一、简介 在Harbor安装章节,大家应该注意到我们使用了docker-compose这个命令,其实在将harbor安装包解压后,运行install.sh,会生成一个docker-compose.yml的文件,其实我们就是根据这个文件来部署harbor的。通过这个文件,docker-compose这个命令能够很方便的对harbor所需要的容器进行启动、停止、重启甚至删除。可以看到,这个yml文件还是很有用的,当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容易出错,此时可以考虑使用docker 单机编排工具 docker-compose,能够很方便的对要启动的容器进行配置管理。下面我将逐个解析一下docker-compose.yml这个文件中的配置语法,在了解之后,我们自己也能改进自己的一些服务部署方式。

二、安装 1、通过pip安装

[root@k8s-m1 ~]# yum -y install epel-release

[root@k8s-m1 ~]# yum -y install python-pip

[root@k8s-m1 ~]# pip install docker-compose

[root@k8s-m1 ~]# docker-compose --version

#不同环境可能有点区别,正确安装即可

2、从github上下载所需版本安装包 github地址:参看说明:https://github.com/docker/compose/releases

[root@k8s-m1 ~]# wget https://github.com/docker/compose/releases/download/v2.18.1/docker-compose-linux-x86_64

[root@k8s-m1 ~]# mv docker-compose-linux-x86_64 /usr/bin/docker-compose

[root@k8s-m1 ~]# chmod +x /usr/bin/docker-compose

3、直接通过yum安装 此方法安装的版本较旧,不推荐使用

#CentOS7安装,依赖EPEL源

[root@k8s-m1 ~]# yum -y install docker-compose

##docker-compose帮助信息

[root@k8s-m1 ~]# docker-compose --help

docker compse文件格式 官方文档:https://docs.docker.com/compose/compose-file/

docker compose文件是一个yaml格式的文件,所以注意行首的缩进很严格

默认docker-compose命令会调用当前目录下的docker-compose.yml的文件,因此一般执行docker-compose命令前先进入docker-compose.yml文件所在目录

docker compose文件的格式很不同版本,版本不同,语法和格式有所不同,参看以下列表 具体参考官方文档https://docs.docker.com/compose/compose-file/compose-versioning/

Compose file formatDocker Engine releaseCompose file format Docker Engine releaseCompose specification 19.03.0+3.8 19.03.0+3.7 18.06.0+3.6 18.02.0+3.5 17.12.0+3.4 17.09.0+3.3 17.06.0+3.2 17.04.0+3.1 1.13.1+3.0 1.13.0+2.4 17.12.0+2.3 17.06.0+2.2 1.13.0+2.1 1.12.0+2.0 1.10.0+

三、重要语法详解 version version用来表示Compose配置文件语法版本,目前为止语法有3个版本,分别为1, 2.x 和 3.x。目前最新的为 3.x版本, 通过过上表可以看到其与docker 1.13.0 及其以上的版本兼容。docker2.x版本的语法仍然在使用中,其与3.x语法并无太大的差异,但能匹配使用的docker版本就比较低,推荐使用较高版本。

version: '2.3'

services:

log:

image: goharbor/harbor-log:v2.8.1

container_name: harbor-log

restart: always

service service 相关的用于定义一个服务,如上面定义了一个服务名为log的服务,具体为: image:log服务使用的docker镜像是goharbor/harbor-log:v2.8.1 container_name:log服务对应的容器名称设置为harbor-log restart:log服务的重启策略是always

cap_add && cap_drop

cap_drop:

- ALL

cap_add:

- CHOWN

- DAC_OVERRIDE

- SETGID

- SETUID

这两参数都是用于安全方面的设置,cap_drop ALL用于设置去掉容器操作linux内核的作用, cap_add 用于为容器添加某些所需的作用,CHOWN修改文件属主的功能;SETGID(SETUID)设置用户组ID、用户ID的功能;DAC_OVERRIDE权限更大,包含用户、用户组、ACL操作权限。 这部分用于调整容器操作内核权限、能力的配置。在v3版本中有一点点变化,就是在docker swarm 模式中,Compose 会忽略这部分参数的值。

volumes volumes用于定义数据卷,将主机的数据卷或着文件挂载到容器里。

volumes:

- /var/log/harbor/:/var/log/docker/:z

- type: bind

source: ./common/config/log/logrotate.conf

target: /etc/logrotate.d/logrotate.conf

- type: bind

source: ./common/config/log/rsyslog_docker.conf

target: /etc/rsyslog.d/rsyslog_docker.conf

需要注意的是:z(小z)表示数据卷的内容可以在容器之间共享,如果是:Z(大Z)表示数据卷是该容器私有的。

ports ports用于容器与宿主机之间的端口映射,冒号前面是宿主机端口,冒号后面是容器端口(暴露给宿主机上的其他进程或容器)。

ports:

- 127.0.0.1:1514:10514

如果宿主机有多网卡多IP、可以指定映射的ip。映射到127.0.0.1可以避免暴露到外网,在宿主机范围内暴露端口。

networks 用于定义网络,配置容器连接的网络,sevices下的networks表明该服务所在的容器使用哪个网络。同一网络名下的容器能够互联

networks:

- harbor:

......

networks:

harbor:

external: false

如上所示定义使用网络harbor,external: false是否使用外部网络, 表示使用harbor这个网络,如果harbor这个网络不存在则新建该网络。external: true则docker-compose up不会尝试新建网络,而是使用已经存在的网络(需要自己事先将网络创建好),网络不存在就报错。

depends_on 设置依赖关系。 按依赖性顺序启动服务。文示例的depends_on表示registry容器需要在log服务对应的容器启动之后才能启动,用于控制服务之间依赖关系及容器启动顺序。

depends_on:

- log

logging 服务的日志记录配置。registry服务将自己的syslog日志发送到tcp://localhost:1514(也就是上面的log服务容器),并为日志打上标签registry。

logging:

driver: "syslog"

options:

syslog-address: "tcp://localhost:1514"

tag: "registry"

目前支持三种日志驱动类型,在linux操作系统/var/log下面的那些日志文件,基本都属于syslog。 driver: “json-file” driver: “syslog” driver: “none”

env_file 从文件添加环境变量。可以是单个值或列表的多个值。下文中的env_file表示在docker-compose.yml同级目录下的common/config/core/env有一个文件叫做env,里面包含该容器需要的一些环境变量。当所需的变量很多的时候可以选择此种方式,不然就可以选择下面的直接通过environment设置。

env_file:

- ./common/config/core/env

大家可以看看每个目录的env文件,里面包含很多变量内容设置。

environment 添加环境变量。可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。如:

environment:

POSTGRES_PASSWORD=root123

shm_size shm_size创建容器时候指定最小共享内存,对于内存有要求的容器服务需要设置这个值。

logging:

driver: "syslog"

options:

syslog-address: "tcp://localhost:1514"

tag: "postgresql"

shm_size: '1gb'

build 指定为构建镜像上下文路径。但一般情况下,本地没有所需的镜像情况下我们都是直接从仓库中拉取镜像。 例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:

version: "2.3"

services:

webapp:

build: ./dir

command 覆盖容器启动的默认命令。如

command: ["bundle", "exec", "thin", "-p", "3000"]

entrypoint 覆盖容器默认的 entrypoint。 entrypoint: [“/code/entrypoint.sh”]

healthcheck 用于检测 docker 服务是否健康运行,用法和前面章节分享的docker服务健康检查一样。

healthcheck:

test: ["CMD","curl", "-fs", "http://localhost"] # 设置检测程序

interval: 30s # 设置检测间隔

timeout: 10s # 设置检测超时时间

retries: 3 # 设置重试次数

start_period: 40s # 启动后,多少秒开始启动检测程序

更多参数,如ulimits、sysctls、secret、dns、dns_search等等都是可以设置的,大家可以根据实际需要编写。

v3和v2版本的区别总结 由于 Swarm mode 中网络的特殊性,Compose v3版本配置文件中一些声明比如expose和links会被忽略。注意:不能再使用 link 定义的网络别名来进行容器互联,可以使用服务名连接。 Compose v3版本配置文件中volumes_from不再支持,只能使用命名数据卷来实现容器数据的持久化和共享。 Compose v3版本配置文件中引入了deploy指令,可对Swarm mode中服务部署的进行细粒度控制,包括 resources:定义cpu_shares,cpu_quota,cpuset,mem_limit,memswap_limit等容器资源限制指令。(v1/v2中相应指令在v3版本的配置文件中不再被支持) restart_policy:定义服务的重启条件 (v1/v2中restart指令在v3版本的配置文件中不再被支持)

四、Docker-compose常用命令 docker-compose命令需要根据docker-compose.yml文件执行相关命令。执行命令前要么先直接进入到含有docker-compose.yml文件的目录,要么通过-f 选项指定,不然会报错。如下:

[root@k8s-m1 ~]# docker-compose -f /root/registry/harbor/harbor/docker-compose.yml ps

##更多命令可以通过docker-compose --help查看

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

五、实例 简单以redis服务为例,使用docker-compose部署redis。注意不同版本的语法有不同之处,不匹配的话是不能正常启动的。 [root@k8s-m1 compose-test]# cat docker-compose.yml

# yaml 配置实例

version: '3'

services:

redis:

image: redis:7.0.11

container_name: redis-test

ports:

- "127.0.0.1:6379:6379"

volumes:

- ./redis.conf:/usr/local/redis/conf/redis.conf

##该redis镜像是用的是前面章节通过dockerfile制作的镜像

[root@k8s-m1 compose-test]# redis-cli

127.0.0.1:6379> AUTH 123456

OK

127.0.0.1:6379>

更多关于docker容器和运维方面的相关知识,请前往博客主页。

原文链接:

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。