(四)Docker三剑客之Compose
Compose 定位是 「 定义和运行多个 Docker 容器的应用( Defining and running multicontainer Docker applications) 」 ,其前身是开源项目 Fig。Github上维护。
参考:
1. 下载安装
curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
cd /usr/local/bin/
chmod +x docker-compose
2. 启动
mkdir compose
cd compose/
vim docker-compose.yml
docker-compose up
docker-compose.yml
version: '3'
services:
redis:
image: "redis:latest"
ports:
- "6379:6379"
3. docker-compose help
[root@Thor compose]# docker-compose help
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
--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 (for example if your docker host
is an IP address)
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
[root@Thor compose]#
4. 启动项目中的服务(容器)
[root@Thor compose]# docker-compose start redis
Starting redis ... done
[root@Thor compose]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------
compose_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
[root@Thor compose]#
5. docker-compose exec
[root@Thor compose]# docker-compose exec redis bash
root@883179463cd2:/data# redis-cli
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379>
127.0.0.1:6379>
6. Compose模板文件
模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。大部分指令和 docker run 相关参数的含义类似。
默认的模板文件名为 docker-compose.yml ,格式为 YAML 格式。
6.1 使用示例
[root@Thor compose-redis]# vim docker-compose.yml
[root@Thor compose-redis]# cat docker-compose.yml
version: '3'
services:
redis-server:
build: .
ports:
- "6379:6379"
httpd:
image: "httpd:latest"
ports:
- "7777:80"
[root@Thor compose-redis]#
[root@Thor compose-redis]# docker-compose up
Creating network "composeredis_default" with the default driver
Building redis-server
Step 1/5 : FROM ubuntu:latest
---> 113a43faa138
Step 2/5 : RUN apt-get update && apt-get install -y redis && mkdir -p /home/ld
---> Using cache
---> f16df9849ef0
Step 3/5 : COPY ./testfile.txt /home/ld
---> 43470c11aef2
Removing intermediate container c0e35ebbb193
Step 4/5 : VOLUME /data
---> Running in e8ff92be38af
---> 00f6628e94f7
Removing intermediate container e8ff92be38af
Step 5/5 : CMD redis-server
---> Running in bf4d5db3edb6
---> 1917e53f658f
Removing intermediate container bf4d5db3edb6
Successfully built 1917e53f658f
WARNING: Image for service redis-server was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating composeredis_redis-server_1 ...
Creating composeredis_httpd_1 ...
Creating composeredis_httpd_1 ... done
Attaching to composeredis_redis-server_1, composeredis_httpd_1
redis-server_1 | 1:C 06 Aug 13:57:29.464 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
httpd_1 | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.19.0.3. Set the 'ServerName' directive globally to suppress this message
redis-server_1 | 1:C 06 Aug 13:57:29.464 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
httpd_1 | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.19.0.3. Set the 'ServerName' directive globally to suppress this message
redis-server_1 | 1:C 06 Aug 13:57:29.464 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
httpd_1 | [Mon Aug 06 13:57:29.497130 2018] [mpm_event:notice] [pid 1:tid 140095686104960] AH00489: Apache/2.4.33 (Unix) configured -- resuming normal operations
httpd_1 | [Mon Aug 06 13:57:29.497235 2018] [core:notice] [pid 1:tid 140095686104960] AH00094: Command line: 'httpd -D FOREGROUND'
redis-server_1 | 1:M 06 Aug 13:57:29.466 * Running mode=standalone, port=6379.
redis-server_1 | 1:M 06 Aug 13:57:29.467 # 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-server_1 | 1:M 06 Aug 13:57:29.467 # Server initialized
redis-server_1 | 1:M 06 Aug 13:57:29.467 # 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-server_1 | 1:M 06 Aug 13:57:29.467 # 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-server_1 | 1:M 06 Aug 13:57:29.467 * Ready to accept connections
[root@Thor compose-redis]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------
composeredis_httpd_1 httpd-foreground Up 0.0.0.0:7777->80/tcp
composeredis_redis-server_1 redis-server Up 0.0.0.0:6379->6379/tcp
[root@Thor compose-redis]#
[root@Thor compose-redis]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
composeredis_redis-server latest 1917e53f658f 4 minutes ago 125 MB
redis 1.0.0 614b878bc14e 13 days ago 125 MB
registry latest b2b03e9146e1 4 weeks ago 33.3 MB
golang latest 4e611157870f 5 weeks ago 794 MB
redis latest 71a81cb279e3 5 weeks ago 83.4 MB
httpd latest 2a7d646dbba8 5 weeks ago 177 MB
ubuntu latest 113a43faa138 2 months ago 81.1 MB
google/cadvisor latest 75f88e3ec333 8 months ago 62.2 MB
[root@Thor compose-redis]#
6.2 常用Compose 命令说明
6.2.1 build 命令
指定 Dockerfile 所在文件夹的路径( 可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
6.2.2 command 命令
覆盖容器启动后默认执行的命令。
command: redis-server
6.2.3 container_name 命令
指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。
container_name: docker-redis-container
6.2.4 depends_on 命令
解决容器的依赖、启动先后的问题。
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
6.2.5 image 命令
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
6.2.6 ports 命令
暴露端口信息,格式为:
- 宿主端口:容器端口 (HOST:CONTAINER)
- 容器端口
如果仅仅指定容器的端口( 宿主将会随机选择端口)
6.2.7 volumes 命令
数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER ) 或加上访问模式(HOST:CONTAINER:ro ),该指令中路径支持相对路径。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro