简介
Docker 是用于部署应用的强大工具,但刚开始接触时可能会觉得比较复杂。本挑战将引导你连接 Docker 容器,创建一个多容器应用。我们会先从简单示例开始,再逐步构建更复杂的应用。即使你刚接触 Docker,也可以按照本实验轻松完成操作。你将学习如何让容器彼此通信,这是使用 Docker 构建可靠应用的基础。
使用 Dockerfile 创建镜像
在连接容器之前,至少需要准备一个容器化应用。在本步骤中,你将为 my-app 镜像创建 Dockerfile。该 Dockerfile 用于定义容器中的运行环境,以及容器启动时要运行的应用。
任务
本步骤的目标是为 my-app 镜像创建 Dockerfile。
要求
- 你的机器上必须已安装 Docker。
- 你应该已有一个要进行容器化的
my-app应用。
提示
- 在构建并运行容器之前,先定义镜像所需的输入内容。
示例结果
创建挑战所需的文件:
在
/home/labex/project/路径下创建名为Dockerfile的新文件,内容如下:- 使用
python:3.7-slim作为基础镜像。 - 将工作目录设置为
/app。 - 将当前目录的内容复制到容器中的
/app。 - 安装所需的软件包。
- 将端口
80暴露给外部。 - 定义一个环境变量(虽然本示例不会使用它,但请保留此指令)。
- 容器启动时运行
app.py。
在项目目录
/home/labex/project/中创建app.py文件,内容如下:import os os.system("wssh --address='0.0.0.0' --port=80")在项目目录
/home/labex/project/中创建requirements.txt文件,内容如下:webssh==1.6.2labex:project/ $ pwd /home/labex/project labex:project/ $ ll total 12K -rw-r--r-- 1 labex labex 59 Jan 24 15:21 app.py -rw-r--r-- 1 labex labex 163 Jan 24 15:19 Dockerfile -rw-r--r-- 1 labex labex 14 Jan 24 15:21 requirements.txt- 使用
使用
docker build命令构建my-app镜像。labex:project/ $ docker images | grep my-app my-app latest 266edf714faf 30 seconds ago 170MB使用
my-app镜像启动新容器,并记录端口映射关系。labex:project/ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11f06f08d2d3 my-app "python app.py" 4 seconds ago Up 4 seconds 0.0.0.0:8080- hopeful_elgamal > 80/tcp打开 Web 浏览器,访问
http://localhost:8080,确认应用正在正常运行。
连接两个 Docker 容器
现在你已经有了一个容器化应用,接下来开始学习如何连接容器。在本步骤中,你将学习如何连接两个 Docker 容器,使它们能够彼此通信。这是使用 Docker 创建多服务应用的关键过程。
任务
启动 Apache 和 MySQL 服务容器,然后启动一个连接到这两个服务的 my_app 容器,以便从 my_app 内部测试 MySQL 连接。
要求
- 你需要两个 Docker 容器:一个运行 Apache,另一个运行 MySQL。
- 再启动一个
my_app容器,并将其连接到 Apache 和 MySQL 容器。 - 在测试数据库连接之前,先在
my_app中安装 MySQL 客户端。 - 你的机器上必须已安装 Docker。
提示
- 记得打开一个新的终端来完成本步骤,避免与上一个容器发生冲突。
示例结果
将 my_app 连接到两个服务后,从该容器访问 MySQL:
基于
httpd镜像启动名为my_apache的 Apache 容器,将主机的80端口映射到容器的80端口。labex:project/ $ docker ps | grep my_apache a91a93216e84 httpd "httpd-foreground" 52 seconds ago Up 47 seconds 0.0.0.0:80- my_apache > 80/tcp启动名为
my_mysql的 MySQL 容器,将MYSQL_ROOT_PASSWORD环境变量设置为password,并使用mysql镜像。labex:project/ $ docker ps | grep mysql 0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysql启动一个同时连接 MySQL 和 Apache 容器的
my_app容器。 注意:连接关系会显示在容器配置中。你可以使用docker inspect my_app查看该配置。labex:project/ $ docker ps | grep my_app 859c201b7267 my-app "python app.py" 53 seconds ago Up 52 seconds 80/tcp my_app使用
docker exec命令,从my_app容器访问 MySQL 命令行界面(如果连接方式不同,需要相应调整命令)。在
my_app中安装 MySQL 客户端,然后连接已连接的 MySQL 服务:labex:project/ $ docker exec -it my_app bash root@859c201b7267:/app## apt-get update && apt install -y default-mysql-client root@859c201b7267:/app## mysql -h mysql -uroot -ppassword Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.3.0 MySQL Community Server - GPL Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
连接多个 Docker 容器并使用环境变量
在上一步的基础上,本部分会加入两个新概念:一个应用容器同时连接两个服务,以及通过环境变量向容器传递连接设置。在步骤 2 中,你只验证了已连接的容器可以彼此访问。在本步骤中,你必须为 my_app2 同时指定两个 --link 选项,并设置用于描述 MySQL 和 Apache 主机的环境变量。
任务
启动三个容器:一个运行 Apache,一个运行 MySQL,另一个运行自定义应用。自定义应用应能够访问 MySQL 和 Apache。
要求
- 你需要三个 Docker 容器:Apache、MySQL 和自定义应用。
- 启动
my_app2时,同时建立两个连接,并设置以下环境变量:DB_HOST=mysql、DB_USER=root、DB_PASSWORD=password和APACHE_HOST=apache。 - 在测试 Apache 连接之前,先在
my_app2中安装curl,因为my-app镜像默认不包含它。 - 你的机器上必须已安装 Docker。
提示
- 可以复用步骤 2 中的服务容器。如果需要确认连接关系或环境变量,请检查新的应用容器。
示例结果
按照步骤 2 中的说明启动 Apache 和 MySQL 容器。
启动名为
my_app2的自定义应用容器,使其能够访问 MySQL 和 Apache。labex:project/ $ docker ps | grep app2 8945b42659a6 my-app "python app.py" 15 seconds ago Up 15 seconds 80/tcp my_app2进入
my_app2,安装curl,然后运行curl http://apache/,确认可以访问已连接的 Apache 容器。<html> <body> <h1>It works!</h1> </body> </html>
总结
在本挑战中,你学习了如何连接 Docker 容器,以创建多容器应用。我们从单个容器开始,逐步完成了两个容器的连接,最后构建了由三个容器组成的环境。现在你已经了解如何利用容器连接和 docker exec 命令实现不同服务之间的通信,从而构建更复杂的应用。继续动手尝试,享受学习过程!



