Sunday, September 29, 2024

[Docker] Phần 6 – Dockerfile

-

Mở Đầu

Trong cuộc hành trình tiếp theo của chúng ta trong thế giới Docker, phần 6 này sẽ khám phá một công cụ quan trọng và mạnh mẽ trong việc tạo và quản lý Docker Container – đó là Dockerfile. Dockerfile là một công cụ tự động hóa và cấu hình cho việc xây dựng Docker Images. Chúng ta sẽ tìm hiểu cách Dockerfile hoạt động, cách tạo Docker Images từ nó và tại sao nó quan trọng trong quy trình triển khai ứng dụng với Docker.

Dockerfile – Cơ Sở Cho Docker Images

Dockerfile là một file cấu hình có cấu trúc chứa tất cả các hướng dẫn để xây dựng một Docker Image. Nó mô tả các bước cụ thể để tạo ra image, bao gồm việc chọn base image, cài đặt các gói phần mềm, cấu hình biến môi trường, sao chép file tin và thực hiện các tùy chỉnh khác. Dockerfile cho phép bạn tự động hóa quy trình xây dựng image, đảm bảo rằng mọi người trong đội làm việc với cùng một môi trường ứng dụng.

Dockerfile Trong Quy Trình Triển Khai

Dockerfile là một phần quan trọng trong quy trình triển khai ứng dụng với Docker. Nó giúp đảm bảo rằng ứng dụng của bạn có thể được triển khai một cách đáng tin cậy trên bất kỳ môi trường Docker nào. Bằng cách sử dụng Dockerfile, bạn có thể đảm bảo rằng ứng dụng của bạn có thể được tái tạo và mở rộng dễ dàng.

Cách viết các chỉ thị trong Dockerfile như RUN, FROM, CMD … để thi hành các tác vụ tự động tạo ra image Docker

Ở các phần trước ta đã sử dụng các lệnh Docker tương tác trực tiếp hết lệnh này đến lệnh khác để lấy image về, tạo container, chạy và cài đặt các thành phần vào container … Rất nhiều thao tác trong quá trình này bạn có thể lưu vào một file gọi là Dockerfile, và ra lệnh cho Docker đọc file đó, chạy từng lệnh theo chỉ thị trong file đó để cuối cùng có được image theo nhu cầu.

Sử dụng Dockerfile

Dockerfile là một file text, trong đó chứa các dòng chỉ thị để Docker đọc và chạy theo chỉ thị đó để cuối cùng bạn có một image mới theo nhu cầu. Khi đang có một Dockerfile giả sử có tên là Dockerfile để ra lệnh cho Docker chạy nó bạn có thể gõ:

docker build -t image_name:image_version --force-rm -f Dockerfile .

Bạn chú ý dấu . ở cuối lệnh docker build ở trên, có nghĩa tìm file có tên Dockerfile ở thư mục hiện tại và -t image_name:image_version là đặt tên và tag được gán cho image mới tạo ra.

Tạo Dockerfile đơn gian đầu tiên

Dockerfile là file text, bạn dùng bất kỳ trình soạn thảo text nào tạo ra file này, và đưa vào nội dung là các chỉ thị. Giờ ta sẽ vừa thực hành vừa học từng bước. Ví dụ tạo file có tên Dockerfile nhập nội dung sau:

Đầu tiên hãy tạo file cấu hình nginx.conf

vi /home/nginx/nginx.conf

Copy nội dung dưới vào file nginx.conf và lưu lại

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
}

