简单介绍:docker-compose支持的可以在单机上进行多容器部署的工具,可以通过运行一个yml文件以固定的顺序启动多个容器,而不需要手动一个个启动。
一、准备工作
老版本的docker-copmose需要单独安装docker-compose,而新版本docker-compose则在安装docker-engine的时候就会带着安装docker-compose。
(一)老版本
使用以下命令:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
上面是针对linux64位操作系统,可改成
sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
安装结束以后运行docker-copmose version即可看到对应的版本号
(二)新版本
直接运行:sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
然后启动:sudo systemctl start docker
二、部署项目
准备一个yml启动文件,可以参考下面的,具体语法我就不一一解释了:
docker-compose.yml文件
version: '3'
services:
cloud-gateway:
network_mode: "host"
image: "adoptopenjdk/openjdk8"
restart: always
working_dir: /root
volumes:
- "./cloud-gateway:/root"
#将外边时间直接挂载到容器内部,权限只读
- /etc/localtime:/etc/localtime:ro
ports:
- "7000:7000"
command: java -jar app.jar
depends_on:
- zipkin
cloud-admin:
network_mode: "host"
image: "adoptopenjdk/openjdk8"
restart: always
working_dir: /root
volumes:
- "./cloud-admin:/root"
#将外边时间直接挂载到容器内部,权限只读
- /etc/localtime:/etc/localtime:ro
ports:
- "7001:7001"
command: java -jar app.jar
depends_on:
- zipkin
cloud-auth:
network_mode: "host"
image: "adoptopenjdk/openjdk8"
restart: always
working_dir: /root
volumes:
- "./cloud-auth:/root"
#将外边时间直接挂载到容器内部,权限只读
- /etc/localtime:/etc/localtime:ro
ports:
- "7003:7003"
command: java -jar app.jar
depends_on:
- zipkin
cloud-tools:
network_mode: "host"
image: "adoptopenjdk/openjdk8"
restart: always
working_dir: /root
volumes:
- "./cloud-tools:/root"
#将外边时间直接挂载到容器内部,权限只读
- /etc/localtime:/etc/localtime:ro
ports:
- "7002:7002"
command: java -jar app.jar
depends_on:
- zipkin
cloud-manage:
network_mode: "host"
image: "adoptopenjdk/openjdk8"
restart: always
working_dir: /root
volumes:
- "./cloud-manage:/root"
#将外边时间直接挂载到容器内部,权限只读
- /etc/localtime:/etc/localtime:ro
ports:
- "7004:7004"
command: java -jar app.jar
depends_on:
- zipkin
nginx:
network_mode: "host"
image: nginx
restart: always
ports:
- '8200:8200'
volumes:
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- ./conf/black.conf:/etc/nginx/black.conf
- ./cloud-frontend/dist/:/home/dist
#将外边时间直接挂载到容器内部,权限只读
- /etc/localtime:/etc/localtime:ro
zipkin:
network_mode: "host"
image: openzipkin/zipkin
container_name: zipkin
ports:
- 9411:9411
volumes:
#将外边时间直接挂载到容器内部,权限只读
- /etc/localtime:/etc/localtime:ro
docker-compose up -d:以后台的方式运行
docekr-compose down:清除所有运行的项目
docker-compose logs -f + 服务名:查询服务运行日志
docker-compose up -d + 服务名:以后台的方式单独运行某个服务
docker-compose restart + 服务名:重启某个服务
三、其他问题
(一)单独停止某个服务
本地修改了代码,需要重新打包发布,但是又不想全部docker-compose停止再启动,那么就可以单独修改其中一个。例如我想停掉我的cloud-gateway项目
1、首先通过 docker ps 查询已启动的容器(docker ps -a 查询所有容器,包括未启动的)
命令 docker container ls -a 也一样。
2、将要更新的容器停止docker-compose stop cloud-gateway (docker-compose stop 是停止yaml包含的所有容器)
3、将第二步已停止的容器删除 docker container rm d9b57f832648 (d9b57f832648是cloud-gateway的容器id)
4、查询所有的镜像 docker images
5、备份镜像,防止意外出错可恢复。docker save cloud-gateway -o /home/bak/cloud-gateway-bak.tar
6、删除镜像 docker rmi cloud-gateway
7、将打包好的更新的jar文件按照docker-compose的描述地址放好,再根据文件编译新的镜像 docker build . -f Dockerfile-Cloud-Gateway -t cloud-gateway
8、启动docker-compose up -d cloud-gateway
9、重启docker-compose restart cloud-gateway
(二)一些常用命令
查看版本:docker-compose version
根据yml创建service:docker-compose up
指定yaml:docker-compose up -f xxx.yaml
后台运行:docker-compose up -d
查看启动成功的service:docker-compose ps,也可以使用docker ps
查看images:docker-compose images
停止/启动service:docker-compose stop/start
删除service[同时会删除掉network和volume]:docker-compose down
进入到某个service:docker-compose exec redis sh
(三)动态扩容
可以使用docker-compose -scale对容器进行动态扩容,但是动态扩容必须先把端口映射去掉,不然同一台机器使用的是一样的对外的端口肯定报错。
例如在机器上自己创建了一个docker-compose文件夹,然后在该文件夹下有启动需要的yml文件,同时也有一个springboot项目的dockerfile文件,只不过通过yml文件运行dockerfile文件构建镜像。我们的项目要访问redis,redis的镜像可直接从远程拉取。
可按照以下步骤扩容:
(1)修改docker-compose.yaml文件,主要是把web的ports去掉,不然会报错
version: '3'
services:
#启动的容器名字叫web
web:
#在该目录下(.)运行构建镜像的命令
build: .
#使用的网络名字叫做app-net
networks:
- app-net
redis:
image: "redis:alpine"
#使用的网络名字叫做app-net
networks:
- app-net
networks:
#创建一个网络,名字叫做app-net
app-net:
#网络的方式是桥接,桥接模式可直接通过名字访问同一个网络下的容器
driver: bridge
(2)创建service
docker-compose up -d
(3)若要对容器进行扩缩容
docker-compose up --scale web=5 -d
docker-compose ps
docker-compose logs web
运行完以上命令就能看到名字叫web的容器被创建了5个