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 docker và Cà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)
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