目录

Docker-实践与应用举例

Docker 实践与应用举例

一、引言

在当今快速发展的信息技术领域,容器化技术已成为推动软件开发、部署和运维变革的关键力量。Docker 作为容器化技术的领军者,以其高效、便捷、可移植等特性,被广泛应用于各种场景。它能够将应用程序及其依赖项打包成一个独立的容器,实现一次构建,到处运行,极大地简化了开发和运维流程,提高了工作效率和应用的稳定性。本文将深入探讨 Docker 的实践与应用,通过丰富的例子、详细的步骤以及相关链接,帮助读者全面掌握 Docker 的使用技巧。

二、Docker 实践基础

(一)安装 Docker

Docker 的安装过程因操作系统而异。以下为常见操作系统的安装教程链接:

  • Linux 系统 :不同的 Linux 发行版安装方式略有不同。例如,在 Ubuntu 系统上,可参考 。在 CentOS 系统上,安装教程见 。安装步骤一般包括更新系统软件包索引,添加 Docker 官方软件源,然后执行安装命令等。
  • Windows 系统 :需要先确保系统满足一定的硬件要求(如支持 Hyper - V 虚拟化技术),安装教程可参考 。安装过程中,可能需要启用一些系统功能,如 Hyper - V,安装完成后即可在 Windows 系统中使用 Docker。
  • Mac 系统 : 提供了详细的安装指南。通常只需下载安装包,按照提示进行安装即可。安装完成后,Docker 会在 Mac 系统中启动并运行。

(二)了解镜像与容器概念

  1. 镜像(Image)

    镜像是 Docker 的基础组件,它是一个只读的模板,包含了运行应用程序所需的所有内容,如操作系统、应用程序代码、依赖库、环境变量等。可以将镜像看作是一个 “软件包”,这个软件包能够在任何支持 Docker 的环境中运行。例如,一个基于 Python 的 Web 应用镜像,它不仅包含了 Python 解释器,还包含了应用程序的源代码以及所有依赖的 Python 库,如 Flask、Django 等。

    镜像通常通过 Dockerfile 来构建。Dockerfile 是一个文本文件,其中包含了一系列指令,用于描述如何构建镜像。例如,下面是一个简单的基于 Python 的 Dockerfile 示例:

# 使用官方的Python基础镜像
FROM python:3.9

# 设置工作目录
WORKDIR /app

# 将当前目录下的所有文件复制到工作目录中
COPY. /app

# 安装应用程序的依赖
RUN pip install -r requirements.txt

# 暴露应用程序的端口
EXPOSE 5000

# 定义容器启动时要执行的命令
CMD ["python", "app.py"]

在这个 Dockerfile 中, FROM 指令指定了基础镜像为官方的 Python 3.9 镜像; WORKDIR 指令设置了容器内的工作目录; COPY 指令将本地的文件复制到容器的工作目录中; RUN 指令用于在构建镜像时执行命令,这里是安装应用程序的依赖; EXPOSE 指令声明容器运行时会监听的端口; CMD 指令定义了容器启动时要执行的命令。

容器(Container)

容器是镜像的运行实例。当我们基于一个镜像创建并启动容器时,Docker 会为容器分配独立的运行环境,包括文件系统、网络、进程空间等。容器之间相互隔离,互不影响,就好像运行在独立的虚拟机中一样,但相比虚拟机,容器的启动速度更快,资源占用更少。

例如,我们基于上面构建的 Python 应用镜像启动一个容器,这个容器就会运行我们的 Python Web 应用程序,并且监听在指定的端口(如 5000 端口)。可以通过命令行工具或者 Docker API 来管理容器的启动、停止、重启、删除等操作。例如,使用 docker run 命令可以启动一个容器, docker stop 命令可以停止正在运行的容器, docker rm 命令可以删除容器。

三、Docker 应用举例

(一)Web 应用部署

  1. 例子 :部署一个简单的 Flask 应用

    Flask 是一个轻量级的 Python Web 框架,非常适合用于快速开发 Web 应用。下面我们将通过 Docker 来部署一个简单的 Flask 应用。

  2. 步骤

    • 编写 Flask 应用代码

      首先,我们需要编写一个简单的 Flask 应用代码。创建一个名为 app.py 的文件,内容如下:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Docker!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

这段代码定义了一个简单的 Flask 应用,当访问根路径时,返回 “Hello, Docker!”。同时,设置应用监听在 0.0.0.0 地址的 5000 端口上,这样可以使应用在容器外部也能被访问到。[此处可插入 app.py 代码的截图 flask_app_code.png,展示代码的编写情况]

  • 创建 Dockerfile

    接下来,我们创建一个 Dockerfile 来构建这个 Flask 应用的镜像。在与 app.py 相同的目录下,创建一个名为 Dockerfile 的文件,内容如下:

# 使用官方的Python基础镜像
FROM python:3.9

# 设置工作目录
WORKDIR /app

# 将当前目录下的所有文件复制到工作目录中
COPY. /app

# 安装应用程序的依赖
RUN pip install -r requirements.txt

# 暴露应用程序的端口
EXPOSE 5000

# 定义容器启动时要执行的命令
CMD ["python", "app.py"]

在这个 Dockerfile 中,我们首先指定了基础镜像是官方的 Python 3.9 镜像。然后设置了容器内的工作目录为 /app ,并将当前目录下的所有文件复制到这个工作目录中。接着,通过 RUN 指令安装应用程序的依赖,这里假设我们有一个 requirements.txt 文件列出了所有依赖的 Python 库。最后,使用 EXPOSE 指令暴露应用程序的 5000 端口,并通过 CMD 指令定义容器启动时要执行的命令为运行 app.py 文件。[此处可插入 Dockerfile 的截图 dockerfile_flask.png,展示 Dockerfile 的内容]

  • 构建镜像

    在包含 app.pyDockerfile 的目录下,打开命令行终端,执行以下命令来构建镜像:

docker build -t flask-app.

这里的 -t 参数用于给镜像指定一个标签(tag), flask-app 是我们给镜像起的名字,最后的 . 表示构建上下文为当前目录。在构建过程中,Docker 会按照 Dockerfile 中的指令依次执行,下载基础镜像、安装依赖、复制文件等。构建完成后,我们可以通过 docker images 命令查看本地已经构建好的镜像列表,应该能看到名为 flask-app 的镜像。

  • 运行容器

    镜像构建完成后,我们可以使用以下命令来运行容器:

docker run -p 5000:5000 flask-app

这里的 -p 参数用于将容器内部的端口映射到宿主机的端口,前面的 5000 是宿主机的端口,后面的 5000 是容器内部的端口。这样,我们就可以通过访问宿主机的 5000 端口来访问容器内运行的 Flask 应用了。在浏览器中输入 http://localhost:5000 ,应该能看到页面显示 “Hello, Docker!”。

重点

  • 正确配置 Dockerfile :Dockerfile 中的指令顺序和参数设置非常重要。例如,基础镜像的选择要根据应用程序的需求来确定,如果应用程序依赖特定版本的操作系统或软件库,就需要选择合适的基础镜像。在安装依赖时,要确保 requirements.txt 文件准确列出了所有依赖的库及其版本,并且安装命令正确执行。
  • 确保应用依赖安装 :在构建镜像时,依赖的安装过程可能会因为网络问题、库版本冲突等原因失败。如果依赖安装不完整,容器启动后应用程序可能无法正常运行。可以通过在 Dockerfile 中添加调试指令,如在 RUN 指令后添加 && echo "Dependency installation completed" ,来检查依赖安装是否成功。同时,要注意依赖库的版本兼容性,避免因版本问题导致应用程序出现运行时错误。

(二)数据库服务

  1. 例子 :运行 MySQL 数据库

    MySQL 是一种广泛使用的关系型数据库管理系统。通过 Docker,我们可以轻松地在本地运行一个 MySQL 数据库实例。

  2. 步骤

    • 拉取 MySQL 镜像

      在命令行终端中执行以下命令来拉取 MySQL 镜像:

docker pull mysql:latest

这里的 mysql:latest 表示拉取 MySQL 的最新版本镜像。如果需要拉取特定版本的镜像,可以将 latest 替换为具体的版本号,如 mysql:8.0.26 。拉取过程中,Docker 会从 Docker Hub(一个公共的镜像仓库)下载 MySQL 镜像及其依赖的层。

  • 运行容器并设置环境变量

    拉取镜像完成后,使用以下命令来运行 MySQL 容器:

docker run -d \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=rootpassword \
    -e MYSQL_DATABASE=mydatabase \
    -e MYSQL_USER=myuser \
    -e MYSQL_PASSWORD=mypassword \
    --name mysql-container \
    mysql:latest

在这个命令中:

  • -d 参数表示在后台运行容器;

  • -p 3306:3306 将容器内部的 3306 端口(MySQL 默认端口)映射到宿主机的 3306 端口,这样我们可以通过宿主机的 3306 端口访问容器内的 MySQL 数据库;

  • -e 参数用于设置环境变量。 MYSQL_ROOT_PASSWORD 设置了 MySQL root 用户的密码为 rootpasswordMYSQL_DATABASE 创建了一个名为 mydatabase 的数据库; MYSQL_USERMYSQL_PASSWORD 分别创建了一个普通用户 myuser 及其密码 mypassword

  • --name 参数为容器指定了一个名称 mysql-container ,方便后续管理。[此处可插入运行命令的截图 run_mysql_command.png,展示命令的输入情况]

  • 连接数据库

    我们可以使用各种数据库客户端工具来连接运行在容器内的 MySQL 数据库。例如,使用 MySQL 命令行客户端,在命令行终端中执行以下命令:

mysql -h 127.0.0.1 -P 3306 -u myuser -p

这里的 -h 参数指定数据库服务器的地址为本地(127.0.0.1), -P 参数指定端口为 3306, -u 参数指定用户名 myuser ,然后输入之前设置的密码 mypassword ,即可连接到容器内的 MySQL 数据库。也可以使用一些图形化的数据库管理工具,如 Navicat、MySQL Workbench 等。在这些工具中,配置连接参数,主机地址为 127.0.0.1,端口为 3306,用户名和密码按照之前设置的填写,即可成功连接。[此处可插入使用 MySQL Workbench 连接数据库的截图 mysql_connection_tool.png,展示连接成功的界面]

重点

  • 设置合适的密码 :密码是数据库安全的重要防线。设置过于简单的密码容易导致数据库被破解,因此要选择一个强度足够的密码,包含字母、数字、特殊字符等。同时,要注意在不同环境(如开发、测试、生产)中使用不同的密码,并妥善保管密码。
  • 数据卷挂载 :默认情况下,容器内的数据在容器删除时会丢失。为了持久化存储 MySQL 的数据,我们可以使用数据卷挂载。例如,在运行容器时添加 -v /host/path:/var/lib/mysql 参数,将宿主机的 /host/path 目录挂载到容器内的 /var/lib/mysql 目录,这样容器内 MySQL 的数据就会存储在宿主机的指定目录中,即使容器被删除,数据也不会丢失。在选择宿主机目录时,要确保该目录有足够的空间,并且目录权限设置正确,避免因权限问题导致 MySQL 无法写入数据。

(三)持续集成 / 持续部署(CI/CD)

  1. 例子 :结合 GitLab CI/CD 部署应用

    GitLab 是一个基于 Git 的代码托管平台,它提供了内置的 CI/CD 功能,方便我们实现应用的持续集成和持续部署。下面以一个 Python Web 应用为例,介绍如何结合 GitLab CI/CD 进行部署。

  2. 步骤

    • 在 GitLab 项目中配置.gitlab-ci.yml

      首先,在我们的 GitLab 项目仓库根目录下创建一个名为 .gitlab-ci.yml 的文件,这个文件用于定义 CI/CD 的流程。以下是一个简单的 .gitlab-ci.yml 文件示例:

