Categories
Software Architecture

Sử Dụng Docker

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.

Kiến trúc Docker.

Hình ảnh DockerCô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 ContainerGiố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 DockerTiệ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ủ DockerMộ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ý DockerMộ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 DockerMộ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 cục bộ điển hình.

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.

Đẩy Image vào kho lưu trữ.

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

INSTRUCTIONDESCRIPTION
FROMĐây phải là chỉ dẫn đầu tiên trong Dockerfile và xác định image để thừa kế từ
MAINTAINERCung cấp một cách rõ ràng và tín nhiệm cho tác giả của image
RUNThực thi một lệnh Linux để định cấu hình và cài đặt
ENTRYPOINTTậ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
CMDCung cấp các đối số mặc định cho ENTRYPOINT bằng cách sử dụng định dạng mảng JSON
LABELSiêu dữ liệu tên / giá trị về image
ENVĐặt các biến môi trường
COPYSao chép tệp vào container
ADDThay 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
EXPOSECác cổng mà container sẽ lắng nghe
VOLUMETạo điểm gắn kết
USERNgườ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

Leave a Reply

Your email address will not be published. Required fields are marked *