简单介绍: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: alwaysworking_dir: /rootvolumes:- "./cloud-gateway:/root"- /etc/localtime:/etc/localtime:roports:- "7000:7000"command: java -jar app.jar depends_on:- zipkincloud-admin:network_mode: "host"image: "adoptopenjdk/openjdk8"restart: alwaysworking_dir: /rootvolumes:- "./cloud-admin:/root"- /etc/localtime:/etc/localtime:roports:- "7001:7001"command: java -jar app.jardepends_on:- zipkincloud-auth:network_mode: "host"image: "adoptopenjdk/openjdk8"restart: alwaysworking_dir: /rootvolumes:- "./cloud-auth:/root"- /etc/localtime:/etc/localtime:roports:- "7003:7003"command: java -jar app.jardepends_on:- zipkincloud-tools:network_mode: "host"image: "adoptopenjdk/openjdk8"restart: alwaysworking_dir: /rootvolumes:- "./cloud-tools:/root"- /etc/localtime:/etc/localtime:roports:- "7002:7002"command: java -jar app.jardepends_on:- zipkin cloud-manage:network_mode: "host"image: "adoptopenjdk/openjdk8"restart: alwaysworking_dir: /rootvolumes:- "./cloud-manage:/root"- /etc/localtime:/etc/localtime:roports:- "7004:7004"command: java -jar app.jardepends_on:- zipkinnginx:network_mode: "host"image: nginxrestart: alwaysports:- '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:rozipkin:network_mode: "host"image: openzipkin/zipkincontainer_name: zipkinports:- 9411:9411volumes:- /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:build: .networks:- app-netredis:image: "redis:alpine"networks:- app-netnetworks: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个