Bootstrap

Docker-Compose介绍以及部署项目

简单介绍: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个

;