一、Docker-Compose 简介

1.什么是docker-compose?

docker-compose 是用来定义和运行一个或多个容器(通常都是多个)运行和应用的工具,可以使用 compose 可以简化容器镜像的构建以及容器的运行,能够使用 YAML 文件来定义多容器之间的关系。一个 docker-compose up 就可以把完整的应用跑起来。
本质上,compose 把 YAML 文件解析成 docker 命令的参数,然后调用相应的 docker 命令行接口,从而将应用以容器化的方式管理起来。它通过解析容器间的依赖关系顺序地启动容器。而容器间的依赖关系由 YAML 文件中的 links 标记指定。

2.为什么需要docker-compose?

我们在生产环境中有很多个应用,每个应用囊括了很多服务器,而docker-cli只能是一个容器运行一个进程,如果多个服务搭配启动一个完成的应用,就得通过多个容器去搭配运行,但是在实际环境中我们可能有几十上百个服务,这时候管理起来相当麻烦,所以多个容器协同工作需要一个有效的工具来管理他们,定义这些容器如何相互关联,因此compose 应运而生。

3.docker-compose的构成

Docker-Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
Docker-Compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。
Docker-Compose 运行目录下的所有文件(docker-compose.yml,extends 文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例。
但是,Docker-Compose 并没有解决负载均衡的问题,他只是解决了管理容器的问题,因此需要借助其他工具实现服务发现及负载均衡,比如 Consul。

4.Docker-Compose 的配置文件

Docker-Compose 的工程配置文件默认为 docker-compose.yml,通常只有在用docker-compose.yml的地方才可以调用docker compose 的命令。

5.YAML简介

YAML实质上是一种通用的数据串行化格式,它的基本语法规则如下:(# 表示注释说明)
a.大小写敏感
b.使用缩进表示层级关系
c.缩进时不允许使用Tab键,只允许使用空格
d.缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

6.YAML支持的数据结构

对象,键值对的集合
数组,一组按次序排列的值,又称序列
纯量,单个的,不可再分的值

version: '3.9'
services:
    nginx:
        image: nginx
        logging:
            options:
                max-size: 1g
        restart: always
        volumes:
            - '/var/run/docker.sock:/tmp/docker.sock:ro'
        ports:
            - '80:80'

7.使用 YAML 时需要注意以下事项

缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进 2 个空格
符号字符后缩进一个空格,如冒号 :、逗号 ,、横杠 - 等
如果包括特殊字符用单引号引起来会作为普通字符串处理,双引号特殊字符作为本身想表示的意思,例如 name: “hello”

8.Docker-Compose 配置常用字段

build	        --指定Dockerfile文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile	    --构建镜像上下文路径
context	        --可以是dockerfile的路径,或者是指向git仓库的url地址
image	        --指定镜像
command	        --执行命令,覆盖容器启动后默认执行的命令
container name	--指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale
deploy	        --指定部署和运行服务相关配置,只能在Swarm模式使用
environment	    --添加环境变量
networks	    --加入网络,引用顶级networks下条目
ports	        --暴露容器端口,与-p相同,但端口不能低于60
volumes	        --挂载一个宿主机目录或命令卷到容器,命名卷要在顶级volume定义卷名称
volumes_from	--从另一个服务或容器挂载卷,可选参数:ro和:rw
hostname	    --容器主机名
sysctls	        --在容器内设置内核参数
links	        --连接到另外一个容器,- 服务名称[:服务别名]
restart	        --重启策略,默认为no,另有always/no-failure/unless-stoped no,默认策略,在容器退出时不重启容器。 no-failure,在容器非正常退出时(退出状态非0),才会重启容器。 on-failure:3,在容器非正常退出时重启容器,最多重启3次。 always,在容器退出时总是重启容器。 unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
depends_on	    --在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是由要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题

9.Docker-Compose 常用命令

build --重新构建服务
ps    --列出容器
up    --创建和启动容器
exec  --在容器里面执行命令
scale --指定一个服务容器启动数量
top   --显示容器进程
logs  --查看容器输出
down  --删除容器、网络、数据卷和镜像
stop/start/restart --停止/启动/重启服务

二、Docker-Compose 安装

Docker-Compose和Docker是分别独立安装的

1.安装 Docker

1.安装rzsz命令
yum -y install lrzsz

2.安装docker依赖环境
yum install -y yum-utils device-mapper-persistent-data lvm2

3.配置国内docker-ce的yum源(这里采用的是阿里云)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.看一下有没有配置成功
cd /etc/yum.repos.d
ls
[root@VM-8-12-centos yum.repos.d]# ll
total 24
-rw-r--r-- 1 root root  614 Jun  7 17:20 CentOS-Base.repo
-rw-r--r-- 1 root root  230 Jun  7 17:20 CentOS-Epel.repo
-rw-r--r-- 1 root root  616 Nov 23  2020 CentOS-x86_64-kernel.repo
-rw-r--r-- 1 root root 2081 Aug 28 17:43 docker-ce.repo
-rw-r--r-- 1 root root 1358 Sep  5  2021 epel.repo
-rw-r--r-- 1 root root 1457 Sep  5  2021 epel-testing.repo

5.安装docker
yum -y install docker-ce doker-ce-cli containerd.io

6.安装完成
docker version

7.使用软连接的方式移动docker到其他地方
mv /var/lib/docker /opt/docker

8.加载镜像加速站点:
systemctl daemon-reload

9.启动docker并且设置开机启动
systemctl enable docker && systemctl start docker

10.将docker安装目录移动到/opt/docker

11.创建软连接
ln -s /opt/docker /var/lib/docker

12.最后启动docker
systemctl restart docker

13查看/var/lib/docker目录大小,大小为260kb
#进入目录
cd /var/lib/docker
#查看当前目录大小,260kb
du -sh

2.安装 Docker-Compose

[root@docker ~]curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

三、Docker-Compose 部署应用

部署的时候可以参照以下模板实例,第一个是参数说明,第二个是我个人的一个应用部署,以供参考。

##参数说明
 
version: '3'					'//compose编排版本为3'
services:						'//服务:'
  nginx:						'//服务名称'
    hostname: nginx				'//容器主机名'
    build:						'//创建容器过程:'
      context: ./nginx			'//所需素材都在该目录(仓库)下'
      dockerfile: Dockerfile	'//指定Dockerfile文件'
    ports:						'//提供端口:'
      - 80:80					'//对外提供(暴露)的端口'
      - 443:443
    networks:					'//指定网络'
      - test					'//网络名称(群集名称需一致)'
    volumes:					'//数据卷'
      - ./wwwroot:/usr/local/nginx/html		'//将宿主机该仓库内文件与nginx首页文件相关联(容器)'
networks:		'//对外公开需要声明networks群集名称'
  test:
version: '3'
services:

  postgres:
        image: 'postgres:latest'
        volumes:
            - '/opt/postgresql:/var/lib/postgresql/data'
        ports:
            - '5432:5432'
        environment:
            - POSTGRES_PASSWORD=111111
        restart: always
        container_name: postgres

  redis:
        image: 'redis:latest'
        volumes:
            - '/opt/redis/data:/data'
            - '/opt/redis/conf/redis.conf:/etc/redis/redis.conf'
        privileged: true
        container_name: redis
        ports:
            - '6379:6379'
        restart: always

  stackedit:
          image: 'mafgwo/stackedit:latest'
          restart: always
          volumes:
              - '/opt/stackedit:/data'
          ports:
              - '8080:8080'
          container_name: stackedit

  docker.ui:
          image: 'joinsunsoft/docker.ui:latest'
          ports:
              - '1234:8999'
          volumes:
              - '/var/run/docker.sock:/var/run/docker.sock'
          restart: always
          container_name: docker-ui

  linux-command:
          image: 'wcjiang/linux-command:latest'
          ports:
              - '6868:3000'
          restart: always
          container_name: linux-command

  it-tools:
        image: 'qingfeng2336/it-tools:latest'
        ports:
            - '1818:80'
        restart: always
        container_name: it-tools

  Thunder:
        image: 'registry.cn-guangzhou.aliyuncs.com/welldene/docker:xunlei'
        ports:
            - '8899:80'
        volumes:
            - '/home/goodjob/Downloads:/data'
        restart: always
        container_name: Thunder

  dashdot:
        image: 'mauricenino/dashdot:latest'
        privileged: true
        volumes:
            - '/proc/1/ns/net:/mnt/host_ns_net:ro'
            - '/etc/os-release:/etc/os-release:ro'
        container_name: dashdot
        ports:
            - '2828:3001'

networks:
  localhost:

四、使用docker-compose管理容器

1.我是创建了一个docker-compose的工具文件夹存配置文件的,先到跟docker-compose.yml文件同一个目录下的路径
root@WellDone:/opt/docker-compose/docker-tools# cd /opt/docker-compose/docker-tools

2.然后启动docker compose up -d
root@WellDone:/opt/docker-compose/docker-tools# docker compose up -d
[+] Running 8/8
 ✔ Container linux-command  Started                                                                                                               0.0s 
 ✔ Container dashdot        Started                                                                                                               0.0s 
 ✔ Container it-tools       Started                                                                                                               0.0s 
 ✔ Container postgres       Started                                                                                                               0.0s 
 ✔ Container docker-ui      Started                                                                                                               0.0s 
 ✔ Container stackedit      Started                                                                                                               0.0s 
 ✔ Container Thunder        Started                                                                                                               0.0s 
 ✔ Container redis          Started                                                                                                               0.0s

3.查看当前启动的容器
root@WellDone:/opt/docker-compose/docker-tools# docker compose ps
NAME            IMAGE                                                       COMMAND                   SERVICE         CREATED       STATUS              PORTS
Thunder         registry.cn-guangzhou.aliyuncs.com/welldene/docker:xunlei   "/Xware/start"            Thunder         3 hours ago   Up About a minute   0.0.0.0:8899->80/tcp, :::8899->80/tcp
dashdot         mauricenino/dashdot:latest                                  "docker-entrypoint.s…"   dashdot         3 hours ago   Up About a minute   0.0.0.0:2828->3001/tcp, :::2828->3001/tcp
docker-ui       joinsunsoft/docker.ui:latest                                "./server"                docker.ui       3 hours ago   Up About a minute   0.0.0.0:1234->8999/tcp, :::1234->8999/tcp
it-tools        qingfeng2336/it-tools:latest                                "/docker-entrypoint.…"   it-tools        3 hours ago   Up About a minute   0.0.0.0:1818->80/tcp, :::1818->80/tcp
linux-command   wcjiang/linux-command:latest                                "/busybox httpd -f -…"   linux-command   3 hours ago   Up About a minute   0.0.0.0:6868->3000/tcp, :::6868->3000/tcp
postgres        postgres:latest                                             "docker-entrypoint.s…"   postgres        3 hours ago   Up About a minute   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp
redis           redis:latest                                                "docker-entrypoint.s…"   redis           3 hours ago   Up About a minute   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp
stackedit       mafgwo/stackedit:latest                                     "docker-entrypoint.s…"   stackedit       3 hours ago   Up About a minute   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp

4.关闭当前docker-compose编排的容器
root@WellDone:/opt/docker-compose/docker-tools# docker compose stop
[+] Stopping 8/8
 ✔ Container dashdot        Stopped                                                                                                               0.0s 
 ✔ Container postgres       Stopped                                                                                                               0.8s 
 ✔ Container it-tools       Stopped                                                                                                               0.9s 
 ✔ Container docker-ui      Stopped                                                                                                               0.3s 
 ✔ Container redis          Stopped                                                                                                               1.0s 
 ✔ Container Thunder        Stopped                                                                                                               0.7s 
 ✔ Container linux-command  Stopped                                                                                                              10.3s 
 ✔ Container stackedit      Stopped                                                                                                               0.4s 

5.删除编排的记录
root@WellDone:/opt/docker-compose/docker-tools# docker compose stop
root@WellDone:/opt/docker-compose/docker-tools# docker compose rm
输入y