Tìm hiểu cơ bản về Docker

Giới thiệu

Docker !!! Hầu hết các bạn làm việc trong ngành công nghiệp phần mềm phải quen thuộc với thuật ngữ này, đặc biệt là các nhà phát triển và quản trị viên. Docker đã trở thành một tiêu chuẩn nổi tiếng trong ngành CNTT khi nói đến việc đóng gói, triển khai và chạy các ứng dụng phân tán của bạn một cách dễ dàng. Hôm nay chúng ta sẽ đi tìm hiểu những kiến thức cơ bản về Docker. Bắt đầu thôi nào !!!

1. Giới thiệu về Docker.

1.1 Docker là gì ?

Docker là nền tảng cung cấp cho các công cụ, service để các developers, adminsystems có thể phát triển, thực thi, chạy các ứng dụng với containers. Hay nói một cách khác nó là một nền tảng để cung cấp cách để building, deploy và run các ứng dụng một cách dễ dàng trên nền tảng ảo hóa - "Build once, run anywhere". Hay nói một cách dễ hiểu như sau: Khi chúng ta muốn chạy app thì chúng ta phải thiết lập môi trường chạy cho nó. Thay vì chúng ta sẽ đi cài môi trường chạy cho nó thì chúng ta sẽ chạy docker.

Ứng dụng Docker chạy trong vùng chứa (container) có thể được sử dụng trên bất kỳ hệ thống nào: máy tính xách tay của nhà phát triển, hệ thống trên cơ sở hoặc trong hệ thống đám mây. Và là một công cụ tạo môi trường được "đóng gói" (còn gọi là Container) trên máy tính mà không làm tác động tới môi trường hiện tại của máy, môi trường trong Docker sẽ chạy độc lập.

Docker có thể làm việc trên nhiều nền tảng như Linux, Microsoft Windows và Apple OS X.

Những nhiệm vụ trên của Docker cũng có thể được thực hiện thông qua Virtualization, Vậy thì tại sao lại chọn Docker? Chúng tiếp tục tìm hiểu nhé !!!

1.2 Virtualization là gì ?

Virtualization host là gì ?

Khi chúng ta nói về Virtualization, nó đề cập đến việc nhập hệ điều hành Guest trên hệ điều hành máy chủ, cho phép các nhà phát triển chạy nhiều HĐH trên các máy ảo khác nhau trong khi tất cả chúng chạy trên cùng một máy chủ, do đó loại bỏ nhu cầu cung cấp thêm tài nguyên phần cứng.

Ưu điểm :

  • Kích hoạt nhiều hệ điều hành trên cùng một máy.
  • Nó rẻ hơn so với các phương pháp trước đây, do thiết lập cơ sở hạ tầng ít hơn / nhỏ gọn.
  • Nếu có bất kỳ trạng thái thất bại nào, thật dễ dàng để phục hồi và bảo trì.
  • Cung cấp nhanh hơn các ứng dụng và tài nguyên cần thiết cho các nhiệm vụ.
  • Tăng năng suất, hiệu quả và đáp ứng CNTT.

Virtualization host là gì ?

Từ kiến trúc VM ở trên, chúng ta có thể hình dung ra rằng 3 hệ điều hành Guest hoạt động như các máy ảo đang chạy trên một hệ điều hành máy chủ. Trong Virtualization, quá trình cấu hình lại phần cứng, phần sụn thủ công, cài đặt HĐH mới, cài đặt hệ điều hành mới có thể hoàn toàn tự động, tất cả các bước này được lưu trữ dưới dạng dữ liệu trong bất kỳ tệp nào của đĩa.

Trong Virtualization, mỗi ứng dụng và hệ điều hành sống trong một thùng chứa phần mềm riêng biệt có tên Virtural Machine (VM) , trong đó VM hoàn toàn tách biệt, tất cả các tài nguyên điện toán như CPU, lưu trữ và kết nối mạng được gộp chung với nhau. Virtural Machine (VM) về bản chất là một giả lập của một máy tính để thực thi các ứng dụng giống như một máy tính thật. VMs chạy trên một máy vật lý sử dụng một thứ gọi là “hypervisor”. Hypervisor có thể là phần cứng, phần mềm hoặc là một bản firmware nào đó có thể chạy trực tiếp trên máy thật (host machine) có chức năng cho nhiều máy ảo chạy trên nó. Host machine sẽ cung cấp cho VMs những tài nguyên như là RAM, CPU. Những tài nguyên đó sẽ được phân bổ giữa các VMs theo cách mà bạn cho là hợp lý. Nếu một VM chạy nhiều ứng dụng hoặc nặng thì bạn phải cung cấp tài nguyên cho nó nhiều tài nguyên hơn những VMs khác trên cùng một host machine.

