介绍
Docker 是部署应用程序的强大工具,但初看之下可能显得有些复杂。本次挑战将引导你通过连接 Docker 容器来构建一个多容器应用程序。我们将从简单的示例入手,逐步深入到更复杂的应用场景。即使你是 Docker 的初学者,也会发现这很容易上手。我们将探索如何让容器之间相互通信,这是使用 Docker 构建健壮应用程序的核心环节。
Docker 是部署应用程序的强大工具,但初看之下可能显得有些复杂。本次挑战将引导你通过连接 Docker 容器来构建一个多容器应用程序。我们将从简单的示例入手,逐步深入到更复杂的应用场景。即使你是 Docker 的初学者,也会发现这很容易上手。我们将探索如何让容器之间相互通信,这是使用 Docker 构建健壮应用程序的核心环节。
在连接容器之前,我们至少需要一个容器化的应用程序。在这一步中,你将为 my-app 镜像创建一个 Dockerfile。这个 Dockerfile 将定义容器内运行的环境和应用程序。
本步骤的目标是为你的 my-app 镜像创建一个 Dockerfile。
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.2
labex: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
打开浏览器并访问 http://localhost:8080 以验证你的应用程序是否正常运行。

现在我们已经有了一个容器化的应用程序,接下来开始连接容器。在这一步中,我们将学习如何连接两个 Docker 容器,使它们能够相互通信。这个过程是在 Docker 中创建多服务应用程序的关键。
将一个 Apache Web 服务器容器与一个 MySQL 数据库容器连接起来。
从 Apache 容器访问 MySQL:
启动一个名为 my_apache 的 Apache 容器,基于 httpd 镜像,将主机端口 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 镜像,并将 MYSQL_ROOT_PASSWORD 环境变量设置为 password。
labex:project/ $ docker ps | grep mysql
0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysql
将 Apache 容器连接到 MySQL 容器。
注意:对于这一步,虽然没有直接的命令输出,但连接信息在容器的环境变量中是可见的。你可以使用 docker inspect my_apache 命令来检查容器。
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 命令行界面(如果你使用了不同的连接方式,则需要调整命令)。
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)]>
在之前步骤的基础上,我们现在将探索如何连接多个容器并利用环境变量进行配置。这一步展示了如何创建更复杂且灵活的多容器环境。
启动三个容器:一个运行 Apache,一个运行 MySQL,还有一个运行自定义应用程序。该自定义应用程序应该能够同时访问 MySQL 和 Apache。
按照步骤 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
使用 curl 通过 Apache 容器访问自定义应用程序。
<html>
<body>
<h1>It works!</h1>
</body>
</html>
在本次挑战中,你学习了如何将 Docker 容器连接在一起以构建多容器应用程序。我们从单个容器开始,进阶到成对连接,最后实现了三个容器的协作。你现在已经了解了如何利用容器连接(links)和 docker exec 命令来实现不同服务之间的通信,从而能够构建更复杂的应用程序。继续实验,祝你玩得开心!