一、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