在此之前部署服务都是使用Docker命令来进行的,越到后面执行的Docker命令就会十分复杂且容易出错,而且对于部署多个容器时需要一条一条docker命令去执行,实在是累啊,还有就是一些实战案例以及项目中都是提供了docker compose服务运行命令模板,基于这几个原因,就去现学了下Docker Compose。
所有博客文件目录索引:博客目录索引(持续更新)
Get started with Docker Compose
简介:docker-compose是基于docker的编排工具,使容器的操作能够批量的,可视的执行,是一个管理多个容器的工具。
最重要的两个概念
# 国内镜像下载
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 为docker-compose设置权限
sudo chmod +x /usr/local/bin/docker-compose
# 查看docker-compose版本
docker-compose --version
Docker运行命令详解
# 直接运行该目录下所有compose文件:
docker-compose up
# 后台运行:
docker-compose up -d
# 指定文件名运行:
docker-compose -f xxx-compose.yml up -d
docker-compose文件语法详解
实战案例:SpringBoot(53) 整合canal实现数据同步,可去根据实战案例中的compose来自己对照下面配置内容来编写出来
version: "3" # 指定docker-compose语法版本
services: # 从以下定义服务配置列表
server_name: # 可将server_name替换为自定义的名字,如mysql/php都可以
container_name: container_name # 指定实例化后的容器名,可将container_name替换为自定义名
image: xxx:latest # 指定使用的镜像名及标签
build: # 如果没有现成的镜像,需要自己构建使用这个选项
context: /xxx/xxx/Dockerfile # 指定构建镜像文件的路径
dockerfile: .... # 指定Dockerfile文件名,上一条指定,这一条就不要了
ports:
- "00:00" # 容器内的映射端口,本地端口:容器内端口
- "00:00" # 可指定多个
volumes:
- "test1:/xx/xx" # 这里使用managed volume的方法,将容器内的目录映射到物理机,方便管理
- "test2:/xx/xx" # 前者是volumes目录下的名字,后者是容器内目录
- "test3:/xx/xx" # 在文件的最后还要使用volumes指定这几个tests
volumes_from: # 指定卷容器
- volume_container_name # 卷容器名
restarts: always # 设置无论遇到什么错,重启容器,其他:unless-stopped(指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器)
depends_on: # 用来解决依赖关系,如这个服务的启动,必须在哪个服务启动之后
- server_name # 这个是名字其他服务在这个文件中的server_name
- server_name1 # 按照先后顺序启动
links: # 与depend_on相对应,上面控制容器启动,这个控制容器连接
- mysql # 值可以是- 服务名,比较复杂,可以在该服务中使用links中mysql代替这个mysql的ip
networks: # 加入指定的网络,与之前的添加网卡名类似
- my_net # bridge类型的网卡名
- myapp_net # 如果没有网卡会被创建,建议使用时先创建号,在指定
environment: # 定义变量,类似dockerfile中的ENV
- TZ=Asia/Shanghai # 这里设置容器的时区为亚洲上海,也就解决了容器通过compose编排启动的 时区问题!!!!解决了容器的时区问题!!!
变量值: 变量名 # 这些变量将会被直接写到镜像中的/etc/profile
command: [ #使用 command 可以覆盖容器启动后默认执行的命令
'--character-set-server=utf8mb4', #设置数据库表的数据集
'--collation-server=utf8mb4_unicode_ci', #设置数据库表的数据集
'--default-time-zone=+8:00' #设置mysql数据库的 时区问题!!!! 而不是设置容器的时区问题!!!!
]
server_name2: # 开始第二个容器
server_name:
stdin_open: true # 类似于docker run -d
tty: true # 类似于docker run -t
volumes: # 以上每个服务中挂载映射的目录都在这里写入一次,也叫作声明volume
test1:
test2:
test3:
networks: # 如果要指定ip网段,还是创建好在使用即可,声明networks
my_net:
driver: bridge # 指定网卡类型
myapp_net:
driver: bridge
该案例是从原始的docker命令演变为使用docker compose,我自己也是如此来进行过渡进而学习docker compose的使用方法的。
案例使用MySQL 5.7.36镜像
首先我们拉取一个mysql5.7.36镜像:
docker pull mysql:5.7.36
原先我们的启动MySQL的Docker命令如下:
docker run --name mysql5736 \
-p 3306:3306 \
-v /mydata/mysql/conf:/etc/mysql/mysql.conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.36
挂载的配置文件名为mysqld.cnf,完整的目录为:/home/dockerfiles/mysql/conf/mysqld.cnf:在配置文件中我开启了binlog,之后来进行验证
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server-id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
替换为Docker Compose文件:
文件路径:
/
└── home
└── dockerfiles
└── mysql
└── conf
└── mysqld.cnf
└──docker-compose-mysql.yml
我们在home目录中创建dockerfiles文件夹,然后在mysql/conf目录下创建对应的mysql配置文件,同上,这个操作我不做演示了。
现在关注点就在这个docker-compose-mysql.yml配置文件上,上面的Docker命令转换如下:
version: "3"
services:
mysql: # mysql服务
image: mysql:5.7.36 # 镜像文件
container_name: mysql5736test # 容器名称
volumes:
- "./mysql/conf:/etc/mysql/mysql.conf.d" # 共享同一个配置文件目录
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
MYSQL_ROOT_PASSWORD: root # 设置初始密码为root
ports:
- "3307:3306" # 端口号配置
接着在dockerfiles文件目录下执行启动命令:
# -f表示指定某个配置文件名 -d:表示后台启动
docker-compose -f docker-compose-mysql.yml up -d
若是出现下面的效果,表示已经成功!
我们使用navicat来去连接一些看看:默认的用户名密码是root、root,端口宿主机开放的是3307映射到容器中的3306,连接成功如下:
用docker compose后简直不要太爽了,避免了之前写了一大长串的docker执行命令,很容易出错,而且执行多个容器也不方便,需要一个个进行启动。
[1]. docker-compose语法详解
[2]. ruamel_yaml.scanner.ScannerError: while scanning for the next token found character ‘\t’ that cannot
[3]. Docker-Compose运行命令
[4]. Docker Compose 简介
[3]. Docker-Compose运行命令
[4]. Docker Compose 简介