Docker và những điều cần biết.
This post hasn't been updated for 2 years
1. Docker là gì?
Docker là một nền tảng mở dùng để developing, shipping và running các ứng dụng một cách dễ dàng thông qua việc sử dụng OS-level virtualization để cung cấp các containers.
2. Docker và Hypervisors
Sự khác biệt chính giữa docker và hypervisor là về tài nguyên. Nếu như ở hypervisors thì chúng ta cần cung cấp tài nguyên từ ban đầu cho các máy ảo kể cả khi máy ảo không dùng hết tài nguyên thì cũng không thể tái sử dụng tài nguyên đã cho đi. Còn đối với docker thì các máy ảo sẽ được cấp tài nguyên khi cần và cấp vừa đủ cho máy ảo sử dụng để có thể tối ưu tài nguyên.
3. Docker Image và Docker Container
Các bạn có thể hiểu docker image là một template dùng để tạo containers thông qua các câu lệnh run các image. Có thể xem containers là các instance của image.
Containers như các máy ảo và được khởi tạo khi chạy các image, cho phép lập trình viên đóng gói ứng dụng của mình.
Một số câu lệnh hay dùng của Docker Image
# Cấu trúc mẫu
$ docker image COMMAND
# Build một image từ Dockerfile
$ docker image build
# Hiển thị lịch sử của một image
$ docker image history
# Danh sách các image
$ docker image ls
# Pull một image hoặc một repository từ registry
$ docker image pull
# Push một image hoặc một repository từ registry
$ docker image push
# Xóa một hoặc nhiều image
$ docker image rm
Một số câu lệnh hay dùng của Docker Container
# Cấu trúc mẫu
$ docker container COMMAND
# Danh sách các container
$ docker container ls
# Chạy một container
$ docker container run
# Dừng một hoặc nhiều container đang chạy
$ docker container stop
# Chạy lại một hoặc nhiều container đang stop
$ docker container start
# Cập nhật config cho các container
$ docker container update
# Xoá một hoặc nhiều container
$ docker container rm
# Xóa tất cả các container đang stop
$ docker container prune
# Chạy một câu lệnh trong container đang chạy
$ docker container exec
Ngoài ra thì còn rất nhiều câu lệnh khác mà mình không thể liệt kê hết ở đây.
4.Dockerfile
Dockerfile là một file không có đuôi dùng để khai báo các config cho image. Khi chúng ta build một image thì sẽ đọc từ trong Dockerfile và tiến hành build image.
Dockerfile là một tập hợp cái câu lệnh có dạng như dưới đây
# Comment
INSTRUCTION arguments
Các INSTRUCTION không phân biệt chữ hoa và chữ thường, nhưng để dễ phân biệt với các arguments thì các INSTRUCTION nên được viết dưới dạng UPPERCASE.
Dưới đây là các INSTRUCTION của Dockerfile.
FROM
FROM ubuntu:18.04
FROM là một instruction khởi tạo dùng để khai báo base image. Một file Dockerfile luôn luôn bắt đầu bằng FROM
RUN
RUN apt-get update
RUN apt-get install -y curl python
RUN được sử dụng để chạy các lệnh và khi chạy thì kết quả sẽ được commit để sử dụng cho các instruction tiếp theo.
CMD
CMD echo "This is a test." | wc -
CMD cung cấp một một lệnh và đối số cho conatiner đang thực thi và một file Dockerfile chỉ có thể có một CMD, nếu có từ 2 CMD trở lên thì CMD cuối cùng sẽ được chạy.
RUN và CMD không giống nhau. RUN là chạy một lệnh và commit kết quả lệnh đó để cho các instruction sau sử dụng, còn CMD thì chỉ định lệnh dự định cho image.
LABEL
LABEL dùng để thêm metadata vào cho image, có thể dùng để thêm một số thông tin về tác giả của image và những thông tin thêm cần thiết. Để xem được label của image thì có thể sử dụng lệnh docker image inspect
.
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates
EXPOSE
EXPOSE dùng để chỉ định các cổng mạng cụ thể khi runtime, có thể cấu hình là cổng trên UDP hoặc TCP, ở trạng thái mặc định thì sẽ là TCP.
EXPOSE 80/tcp
EXPOSE 80/udp
ENV
ENV được dùng để khai báo các biến môi trường nhằm phục vụ cho các instruction trong giai đoạn build stage
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy
ADD
ADD [--chown=<user>:<group>] <src>... <dest>
#example
ADD --chown=55:mygroup files* /somedir/
ADD dùng để sao chép một file mới, thư mục mới hoặc một file remote từ <src> vào trong filesystem của image dựa trên đường dẫn <dest>.
COPPY
COPY cũng dùng để sao chép moojy file, thư mục mới từ src vào trong filesystem của imagr dực trên đường dẫn dest, nhưng COPY khác ADD là COPY không chấp nhận file remote mà chỉ chấp nhận file ở local.
ENTRYPOINT
Ở CMD chúng ta đã biết là một Dockerfile chỉ có thể có một CMD, vậy nếu chúng ta muốn khi chạy container có thể thực thi nhiều câu lệnh thì làm như thế nào?
Khi đó chúng ta sử dụng ENTRYPOINT để khai báo các lệnh vào đối số để container thực thi. Các lệnh này thường được viết trong một file có đuôi sh.
ENTRYPOINT ["/docker-entrypoint.sh"]
#!/bin/bash
set -e
if [ "$1" = 'postgres' ]; then
chown -R postgres "$PGDATA"
if [ -z "$(ls -A "$PGDATA")" ]; then
gosu postgres initdb
fi
exec gosu postgres "$@"
fi
exec "$@"
VOLUME
VOLUME dùng để chỉ định một điểm gắn kết từ máy host vào container để truy cập và lưu trữ dữ liệu.
VOLUME /myvol
WOKRDIR
WORKDIR dùng để thiết lập thư mục cho các instruction khác như RUN, CMD, ENTRYPOINT, COPY, ADD.
WORKDIR /path/to/workdir
ARG
ARG dùng để định nghĩa các biến để dùng trong thời gian build image.
ARG user1=someuser
ARG buildno=1
Không nên truyền vào các biến như secret key hoặc thông tin đăng nhập người dùng, vì các biến này được hiển thị cho tất cả mọi người dùng image.
5. Docker Hub
Dockerhub là một Registry lớn của Docker Image. Hiểu đơn giản thì Dockerhub là nơi dùng để lưu trữ và chia sẻ các image của docker.
Chúng ta sẽ thử tạo một image và push lên docker-hub.
Bước 1 Tạo một tài khoản trên docker-hub và tạo một repository. Ở đây thì mình đã tạo sẵn một repository có tên là lesson1
Bước 2 Tạo và build một image
Đầu tiên chúng ta cần tạo một Dockerfile đơn giản như sau
FROM busybox
CMD echo "Hello Docker, My name is Polaris."
Sau đó chúng ta sử dụng lệnh build để build Dockerfile này.
quang@quang-Inspiron-14-3467:~/docker/lesson1$ docker build . -t quanglx173330/lesson1:latest
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM busybox
---> ec3f0931a6e6
Step 2/2 : CMD echo "Hello Docker, My name is Polaris."
---> Running in 279c442d6af3
Removing intermediate container 279c442d6af3
---> e239d02ad839
Successfully built e239d02ad839
Successfully tagged quanglx173330/lesson1:latest
Để có thể push image lên docker-hub thì chúng ta cần build một image dạng <your_username>/<your_repo>:tag
Sau khi build xong image chúng ta sẽ có được một image như dưới đây
quang@quang-Inspiron-14-3467:~/docker/lesson1$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
quanglx173330/lesson1 latest e239d02ad839 9 seconds ago 1.24MB
Bước 3 Push image lên trên repository của docker-hub
quang@quang-Inspiron-14-3467:~/docker/lesson1$ docker push quanglx173330/lesson1:latest
The push refers to repository [docker.io/quanglx173330/lesson1]
d31505fd5050: Layer already exists
latest: digest: sha256:a52e3329e125efecb5a7445566ed977f84986e38407542f840b5fdb56899e26c size: 527
Và dưới đây là kết quả sau khi push:
6. Lời kết
Ở trên là những kiến thức cơ bản nhất về Docker mà mình đã tổng hợp được. Cảm ơn các bạn đã theo dõi bài viết, mong bài viết mang lại cho các bạn những kiến thức hữu ích. Ở phần tiếp theo chúng ta sẽ tìm hiểu về Docker-compose, mời các bạn đón đọc.
Tài liệu tham khảo
All Rights Reserved