目录
2、将MySQL容器加入到 lting-scrm-net网段中
#1、创建docker-compose安装目录
mkdir /apps/compose
cd /apps/compose
#2、下载Linux版本
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /apps/compose/docker-compose
# 3、赋权:
sudo chmod +x /apps/compose/docker-compose
# 4、创建软连接:
ln -sf /apps/compose/docker-compose /usr/bin/docker-compose
#5、查看版本:
docker-compose -v
# 启动全部
docker-compose up
# 启动外部独立yml?
docker-compose -f xxx.yml up
### 如果我们要启动的文件名字不是docker-compose.yml,而是比如“standalone-mysql.yaml”、“standalone-nacos.yaml”之类文件,可以使用此命令启动
# 启动部分容器
docker-compose up SERVICE_NAME
### 一个yml文件中有多个容器时,可以使用此命令启动,比如:
### docker-compose up nacos ### nacos依赖db,所以db也会启动;
### docker-compose up db ### 单独启动db;
# 以依赖关系顺序停止服务
docker-compose stop
### docker-compose up nacos ### nacos依赖db,所以db会在nacos前面停止
### 后台启动:添加“-d”即可
docker-compose up -d
# 卸载
直接删除docker-compose安装目录即可
MySQL+Nacos+Seata,依赖关系如下:
三者都是放在docker-compose.yml文件中。各个版本如下:
[root@iZbp222227zw5Z ~]# docker-compose --version
Docker Compose version v2.6.1
[root@iZb2222222zw5Z ~]# docker --version
Docker version 20.10.17, build 100c701
docker-compose.yml文件版本:version '3.9'
depends_on:指定依赖的执行顺序
# depends_on:在version '3.9'版本中新增condition心跳检测,可以控制以来服务是否启动成功
### 写法一:无法判断该服务是否成功启动
######缺点:--- 比如nacos和mysql,mysql启动时会初始化数据,如果我们使用此种方法时,在nacos启动时mysql的初始化数据可能未执行完毕,导致nacos会报错:Caused by: java.lang.IllegalStateException: No DataSource set....
version: "3.9"
services:
db:
image: mysql:8.0.21
nacos:
depends_on:
- db
### 写法二:
version: "3"
services:
db:
image: mysql:8.0.21
healthcheck:
......
nacos:
depends_on:
db:
condition: service_healthy
参数说明:
condition:有三个值。分别是:
- service_sarted:该服务无论初始化完成没都会启动本服务, 能使用“docker ps” 查看---与“写法一”作用类似;
- service_healthy:心跳检测,如果该服务启动成功后----可能还没有初始化完成,本服务不会成功启动---即只创建不启动。不能使用“docker ps”查看,但是可以使用“docker ps -a”查看 -----等待时间久;
报错:container for service xxx has no healthcheck configured ---必须在 xxx中配置“healthcheck”,具体配置见:心跳检测、心跳检测模板
- service_completed_successfully:该服务启动成功并且初始化完成后,才会启动本服务-----等待时间超级久;
比如:nacos依赖mysql,在nacos的 depends_on中配置了db.condition: “service_healthy”;如果我们不配置心跳检测“healthcheck”,系统会报错:container for service xxx has no healthcheck configured;
模板如下:
version: '3.9'
services:
#mysql数据库脚本
db:
image: mysql:8.0.21
......
healthcheck:
test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
interval: 5s ### 间隔时间 --- 时间为了方便调试,设置较短。可以设置:1m30s....
timeout: 5s ### 超时时间
retries: 2 ### 重试次数
start_period: 5s ### 启动后,多少s开始检测程序
nacos:
image: nacos/nacos-server:v2.1.0
depends_on:
db:
condition: service_healthy
#第一种方式(推荐):
environment:
TZ: Asia/Shanghai
#第二种方式:
environment:
SET_CONTAINER_TIMEZONE=true
CONTAINER_TIMEZONE=Asia/Shanghai
#第三种方式:
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
使用方法三时可能会报如下错误:
[root@iZbp167fcodo22222gk7zw5Z czg-compose]# docker-compose up -d
Creating mysql ... error
ERROR: for mysql Cannot start service mysql: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/etc/timezone" to rootfs at "/etc/timezone": mount /etc/timezone:/etc/timezone (via /proc/self/fd/6), flags: 0x5001: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
ERROR: for mysql Cannot start service mysql: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/etc/timezone" to rootfs at "/etc/timezone": mount /etc/timezone:/etc/timezone (via /proc/self/fd/6), flags: 0x5001: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
ERROR: Encountered errors while bringing up the project.
原因:centos7.6中/etc/timezone是一个文件夹,而不是一个文件,执行如下命令:
echo 'Asia/Shanghai' > /etc/timezone/timezone
最终命令变为:
volumes:
- /etc/timezone/timezone:/etc/timezone:ro
互相通信,应用场景: A容器要去访问B容器----A环境依赖于B环境;
此时A、B容器有三种类型,分别是:
本文只讲1、2两种。主要涉及到的知识有:
使用networks。
version: '3.9'
services:
#mysql数据库脚本
mysql:
image: mysql:8.0.21
......
networks:
- my_network
#nacos服务脚本
nacos:
image: nacos/nacos-server:2.0.0
......
networks:
- my_network
# docker容器内网地址
networks:
my_network: ### 网段名称
driver: bridge ### bridge可以随意取
完成上述操作后,我们就可以在nacos容器中ping mysql即可。
docker exec -it nacos /bin/bash
ping mysql
version: '3.9'
services:
#mysql数据库脚本
mysql:
image: mysql:8.0.21
......
networks:
extnetwork:
ipv4_address: 172.21.0.1
#nacos服务脚本
nacos:
......
networks:
extnetwork:
ipv4_address: 172.21.0.2
networks:
extnetwork:
name: extnetwork
ipam:
config:
- subnet: 172.21.0.0/16
与上述设置网段效果一致,都可以在nacos使用ping mysql...
------ 下面红体方法,为通测通过配置
用于链接到外部容器。所有容器需要在同一个网络中。---- 不在同一个docker-compose.yml文件中
如果没有存在/之前启动的依赖没有设置networks,可以使用docker network创建网段。
docker network create lting-scrm-net --driver bridge
注意:此处相当于注册到已经存在的网段中
方法一:在容器A的docker-compose.yml中配置网段
version: '3'
services:
mysql8.0:
# 镜像名
image: mysql:8.0.21
......
### docker容器内网地址
networks:
default:
external:
name: lting-scrm-net
方法二:使用docker run启动
docker run --name mysql8.0 -e MYSQL_ROOT_PASSWORD=2sIsS5 --net lting-scrm-net -d mysql:8.0.21
### 注意:使用此种方法启动mysql时,1、需要手动加入nacos配置;2、需要修改mysql的编码等等....
启动结果查询
docker network inspect my-net
[
{
"Name": "lting-scrm-net",
"Id": "d9218b9779d3f09de156eecefb4a671f2ca1f3f8d1922c3314a3f8996f4128b2",
"Created": "2022-07-03T11:25:14.750477854+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.27.0.0/16",
"Gateway": "172.27.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"6ae916819bb48e8411f0f0c980b416c4a138e9feca168866f3fde19a457e7298": {
"Name": "mysql8.0",
"EndpointID": "95e15064188793c1eeb37a04a6332b66f791ca821f26fe39f90df10d4fb65712",
"MacAddress": "02:42:ac:1b:00:02",
"IPv4Address": "172.27.0.1/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
方法一:使用docker-compose.yml配置
version: "3.9"
services:
nacos:
image: nacos/nacos-server:v2.1.0
......
environment:
MYSQL_SERVICE_HOST: mysql8.0 ### 容器A的名称
......
external_links:
- mysql8.0 ### 容器A的名称
networks:
default:
external:
name: lting-scrm-net
方法二:使用docker run方式连接
# 开启一个实例nacos并与my-net建立链接
docker run --rm --name nacos --link lting-scrm-net -d nacos/nacos-server:v2.1.0
使用方法,见:3、在Nacos容器中连接Mysql容器>>方法一:使用docker-compose.yml配置即可。
-------------------------------------------------------------------------------------------------------------------------------
docker-compose编排Mysql+nacos+seata完整配置见下文