http {
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
        gzip on;
        include /etc/nginx/conf.d/*.conf;
}

Tạo file hoanghd.com.conf, bạn hãy xem phần cấu hình nginx để rõ các bước cấu hình trong config ở dưới

server {
    listen 8099;
    root /var/www/html/hoanghd.com/;
    index index.html index.htm index.nginx-debian.html;
}

server {
    listen 443 ssl;
    server_name hoanghd.com;
    proxy_redirect off;
    ssl_certificate /etc/nginx/ssl/hoanghd.com.pem; #fullchain.pem
    ssl_certificate_key /etc/nginx/ssl/hoanghd.com.pem; #privkey.pem
    ssl_trusted_certificate /etc/nginx/ssl/hoanghd.com.pem;  #chain.pem

    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_buffering on;
        proxy_connect_timeout  3600s;
        proxy_read_timeout  3600s;
        proxy_send_timeout  3600s;
        send_timeout  3600s;
        client_max_body_size 10m;
        proxy_set_header X-Forwarded-Proto $scheme;
        add_header Content-Security-Policy upgrade-insecure-requests;
        proxy_pass http://127.0.0.1:8099/;
    }
}

Tạo thư mục chứa source web

mkdir -p /home/sourceweb/

Tạo file index.html trong thư mục chứa source để lát chúng ta sử dụng Dockerfile copy source web vào imgage

echo 'Chao mung ban den voi website cua toi' > /home/sourceweb/index.html

Tạo Dockerfile với nội dung dưới

vi /home/Dockerfile

Đưa nội dung dưới vào Dockerfile, mình đã chú thích các thành phần rõ ràng ở dưới nên mình không giải thích gì thêm

# xây dựng image mới từ image ubuntu:latest (Ubuntu 20.04)
FROM ubuntu:20.04

# Cập nhật các gói và cài vào đó nginx, vim
RUN apt update -y
RUN apt install nginx -y
RUN apt update -y \
    && apt install vim -y \ 
    && apt install systemctl -y

#Thiết lập thư mục hiện tại
WORKDIR /etc/nginx

# Copy tất cả các file trong thư mục hiện tại (./sourceweb)  vào WORKDIR
ADD ./sourceweb /var/www/html/hoanghd.com/

#Thiết lập khi tạo container từ image sẽ mở cổng 443
EXPOSE 443

# Khi chạy container tự động chạy ngay nginx
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

Sau khi hoàn thành tạo các file và thư mục, bạn sẽ có 1 cây thư mục như dưới

├── Dockerfile
├── nginx
│   ├── conf.d
│   │   └── hoanghd.com.conf
│   ├── nginx.conf
│   └── ssl
│       └── hoanghd.com.pem
└── sourceweb
    └── index.html

4 directories, 5 files

Chạy lệnh docker build để tiến hành build 1 image mới

docker build -t web-hoanghd:version1 --force-rm -f Dockerfile .

Sau khi build xong image, hãy list image và bạn sẽ thấy image web-hoanghd đã được tạo, ngoài ra còn có thêm image ubuntu 20.04 vì đây chính là image cơ sở để tạo ra image web-hoanghd

$ docker image ls
REPOSITORY    TAG        IMAGE ID       CREATED         SIZE
web-hoanghd   version1   81096b77d218   5 minutes ago   248MB
ubuntu        20.04      680e5dfb52c7   10 days ago     72.8MB

Bây giờ bạn hay run image web-hoanghd mà mount một số file và thư mục đã tạo để nginx có thể chạy được web của bạn

$ docker run -it --name=web-hoanghd \
    -v /home/nginx/ssl:/etc/nginx/ssl \
    -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf \
    -v /home/nginx/conf.d:/etc/nginx/conf.d \
    -p 443:443 \
    web-hoanghd:version1

Kết quả khi run xong

$ docker ps 
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS         PORTS                                   NAMES
57eba5da9000   web-hoanghd:version1   "/usr/sbin/nginx -g …"   38 seconds ago   Up 3 seconds   0.0.0.0:443->443/tcp, :::443->443/tcp   web-hoanghd

Và đây là kết quả

Kết Luận

Trong phần này, chúng ta đã bắt đầu khám phá Dockerfile và tìm hiểu tại sao nó là một công cụ quan trọng trong việc tạo và quản lý Docker Images. Chúng ta đã thấy cách Dockerfile được sử dụng để định nghĩa môi trường của ứng dụng và làm cho việc triển khai ứng dụng trở nên dễ dàng và đáng tin cậy.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories