准备 Docker 环境
Linux
# 安装 Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl enable --now docker
# 安装 docker-compose
curl -L https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 验证安装
docker -v
docker-compose -v
# 如失效,自行百度~
MacOS
推荐直接使用 Orbstack。可直接通过 Homebrew 来安装:
brew install orbstack
或者直接下载安装包进行安装。
Windows
我们建议将源代码和其他数据绑定到 Linux 容器中时,将其存储在 Linux 文件系统中,而不是 Windows 文件系统中。
-
docker官网首页https://www.docker.com/ 下载windows版本的Docker Desktop。
-
也可以选择直接使用 WSL 2 后端在 Windows 中安装 Docker Desktop。
-
也可以直接在 WSL 2 中安装命令行版本的 Docker
创建docker-compose.yml文件
新建一个部署项目文件夹,例如myproject
文件夹,进入文件夹,创建一个docker-compose.yml文件,修改docker-compose.yml文件内的配置如下:
version: '1.4'
services:postgres:image: postgres:12.20container_name: postgresrestart: alwaysports: # 生产环境建议不要暴露- "5432:5432"networks:- digital-twinenvironment:POSTGRES_USER: usernamePOSTGRES_PASSWORD: passwordPOSTGRES_DB: postgresvolumes:- ./postgres/data:/var/lib/postgresql/datamongo:image: mongo:8.0container_name: mongorestart: alwaysports:- "27017:27017"networks:- digital-twinenvironment:MONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROOT_PASSWORD: examplevolumes:- ./mongo/data:/data/dbredis:image: redis:7.4.1container_name: redisnetworks:- digital-twinrestart: alwaysports:- "6379:6379"environment:- REDIS_PASSWORD=tarzan123456command: >sh -c "redis-server --requirepass $$REDIS_PASSWORD"volumes:- ./redis/data:/data # 持久化数据,将容器内的 /data 目录映射到宿主机的当前目录下的 data 文件夹web:image: nginx:1.26.2container_name: nginx-webvolumes:- ./nginx/nginx.conf:/etc/nginx/nginx.conf- ./nginx/html:/usr/share/nginx/html- ./nginx/logs:/var/log/nginxports:- "80:80"networks:- digital-twindigital-twin:container_name: coalface-safetyimage: tarzan/coalface-safety:v1.4ports:- "12000:12000"networks:- digital-twindepends_on:- mongo- postgres- redisrestart: alwaysenvironment:- SPRING_DATA_MONGODB_URI=mongodb://root:example@mongo:27017/work_face?authSource=admin- SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/coalface_safety- SPRING_DATASOURCE_USERNAME=username- SPRING_DATASOURCE_PASSWORD=password- SPRING_REDIS_HOST=redis- SPRING_REDIS_PASSWORD=tarzan123456- OPC_TCP=opc.tcp://10.16.91.47:12685
networks:digital-twin:
配置解读
这份 docker-compose.yml
文件定义了一个多服务的 Docker 组合,用于部署一个包含 PostgreSQL、MongoDB、Redis 和 Nginx 的 Web 应用程序,以及一个名为 digital-twin
的自定义应用。下面是对该文件的逐行详细解读:
版本声明
version: '1.4'
指定了此 docker-compose
文件遵循的是版本 1.4
的规范。不同的版本之间可能存在语法差异,因此指定版本是非常重要的。
服务定义
services:
这是所有服务的开始标签,每个服务都是一个独立运行的应用程序或数据库实例。
PostgreSQL 数据库
postgres:image: postgres:12.20container_name: postgresrestart: alwaysports:- "5432:5432"networks:- digital-twinenvironment:POSTGRES_USER: usernamePOSTGRES_PASSWORD: passwordPOSTGRES_DB: postgresvolumes:- ./postgres/data:/var/lib/postgresql/data
image
: 使用的镜像是postgres:12.20
,即 PostgreSQL 数据库的版本 12.20。container_name
: 容器启动后,其名称将设置为postgres
。restart
: 设置为always
,意味着无论退出代码为何,Docker 都会自动重启容器。ports
: 将容器内的端口5432
映射到宿主机的端口5432
。networks
: 容器将连接到名为digital-twin
的网络。environment
: 设置了 PostgreSQL 的环境变量,包括用户名、密码和初始创建的数据库名。volumes
: 将本地文件夹./postgres/data
映射到容器内的/var/lib/postgresql/data
,以便持久化存储数据库文件。
MongoDB 数据库
mongo:image: mongo:8.0container_name: mongorestart: alwaysports:- "27017:27017"networks:- digital-twinenvironment:MONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROOT_PASSWORD: examplevolumes:- ./mongo/data:/data/db
image
: 使用的镜像是mongo:8.0
。container_name
: 容器启动后,其名称将设置为mongo
。restart
: 设置为always
。ports
: 将容器内的端口27017
映射到宿主机的端口27017
。networks
: 容器将连接到名为digital-twin
的网络。environment
: 设置了 MongoDB 的环境变量,包括初始化用户和密码。volumes
: 将本地文件夹./mongo/data
映射到容器内的/data/db
。
Redis 缓存服务器
redis:image: redis:7.4.1container_name: redisnetworks:- digital-twinrestart: alwaysports:- "6379:6379"environment:- REDIS_PASSWORD=tarzan123456command: >sh -c "redis-server --requirepass $$REDIS_PASSWORD"volumes:- ./redis/data:/data
image
: 使用的镜像是redis:7.4.1
。container_name
: 容器启动后,其名称将设置为redis
。networks
: 容器将连接到名为digital-twin
的网络。restart
: 设置为always
。ports
: 将容器内的端口6379
映射到宿主机的端口6379
。environment
: 设置了 Redis 的密码环境变量。command
: 启动 Redis 服务时需要提供密码。volumes
: 将本地文件夹./redis/data
映射到容器内的/data
。
Nginx Web 服务器
web:image: nginx:1.26.2container_name: nginx-webvolumes:- ./nginx/nginx.conf:/etc/nginx/nginx.conf- ./nginx/html:/usr/share/nginx/html- ./nginx/logs:/var/log/nginxports:- "8080:80"networks:- digital-twin
image
: 使用的镜像是nginx:1.26.2
。container_name
: 容器启动后,其名称将设置为nginx-web
。volumes
: 映射了 Nginx 的配置文件、静态文件目录和日志目录。ports
: 将容器内的端口80
映射到宿主机的端口8080
。networks
: 容器将连接到名为digital-twin
的网络。
自定义应用 digital-twin
digital-twin:container_name: coalface-safetyimage: tarzan/coalface-safety:v1.4ports:- "12000:12000"networks:- digital-twindepends_on:- mongo- postgres- redisrestart: alwaysenvironment:- SPRING_DATA_MONGODB_URI=mongodb://root:example@mongo:27017/work_face?authSource=admin- SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/coalface_safety- SPRING_DATASOURCE_USERNAME=username- SPRING_DATASOURCE_PASSWORD=password- SPRING_REDIS_HOST=redis- SPRING_REDIS_PASSWORD=tarzan123456- OPC_TCP=opc.tcp://10.16.91.47:12685
image
: 使用的镜像是tarzan/coalface-safety:v1.4
。container_name
: 容器启动后,其名称将设置为coalface-safety
。ports
: 将容器内的端口12000
映射到宿主机的端口12000
。networks
: 容器将连接到名为digital-twin
的网络。depends_on
: 指定了依赖的服务列表,这些服务在启动之前会被先启动。restart
: 设置为always
。environment
: 设置了一系列环境变量,用于配置应用程序连接到 MongoDB、PostgreSQL 和 Redis 的方式,以及其他配置选项如 OPC UA 服务器地址。
网络定义
networks:digital-twin:
这里定义了一个名为 digital-twin
的网络,所有的服务都会连接到这个网络上,以便它们可以互相通信。
启动容器
在 docker-compose.yml
同级目录下执行。请确保docker-compose版本最好在2.17以上,否则可能无法执行自动化命令。
# 启动容器
docker-compose up -d
docker-compose up -d
是一个常用的命令,用于启动并运行 Docker Compose 文件中定义的所有服务。这个命令的具体含义如下:
docker-compose
这是调用 Docker Compose 工具的命令。Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过使用 YAML 文件来配置应用程序的服务,你可以轻松地管理一个应用的服务群组。
up
up
命令是 Docker Compose 中用来启动和创建项目中的服务。它执行以下操作:
- 构建或者重新构建服务中定义的任何镜像。
- 如果存在已停止的容器,则会启动这些容器。
- 如果没有容器存在,它会创建并启动新的容器。
- 如果有需要更新的容器(例如,如果服务的配置已经改变),它会停止并移除旧的容器,然后创建新的容器。
-d
-d
参数代表“detached”模式,即后台运行模式。这意味着当您运行 docker-compose up -d
命令时,Docker 会在后台启动并运行所有服务,并立即将控制台返回给您,而不是保持控制台占用状态显示服务的日志输出。
总结
所以,当你运行 docker-compose up -d
命令时,实际上是告诉 Docker Compose 根据当前目录下的 docker-compose.yml
文件中的配置,在后台启动并运行所有定义的服务。这对于生产环境中部署应用非常有用,因为您可以立即获得控制台访问权限,而服务则在后台持续运行。
示例命令执行流程
- 解析
docker-compose.yml
文件:Docker Compose 读取docker-compose.yml
文件中的配置信息。 - 构建镜像(如果需要):根据配置文件中的
build
指令构建所需的 Docker 镜像。 - 启动或创建容器:对于每个服务,如果已经有容器存在,则启动这些容器;如果没有,则创建新容器并启动。
- 后台运行:由于
-d
参数的存在,所有服务都在后台运行,不会阻塞终端。
注意事项
- 在使用
docker-compose up -d
命令前,请确保当前工作目录下有一个有效的docker-compose.yml
文件。 - 如果你想查看服务的日志输出,可以使用
docker-compose logs
命令。 - 如果你需要停止所有服务,可以使用
docker-compose down
命令。