docker学习(4)之docker-compose


内容来源为六星教育,这里仅作为学习笔记

docker-compose是什么?

注意是docker中的compose
Compose是 Docker 的服务编排工具,诞生主要是来帮助开发或运维人员很好地管理docker容器;减少繁琐的单个容器创建、删除等操作,比较适合组合使用多个容器进行开发的场景。

对于需要多个容器的操作,传统的方式是一个个的创建及运行,而compose则只需要通过一次性把这些命令写在docker-compose.yml文件中,以后每次启动这一整个环境的时候,只需要你只要敲一个 docker-compose up命令就ok了。

docker-composer安装

官网地址:https://docs.docker.com/compose/

curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

修改权限

chmod +x /usr/local/bin/docker-compose

安装完成后可以查看版本

docker-compose --version

在这里插入图片描述
如上就是下载的命令,也可以通过去github上手动下载并操作;下载的过程是比较慢的

建议采用如下地址方式下载:http://get.daocloud.io/#install-compose

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-composer命令了解

一般步骤

  1. 定义Dockerfile,方便迁移到任何地方;
  2. 编写docker-compose.yml文件;
  3. 运行docker-compose up启动服务

示例: 准备工作:提前下载好镜像

  1. 需要新建一个空白目录,在目录新建一个 docker-compose.yml

简单来说要版本一致;如下为示例代码

version: '3.6'
services:
	nginx:
		image: nginx:laster
		ports:
			- "8080:80"
		stdin_open: true
		networks:
			app_net:
				ipv4_address: 172.20.0.20
		tty: true
		links:
			- redis-test
		command: [/bin/bash]
	redis-test:
		build: .
		ports:
			- "6379:6379"
		stdin_open: true
		networks:
			app_net:
				ipv4_address: 172.0.20.21
		tty: true
		command: [/bin/bash]
networks:
	app_net:
		driver: bridge
		ipam: 
			driver: default
			config:
				- subnet: 172.0.20.0/16

以上命令的意思是新建nginx和redis容器。
好,我们启动应用:
docker-compose up
就成功了。浏览器访问 即可。 默认是前台运行并打印日志到控制台。如果想后台运行,可以
docker-compose up –d
服务后台后,可以使用下列命令查看状态:
docker-compose ps
停止服务:
docker-compose stop
重新启动服务:
docker-compose restart

docker-compose.yml文件命令了解

docker-compose的默认模版文件为: docker-compose.yml。 和Dockerfile一样,它也是有自己的语法命令的。其中定义的每个服务都必须通过image指令指定镜像或build指令(需要Dockerfile)来自动构建。其它大部分指令都跟docker run中的类似。

需要注意的是docker-composer运用的时候一定要注意版本的问题,如下图显示;

撰写文件格式Docker引擎
11.9.0+
2.01.10.0+
2.11.12.0+
2.2,3.0,3.1,3.21.13.0+
2.3,3.3,3.4,3.517.06.0+
2.417.12.0+
3.618.02.0+
3.718.06.0+

每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。 image 指定镜像tag或者ID。示例:
在这里插入图片描述

build

Build 用来指定一个包含Dockerfile文件的路径。一般是当前目录.。Fig将build并生成一个随机命名的镜像
注意,在version 1里bulid仅支持值为字符串。version 2里支持对象格式。
在这里插入图片描述

context 为路径, dockerfile 为需要替换默认 docker-compose 的文件名, args 为构建(build)过程中的环境变量,用于替换 Dockerfile 里定义的ARG参数,容器中不可用。示例

Dockerfile:

ARG buildno
ARG password

RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

docker-compose.yml:

build: 
	context: .
	args: 
		buildno: 1
		password: secret
	
build: 
	context: .
	args:
		- buildno=1
		- password=secret

Command

用来覆盖缺省命令。示例:
command: bundle exec thin -p 3000

command也支持数组形式:
command: [bundle, exec, thin, -p, 3000]

Links

用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,这样别名将和服务名相同。同 docker run --link 。
示例:

links:
	- db
	- db:mysql
	- redis

使用了别名将自动会在容器的 /etc/hosts 文件里创建相应记录

