一。Docker-Compose简介
docker镜像在创建之后,往往需要自己手动pull来获取镜像,然后执行run命令来运行。当服务需要用到多种容器,容器之间又产生了各种依赖和连接的时候,部署一个服务的手动操作是令人感到十分厌烦的。
dcoker-compose技术,就是通过一个.yml配置文件,将所有的容器的部署方法、文件映射、容器连接等等一系列的配置写在一个配置文件里,最后只需要执行docker-compose up命令就会像执行脚本一样的去一个个安装容器并自动部署他们,极大的便利了复杂服务的部署。
使用Compose仅需要三步:
- 自定义应用Dockerfile
- 使用docker-compose.yml 将多个docker应用配置好,将关联关系网络等设置好
- 运行docker-compose up和撰写启动并运行您的整个应用程序。
docker-compose安装部署
安装过程参考:https://docs.docker.com/compose/install/
linux安装
curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
使用该方式安装需要添加执行权限
chmod +x /usr/local/bin/docker-compose
删除只需要执行
rm -rf /usr/local/bin/docker-compose
如果安装pythonpip环境
pip install docker-compose
查看安装版本
[root@cdh2 soft]# docker-compose -v
docker-compose version 1.23.2, build 1110ad0
二。Docker-Compose入门案例
docker-compose例子参考官网入门例子https://docs.docker.com/compose/gettingstarted/
官方例子是:使用python编写一个web程序,当用户访问一次就在redis的计数器上+1,并显示被访问的次数
编写python程序 fsk.py
from flask import Flask
from redis import Redis;
app = Flask(__name__)
cache=Redis('redis',6379) #连接redis redis的ip用主机名,不用ip地址
@app.route("/")
def hello():
vcount=cache.incr("viewCount"); #每有一个人访问累加一个
return "Hello World! this is "+str(vcount)+" count";
if __name__ == "__main__":
app.run(host="0.0.0.0",port=8899)
将来该程序需要部署到linux上 ,需要安装一个python的基础镜像 并且安装python的flash和redis库
编写一个requirements.txt添加(pip installl -r 这个文件就自动安装该文件所有库)
redis
flask
编写Dockerfile文件用于构建镜像
FROM python:3.5-slim
COPY . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python","fsk.py"]
编写docker-compose.yml(该文件就是核心聚合文件,我们的服务之前还需要安装一个redis)
version: '2'
services:
redis:
image: "redis:4"
ports:
- "6379:6379"
fsk:
build: .
container_name: "app_fsk"
volumes:
- ".:/code" #当前目录挂载到容器/code
depends_on:
- redis #依赖redis服务,会先启动redis
links:
- "redis:redis" #表示链接到redis上并且添加一个redis主机名执行redis的服务的ip地址
ports:
- "8899:8899" #对外暴露8899端口
四个文件位于同一个目录
执行命令(-d 表示后台运行)
docker-compose up
打印日志
Creating compose_redis_1 ... done
Creating compose_fsk_1 ... done
Attaching to compose_redis_1, compose_fsk_1
redis_1 | 1:C 24 Jan 11:17:49.462 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 24 Jan 11:17:49.463 # Redis version=4.0.12, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 24 Jan 11:17:49.463 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 24 Jan 11:17:49.465 * Running mode=standalone, port=6379.
redis_1 | 1:M 24 Jan 11:17:49.466 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | 1:M 24 Jan 11:17:49.466 # Server initialized
redis_1 | 1:M 24 Jan 11:17:49.466 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1 | 1:M 24 Jan 11:17:49.469 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1 | 1:M 24 Jan 11:17:49.469 * Ready to accept connections
fsk_1 | * Serving Flask app "fsk" (lazy loading)
fsk_1 | * Environment: production
fsk_1 | WARNING: Do not use the development server in a production environment.
fsk_1 | Use a production WSGI server instead.
fsk_1 | * Debug mode: off
fsk_1 | * Running on http://0.0.0.0:8899/ (Press CTRL+C to quit)
访问http://ip地址:8899
如果需要关闭,进入docker-compose.yml目录
docker-compose down #自动删除启动的容器不会删除镜像
三。Docker-Compose命令简介
docker-compose所有命令可以管理yml中服务的生命周期
[root@cdh2 compose]# docker-compose
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name
(default: directory name)
--verbose Show more output
--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--no-ansi Do not print ANSI control characters
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the
name specified in the client certificate
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
--compatibility If set, Compose will attempt to convert deploy
keys in v3 files to their non-Swarm equivalent
Commands:
build 构建或者重新构建 services就是调用Dockerfile打镜像 指定服务名称
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down 停止and 移除 containers, networks, images, and volumes
events Receive real time events from containers
exec 在运行的容器中执行一个命令
help Get help on a command
images 显示所有镜像
kill 杀死containers
logs 查看所有容器的日志
pause 暂停services
port 打印所有绑定的公共的端口
ps 查看所有运行containers
pull Pull service images
push Push service images
restart Restart services
rm 移除掉已经停止 所有容器 -f 强制删除
run Run a one-off command
scale Set number of containers for a service
start 启动某个services
stop 停止某个 services
top 显示所有运行的经常
unpause Unpause services
up 创建和启动 containers
version Show the Docker-Compose version information
[root@cdh2 compose]# docker-compose logs --help
View output from containers.
Usage: logs [options] [SERVICE...]
Options:
--no-color Produce monochrome output.
-f, --follow Follow log output.
-t, --timestamps Show timestamps.
--tail="all" Number of lines to show from the end of the logs
for each container.
常用命令汇总
- 构建和启动所有服务:docker-compose up -d
- 查看所有运行服务容器:docker-compose ps
- 查看所有构建的镜像: docker-compose images
- 查看所有运行服务进程:docker-compose top
- 停止某个yml定义服务 :docker-compose stop 服务名称(注意是yml中定义服务名称不是生成服务名称)
- 启动某个yml定义服务 :docker-compose start 服务名称
- 下线所有的服务 docker-compose down [会删除容器和docker-compose images中的镜像,但是docker images还是存在]
- 删除所有容器和镜像 docker-compose down --rmi all
四。Docker-Compose配置文件简介
每个docker-compose.yml必须定义image
或者build
中的一个,其它的是可选的。
更详细配置参考:https://docs.docker.com/compose/compose-file/compose-file-v2/
docker-compose.yml文件开头版本和docker引擎的版本参考https://github.com/docker/compose/releases/
Compose file format | Docker Engine |
---|---|
1 | 1.9.0+ |
2.0 | 1.10.0+ |
2.1 | 1.12.0+ |
2.2, 3.0, 3.1, 3.2 | 1.13.0+ |
2.3, 3.3, 3.4, 3.5 | 17.06.0+ |
2.4 | 17.12.0+ |
3.6 | 18.02.0+ |
3.7 |
image
指定镜像tag或者ID。示例:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
注意,在
version 1
里同时使用image
和build
是不允许的,version 2
则可以,如果同时指定了两者,会将build
出来的镜像打上名为image
标签。
build
用来指定一个包含Dockerfile
文件的路径。一般是当前目录.
。Fig将build并生成一个随机命名的镜像。
注意,在
version 1
里bulid
仅支持值为字符串。version 2
里支持对象格式。
build: ./dir
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
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。
cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1
user: postgresql
working_dir: /code
domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43
mem_limit: 1000000000
mem_limit: 128M
memswap_limit: 2000000000
privileged: true
restart: always
read_only: true
shm_size: 64M
stdin_open: true
tty: true