Docker Compose
Docker能够很容易地将每个微服务绑定到容器,并且Docker Compose使得这些容器的编排变得非常简单。没有Docker Compose,容器编排步骤将涉及各种镜像、创建所需的网络,以及以一定顺序通过一系列Docker run 命令来运行应用程序,
Docker Compose的功能不仅在于启动容器;它还有以下的功能:
- 构建、停止以及启动与应用程序相关的容器
- 跟踪运行中容器的日志,避免了必须打开多个终端会话来跟踪每个容器的麻烦
- 查看每个容器的状态
Docker Compose 是本地开发测试使用的,真正上线不用它
linux需要额外安装,自行百度
Compose文件是一个YAML配置文件,该文件定义了启动应用程序所需的服务、网络和卷。Docker要求Compose文件所处的路径与调用docker-compose命令时所处的位置相同,并且该位置中要有一个docker-compose.yml或者docker-compose.yaml的文件,就是说创建个docker-compose文件,把Docker Compose写进这个文件中。一般都是写在同级目录下,也可以使用-f标记来重写这个位置。
常用命令
- docker-compose up Create and start containers
- docker-compose stop Stop services
- docker-compose start Start services
- docker-compose down Stop and remove containers, networks, images, and volumes 停止并删除所有的容器
- docker-compose exec 跟docker exec 一样,对正在运行的容器操作
- docker-compose build Build or rebuild services 先把yml文件中需要build的镜像先build起来,然后再up起来,如果yml中的自定义的Dockerfile文件发生了更改,则需要先这样运行。
- docker-compose config Validate and view the Compose file, 就是查看自己写的docker-compose.yml文件
- docker-compose logs 查看这些容器的日志
- docker-compose logs --tail=n 查看容器的后n条数据
- docker-compose ps 列举docker-compse 里的server
- docker-compose images 列举docker-compose定义的container和images
- docker-compose scale Set number of containers for a service,就是一次启动几个服务,后面会说
- docker-compose -f docker-compose.yml up -f 指定文件,默认是docker-compose。yml 通过-f 可以指定
关于文件版本
一共有三个版本,现在都用版本3,及开头用
version: '3'
version: '3'
services:
database: (这是服务的名字,随便取)
image:mysql (写成这个样子,是要在docker hub 拉取镜像)
environment:
xxxxx: xx
webserver:
image: nginx:alpine
ports:
- 8080:80
depends_on: (这个是说明了启动顺序,Docker Compose默认按从上到下执行,
但是这个指定了顺序,webserver->cache->database)
- cache
- database
cache:
image: redis
然后要启动所有的容器:
docker-compose up
Docker Compose 文件参考
1 Services
- 一个service代表一个container,这个container可以从dockerhub的image来创建,或者本地的Dockerfile,build来创建
- service的启动类似docker run ,可以指定network 和 vomlume,所以可以给service指定network和volume。
service包括以下的选项:
- build
- context
- image
- environment/env_file
- depend_on
- image
- ports
- volumes
- restart
①build
build键值包含了在构建时要应用的配置选项。build键值可以是构建上下文的路径,也可以是一个由上下文和可选的Dockefile位置构成的详情对象。
services:
app:
build: ./app
# 一般用这个就就行了,指明了Dockerfile所在的路径
services:
app:
context: ./app
Dockerfile: dockerfile-app
②context
设置上下文路径,如果时相对路径,就是相对于Compose文件位置而言。
services:
app:
context: ./app
Dockerfile: dockerfile-app
③image
如果使用了build选项时提供了image标签,那么Docker会构建该镜像,并使用所提供的镜像名称和标签为该镜像赋予名称和打上标签。
services:
app:
build: ./app
image: xxx:xxx # 就是给这个容器起一个明,相当于docker run -t xxx:xxx
如果没有build,只有image,那么docker会优先在本地找镜像,本地没有在从dockerhub找
services:
db:
image: pstgres:9.4 # 本地没有,则会从dockrhub拉取
④environment/env_file
environment用于设置应用程序的环境变量,而env_file则提供envirment文件的路径,设置环境变量时会读取该路径。environment/env_file都可以接收作为数组输入的单个文件或多个文件。
environment可以用 = 或者 :
environment:
- ssss=ssss
environment:
ssss: ssss
version: '3'
services:
app:
image: mysql
environment:
PATH: /nome
# ############################
version: '3'
services:
app:
image: mysql
env_file: .env
# ############################
version: '3'
services:
app:
image: mysql
env_file:
- common.env
- app.env
- secrets.env
⑤depends_on
这个键值用于设置跨各个服务的依赖性需求。
version: '3'
services:
database:
image: mysql
webserver:
iamge: naginx:alpine
depends_on:
- cache
- database
cache:
image: redis
⑥ports
这个键值用于指定要被公开到主机端口的容器端口。在提供这个键值时,可指定要将容器端口公开到哪个Docker宿主机端口,也可以仅指定容器端口,这样的话就会在主机上选择一个随机的临时端口号。
version: '3'
services:
database:
imgae: nginx
ports:
- "8080:80"
# ##########################
version: '3'
services:
database:
imgae: nginx
ports:
- "80"
⑦ volumes
volumes可以用作*键值,就是和services同级,也可以用作子选项,就是附属在services下。*和子选项要同时用。
注意如果有子选项,但是没有*的volumes键值,那么就会报错,因为相当于没创建卷,却直接引用。
前面说的利用卷,必须设置*的键值,但是要是用绑定挂载,就不需要*的键了。
version: '3'
services:
database:
image: mysql
environment:
xxx:sss
volumes:
- "dbdata:/var/lib/mysql" # 指定这个容器需要绑定的卷
webserver:
image: nginx:apine
depends_on:
- caceh
- database
cache:
image: redis
volumes:
dbdata # 相当于 docker volume create dbdata
version: '3'
sercives:
database:
image: mysql
environment:
xxx: xxx
volumes:
- "./dbdir:/var/lib/mysql" # 绑定挂载
⑥ restart
restart键值提供了容器的重启策略,默认情况下,重启策略被设置为no, 这意味着Docker无论如何都不重启该容器。可以在以下的重启策略之间选择。
- no 容器绝不会重启
- always 容器总是会在退出之后重启
- on-failure 如果由于运行错误导致退出,则容器将会重启
- unless-stopped 除非显示退出或者Docker守护程序停止运行,否则容器总是会重启
Docekr Compose Demo
docker-compose.yaml 代码清单
version: '3'
services:
app:
build: .
depends_on:
- mysql
restart: "on-failure"
volumes:
- "appdata:/apps/xxx"
mysql:
iamge: mysql
volumes:
- "dbdata:/xxx/xxx"
environment:
- ssss=ssss
volumes:
dbdata
appdata
docker-compose config # 看是否正常
docker-compose up --build # --build会强制Docker重新构建镜像
再来个例子,这里是指定network
version: '3'
services:
worker:
build: ./worker
networks:
-back-tier
networks:
back-iter:
driver: bridge
关于--scale选项, 启动多个服务
version: '3'
services:
redis:
image: redis
web:
build:
context: .
dockefile: Docekrfile
docker-compose up --scale web=3 -d 启动3个web服务,注意web是docker-conpose.yml文件里的services名
上一篇: Java创建和删除目录