前言
记录使用docker-compose的问题
一、docker-compose部署前后端服务
- 构建好需要的前后端镜像,上传镜像仓库或者通过docker save -o 镜像名称:版本号(打包)
构建方法可参考:docker及docker-compose安装及使用 - docker pull 拉去镜像或者使用docker load -i 镜像包名称 打开需要的镜像包(解包)
- 编写docker-compose.yml文件
version: '3'
services:
mysql:
image: mysql:8.0.31
container_name: mysql # 设置数据库容器名称
environment:
MYSQL_ROOT_PASSWORD: password # 设置root用户的密码
MYSQL_DATABASE: mysql # 容器启动时就创建数据库myql
MYSQL_CHARSET: utf8mb4 # 指定创建数据库的字符集
MYSQL_COLLATION: utf8mb4_0900_ai_ci # 指定创建数据库的默认排序规则
volumes: # 挂载卷
- /root/mysql/conf:/etc/mysql/conf.d
- /root/mysql/logs:/logs
- /root/mysql/data:/var/lib/mysql
django-server:
image: django-server:v1.0.0
container_name: django # 设置后端容器名称
volumes:
- /root/data/script:/diango-server/script/
depends_on: # 指定启动容器顺序:mysql>django
- mysql
react-server:
image: react-server:v1.0.0
container_name: react # 设置前端容器名称
ports:
- "8000:80"
depends_on: # 指定容器启动顺序:mysql>django>react
- mysql
- autotest-server
networks:
default:
external:
name: mynetwork # 设置所有容器使用docker中mynetwork网络
- 启动服务
docker-compose up -d # 创建对应容器启动服务
docker-compose down # 停止对应服务并删除所有容器
二、遇到的问题点
1.容器之间的通信
通过指定docker-compose的网络,容器之间可以通过“容器名称:端口号”实现互相通信,独立在docker-compose之外的容器加入这个网络,也可以通过进行互相通信
2.depends_on按顺序启动问题
指定了每个容器的启动顺行,但是每个容器内的服务并没有被指定启动顺序,比如:数据库服务初始化并没有完成,后端服务已经开始要连接数据库,这时连接数据库失败,导致后端容器启动失败。
暂时解决办法:写了一个脚本定时连接数据库,直至数据库初始化完成后脚本连接成功,后端再开始启动服务。
def try_connect_mysql(max_attempt):
attempt = 1
for _ in range(max_attempt):
try:
sql().run('show databases')
log.info('连接数据库成功')
break
except Exception as e:
log.info(f"尝试连接到数据库失败(尝试连接 {attempt}): {e}")
attempt += 1
time.sleep(5)