Những VMs chạy trên host machine thường được gọi là guest machine. Guest machine này sẽ chứa tất cả những thứ mà hệ thống cần để chạy ứng dụng như hệ điều hành (OS), system binaries và libraries. VMs chạy trên hệ điều hành của host machine và không thể truy cập trực tiếp đến phần cứng mà phải thông qua hệ điều hành.

Để khắc phục những hạn chế trên của Virtualization, Containerization ra đời.

1.3 Containerization là gì ?

Containerization là gì ?

Containerization là một kỹ thuật trong đó virtualization được đưa containerization lên mức hệ điều hành. Trong containerization, ta virtualization tài nguyên hệ điều hành, sẽ hiệu quả hơn vì không có hệ điều hành khách nào tiêu thụ tài nguyên máy chủ, vì container chỉ sử dụng hệ điều hành của máy chủ và chỉ chia sẻ thư viện & tài nguyên có liên quan khi được yêu cầu. Các nhị phân và thư viện cần thiết của container chạy trên kernel host dẫn đến việc xử lý và thực thi nhanh hơn.

Container là gì ?

Container không giống như VMs, Container không cung cấp sự ảo hóa về phần cứng. Một Container cung cấp ảo hóa ở cấp hệ điều hành bằng một khái niệm trừu tượng là “user space”. Sự khác nhau lớn nhất của Container và VMs là Container có thể chia sẻ host system’s kernel với các container khác. Cùng xem mô hình bên dưới để hiểu rõ hơn về Container.

Dựa vào sơ đồ bên trên. Các bạn có thể thấy các gói container chỉ là một user space bao gồm ứng dụng, system binaries và libraries mà không cần guest OS hoặc ảo hóa phần cứng như VMs. Đây là cái mà làm cho các container nhẹ hơn (lightweight). Các container sẽ chạy trên công nghệ cụ thể ở đây là Docker Engine.

Ưu điểm :

  • Các container nhỏ và nhẹ hơn vì chúng có chung nhân hệ điều hành.
  • Không mất nhiều thời gian để khởi động (trong một vài giây).
  • Hiệu suất cao với việc sử dụng tài nguyên thấp hơn

1.4 Sự khác biệt giữa Docker và Virtual Machine

Sự khác biệt giữa DockerVirtual Machine

  • Docker : Dùng chung kernel, chạy độc lập trên Host Operating System và có thể chạy trên bất kì hệ điều hành nào cũng như cloud. Khởi động và làm cho ứng dụng sẵn sàng chạy trong 500ms, mang lại tính khả thi cao cho những dự án cần sự mở rộng nhanh.
  • Virtual Machine : Cần thêm một Guest OS cho nên sẽ tốn tài nguyên hơn và làm chậm máy thật khi sử dụng. Thời gian khởi động trung bình là 20s có thể lên đến hàng phút, thay đổi phụ thuộc vào tốc độ của ổ đĩa