172.17.2.186 db
172.17.2.186 mysql
172.17.2.187 redis

所以我们在容器里就可以直接使用别名作为服务的主机名。

Ports

用于暴露端口。同docker run -p。示例:

ports:
	- "3000"
	- "8000:8000"
	- "49100:22"
	- "127.0.0.1:8001:8001"

Expose

expose提供container之间的端口访问,不会暴露给主机使用。同docker run --expose。

expose:
	- "3000"
	- "8000"

volumes

挂载数据卷。同 docker run -v 。示例

volumes:
	- /var/lib/mysql
	- cache/:/tmp/cache
	- ~/configs:/etc/configs/:ro

volumes_from

挂载数据卷容器,挂载是容器。同 docker run --volumes-from 。示例:

volumes_from:
	- service_name
	- service_name:ro
	- container:container_name
	- container:container_name:rw

container:container_name 格式仅支持 version 2

environment

添加环境变量。同 docker run -e。可以是数组或者字典格式:

environment:
	RACK_ENV: development
	SESSION_SECRET:

environment:
	- RACK_ENV=development
	- SESSION_SECRET

depends_on

用于指定服务依赖,一般是mysql、redis等。 指定了依赖,将会优先于服务创建并启动依赖。
links也可以指定依赖。

external_links

链接搭配 docker-compose.yml 文件或者 Compose 之外定义的服务,通常是提供共享或公共服务。格式与links相似

external_links:
	- redis_1
	- project_db_1:mysql
	- project_db_1:postgresql

注意,external_links链接的服务与当前服务必须是同一个网络环境。

extra_hosts

添加主机名映射

extra_hosts:
	- "somehost:162.242.195.82"
	- "otherhost:50.31.209.229"

将会在/etc/hosts创建记录:

162.242.195.82  somehost
50.31.209.229   otherhost

Extends

继承自当前yml文件或者其它文件中定义的服务,可以选择性的覆盖原有配置

extends:
	file: common.yml
	service: webapp

service必须有,file可选。service是需要继承的服务,例如web、database。

Net

设置网络模式。同docker的–net参数

net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"

Dns

自定义dns服务器。

dns: 8.8.8.8
dns: 
	- 8.8.8.8
	- 9.9.9.9

cpu_shares,cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir 这些命令都是单个值,含义请参考 docker run。
在这里插入图片描述

docker-compose.yml参考

$ docker-compose
在这里插入图片描述
批处理脚本

关闭所有正在运行容器
docker ps | awk '{print $1}' | xargs docker stop
删除所有容器应用
docker ps -a | awk '{print $1}' | xargs docker rm
或者
docker rm $(docker ps -a -q)

docker-composer体验

注意nginx的配置
比如我们通过docker-composer来帮我们编排lrnp环境
如下为文件目录
在这里插入图片描述
对于PHP,nginx我们采用基于dockerfile的方式构建,而redis则直接利用之前使用的镜像

# 编排php,redis,nginx容器
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
	nginx: # 这个表示服务的名称,课自定义; 注意不是容器名称
		build: # 根据dockerfile构建镜像及构建为容器
			context: ./nginx
		image: nginx1.4_composer # 指定容器的镜像文件
		container_name: nginx-1.4-composer # 这是容器的名称
		ports: # 配置容器与宿主机的端口
			- "8001:80"
		privileged: true # 执行特殊权限的命令
		volumes: # 配置数据挂载
			- /redis_2004/09/nginx/conf:/conf
		working_dir: /conf #工作目录
	php: # 这个表示服务的名称,课自定义; 注意不是容器名称
		build: # 根据dockerfile构建镜像及构建为容器
			context: ./php
		image: php7.3_composer # 指定容器的镜像文件
		container_name: php-7.3-composer # 这是容器的名称
		ports: # 配置容器与宿主机的端口
			- "9001:9000"
		volumes: # 配置数据挂载
			- /redis_2004/09/php/www:/www
	redis: # 这个表示服务的名称,课自定义; 注意不是容器名称
		image: redis5asm # 指定容器的镜像文件
		container_name: redis-5-composer # 这是容器的名称
		ports: # 配置容器与宿主机的端口
			- "6800:6800"