image: python:3.9

stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - pip install -r requirements.txt
    - python setup.py sdist
  artifacts:
    paths:
      - dist/

test:
  stage: test
  script:
    - pip install -r requirements.txt
    - pytest tests/

deploy:
  stage: deploy
  script:
    - docker build -t myapp.
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker push $CI_REGISTRY_IMAGE

在这个文件中:

  • image 指定了整个 CI/CD 流程使用的基础镜像为 Python 3.9。

  • stages 定义了 CI/CD 的三个阶段: build (构建)、 test (测试)、 deploy (部署)。

  • build 阶段中, script 部分首先安装应用程序的依赖,然后使用 python setup.py sdist 命令生成源代码分发文件。 artifacts 部分指定将生成的 dist 目录作为构建产物保存,以便后续阶段使用。

  • test 阶段中,同样先安装依赖,然后使用 pytest 命令运行测试用例,测试用例放在 tests 目录中。

  • deploy 阶段中,首先使用 docker build 命令构建应用的 Docker 镜像,然后使用 docker login 命令登录到 GitLab 的容器镜像仓库(需要事先在 GitLab 项目设置中配置好容器镜像仓库的相关信息),最后使用 docker push 命令将构建好的镜像推送到容器镜像仓库。[此处可插入.gitlab-ci.yml 文件的截图 gitlab_ci_yml.png,展示文件内容]

  • 推送代码触发 CI/CD 流程

    当我们在本地开发完成后,将代码推送到 GitLab 仓库。每次代码推送都会触发 GitLab CI/CD 流程。在 GitLab 项目的 CI/CD -> Pipelines 页面中,可以查看 CI/CD 流程的执行状态。如果某个阶段出现错误,流程会停止,我们可以根据错误信息进行排查和修复。例如,如果测试阶段失败,可能是测试用例编写错误或者应用程序代码出现问题。当 CI/CD 流程成功完成后,应用的 Docker 镜像会被推送到容器镜像仓库,我们可以在仓库中查看镜像的版本和详细信息。[此处可插入 GitLab 项目中 CI/CD 流程执行情况的截图 gitlab_ci_cd_flow.png,展示流程的运行状态]

  1. 重点
    • 配置正确的 CI/CD 流程 :CI/CD 流程的配置要根据应用程序的特点和需求来进行。例如,在构建阶段,要确保依赖安装和构建命令正确执行,生成的构建产物符合预期。在测试阶段,要编写足够覆盖应用程序功能的测试用例,并且确保测试环境与实际运行环境尽可能一致。在部署阶段,要正确配置容器镜像仓库的地址、用户名和密码,确保镜像能够成功推送和拉取。
    • 认证与授权 :在 CI/CD 流程中,涉及到与各种服务的交互,如容器镜像仓库、代码仓库等,需要进行认证和授权。在 GitLab 中,通过环境变量(如 $CI_REGISTRY_USER$CI_REGISTRY_PASSWORD )来传递认证信息。要确保这些环境变量的设置正确,并且不要将敏感信息直接硬编码在 .gitlab-ci.yml 文件中,避免信息泄露。同时,要定期更新认证信息,提高安全性。

四、相关链接

  1. Docker 官方文档

    Docker 官方文档是学习和使用 Docker 的重要资源,它包含了详细的安装指南、命令参考、最佳实践等内容。无论是初学者还是有经验的开发者,都能从官方文档中获取到有用的信息。

  2. Docker Hub

    Docker Hub 是一个公共的镜像仓库,用户可以在上面搜索、下载各种官方和社区贡献的镜像。同时,用户也可以将自己构建的镜像推送到 Docker Hub 上,方便在不同环境中使用。

  3. 更多案例

    Docker 官方博客上发布了大量的案例和技术文章,涵盖了 Docker 在不同领域的应用,如人工智能、大数据、云计算等。通过阅读这些案例,可以拓宽对 Docker 应用场景的理解,学习到更多的实践技巧。

通过以上对 Docker 实践基础的