Cách tạo image từ Dockerfile – Bài 12

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

Hướng dẫn cài đặt Private Docker Registry – Bài 11

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 .
  • username là tài khoản Docker Hub của bạn (nếu định push lên đó)
  • image-name là tên mô tả image bạn tạo
  • tag là 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
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ủ đề:

Hướng dẫn tạo website WordPress với Docker – Bài 13

Cách lệnh cơ bản trong Docker – Bài 2

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em