记一下Docker的最后一个 docker-compose,之前省略了几节,比如安装mysql、nginx等都没写,其实直接依赖docker-compose的yml文件就可以实现自动编排了,没必要一个个启动,所以就忽略了。
1、docker-compose的概念:
Compose项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
开源代码地址:https://github.com/docker/compose
Compose的定位是定义和运行多个 Docker 容器的应用,我们知道使用一个 Dockerfile
模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
比较抽象,简言之一个服务就是一个容器,一个项目就多个容器组成。
docker-compose可以实现容器间的快速编排,但是没法做资源调度,所以接下来要去学k8s。(天天听天天听,知道他很火,可以从来没用过)
2、安装docker-compose
在linux上很简单,就下文件到指定目录,加权限就行:
$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose #下载
$ sudo chmod +x /usr/local/bin/docker-compose #给权限
$ docker-compose --version #测试是否安装成功
$ sudo rm /usr/local/bin/docker-compose #卸载
3、docker-compose的使用
我们搞开发时肯定不止启动一个web项目,附带还有一堆的中间件。所以需要在一个空文件中建立一个docker-compose.yml文件,这个文件名就是这个容器编排的项目名,然后yml文件中写容器的编排内容。例:
version: "3.2"
services:
tomcat01: #服务名称
container_name: tomcat01 #相当于run 的 --name
image: tomcat:8.0-jre8 #使用哪个镜像 相当于run image
ports: #用来完成host与容器端口映射关系 相当于run -p
- "8088:8080"
volumes: #完成宿主机与容器中目录数据卷共享 相当于run -v
# - /root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
- tomcatwebapps01:/usr/local/tomcat/webapps
networks: #代表当前服务使用哪个网络桥 相当于 run --network
- hello
tomcat02: #服务名称
container_name: tomcat02
image: tomcat:8.0-jre8 #使用哪个镜像
ports: #用来完成host与容器端口映射关系
- "8089:8080"
volumes: #完成宿主机与容器中目录数据卷共享
# - /root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
- tomcatwebapps02:/usr/local/tomcat/webapps
networks: #代表当前服务使用哪个网络桥
- hello
mysql:
container_name: mysql
image: mysql:5.7.32
ports:
- "3307:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconf:/etc/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
networks:
- hello
redis:
container_name: redis
image: redis:5.0.10
ports:
- "6379:6379"
volumes:
- redisdata:/data
command: "redis-server --appendonly yes" # run 镜像之后覆盖容器内默认命令
networks:
- hello
volumes: #声明上面服务所使用的自动创建的卷名
tomcatwebapps01: #声明指定的卷名 compose自动创建该卷名但是会在之前加入项目名
external: #使用自定义卷名,指定为true的话,这样必须先docker volume create 卷名
false #true确定使用指定卷名
tomcatwebapps02: #声明指定的卷名 compose自动创建该卷名但是会在之前加入项目名
external: #使用自定义卷名,指定为true的话,这样必须先docker volume create 卷名
false #true确定使用指定卷名
mysqldata:
mysqlconf:
redisdata:
networks: #定义服务用到桥
hello: #定义上面的服务用到的网桥名称 默认创建的就是 bridge
external: #使用自定义网桥名,指定为true的话,这样必须先docker network create 网桥名
false #使用外部指定网桥 #true确定使用指定网桥名 注意:网桥必须存在,就是和volume自定义卷用法一样
其实yml文件service中的指令使用方式都和docker run差不多,比如我上面注释写的"networks: 就相当于docker run --network"。
我很懒就不重新写了,上面yml的内容就是在某项目中,定义docker-compose的版本为3.2,然后使用相同网桥,启动4个容器,2个tomcat容器、1个mysql、1个redis;4个容器分别挂载目录不同,还有端口、依赖镜像、自定义名称,还有environment和command参数分别代表设置环境变量和覆盖容器启动后默认执行的命令。
然后如图就都启动成功了
启动:
docker-compose up #启动
docker-compose up -d #后台启动
docker-compose模板参考文档:https://vuepress.mirror.docker-practice.com/compose/compose_file/