最佳实践
从 Docker 官网可以看到不同容器的 compose.yml 文件内容的demo
- https://hub.docker.com/_/nginx
- https://hub.docker.com/_/mysql
1、前言
1.1、部署 MySQL 容器的 3 种类型
在容器中部署 Mysql 会有三种网络分布类型:
-
单独部署 mysql 容器,宿主机通过端口映射访问 容器 mysql
-
使用两个 compose 文件,分别部署 mysql 容器和其它容器(比如 apollo 的 config-service、admin-service、portal)
-
使用一个 compose 文件,同时部署 mysql 和其它容器(比如 apollo 的 config-service、admin-service、portal),其它容器通过mysql容器名:容器端口访问 mysql,此时相当于一次部署了 4 个容器
1.2、M2芯片类型问题
容器来自镜像,而镜像和芯片架构有关。
部署完容器之后,又会涉及一些工具软件(比如 workbench)的适配问题。
一般而言,使用 compose 直接使用 镜像名:latest 即可,但是使用 Mysql,为了寻求 M2芯片&mysql镜像&workbench 适配,我们需要增加一些特殊配置。
-
指定架构类型
platform: linux/amd64 #x86_64 系统(大多数桌面和服务器)
platform: linux/arm64 #ARM64 系统(例如Apple M1/M2
)
platform: linux/arm/v7 #32 位 ARM 系统(例如旧版 Raspberry Pi) -
指定 镜像版本
image: mysql:8.0.30
2、具体实现
2.1、单独部署 mysql 供宿主机访问
2.1.1、文件夹结构
sql 可以放置 xxx.sql 脚本,不过建议容器启动后,再手动执行。
data 为宿主机挂载容器的数据目录。
2.1.2、docker-compose.yml 内容
# 如果需要自定义共享网络
# docker network create bestcxx-network
# 自定义工程名称,默认文件夹名,影响注册网络名,AAA_网络名,或者 docker-compose -p diy_project_name up 启动时定义
# 外部连接时,需要 &allowPublicKeyRetrieval=true 以支持明文连接数据库
version: '3.8'
services:
mysql-db-withdata:
#platform: linux/arm64 #非 arm 架构芯片可以注释本行
image: mysql:8.0.30 #M2 版本 8.0.30,目前最新 workbench 最高到 8 #非 arm 架构芯片可以写 image: mysql:latest
container_name: mysql-db-withdata
restart: always
ports:
- "13306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootadmin
MYSQL_DATABASE: apollodb
MYSQL_USER: userapollo
MYSQL_PASSWORD: userapollo
volumes:
#- ./sql:/docker-entrypoint-initdb.d # 自动加载运行 /sql 目录下的脚本 xxx.sql
- ./data:/var/lib/mysql # 在宿主机持久化数据
networks:
bestcxx-network:
networks:
bestcxx-network:
2.1.3、运行
在 Mysql 文件夹目录下执行
# docker-compose stop
docker-compose up -d
2.2、单独部署 mysql 容器供其它容器访问(以 apollo 为例)
最终容器运行形态展示
这里需要为两个容器创建一个共同的容器网络。
默认情况下,每启动一个容器,会自动创建一个 文件夹_网络名 的容器网络,当多个 compose 文件启动容器时,可以在命令行加入配置,使得不同的 compose 启动的多个容器使用共同的容器名、内部定义相同的网络名——最终共享同一个容器网络。
创建一个容器网络,网络名为 bestcxx-network <