Compose是一个用于定义和运行多容器Docker应用程序的工具,前世是Fig。它非常适用于在开发、测试、构建CI工作流等场景。
使用Compose大致有3个步骤:
以disvoery-eureka为例讲解Compose基本步骤:
1.在discovery-eureka-0.0.1-SNAPSHOT.jar所在路径(默认是项目的target目录)创建Dockerfile文件,并在其中添加如下内容。
#基于哪个镜像
FROM java:8
#将本地文件夹挂载到当前容器
VOLUME /tmp
#复制文件到容器,也可以直接写成ADD discovery-eureka-0.0.1-SNAPSHOT.jar /app.jar
ADD discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c "touch /app.jar"
#声明需要暴露的端口
EXPOSE 9000
#配置容器启动后执行的命令
EXTRYPOINT ["java","-Djava.security.egd=file:/dve/./urandom","-jar","/app.jar"]
3.在discovery-eureka-0.0.1-SNAPSHOT.jar所在路径创建文件docker-compose.yml,在其中添加如下内容。
version: '3'
services:
eureka : #指定服务名称
build: . #指定Dockerfile所在路径
ports:
- "8761:8761" #形成端口映射,类似docker run 的-p选项,注意使用字符串形式
docker-compose up
Compose就会自动构建镜像并使用镜像启动容器。也可使用docker-compose up -d后台启动并运行这些容器。
5.访问http://宿主机IP:8761/,即可访问Eureka Server主页。
Docker Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker Compose运行目录下的所有文件(docker-compose.yml、extends文件或环境变量文件等)组成一个工程(默认为docker-compose.yml所在目录的目录名称)。一个工程可包含多个服务,每个服务定义了容器运行的镜像、参数和依赖,一个服务可包括多个容器实例。
build : ./dir
也可以是一个对象,用于指定Dockerfile和参数,例如:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
command: bundle exec thin -p 3000
可以是一个值,也可以是一个列表。示例:
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
可以是一个值,也可以是一个列表。示例:
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
可使用数组或字典两种方式。示例:
enviroment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
envioment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
可指定一个文件路径或路径列表。如果通过docker -compose -f FILE指定了Compose文件,那么env_file中的路径是Compose文件所在目录的相对路径。使用enviroment指定的环境变量会覆盖env_file指定的环境变量。
示例:
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
示例:
expose:
- "3000:
- "8000"
例如:
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
示例:
image: java
可以指定服务名称和服务别名,也可只指定服务名称。
例如:
web:
links:
- db
- db:database
- redis
示例:
network_mode:"bridge"
network_mode:"host"
network_mode:"none"
network_mode:"service:[service name]"
network_mode:"container:[container name/id]"
容器端口小于60将得到错误的接口,因为yaml会把xx:yy的数字解析为60进制。
示例:
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
可以设置宿主机路径(HOST:CONTAINER),也可以指定访问模式(HOST:CONTAINER:ro),
示例:
volumes:
- /var/lib/mysql
- /opt/data:/var/lib/mysql
- ./cache:/tmp/cache
- -/configs:/etc/configs/:ro
- datavolume:/var/lib/mysql
构建或重新构建服务。服务被构建后将以project_service的形式标记,例如composetest_db
查看指定命令的帮助文档。
docker-compose所有命令的帮助文档都可通过该命令查看。
docker-compose help COMMAND
示例:
docker-compose help build #查看docker-compose build的帮助
通过发生SIGKILL信号停止指定服务的容器。
示例:
docker-compose kill eureka
该命令也支持通过参数来指定发生的信号,例如:
docker-compose kill -s SIGINT
查看服务的日志输出。
打印绑定的公共端口。示例:
docker-compose port eureka 8761
这样可输出eureka服务8761端口所绑定的公共端口。
列出所有容器。示例:
docker-compose ps
也可列出指定服务的容器,示例:
docker-compose ps eureka
下载服务镜像。
删除指定服务的容器。示例:
docker-compose rm eureka
在一个服务上执行一个命令。示例:
docker-compose run web bash
这样可启动一个web服务,同时执行bash命令
设置指定服务运行容器的个数,以service=num的形式指定。示例:
docker-compose scale user=3 movie=3
启动指定服务已存在的容器。示例:
docker-compose start eureka
停止已运行的容器,示例:
docker-compose stop eureka
停止后,可使用docker-compose start再次启动这些容器。
构建、创建、重新创建、启动,连接服务的相关容器。所有连接的服务都会启动,除非它们已经停止运行。
docker-compose up命令会聚合所有容器的输出,当命令退出时,所有容器都会停止。使用docker-compose up -d 可在后台启动并运行所有容器。