2. Tại sao nên dùng Docker?

  • Tiện lợi: Khi bạn được phân bổ vào dự án mới, bạn đọc file README, thấy dự án hiện tại cần cài rất nhiều thứ, nào là ruby, rồi rails, redis, mysql, nginx, ... mỗi thứ lại phải kèm theo version bao nhiêu, .... Bạn lên google search cách cài đặt, config những thứ này sẽ mất một khoảng thời gian khá lâu. Chưa hết, có thể chưa cài xong đã conflic tùm lum, cái nọ xung đột cái kia chẳng hạn, lại còn ảnh hưởng tới những chương trình cũ đã cài đặt trong máy nữa chứ, thôi cài lại luôn cả hệ điều hành cho máy. Thế là mất thời gian, mệt mỏi với nhưng thao tác phụ mà chưa tập trung được vào việc chính. Nhưng với docker mọi thứ đơn gian hơn nhiều, chỉ vài dòng lệnh thôi, bạn sẽ có thể nhanh chóng tạo được môi trường ảo hóa chứa đầy đủ những cài đặt cần thiết cho project rồi.
  • Dễ dàng sử dụng: Docker rất dễ cho mọi người sử dụng từ developers, systems admins, architects…v…v.. nó tận dụng lợi thế của container để build, test nhanh chóng. Có thể đóng gói ứng dụng trên laptop của họ và chạy trên public cloud, private cloud..v.v… “Build once, run anywhere”.
  • Tốc độ: Docker container rất nhẹ và nhanh, bạn có thể tạo và chạy docker container trong vài giây so sánh với VMs thì mỗi lần chạy VMs cần rất nhiều thời gian khởi động.
  • Khả năng di động: môi trường develop được dựng lên bằng docker có thể chuyển từ người này sang người khác mà không làm thay đổi cấu hình ở trong.
  • Chia sẻ: DockerHub là một “app store for docker images”. Trên DockerHub có hàng ngàn public images được tạo bởi cộng đồng. Dễ dàng tìm thấy những image mà bạn cần và chỉ cần pull về và sử dụng với một số sửa đổi nhỏ.
  • Môi trường chạy và khả năng mở rộng: Bạn có thể chia nhỏ những chức năng của ứng dụng thành các container riêng lẻ. Ví dụng Database chạy trên một container và Redis cache có thể chạy trên một container khác trong khi ứng dụng Node.js lại chạy trên một cái khác nữa. Với Docker, rất dễ để liên kết các container với nhau để tạo thành một ứng dụng, làm cho nó dễ dàng scale, update các thành phần độc lập với nhau.

3. Khi nào sử dụng Docker?

  • Khi bạn cần triển khai kiến trúc Mircoservices.
  • Khi ứng dụng bạn cần scale một cách linh hoạt.
  • Khi bạn cần build 1 lần và chạy ở nhiều máy khác nhau mà không cần quan tâm đến config.
  • Khi bạn cần một cách tiếp cận mới về building, shipping, running ứng dụng một cách nhanh chóng dễ dàng.

4. Các thành phần cơ bản của Docker

4.1. Docker Engine

Docker engine là một ứng dụng client-server. có 2 phiên bản phổ biến:

  • Docker Community Edition (CE): Là phiên bản miễn phí và chủ yếu dựa vào các sản phầm nguồn mở khác.
  • Docker Enterprise(EE): Khi sử dụng phiên bản này bạn sẽ nhận được sự support của nhà phát hành, có thêm các tính năng quản lý và security.

Các thành phần chính của dockẻ engine gồm có:

  • Server hay còn được gọi là docker daemon: chịu trách nhiệm tạo, quản lý các Docker objects như images, containers, networks, volume.
  • REST API: docker daemon cung cấp các api cho Client sử dụng để thao tác với Docker
  • Client là thành phần đầu cuối cung cấp một tập hợp các câu lệnh sử dụng api để người dùng thao tác với Docker.

4.2. Distribution tools

Là các công cụ phân tán giúp chúng ta lưu trữ và quản lý các Docker Images như: Docker Registry, Docker Trusted Registry, Docker Hub

Docker Hub là một công cụ phần mềm như một dịch vụ cho phép người dùng public hay private các images của chúng ta. Dịch vụ cung cấp hơn 100.000 ứng dụng có sẵn công khai, cũng như các cơ quan đăng ký container công cộng và tư nhân

4.3. Orchestration tools

Docker Machine : Machine tạo Docker Engine trên laptop của bạn hoặc trên bất cứ dịch vụ cloud phổ biến nào như AWS, Azure, Google Cloud, Softlayer hoặc trên hệ thống data center như VMware, OpenStack. Docker Machine sẽ tạo các máy ảo và cài Docker Engine lên chúng và cuối cùng nó sẽ cấu hình Docker Client để giao tiếp với Docker Engine một cách bảo mật

Docker Compose : là công cụ giúp định nghĩa và khởi chạy multi-container Docker applications

Docker Swarm : là một công cụ giúp chúng ta tạo ra một clustering Docker. Nó giúp chúng ta gom nhiều Docker Engine lại với nhau và ta có thể "nhìn" nó như duy nhất một virtual Docker Engine

