在当今快速发展的信息技术领域,容器化技术已成为推动软件开发、部署和运维变革的关键力量。Docker 作为容器化技术的领军者,以其高效、便捷、可移植等特性,被广泛应用于各种场景。它能够将应用程序及其依赖项打包成一个独立的容器,实现一次构建,到处运行,极大地简化了开发和运维流程,提高了工作效率和应用的稳定性。本文将深入探讨 Docker 的实践与应用,通过丰富的例子、详细的步骤以及相关链接,帮助读者全面掌握 Docker 的使用技巧。
Docker 的安装过程因操作系统而异。以下为常见操作系统的安装教程链接:
# 使用官方的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
命令可以删除容器。
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,展示代码的编写情况]
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.py
和Dockerfile
的目录下,打开命令行终端,执行以下命令来构建镜像: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. 重点
requirements.txt
文件准确列出了所有依赖的库及其版本,并且安装命令正确执行。RUN
指令后添加&& echo "Dependency installation completed"
,来检查依赖安装是否成功。同时,要注意依赖库的版本兼容性,避免因版本问题导致应用程序出现运行时错误。docker pull mysql:latest
这里的mysql:latest
表示拉取 MySQL 的最新版本镜像。如果需要拉取特定版本的镜像,可以将latest
替换为具体的版本号,如mysql:8.0.26
。拉取过程中,Docker 会从 Docker Hub(一个公共的镜像仓库)下载 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 用户的密码为rootpassword
;MYSQL_DATABASE
创建了一个名为mydatabase
的数据库;MYSQL_USER
和MYSQL_PASSWORD
分别创建了一个普通用户myuser
及其密码mypassword
;--name
参数为容器指定了一个名称mysql-container
,方便后续管理。[此处可插入运行命令的截图 run_mysql_command.png,展示命令的输入情况]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. 重点
-v /host/path:/var/lib/mysql
参数,将宿主机的/host/path
目录挂载到容器内的/var/lib/mysql
目录,这样容器内 MySQL 的数据就会存储在宿主机的指定目录中,即使容器被删除,数据也不会丢失。在选择宿主机目录时,要确保该目录有足够的空间,并且目录权限设置正确,避免因权限问题导致 MySQL 无法写入数据。.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_REGISTRY_USER
、$CI_REGISTRY_PASSWORD
)来传递认证信息。要确保这些环境变量的设置正确,并且不要将敏感信息直接硬编码在.gitlab-ci.yml
文件中,避免信息泄露。同时,要定期更新认证信息,提高安全性。通过以上对 Docker 实践基础的