Docker 实践与应用举例

一、引言

在当今快速发展的信息技术领域,容器化技术已成为推动软件开发、部署和运维变革的关键力量。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指令定义了容器启动时要执行的命令。

  1. 容器(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!"。

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

  1. 重点
  • 设置合适的密码:密码是数据库安全的重要防线。设置过于简单的密码容易导致数据库被破解,因此要选择一个强度足够的密码,包含字母、数字、特殊字符等。同时,要注意在不同环境(如开发、测试、生产)中使用不同的密码,并妥善保管密码。
  • 数据卷挂载 :默认情况下,容器内的数据在容器删除时会丢失。为了持久化存储 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 实践基础的

相关推荐
不学无术の码农4 小时前
Ubuntu 22.04 (WSL2) 上使用 Docker 安装 Nacos 3.0.0
ubuntu·docker
AnnyYoung5 小时前
从Dockerfile 构建docker镜像——保姆级教程
docker·容器·eureka
何怀逸6 小时前
安装 Docker
运维·docker·容器
码码哈哈0.06 小时前
2025最新:3分钟使用Docker快速部署单节点Redis
redis·docker·eureka
Sahas10198 小时前
debian安装docker
docker·eureka·debian
may_一一9 小时前
Docker中mysql镜像保存与导入
mysql·docker·容器
liuze4089 小时前
使用 docker 安装 nacos3.x
运维·docker·容器
家庭云计算专家10 小时前
一键设置动态域名+ipv6内网直通访问ssh服务-家庭云计算专家
运维·docker·容器·云计算·ssh·onlyoffice
Kendra91911 小时前
Docker 容器 - Dockerfile
java·docker·eureka
YJII11 小时前
Docker封装深度学习模型
运维·docker·容器