4.4. Một số thành phần khác

Dockerfile : như một script dùng để build các image trong container. Dockerfile bao gồm các câu lệnh liên tiếp nhau được thực hiện tự động trên một image gốc để tạo ra một image mới. Dockerfile giúp đơn giản hóa tiến trình từ lúc bắt đầu đến khi kết thúc

Docker Toolbox : Bởi vì Docker Engine dùng một số feature của kernel Linux nên ta sẽ không thể chạy Docker Engine natively trên Windows hoặc BSD được. Ở các phiên bản trước đây thì ta sẽ cần một máy ảo cài một phiên bản Linux nào đó và sau đó cài Docker Engine lên máy ảo đó

5. Kiến trúc của Docker.

Docker Daemon: lắng nghe các yêu cầu từ Docker Client để quản lý các đối tượng như Container, Image, Network và Volumes. Các Docker Daemon cũng giao tiếp với nhau để quản lý các Docker Service.

Docker Client: là một công cụ giúp người dùng giao tiếp với Docker host. Khi người dùng gõ lệnh docker run imageABC tức là người dùng sử dụng CLI và gửi request đến dockerd thông qua api, và sau đó Docker daemon sẽ xử lý tiếp. Docker client có thể giao tiếp và gửi request đến nhiều Docker daemon.

Docker Registry (Docker Hub): là một kho chứa các image được publish bởi cộng đồng Docker. Nó giống như GitHub và bạn có thể tìm những image cần thiết và pull về sử dụng.

Docker object: chính là các đối tượng mà ta thường xuyên gặp khi sử dụng Docker. Gồm có ImagesContainers .

  • Images: hiểu nôm na là một khuôn mẫu để tạo một container. Thường thì image sẽ base trên 1 image khác với những tùy chỉnh thêm. ví dụ bạn build 1 image dựa trên image ubuntu để chạy Apache web service và ứng dụng của bạn và những tùy chỉnh, cấu hình để ứng dụng của bạn có thể chạy được. Bạn có thể tự build một image riêng cho mình hoặc sử dụng những image được publish từ cộng đồng Docker Hub. Một image sẽ được build dựa trên những chỉ dẫn của Dockerfile.
  • Containers: là một instance của một image. Bạn có thể create, start, stop, move or delete container dựa trên Docker API hoặc Docker CLI.

⭐️ Sự khác biệt giữa Docker ImagesDocker Containers

  • Docker Images: Là một template chỉ cho phép đọc, ví dụ một image có thể chứa hệ điều hành Ubuntu và web app. Images được dùng để tạo Docker container. Docker cho phép chúng ta build và cập nhật các image có sẵn một cách cơ bản nhất, hoặc bạn có thể download Docker images của người khác.
  • Docker Containers: Docker container có nét giống với các directory. Một Docker container giữ mọi thứ chúng ta cần để chạy một app. Mỗi container được tạo từ Docker image. Docker container có thể có các trạng thái run, started, stopped, moved và deleted.

6. Quy trình thực thi của một hệ thống sử dụng Docker

Như trong hình, một hệ thống Docker được thực thi với 3 bước chính :

BUILD -> PUSH -> PULL,RUN

Build: Đầu tiên tạo một dockerfile, trong dockerfile này chính là code của chúng ta. Dockerfile này sẽ được Build tại một máy tính đã cài đặt Docker Engine. Sau khi build ta sẽ có được Container, trong Container này chứa ứng dụng kèm bộ thư viện của chúng ta.

Push: Sau khi có được Container, chúng ta thực hiện push Container này lên cloud và lưu tại đó.

Pull, Run: Nếu một máy tính khác muốn sử dụng Container chúng ta thì bắt buộc máy phải thực hiện việc Pull container này về máy, tất nhiên máy này cũng phải cài Docker Engine. Sau đó thực hiện Run Container này.

7. Cài đặt Docker

Sau đây, mình sẽ hướng dẫn các bạn cài đặt trên ubuntu. Ngoài ra bạn có thể tham khảo tại trang chủ.

7.1 Chuẩn bị trước khi cài đặt

  1. Update ubuntu
$ sudo apt-get update
  1. Cài đặt các gói để cho phép apt sử dụng repository qua HTTPS
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
  1. Thêm key chính thức của Docker
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  1. Thêm Repositories stable
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

