Kiến trúc Docker
Docker sử dụng kiến trúc client-server và một API từ xa để quản lý và tạo các Docker container được xây dựng dựa trên các Linux container. Các Docker container được tạo từ các Docker image. Mối quan hệ giữa container và image tương tự như mối quan hệ giữa các đối tượng và lớp trong lập trình hướng đối tượng.
Hình ảnh Docker | Công thức hoặc mẫu để tạo Docker container. Nó bao gồm các bước cài đặt và chạy phần mềm cần thiết. |
Docker Container | Giống như một máy ảo nhỏ được tạo ra từ các chỉ dẫn được tìm thấy trong Docker image bắt nguồn |
Khách hàng Docker | Tiện ích command-line hoặc công cụ khác tận dụng Docker API (https://docs.docker. com/reference/api/docker_remote_api) để giao tiếp với Docker daemon |
Máy chủ Docker | Một máy vật lý hoặc máy ảo đang chạy Docker daemon và chứa các image được lưu trong bộ nhớ cache cũng như các container có thể chạy được tạo từ các image |
Cơ quan đăng ký Docker | Một kho lưu trữ các Docker image có thể được sử dụng để tạo các Docker container. Docker Hub (https://hub.docker.com) là ví dụ xã hội phổ biến nhất về kho lưu trữ Docker. |
Máy Docker | Một tiện ích để quản lý nhiều máy chủ Docker, có thể chạy cục bộ trong VirtualBox hoặc từ xa trong dịch vụ lưu trữ đám mây như Amazon Web Services, Microsoft Azure hoặc Digital Ocean |
Bắt đầu
Cài đặt Docker
curl -sSL https://get.docker.com/ | sh
curl -L https://github.com/docker/machine/releases/
↳download/v0.4.0/docker-machine_linux-amd64 > /
↳usr/local/bin/docker-machine
chmod +x /usr/local/bin/docker-machine
Chạy một Container
docker run hello-world
Quy trình công việc cục bộ điển hình
Docker có một quy trình công việc điển hình cho phép bạn tạo image, kéo image, xuất bản image và chạy các container.
Quy trình công việc Docker điển hình liên quan đến việc xây dựng một image từ Dockerfile, có chỉ dẫn về cách cấu hình một container hoặc kéo một image từ Docker Registry chẳng hạn như Docker Hub. Với image trong môi trường Docker của bạn, bạn có thể chạy image, nó tạo container làm môi trường thời gian chạy với hệ điều hành, phần mềm và các cấu hình được mô tả bằng image. Ví dụ: kết quả của bạn có thể là một container trên hệ điều hành Debian chạy phiên bản MySQL 5.5, nó tạo ra một cơ sở dữ liệu cụ thể với người dùng và các bảng được ứng dụng web của bạn yêu cầu. Các container có thể chạy này có thể được khởi động và dừng giống như khởi động và dừng một máy ảo hoặc máy tính. Nếu cấu hình thủ công hoặc các cài đặt phần mềm được thực hiện, một container sau đó có thể được ghi lại (commit) để tạo ra một image mới mà sau này có thể được sử dụng để tạo container từ nó. Cuối cùng, khi bạn muốn chia sẻ một image với nhóm của mình hoặc với thế giới, bạn có thể đẩy image của mình vào một Docker registry.
Kéo image từ Docker Registry
docker pull mysql
docker pull mysql:5.5.45
Xây dựng image từ một Dockerfile
Nếu bạn không thể tìm thấy thứ mình cần hoặc không tin tưởng vào nguồn của một image bạn tìm thấy trên Docker Hub, bạn luôn có thể tạo image của riêng mình bằng cách tạo một Dockerfile. Dockerfiles chứa các chỉ dẫn để thừa kế từ một image hiện có, nơi bạn có thể thêm phần mềm hoặc tùy chỉnh cấu hình.
Sau đây là một ví dụ đơn giản về những gì bạn có thể tìm thấy trong một tệp có tên Dockerfile:
FROM mysql:5.5.45
RUN echo America/New_York | tee /etc/timezone &&
↳dpkg-reconfigure --frontend noninteractive tzdata
Để tạo image này từ thư mục chứa Dockerfile, hãy chạy lệnh sau:
docker build .
Lệnh này sẽ tạo ra một image không có tên. Bạn có thể thấy nó bằng cách chạy lệnh liệt kê image.
docker images
Điều này hiển thị tất cả các image được lưu trong bộ nhớ cache cục bộ, bao gồm cả những image được tạo bằng lệnh build.
REPOSITORY TAG IMAGE ID VIRTUAL SIZE
<none> <none> 4b9b8b27fb42 214.4 MB
mysql 5.5.45 0da0b10c6fd8 213.5 MB
Như bạn có thể thấy, lệnh build đã tạo ra một image có tên kho lưu trữ và tên thẻ là . Điều này có xu hướng không hữu ích lắm, vì vậy bạn có thể sử dụng tùy chọn –t để đặt tên cho image để dễ sử dụng hơn:
docker build –t est-mysql .
Liệt kê các image một lần nữa, bạn có thể thấy image rõ ràng hơn nhiều.
REPOSITORY TAG IMAGE ID VIRTUAL SIZE
est-mysql latest 4b9b8b27fb42 214.4 MB
mysql 5.5.45 0da0b10c6fd8 213.5 MB
Có một tùy chọn thay thế để tạo image tùy chỉnh bên cạnh việc viết Dockerfile. Bạn có thể chạy một image hiện có với quyền truy cập bash sau đó tùy chỉnh image theo cách thủ công bằng cách cài đặt phần mềm hoặc thay đổi cấu hình. Khi hoàn tất, bạn có thể chạy lệnh commit của docker (docker commit) để tạo image của container đang chạy. Đây không được coi là phương pháp hay nhất vì nó không thể lặp lại hoặc tự ghi lại như sử dụng phương pháp Dockerfile.
Chạy một Image
Để chạy một Docker image, bạn chỉ cần sử dụng lệnh run theo sau là tên image cục bộ hoặc tên được tìm thấy trong Docker Hub. Thông thường, một Docker image sẽ yêu cầu một số biến môi trường bổ sung, có thể được chỉ định bằng tùy chọn -e. Đối với các tiến trình chạy lâu dài như daemon, bạn cũng cần sử dụng tùy chọn –d. Để bắt đầu image est-mysql, bạn sẽ chạy lệnh sau để cấu hình mật khẩu của người dùng root MySQL, như được ghi trong tài liệu kho lưu trữ mysql của Docker Hub:
docker run -e MYSQL_ROOT_PASSWORD=root+1 -d est-
↳mysql
Để xem container đang chạy, bạn có thể sử dụng lệnh Docker ps:
docker ps
Lệnh ps liệt kê tất cả các tiến trình đang chạy, tên image mà chúng được tạo từ đó, lệnh đã chạy, bất kỳ cổng nào mà phần mềm đang lắng nghe và tên của container.
CONTAINER ID IMAGE COMMAND
30645f307114 est-mysql “/entrypoint.sh mysql”
PORTS NAMES
3306/tcp serene_brahmagupta
Như bạn có thể thấy từ các tiến trình đang chạy ở trên, tên của container là serene_brahmagupta. Đây là tên được tạo tự động và có thể khó duy trì. Vì vậy, nó được coi là phương pháp hay nhất để đặt tên rõ ràng cho container bằng cách sử dụng tùy chọn –name để cung cấp tên của bạn khi khởi động container:
docker run --name my-est-mysql -e MYSQL_ROOT_
↳PASSWORD=root+1 -d est-mysql
Bạn sẽ nhận thấy từ đầu ra ps rằng container đang lắng nghe cổng 3306, nhưng điều đó không có nghĩa là bạn có thể sử dụng dòng lệnh MySQL hoặc MySQL Workbench cục bộ để tương tác với cơ sở dữ liệu, vì cổng đó chỉ có thể truy cập được trong môi trường Docker an toàn mà nó đã được khởi chạy. Để làm cho nó khả dụng bên ngoài môi trường đó, bạn phải ánh xạ các cổng bằng cách sử dụng tùy chọn –p.
docker run --name my-est-mysql -e MYSQL_ROOT_
↳PASSWORD=root+1 -p 3306:3306 -d est-mysql
Bây giờ mysql đang lắng nghe trên một cổng mà bạn có thể kết nối. Nhưng bạn vẫn phải biết địa chỉ IP là gì để kết nối. Để xác định địa chỉ IP, bạn có thể sử dụng lệnh docker-machine ip để biết được nó.
docker-machine ip default
Sử dụng default làm tên máy, là máy mặc định được cài đặt với Docker Toolbox, bạn sẽ nhận được địa chỉ IP của máy đang lưu trữ docker container của bạn.
Với địa chỉ IP, bây giờ bạn có thể kết nối với MySQL bằng dòng lệnh MySQL cục bộ của mình.
mysql -h 192.168.99.100 -u root -proot+1
Dừng và khởi động Container
Bây giờ bạn có một Docker container đang chạy, bạn có thể dừng nó bằng cách sử dụng lệnh stop của Docker và tên container:
docker stop my-est-mysql
Toàn bộ trạng thái của container được ghi lại vào đĩa, vì vậy nếu bạn muốn chạy lại nó ở trạng thái như khi bạn tắt nó, bạn có thể sử dụng lệnh start:
docker start my-est-mysql
Gắn thẻ một Image
Bây giờ bạn có một image mà bạn đã chạy và xác thực, bạn nên gắn thẻ nó bằng tên người dùng, tên image và số phiên bản trước khi đẩy nó vào kho lưu trữ. Bạn có thể thực hiện điều này bằng cách sử dụng lệnh Docker tag:
docker tag est-mysql javajudd/est-mysql:1.0
Đẩy Image vào kho lưu trữ
Cuối cùng, bạn đã sẵn sàng để đẩy image của mình lên Docker Hub để cả thế giới sử dụng hoặc nhóm của bạn sử dụng thông qua một kho lưu trữ riêng tư. Đầu tiên, nếu bạn chưa làm như vậy, bạn sẽ cần truy cập https://hub.docker.com/ để tạo một tài khoản miễn phí. Tiếp theo bạn cần đăng nhập bằng lệnh login.
docker login
Khi được nhắc, hãy nhập tên người dùng, mật khẩu và địa chỉ email mà bạn đã đăng ký.
Bây giờ đẩy image của bạn bằng cách sử dụng lệnh push, chỉ định tên người dùng, tên image và số phiên bản của bạn.
docker push javajudd/est-mysql:1.0
Sau một thời gian, bạn sẽ nhận được thông báo rằng kho lưu trữ đã được đẩy thành công. Nếu bạn đăng nhập lại vào tài khoản Docker Hub của mình, bạn sẽ thấy kho lưu trữ mới.
Các lệnh hữu ích khác
Liệt kê Containers
Bạn đã thấy cách lệnh ps có thể liệt kê các container đang chạy, nhưng còn tất cả các container, bất kể trạng thái của chúng thì sao? Bằng cách thêm tùy chọn –a, bạn có thể xem tất cả chúng.
docker ps -a
Xóa Containers
Khi bạn sử dụng xong một container, thay vì để nó nằm xung quanh, bạn sẽ muốn loại bỏ nó để lấy lại không gian đĩa. Để xóa một container, bạn có thể sử dụng lệnh rm:
docker rm my-est-mysql
Xóa Images
Bạn đã thấy cách lệnh images có thể liệt kê tất cả các image được lưu trong bộ nhớ cache cục bộ. Những image này có thể chiếm một lượng đáng kể dung lượng, từ một megabyte đến vài trăm megabyte, vì vậy bạn sẽ muốn xóa những image không mong muốn bằng lệnh rmi:
docker rmi est-mysql
Trong chu kỳ gỡ lỗi khi tạo image mới, bạn có thể tạo ra một lượng lớn image không mong muốn và không được đặt tên, được ký hiệu bằng tên là . Bạn có thể dễ dàng loại bỏ tất cả các image treo lơ lửng bằng lệnh sau:
docker rmi $(docker images -q -f dangling=true)
Liệt kê các cổng
Thường sẽ hữu ích khi biết những cổng nào được tiếp xúc bởi container, chẳng hạn như cổng 3306 để truy cập cơ sở dữ liệu MySQL hoặc cổng 80 để truy cập máy chủ web. Lệnh port có thể được sử dụng để hiển thị các cổng tiếp xúc.
docker port my-est-mysql
Liệt kê các tiến trình
Nếu bạn cần xem các tiến trình đang chạy trong một container, bạn có thể sử dụng lệnh top (tương tự như chạy lệnh top của Linux):
docker top my-est-mysql
Thực thi các lệnh
Bạn có thể thực thi các lệnh trong một container đang chạy bằng cách sử dụng lệnh exec. Ví dụ: để liệt kê nội dung của thư mục gốc của ổ cứng, bạn có thể làm như sau:
docker exec my-est-mysql ls /
Nếu bạn muốn ssh dưới dạng root vào container, có một lệnh exec tương đương mà bạn có thể chạy để có quyền truy cập vào bash shell và vì tất cả các giao tiếp giữa Docker client và Docker daemon đã được mã hóa nên nó được bảo mật.
docker exec -it my-est-mysql bash
Chạy Container
Lệnh run là lệnh phức tạp và đặc trưng nhất trong tất cả các lệnh Docker. Nó có thể được sử dụng để làm những việc như quản lý các cài đặt mạng; quản lý các tài nguyên hệ thống như bộ nhớ, CPU và hệ thống tệp; và cấu hình an ninh. Truy cập https://docs.docker.com/reference/run/ để xem tất cả các tùy chọn có sẵn.
Dockerfile
Chỉ dẫn
INSTRUCTION | DESCRIPTION |
FROM | Đây phải là chỉ dẫn đầu tiên trong Dockerfile và xác định image để thừa kế từ |
MAINTAINER | Cung cấp một cách rõ ràng và tín nhiệm cho tác giả của image |
RUN | Thực thi một lệnh Linux để định cấu hình và cài đặt |
ENTRYPOINT | Tập lệnh hoặc ứng dụng cuối cùng được sử dụng để khởi động container, làm cho nó trở thành ứng dụng thực thi |
CMD | Cung cấp các đối số mặc định cho ENTRYPOINT bằng cách sử dụng định dạng mảng JSON |
LABEL | Siêu dữ liệu tên / giá trị về image |
ENV | Đặt các biến môi trường |
COPY | Sao chép tệp vào container |
ADD | Thay thế để sao chép |
WORKDIR | Đặt thư mục làm việc cho các lệnh RUN, CMD, ENTRYPOINT, COPY và / hoặc ADD |
EXPOSE | Các cổng mà container sẽ lắng nghe |
VOLUME | Tạo điểm gắn kết |
USER | Người dùng chạy chỉ dẫn RUN, CMD và / hoặc ENTRYPOINT |
Ví dụ về Dockerfile
FROM debian:jessie
RUN groupadd -r mysql && useradd -r -g mysql
↳mysql
RUN mkdir /docker-entrypoint-initdb.d
RUN apt-get update && apt-get install -y perl
↳--no-install-recommends && rm -rf /var/lib/apt/
↳lists/*
RUN apt-get update && apt-get install -y libaio1
↳&& rm -rf /var/lib/apt/lists/*
RUN gpg --keyserver ha.pool.
↳sks-keyservers.net --recv-keys
↳A4A9406876FCBD3C456770C88C718D3B5072E1F5
ENV MYSQL_MAJOR 5.5
ENV MYSQL_VERSION 5.5.45
RUN apt-get update && apt-get install -y curl
↳--no-install-recommends && rm -rf /var/lib/apt/
↳lists/* \
&& curl -SL “http://dev.mysql.com/get/
↳Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_
↳VERSION-linux2.6-x86_64.tar.gz” -o mysql.tar.gz \
&& curl -SL “http://mysql.he.net/Downloads/
↳MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-
↳linux2.6-x86_64.tar.gz.asc” -o mysql.tar.gz.asc \
&& apt-get purge -y --auto-remove curl \
&& gpg --verify mysql.tar.gz.asc \
&& mkdir /usr/local/mysql \
&& tar -xzf mysql.tar.gz -C /usr/local/mysql
↳--strip-components=1 \
&& rm mysql.tar.gz* \
# continued ->
&& rm -rf /usr/local/mysql/mysql-test /usr/
↳local/mysql/sql-bench \
&& rm -rf /usr/local/mysql/bin/*-debug /usr/
↳local/mysql/bin/*_embedded \
&& find /usr/local/mysql -type f -name “*.a”
↳-delete \
&& apt-get update && apt-get install -y
↳binutils && rm -rf /var/lib/apt/lists/* \
&& { find /usr/local/mysql -type f -executable
↳-exec strip --strip-all ‘{}’ + || true; } \
&& apt-get purge -y --auto-remove binutils
ENV PATH $PATH:/usr/local/mysql/bin:/usr/local/
↳mysql/scripts
RUN mkdir -p /etc/mysql/conf.d \
&& { \
echo ‘[mysqld]’; \
echo ‘skip-host-cache’; \
echo ‘skip-name-resolve’; \
echo ‘user = mysql’; \
echo ‘datadir = /var/lib/mysql’; \
echo ‘!includedir /etc/mysql/conf.d/’; \
} > /etc/mysql/my.cnf
VOLUME /var/lib/mysql
COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT [“/entrypoint.sh”]
EXPOSE 3306
CMD [“mysqld”]
Máy Docker
Docker Machine là một tiện ích dòng lệnh khác được sử dụng để quản lý một hoặc nhiều máy cục bộ hoặc máy từ xa. Các máy cục bộ thường được chạy trong các phiên bản VirtualBox riêng biệt. Các máy từ xa có thể được lưu trữ trên các nhà cung cấp dịch vụ đám mây như Amazon Web Services (AWS), Digital Ocean hoặc Microsoft Azure.
Tạo máy cục bộ
Khi cài đặt Docker Toolbox, bạn sẽ nhận được một Docker Machine mặc định có tên là “default.”. Điều này rất dễ sử dụng để bắt đầu, nhưng tại một số thời điểm, bạn có thể cần nhiều máy để phân đoạn các container khác nhau mà bạn đang chạy. Bạn có thể sử dụng lệnh docker-machine create để thực hiện việc này:
docker-machine create -d virtualbox qa
Điều này tạo ra một máy cục bộ mới bằng cách sử dụng một VirtualBox image có tên là “qa.”
Liệt kê máy
Nếu bạn cần xem những máy nào bạn đã cấu hình, bạn có thể chạy lệnh docker-machine ls:
docker-machine ls
Khởi động và dừng máy
Các Docker Machine có thể được khởi động bằng lệnh docker-machine start.
docker-machine start qa
Khi máy được khởi động, bạn phải cấu hình dòng lệnh Docker mà Docker Daemon sẽ tương tác với. Bạn có thể thực hiện việc này bằng cách sử dụng lệnh docker-machine env và định giá nó bằng eval.
docker-machine env qa
eval “$(docker-machine env qa)”
Để dừng máy, hãy sử dụng lệnh docker-machine stop.
docker-machine stop qa