一、认识Docker-Compose
官网—Use Docker Compose
Get started with Docker Compose
简介:docker-compose是基于docker的编排工具,使容器的操作能够批量的,可视的执行,是一个管理多个容器的工具。
docker-compose是基于docker的开源项目,托管于github上,由python实现,调用 docker服务的API负责实现对docker容器集群的快速编排,即通过一个单独的yaml文件,来定义一组相关的容器来为一个项目服务。 所以,docker-compose默认的管理对象是项目,通过子命令的方式对项目中的一组容器进行生命周期的管理。
最重要的两个概念
服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
二、快速安装Docker-Compose
# 国内镜像下载 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文件: docker-compose up # 后台运行: docker-compose up -d # 指定文件名运行: docker-compose -f xxx-compose.yml up -d
docker-compose文件语法详解
参考: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 Compose
该案例是从原始的docker命令演变为使用docker compose,我自己也是如此来进行过渡进而学习docker compose的使用方法的。
案例使用MySQL 5.7.36镜像
首先我们拉取一个mysql5.7.36镜像:
docker pull mysql:5.7.36
原先我们的启动MySQL的Docker命令如下:
在命令中我们挂载了对应的mysql配置文件。
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执行命令,很容易出错,而且执行多个容器也不方便,需要一个个进行启动。