7.2 Cài đặt Docker CE

  1. Update ubuntu lần nữa
$ sudo apt-get update
  1. Cài đặt Docker CE phiên bản mới nhất
$ sudo apt-get install docker-ce
  1. Test lại xem đã cài đặt thành công hay chưa
docker run hello-world

Nếu câu lệnh cuối cùng của bạn ra kết quả như sau thì bạn đã cài đặt Docker thành công:

Để tạo thông báo này, Docker đã thực hiện các bước sau:

  1. Client Docker đã liên hệ với Docker daemon.
  2. Docker daemon sẽ pull image "hello-world" từ Docker Hub.
  3. Docker daemon sex tạo mới container từ image đó để thực thi tiến trình, tạo ra kết quả như chúng ta đang nhìn thấy.
  4. Docker daemon sẽ truyền luồng đầu ra đó đến Docker client, gửi và hiển thị kết quả trên terminal.

8. Một số câu lệnh trong Docker nên biết

Lệnh Mô tả
docker images Liệt kê các images hiện có
docker pull image_name Pull một image từ Docker Hub
docker rmi {image_id/name} Xóa một image
docker run -v <forder_in_computer>:<forder_in_container> -p <port_in_computer> <port_in_container> -it <image_name> /bin/bash Tạo mới container bằng cách chạy image (kèm theo các tùy chọn)
docker ps Liệt kê các container đang chạy
docker ps -a Liệt kê các container đã tắt
docker rm -f {container_id/name} Xóa một container
docker start {new_container_name} Khởi động một container
docker exec -it {new_container_name} /bin/bash Truy cập vào container đang chạy
uname -a Hiển thị thông tin của Kernel ubuntu

9. Dockerfile

9.1 Dockerfile là gì ?

Như đã nỏi ở trên, Dockerfile : như một script dùng để build các image trong container, bao gồm các câu lệnh liên tiếp nhau được thực hiện tự động trên một image gốc để tạo ra một image mới. Hiểu đơn giản, Dockerfile là một file dạng text, không có đuôi, giúp thiết lập cấu trúc cho docker image nhờ chứa một tập hợp các câu lệnh. Dockerfile giúp đơn giản hóa tiến trình từ lúc bắt đầu đến khi kết thúc.

Như vậy Dockerfile sẽ quy định Docker image được khởi tạo từ đâu, gồm những gì trong đó.

9.2 Định dạng của Dockerfile

# Comment
INSTRUCTION arguments
  • Ở đây thì INSTRUCTION sẽ không phân biệt case-sensitive, nhưng để tốt nhất thì nên viết UPPERCASE cho dễ phân biệt enviroment variable khác.

  • Các arguments là đoạn nội dung mà chỉ thị sẽ làm gì.

Ví dụ :

# Comment
RUN echo 'we are running some # of cool things'

Docker sẽ chạy lần lượt các lệnh trong file Dockerfile từ trên xuống, và một Dockerfile phải bắt đầu bằng enviroment variable FROM . còn FROM là gì chúng ta sẽ tìm hiểu kĩ hơn ở phần tiếp theo nhé.

9.3 Một số lệnh có sẵn

9.3.1 FROM

Dùng để chỉ ra image được build từ đâu (từ image gốc nào)

FROM ubuntu

hoặc có thể chỉ rõ tag của image gốc

FROM ubuntu14.04:lastest

9.3.2 RUN

Dùng để chạy một lệnh nào đó khi build image, ví dụ về một Dockerfile

FROM ubuntu
RUN apt-get update
RUN apt-get install curl -y

9.3.3 CMD

Lệnh CMD dùng để truyền một lệnh của Linux mỗi khi thực hiện khởi tạo một container từ image (image này được build từ Dockerfile) Có các cách (trong docs nói có 3 cách) sử dụng lệnh CMD, ví dụ :

  • Cách 1:
FROM ubuntu
RUN apt-get update
RUN apt-get install curl -y
CMD ["curl", "ipinfo.io"]
  • Cách 2 :
FROM ubuntu
RUN apt-get update
RUN apt-get install wget -y
CMD curl ifconfig.io

9.3.4 LABEL

LABEL <key>=<value> <key>=<value> <key>=<value> ...

Chỉ thị LABEL dùng để add các metadata vào image.

Ví dụ:

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

Để xem các label của images, dùng lệnh docker inspect.

9.3.5 MAINTAINER

MAINTAINER <name>

Dùng để đặt tên giả của images.

Hoặc bạn có thể sử dụng

LABEL maintainer "[email protected]"

9.3.6 EXPOSE

EXPOSE <port> [<port>...]

Lệnh EXPOSE thông báo cho Docker rằng image sẽ lắng nghe trên các cổng được chỉ định khi chạy. Lưu ý là cái này chỉ để khai báo, chứ ko có chức năng nat port từ máy host vào container. Muốn nat port, thì phải sử dụng cờ -p (nat một vài port) hoặc -P (nat tất cả các port được khai báo trong EXPOSE) trong quá trình khởi tạo contrainer.

9.3.7 ENV

ENV <key> <value>
ENV <key>=<value> ...

Khai báo cáo biến giá trị môi trường. Khi run container từ image, các biến môi trường này vẫn có hiệu lực.

9.3.8 ADD

ADD has two forms:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] (this form is required for paths containing whitespace)

Chỉ thị ADD copy file, thư mục, remote files URL (src) và thêm chúng vào filesystem của image (dest)

  • src: có thể khai báo nhiều file, thư mục, có thể sử dụng các ký hiệu như *,?,...
  • dest phải là đường dẫn tuyệt đối hoặc có quan hệ với chỉ thị WORKDIR

Note: If your URL files are protected using authentication, you will need to use RUN wget, RUN curl or use another tool from within the container as the ADD instruction does not support authentication.

Các quy định:

  • The path must be inside the context of the build: Có nghĩa là phải nằm trong thư mục đang build (chứa dockerfiles).
  • If is a directory, the entire contents of the directory are copied, including filesystem metadata. The directory itself is not copied, just its contents.
  • If multiple resources are specified, either directly or due to the use of a wildcard, then must be a directory, and it must end with a slash /.
  • If does not end with a trailing slash, it will be considered a regular file and the contents of will be written at .
  • If doesn’t exist, it is created along with all missing directories in its path.

9.3.9 COPY

COPY <src>... <dest>
COPY ["<src>",... "<dest>"] (this form is required for paths containing whitespace)

Chỉ thị COPY, copy file, thư mục (src) và thêm chúng vào filesystem của container (dest).

Các lưu ý tương tự chỉ thị ADD.

9.3.10 ENTRYPOINT

ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)

Hai cái CMD và ENTRYPOINT có tác dụng tương tự nhau. Nếu một Dockerfile có cả CMD và ENTRYPOINT thì CMD sẽ thành param cho script ENTRYPOINT. Lý do người ta dùng ENTRYPOINT nhằm chuẩn bị các điều kiện setup như tạo user, mkdir, change owner... cần thiết để chạy service trong container.

9.3.11 VOLUME

VOLUME ["/data"]

Mount thư mục từ máy host và container. Tương tự option -v khi tạo container.

Thư mục chưa volumes là /var/lib/docker/volumes/. Ứng với mỗi container sẽ có các thư mục con nằm trong thư mục này. Tìm thư mục chưa Volumes của container sad_euclid:

[email protected]:/var/lib/docker/volumes# docker inspect sad_euclid | grep /var/lib/docker/volumes
                "Source": "/var/lib/docker/volumes/491a2a775a4cf02bbaca105ec25995008cc7adbc5511e054bb9c6a691a2681ee/_data",

9.3.12 USER

USER daemon

Set username hoặc UID để chạy các lệnh RUN, CMD, ENTRYPOINT trong dockerfiles.

9.3.13 WORKDIR

WORKDIR /path/to/workdir

Chỉ thị WORKDIR dùng để đặt thư mục đang làm việc cho các chỉ thị khác như: RUN, CMD, ENTRYPOINT, COPY, ADD,...

9.3.14 ARG

ARG <name>[=<default value>]

Chỉ thị ARG dùng để định nghĩa các giá trị của biến được dùng trong quá trình build image (lệnh docker build --build-arg =). biến ARG sẽ không bền vững như khi sử dụng ENV.

9.3.15 STOPSIGNAL

STOPSIGNAL signal

Gửi tín hiệu để container tắt đúng cách.

9.3.16 SHELL

SHELL ["executable", "parameters"]

Chỉ thị Shell cho phép các shell form khác có thể ghi đè shell mặc định. Mặc định trên Linux là ["/bin/sh", "-c"] và Windows là ["cmd", "/S", "/C"].

Ví dụ:

FROM microsoft/windowsservercore

# Executed as cmd /S /C echo default
RUN echo default

# Executed as cmd /S /C powershell -command Write-Host default
RUN powershell -command Write-Host default

# Executed as powershell -command Write-Host hello
SHELL ["powershell", "-command"]
RUN Write-Host hello

# Executed as cmd /S /C echo hello
SHELL ["cmd", "/S"", "/C"]
RUN echo hello

9.3.17 ONBUILD

ONBUILD [INSTRUCTION]

Chỉ thị ONBUILD được khai báo trong base image. Và khi child image build image từ base image thì lệnh ONBUILD mới được thực thi.

Ngoài ra bạn có thể tham khảo thêm và chi tiết hơn tại trang chủ.

9.4 Thực hành đơn giản với Dockerfile

Đầu tiên cần chỉ định image gốc được sử dụng trong quá trình tạo image mới bằng dockerfile

FROM ubuntu:14.04

Bổ sung thông tin về người tạo ra dockerfile này

MAINTAINER phudv

Chạy các lệnh sẽ cài đặt bổ sung gói cho image, giả sử mình muốn tạo image apache.

RUN apt-get update -y && apt-get install apache2 && apt-get clean && rm -rf /var/lib/apt/lists/*

Chỉ định một số cấu hình biến môi trường để apache chạy trong container:

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_SERVERADMIN admin@localhost
ENV APACHE_SERVERNAME localhost
ENV APACHE_SERVERALIAS docker.localhost
ENV APACHE_DOCUMENTROOT /var/www
Cung cấp cổng mà dịch vụ apache trong container kết nối ra ngoài:
EXPOSE 80

Lệnh mà ứng dụng trong container được tạo ra sẽ thực thi:

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

Bây giờ ta sẽ tổng hợp các thành phần rời rạc ở trên thành một tập tin hoàn chỉnh và tạo image:

#!/bin/bash
mkdir -p apache && cd apache

cat << EOF > dockerfile
FROM ubuntu:14.04

MAINTAINER tannt

RUN apt-get update && apt-get install -y apache2 && apt-get clean && rm -rf /var/lib/apt/lists/*

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_SERVERADMIN [email protected]
ENV APACHE_SERVERNAME localhost
ENV APACHE_SERVERALIAS docker.localhost
ENV APACHE_DOCUMENTROOT /var/www

EXPOSE 80

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
EOF

docker build -t apache_test .
  • Trên host, thực hiện lệnh sau để tạo ra một image tên là apache_test
bash dockerfile.sh
  • Kiểm tra image có tên apache_test vừa tạo
docker images
  • Tạo container từ image mới tạo bởi dockerfile
docker run -it apache_test /bin/bash

⭐️ Bạn có thể tìm hiểu về cách viết Dockerfile hiệu quả tại đây

Tổng kết

Ở bài này có một số thông tin chúng ta cần nắm rõ được là:

  • Hiểu được Docker là gì? Tại sao nên dùng Docker? Và hiểu được khi nào nên dùng nó?
  • Các thành phần của Docker và chức năng của chúng.
  • Kiến trúc và quy trình thực hiện của hệ thống Docker
  • Cách cài đặt và chạy Docker.
  • Nắm vững một số lệnh trong Docker.
  • Hiểu hơn về Dockerfile và biết tạo một Dockerfile đơn giản của riêng mình.

Bài viết của mình đến đây là kết thúc. Hi vọng bài viết của mình có thể giúp bạn hiểu rõ hơn về Docker. Bài viết cũng khó tránh khỏi những sai xót, mong mọi người thông cảm, và rất mong những ý kiến đóng góp của mọi người để bài viết được hoàn thiện hơn. Cảm ơn các bạn đã dành thời gian cho bài viết của mình !!!

Tài liệu tham khảo

https://docs.docker.com/

https://viblo.asia/p/docker-chua-biet-gi-den-biet-dung-phan-1-lich-su-ByEZkWrEZQ0