Giống như các nền tảng ảo hóa khác như VMware hay VirtualBox, Docker cũng có “luật chơi” riêng để tạo ra một môi trường hoạt động chuẩn. Và để tạo được một image trong Docker, bạn phải tuân theo quy tắc của Dockerfile – đây chính là “template” để build image.
Tóm tắt quy trình:
- Tạo Dockerfile
- Dùng lệnh
docker buildđể tạo Image - Từ Image, bạn có thể tạo ra Container
Xem thêm:
Hướng dẫn chạy MySQL và Adminer bằng Docker Compose – Bài 10
1. Cách tạo image từ Dockerfile
1.1. Tạo file Dockerfile
Docker sẽ mặc định tìm kiếm một file có tên là Dockerfile.
Ví dụ:
mkdir images
cd images
nano Dockerfile
Bạn có thể đặt tên khác, không bắt buộc phải dùng tên Dockerfile. Nhưng nếu vậy thì phải dùng thêm tùy chọn -f khi build.
Ví dụ bạn đặt là Tarekfile, thì khi build cần dùng:
docker build -f Tarekfile .
Trong file này, dòng lệnh bắt buộc là FROM, để chỉ hệ điều hành nền tảng bạn muốn dùng (thường là Linux). Ví dụ:
FROM alpine
Dòng này nói rằng bạn sẽ sử dụng Alpine Linux làm nền tảng cho container của bạn. Đây là một hệ điều hành rất nhẹ, phổ biến để build các ứng dụng nhỏ gọn.
1.2. Build Image
Sau khi tạo xong Dockerfile, bạn dùng lệnh sau để build image:
docker build .
Dấu . ở cuối nghĩa là Docker sẽ tìm Dockerfile trong thư mục hiện tại.
Nếu bạn không đặt tên cho image, Docker sẽ tự sinh ra tên ngẫu nhiên. Nhưng để quản lý dễ hơn, bạn nên gắn tên và tag cho image ngay từ đầu:
docker build -t username/image-name:tag .
Ví dụ:
docker build -t tarekg/alpine-test:1.0 .
usernamelà tài khoản Docker Hub của bạn (nếu định push lên đó)image-namelà tên mô tả image bạn tạotaglà phiên bản (nếu không có, mặc định làlatest)
1.3. Kiểm tra image vừa tạo
Sau khi build, bạn có thể kiểm tra bằng lệnh:
docker images
2. Cách lệnh cơ bản tạo Docker image
Những lệnh quan trọng trong Dockerfile:
FROM
Chỉ định image nền (base image) mà bạn muốn sử dụng. Ví dụ:
FROM ubuntu
Nghĩa là bạn sẽ xây dựng image mới dựa trên Ubuntu.
LABEL
Dùng để mô tả thông tin cho image, chẳng hạn như mô tả chức năng:
LABEL description="Image chạy Apache server trên Ubuntu"
MAINTAINER
Dùng để ghi thông tin người tạo image:
MAINTAINER TTnguyen <ttnguyen@example.com>
RUN
Dùng để chạy các lệnh Linux trong quá trình xây dựng image, ví dụ:
RUN apt update && apt install -y iputils-ping
Bạn có thể viết lệnh RUN theo nhiều cách:
RUN apt update && \
apt install -y curl && \
apt install -y vim
hoặc mỗi lệnh một dòng RUN, nhưng thường nên gộp lại để giảm số lớp trong image.
COPY
Dùng để copy file từ máy tính của bạn vào bên trong image:
COPY index.html /var/www/html/
WORKDIR
Đặt thư mục làm việc mặc định bên trong container:
WORKDIR /var/www/html
Tất cả các lệnh sau đó sẽ được thực thi trong thư mục này.
EXPOSE
Dùng để mở cổng trên container cho các dịch vụ bên ngoài truy cập:
EXPOSE 80
Ví dụ nếu bạn chạy web server thì cần mở cổng 80 để truy cập HTTP.
CMD
Dùng để chỉ định lệnh mặc định chạy khi container khởi động:
CMD ["apache2ctl", "-D", "FOREGROUND"]
Sau khi viết xong Dockerfile, bạn có thể build image bằng lệnh:
docker build -t ten-image .
Trong đó -t là tên của image và . là vị trí của Dockerfile.
Chạy thử image:
Sau khi build xong, bạn có thể chạy image bằng lệnh:
docker run -d -p 8080:80 ten-image
Docker file:
FROM
LABEL
MAINTAINER user <user@example.com>
RUN
USER
ENV
WORKDIR /var/www/html/index.html
COPY and ADD
EXPOSE
ENTRYPOINT
CMD
3. Hướng dẫn tạo Docker image
Mục tiêu:
- Nginx làm web server
- ping (iputils-ping) để test mạng
- Copy 1 file HTML vào thư mục web mặc định
/var/www/html
Bước 1: Tạo thư mục
mkdir nginx-demo
cd nginx-demo
touch Dockerfile index.html
Bước 2: Tạo nội dung index.html
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
<title>Demo Nginx on Docker</title>
</head>
<body>
<h1>Hello from Nginx Docker Container!</h1>
</body>
</html>
Bước 3: Viết docker file
# Sử dụng image Ubuntu
FROM ubuntu:22.04
# Tắt prompt trong quá trình cài đặt
ENV DEBIAN_FRONTEND=noninteractive
# Cập nhật và cài đặt nginx + ping (iputils-ping)
RUN apt-get update && \
apt-get install -y nginx iputils-ping && \
apt-get clean
# Copy file index.html vào thư mục web mặc định
COPY index.html /var/www/html/index.html
# Mở cổng 80
EXPOSE 80
# Start Nginx ở foreground (tránh container tự dừng)
CMD ["nginx", "-g", "daemon off;"]
Bước 4: Build Docker image
docker build [OPTIONS] -t <tên-image>:<tag> <đường-dẫn-build-context>
sudo docker build -t nginx/http:demo ./
Bước 5: Run container
docker run -d -p 8080:80 --name my-nginx-demo nginx-demo
- Truy cập: http://localhost:8080 để xem trang
index.html - Ping thử từ container:
docker exec -it my-nginx-demo ping google.com
Vậy là bạn đã có cái nhìn tổng quan về cách viết Dockerfile và xây dựng image tùy chỉnh. Khi đã quen, bạn có thể xây dựng các image chuyên biệt cho từng ứng dụng: web, database, backend, frontend…
Bài viết cùng chủ đề: