2019独角兽企业重金招聘Python工程师标准>>>
什么是docker-compose?
在 docker - 部署一个复杂的springboot服务 该文中,我们部署了一个“复杂”的springboot服务,实现了一个计数服务。通过这次部署操作,我们了解到部署多容器的APP至少需要经过以下几个步骤:
(1)写Dockerfile构建镜像或者从docker registry中拉取镜像
(2)构建多个容器
(3)管理这些容器(启动、停止等)
可见,如果APP涉及到的容器很多,要管理这些容器是比较复杂的,至少命令行敲到想哭。那么,有没有一个工具,帮我们批处理这些容器呢?
docker-compose是docker公司推出的一个服务编排工具,换句话说就是一个批处理容器的工具。该工具可以通过yml文件定义多容器的应用,并创建和管理这些容器。
安装docker-compose
在文章 安装 docker-compose 中,已经详细介绍了compose的几种安装方法,可以参考安装。
docker-compose.yml
docker-compose.yml是compose的默认的脚本名字,在执行compose命令构建的时候,如果不指定文件名,将会默认使用docker-compose.yml文件,和Dockerfile文件类似。
docker-compose.yml是有版本的,现在最新版本是v3版本,v1版本不推荐使用,v2和v3是可兼容的,而且区别不是很大。这里需要提到一点区别,v2只能用于多个容器部署在一个宿主主机,而v3可以集群方式部署在多个宿主主机(swarm)。另外,不同的compose文件版本对docker的版本是有要求的。如果有兴趣,可以在docker的官网中详细了解,版本间的区别链接的地址。我们采用官方推荐的v3版本学习docker-compose。
在compose中,主要有四个基本节点: version、services、networks、volumes。是不是很熟悉,其实compose就是使用脚本方式代替我们之前通过命令行启动每个服务。下面是一个基本的compose脚本。
version: '3'
services:
springboot-docker:
image: myimage:1.0
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:8080
networks:
- mybridge
volumes:
- mydata:/app
networks:
mybridge:
driver: bridge
volumes:
mydata:
本文将通过一个简单的 docker-compose 文件,熟悉常用的docker-compose命令。docker-compose.yml文件存放在dockercompose文件夹中。
version: '3'
services:
busybox:
image: busybox
restart: always
command: /bin/echo
redis:
image: redis:4.0.11
ports:
- 6379:6379
volumes:
- /data/redis:/data
restart: always
command: redis-server
我们查看 docker-compose 有多少种命令,有个大概的了解。docker-compose命令即可查看。
[root@localhost dockercompose]# docker-compose
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f ...] [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 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
这里的选项中有两个是常用的:-f 和 -p
-f :指定文件。在运行up命令启动容器时,如果没有指定docker-compose.yml文件,将会读取当前目录下的docker-compose.yml文件
-p:启动后的服务的名字默认情况下采用compose.yml文件所在的目录+服务名+副本数命名,例如上面的例子的名字为: dockercompose_redis_1 。如果指定-p,则会用项目名代替该文件目录名。
下面开始介绍一些常用的docker-compose命令。
create/start/up/stop/kill/rm/restart/down
docker-compose create | 创建所有的服务 |
docker-compose start | 启动被停止或未启动的服务 |
docker-compose up | 创建所有服务并且启动服务,即同时执行了create和start命令 |
docker-compose stop | 停止所有服务 |
docker-compose kill | 强行停止所有服务 |
docker-compose rm | 删除停止的服务 |
docker-compose restart | 重启所有服务) |
docker-compose down | 停止、删除所有的服务以及网络、镜像 |
其中,up命令启动所有的服务时,如果没有使用-d命令,会在前台启动所有的服务,前台窗口将打印服务的启动日志。建议通过 -d 启动。例如通过up启动上面的redis服务。
[root@localhost dockercompose]# docker-compose up -d
Creating network "dockercompose_default" with the default driver
然后可以通过 docker-compose logs -f 获取输出的日志
ps
该命令可以查看容器列表,可以获取到容器的简单信息。
[root@localhost dockercompose]# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------
dockercompose_busybox_1 /bin/echo Up
dockercompose_redis_1 docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp
上面的信息可以得到容器名、启动命令、容器状态以及端口的映射情况。
scale
该命令用于扩展容器,为service设置多个容器(副本)。我们为上面的busybox服务扩展为2个副本。
[root@localhost dockercompose]# docker-compose scale busybox=2
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting dockercompose_busybox_1 ... done
Creating dockercompose_busybox_2 ... done
稍等一下,通过ps命令可以看到已经启动了两个busybox服务。
前面的输出中,提示该命令已经过期,使用--scale选项指定副本。
我们down了服务后,重新使用up命令并指定副本数
[root@localhost dockercompose]# docker-compose up -d --scale busybox=2
[root@localhost dockercompose]# docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------
dockercompose_busybox_1 /bin/echo Restarting
dockercompose_busybox_2 /bin/echo Restarting
dockercompose_redis_1 docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp
不明白为什么一直都是restarting。。。。。忽略它吧。。。。一般不会在一个宿主部署两个同样的服务