然后执行命令
docker-compose up -d # 启动命令
正常的结果
在这里插入图片描述
在这里插入图片描述
我们可以通过如上的命令来查看docker-compose在执行之后的创建了一个bridge模式的网段并且自动进行分配
在这里插入图片描述
可以看到是创建了相应的容器,不过在上面redis容器没有启动,那么很可能没有传入挂载命令的关系,同时也挂载redis的配置

# 编排php,redis,nginx容器
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
	nginx: # 这个表示服务的名称,课自定义; 注意不是容器名称
		build: # 根据dockerfile构建镜像及构建为容器
			context: ./nginx
		image: nginx1.4_composer # 指定容器的镜像文件
		container_name: nginx-1.4-composer # 这是容器的名称
		ports: # 配置容器与宿主机的端口
			- "8001:80"
		privileged: true # 执行特殊权限的命令
		volumes: # 配置数据挂载
			- /redis_2004/09/nginx/conf:/conf
		working_dir: /conf #工作目录
	php: # 这个表示服务的名称,课自定义; 注意不是容器名称
		build: # 根据dockerfile构建镜像及构建为容器
			context: ./php
		image: php7.3_composer # 指定容器的镜像文件
		container_name: php-7.3-composer # 这是容器的名称
		ports: # 配置容器与宿主机的端口
			- "9001:9000"
		volumes: # 配置数据挂载
			- /redis_2004/09/php/www:/www
	redis: # 这个表示服务的名称,课自定义; 注意不是容器名称
		image: redis5asm # 指定容器的镜像文件
		container_name: redis-5-composer # 这是容器的名称
		ports: # 配置容器与宿主机的端口
			- "6800:6800"
		volumes: # 配置数据挂载
			- /redis_2004/09/redis:/redis
		command: top

配置网络

设置网络并自定义网络段

# 设置网络模块
networks:
# 自定义网络
	nginx_net:
		driver: bridge
		ipam: #定义网段
		config:
			- subnet: "172.15.22.0/24"

使用网络

redis: # 这个表示服务的名称,课自定义; 注意不是容器名称
	image: redis5asm # 指定容器的镜像文件
	networks: ## 引入外部预先定义的网段
		nginx_net:
			ipv4_address: 172.15.22.10 #设置ip地址

进行如下完整代码

# 编排php,redis,nginx容器
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
	nginx: # 这个表示服务的名称,课自定义; 注意不是容器名称
		build: # 根据dockerfile构建镜像及构建为容器
			context: ./nginx
		image: nginx1.4_composer # 指定容器的镜像文件
		container_name: nginx-1.4-composer # 这是容器的名称
		ports: # 配置容器与宿主机的端口
			- "8001:80"
		privileged: true # 执行特殊权限的命令
		volumes: # 配置数据挂载
			- /redis_2004/09/nginx/conf:/conf
		working_dir: /conf #工作目录
	php: # 这个表示服务的名称,课自定义; 注意不是容器名称
		build: # 根据dockerfile构建镜像及构建为容器
			context: ./php
		image: php7.3_composer # 指定容器的镜像文件
		container_name: php-7.3-composer # 这是容器的名称
		ports: # 配置容器与宿主机的端口
			- "9001:9000"
		volumes: # 配置数据挂载
			- /redis_2004/09/php/www:/www
	redis: # 这个表示服务的名称,课自定义; 注意不是容器名称
	image: redis5asm # 指定容器的镜像文件
	networks: ## 引入外部预先定义的网段
		nginx_net:
			ipv4_address: 172.15.22.10 #设置ip地址
	container_name: redis-5-composer # 这是容器的名称
	ports: # 配置容器与宿主机的端口
		- "6800:6800"
	volumes: # 配置数据挂载
		- /redis_2004/09/redis:/redis
	command: top
# 设置网络模块
networks:
	# 自定义网络
	nginx_net:
	driver: bridge
	ipam: #定义网段
		config:
			- subnet: "172.15.22.0/24"

测试
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值