使用 Link 连接容器

DockerBeginner
立即练习

简介

Docker 是用于部署应用的强大工具,但刚开始接触时可能会觉得比较复杂。本挑战将引导你连接 Docker 容器,创建一个多容器应用。我们会先从简单示例开始,再逐步构建更复杂的应用。即使你刚接触 Docker,也可以按照本实验轻松完成操作。你将学习如何让容器彼此通信,这是使用 Docker 构建可靠应用的基础。

使用 Dockerfile 创建镜像

在连接容器之前,至少需要准备一个容器化应用。在本步骤中,你将为 my-app 镜像创建 Dockerfile。该 Dockerfile 用于定义容器中的运行环境,以及容器启动时要运行的应用。

任务

本步骤的目标是为 my-app 镜像创建 Dockerfile。

要求

  • 你的机器上必须已安装 Docker。
  • 你应该已有一个要进行容器化的 my-app 应用。

提示

  • 在构建并运行容器之前,先定义镜像所需的输入内容。

示例结果

  1. 创建挑战所需的文件:

    /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
    
  2. 使用 docker build 命令构建 my-app 镜像。

    labex:project/ $ docker images | grep my-app
    my-app latest 266edf714faf 30 seconds ago 170MB
    
  3. 使用 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
    
  4. 打开 Web 浏览器,访问 http://localhost:8080,确认应用正在正常运行。

    在浏览器中运行的 Web 应用

连接两个 Docker 容器

现在你已经有了一个容器化应用,接下来开始学习如何连接容器。在本步骤中,你将学习如何连接两个 Docker 容器,使它们能够彼此通信。这是使用 Docker 创建多服务应用的关键过程。

任务

启动 Apache 和 MySQL 服务容器,然后启动一个连接到这两个服务的 my_app 容器,以便从 my_app 内部测试 MySQL 连接。

要求

  • 你需要两个 Docker 容器:一个运行 Apache,另一个运行 MySQL。
  • 再启动一个 my_app 容器,并将其连接到 Apache 和 MySQL 容器。
  • 在测试数据库连接之前,先在 my_app 中安装 MySQL 客户端。
  • 你的机器上必须已安装 Docker。

提示

  • 记得打开一个新的终端来完成本步骤,避免与上一个容器发生冲突。

示例结果

my_app 连接到两个服务后,从该容器访问 MySQL:

  1. 基于 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
    
  2. 启动名为 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
    
  3. 启动一个同时连接 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
    
  4. 使用 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=mysqlDB_USER=rootDB_PASSWORD=passwordAPACHE_HOST=apache
  • 在测试 Apache 连接之前,先在 my_app2 中安装 curl,因为 my-app 镜像默认不包含它。
  • 你的机器上必须已安装 Docker。

提示

  • 可以复用步骤 2 中的服务容器。如果需要确认连接关系或环境变量,请检查新的应用容器。

示例结果

  1. 按照步骤 2 中的说明启动 Apache 和 MySQL 容器。

  2. 启动名为 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
    
  3. 进入 my_app2,安装 curl,然后运行 curl http://apache/,确认可以访问已连接的 Apache 容器。

    <html>
      <body>
        <h1>It works!</h1>
      </body>
    </html>
    

总结

在本挑战中,你学习了如何连接 Docker 容器,以创建多容器应用。我们从单个容器开始,逐步完成了两个容器的连接,最后构建了由三个容器组成的环境。现在你已经了解如何利用容器连接和 docker exec 命令实现不同服务之间的通信,从而构建更复杂的应用。继续动手尝试,享受学习过程!

✨ 查看解决方案并练习✨ 查看解决方案并练习✨ 查看解决方案并练习