Docker 实践与应用举例

发布于:2025-03-10 ⋅ 阅读:(23) ⋅ 点赞:(0)

一、引言

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

二、Docker 实践基础

(一)安装 Docker

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

  • Linux 系统:不同的 Linux 发行版安装方式略有不同。例如,在 Ubuntu 系统上,可参考Ubuntu 官方安装文档。在 CentOS 系统上,安装教程见CentOS 官方安装文档 。安装步骤一般包括更新系统软件包索引,添加 Docker 官方软件源,然后执行安装命令等。
  • Windows 系统:需要先确保系统满足一定的硬件要求(如支持 Hyper - V 虚拟化技术),安装教程可参考Docker Desktop for Windows 官方文档 。安装过程中,可能需要启用一些系统功能,如 Hyper - V,安装完成后即可在 Windows 系统中使用 Docker。
  • Mac 系统Docker Desktop for 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指令定义了容器启动时要执行的命令。
2. 容器(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!”。
3. 重点

  • 正确配置 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,展示连接成功的界面]
3. 重点

  • 设置合适的密码:密码是数据库安全的重要防线。设置过于简单的密码容易导致数据库被破解,因此要选择一个强度足够的密码,包含字母、数字、特殊字符等。同时,要注意在不同环境(如开发、测试、生产)中使用不同的密码,并妥善保管密码。
  • 数据卷挂载:默认情况下,容器内的数据在容器删除时会丢失。为了持久化存储 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 Docs
    Docker 官方文档是学习和使用 Docker 的重要资源,它包含了详细的安装指南、命令参考、最佳实践等内容。无论是初学者还是有经验的开发者,都能从官方文档中获取到有用的信息。
  2. Docker Hubhttps://hub.docker.com/
    Docker Hub 是一个公共的镜像仓库,用户可以在上面搜索、下载各种官方和社区贡献的镜像。同时,用户也可以将自己构建的镜像推送到 Docker Hub 上,方便在不同环境中使用。
  3. 更多案例Blog | Docker
    Docker 官方博客上发布了大量的案例和技术文章,涵盖了 Docker 在不同领域的应用,如人工智能、大数据、云计算等。通过阅读这些案例,可以拓宽对 Docker 应用场景的理解,学习到更多的实践技巧。

通过以上对 Docker 实践基础的


网站公告

今日签到

点亮在社区的每一天
去签到