+9

Docker cho người mới bắt đầu (phần 3: Dockerfile)

Xin chào mn, hôm nay chúng ta sẽ đi chi tiết hơn về cách sử dụng Docker, nếu các bạn chưa có lí thuyết cơ bản về Docker thì hãy dành ít phút để đọc lại phần Giới thiệu dockerCài đặt Docker nhé. Ah trước khi vào thì các bạn cài giúp mình Docker Desktop nếu sử dụng windows hoặc MacOs nhé, sẽ trực quan hơn với bài này. Bây giờ thì cùng tiếp tục với Dockerfile nào 😀

Dockerfile là gì vậy ?

Dockerfile là 1 file không có phần mở rộng, chứa tập các lệnh để tạo ra 1 Docker Image.

Có thể hiểu rằng container giống 1 máy tính vật lí, nhưng chưa có gì được cài vào cả, bây giờ Dockerfile sẽ cài tất cả những gì cần để máy tính chạy được bình thường

Xây dựng Dockerfile như thế nào ?

Giả sử ta đã có 1 file chứa mã nguồn ( có thể là php, java, html, ...) , ở đây mình đặt tên là index.php để lát nữa ta sẽ test thử nhé

<p>Hello Docker</p>

Chúng ta sẽ tạo ra 1 file đặt tên là Dockerfile, file này nên đặt ở cùng cấp với folder chứa mã nguồn (bạn cũng có thể đặt ở vị trí khác, tất nhiên ta cần 1 số tuỳ chỉnh tương ứng khi chạy lệnh build image và viết Dockerfile).

~$ touch Dockerfile

Dưới đây là Dockerfile với mục đích tạo ra 1 môi trường sử dụng hệ điều hành ubuntu

FROM ubuntu

WORKDIR /src

EXPOSE 3001

Cùng phân tích file trên 1 chút

FROM ubuntu:16.04 Docker sẽ tự động tìm xem image ubuntu:16.04 này đã tồn tại trong máy chưa, nếu chưa thì Docker sẽ tự động pull image này về từ Docker Hub. Trong đó ubuntu là tên của image, 16:04 là tag (phiên bản).

WORKDIR: xác định thư mục làm việc khi đi vào docker, tên thư mục có thể tự định nghĩa, khi build image sẽ tự sinh ra

EXPOSE: Container sẽ thông báo cho Docker biết là nó sẽ lắng nghe các sự kiện trên cổng này

Bây giờ ta sẽ chạy lệnh để tạo docker image : docker build -t panda .

panda là tên image, các bạn có thể đặt tên khác

dấu . có nghĩa là Dockerfile đang ở cùng cấp với thư mục đang chạy lệnh này)

Screenshot 2024-11-14 at 10.19.27.png

Với máy cài docker desktop: Giờ ta sẽ vào trong docker desktop > mục Images

ở trên ta thấy 1 image tên là panda với trạng thái là Unused, như vậy là ta đã tạo thành công

Đã tạo Docker Image thành công thì chúng ta sẽ tạo thử 1 container

docker run -it panda bash

Trạng thái image đã đổi sang In use

giờ ta vào menu Containers để xem

chúng ta thấy 1 container có tên focused_joliot, được tạo ra từ image tên là panda, trạng thái là running, tên container là ngẫu nhiên, ta cũng có thể đặt tên container theo nhu cầu

Khi click vào tên container, sang tab Files, ta thấy có 1 thư mục src trống, đó là thư mục ta định nghĩa bằng lệnh WORKDIR

Nếu không có docker desktop thì sử dụng lệnh sau để kiểm tra : Kiểm tra images docker images Xem danh sách các container docker ps Đi vào docker container có id là cb3117b1f4db

Như ở trên chúng ta đã cài được ubuntu và đi vào được container, giờ bạn cần cài thêm các thư viện liên quan nữa. Giả sử giờ mình muốn cài thêm php thì sao

B1: Đi vào trong container (sử dụng lệnh hoặc docker desktop đều được)

B2: Cài đặt php (hoặc bất kì thư viện nào) sử dụng lệnh

B3: Nếu cài thành công thì sẽ copy các lệnh đã sử dụng vào Dockerfile, chú ý tới các option Y/N

B4: Build lại Docker Image, nếu build không lỗi thì bạn đã thành công

B5: Tạo Container mới và đi vào container để kiểm tra xem ứng dụng đã được cài trong container hay chưa

Ta sẽ lặp lại các bước trên với mỗi thư viện bạn muốn cài đặt vào container

FROM ubuntu

WORKDIR /src

COPY index.php /src/index.php  // copy mã nguồn từ HOST vào Container

RUN apt-get update && \
    apt-get install -y php-cli && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*
    
# RUN ... // cài các ứng dụng khác

CMD ["php", "-S", "0.0.0.0:3003", "/src/index.php"] // máy chủ php sẽ lắng nghe trên cổng 3003

# EXPOSE 3001  // không bắt buộc phải có lệnh này, như trong case này thì ko cần vì chỉ cần chạy php và đã lắng nghe ở cổng 3003 rồi

Tùy chọn -y tương đương việc tự động lựa chọn yes trong khi cài đặt packet

RUN : Để thực thi một câu lệnh nào đó trong quá trình build images

COPY : Copy file, thư mục từ host machine vào image. Có thể sử dụng url cho tập tin cần copy.

CMD : Để thực thi một câu lệnh trong quá trình bật container.

VOLUME : Mount thư mục từ máy host vào container.

ENTRYPOINT: Giúp thực thi nhiều câu lệnh trong quá trình start container, những câu lệnh này sẽ được viết trong file .sh, lưu ý là chỉ nên dùng trên dev, trên prod nên tách các service riêng thành các container độc lập và sử dụng docker-compose

Mỗi Dockerfile chỉ có một câu lệnh CMD, nếu như có nhiều hơn một câu lệnh CMD thì chỉ có câu lệnh CMD cuối cùng được sử dụng. Nếu muốn khởi động nhiều ứng dụng khi start container thì ta sẽ sử dụng ENTRYPOINT, ở ví dụ này chỉ chạy đơn giản 1 file php nên mình sử dụng CMD

Giờ build lại docker image và chạy container để xem kết quả nhé

docker build -t panda .  // build lại docker image
docker run -p 3002:3003 panda  // chạy container

3002 là cổng của HOST

3003 là cổng mà php trong container lắng nghe

Tuỳ chọn -p sẽ thực hiện ánh xạ cổng 3003 của container và cổng 3002 của host lại với nhau, những gì cổng 3003 lắng nghe được sẽ ánh xạ qua cổng 3002

Kết quả là

Done, vậy là chúng ta vừa cùng nhau đi từ cách viết Dockerfile để tạo image, rồi từ image để tạo ra được 1 container đơn giản. Hy vọng bài viết hữu ích cho mn. Cám ơn mn đã dành thời gian cho mình 😀


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí