version: "3"
services:
redis:
image: redis:3.2
networks:
- backend
volumes:
- ./redis/redis.conf:/etc/redis.conf:ro
ports:
- "6379:6379"
command: ["redis-server", "/etc/redis.conf"]
database:
image: mysql:5.7
networks:
- backend
volumes:
- ./mysql/my.cnf:/etc/mysql/my.cnf:ro
- mysql-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=my-secret-pw
ports:
- "3306:3306"
webapp:
build: ./webapp
networks:
- frontend
- backend
volumes:
- ./webapp:/webapp
depends_on:
- redis
- database
nginx:
image: nginx:1.12
- networks:
- frontend
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./webapp/html:/webapp/html
depends_on:
- webapp
ports:
- "80:80"
- "443:443"
networks:
frontend:
backend:
volumes:
mysql-data:
指定镜像
容器最基础的就是镜像,在Docker Compose中指定镜像有两种方式。
方式1:image
这种比较简单,就之间指定镜像仓库中的镜像名称就可以。
方式2:采用Dockerfile文件来构建镜像。通过 build
这个配置能够定义构建的环境⽬录,这与 docker build
中的环境⽬录是同⼀个含义。如果我们通过这种⽅式指定镜像,那么 Docker Compose 先会帮助我们执⾏镜像的构建,之后再通过这个镜像启动容器。在docker build
中通过选项还可以定义许多内容,在Docker Compose也可以。
webapp:
build:
context: ./webapp
dockerfile: webapp-dockerfile
args:
- JAVA_VERSION=1.6
依赖声明
虽然在配置文件中定义了服务,在书写上有从上到下的先后关系。但是在实际的启动中,由于各种因素,这个顺序是无法保证的。如果一个容器的启动依赖于别的容器,那么可以通过depends_on
进行配置
文件挂载
在 Docker Compose ⾥定义⽂件挂载的⽅式与 Docker Engine ⾥也并没有太多的区别,使⽤ volumes
配置可以像 docker CLI ⾥的 -v
选项⼀样来指定外部挂载和数据卷挂载。
能够直接挂载宿主机⽂件系统中的⽬录,也可以通过数据卷的形式挂载内容。并且在使⽤外部⽂件挂载的时候,可以直接指定相对⽬录进⾏挂载,这⾥的相对⽬录是指相对于 docker-compose.yml
⽂件的⽬录
数据卷
如果需要使用数据卷来存放特殊数据,那么可以通过独立于services
的volumes
来声明。Docker Compose会自动创建,如果需要引用外部数据卷需要配置external
,此时Docker Compose 在创建项⽬时不会直接创建数据卷,⽽是优先从 Docker Engine 中已有的数据卷⾥寻找并直接采⽤
配置网络
在 Docker Compose ⾥,我们可以为整个应⽤系统设置⼀个或多个⽹络。网络的声明也独立与services
之外,在根配置下的networks
中,除了上面的例子中简单的声明⽹络名称,让 Docker Compose 自动按默认形式完成网络配置外,还可以显式的指定⽹络的参数。
声明网络并且配置网络驱动和网段。
networks:
frontend:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.10.1.0/24
使用网络别名
直接使⽤容器名或服务名来作为连接其他服务的⽹络地址,因为缺乏灵活性,常常还不能满⾜我们的需要。这时候我们可以为服务单独设置⽹络别名,在其他容器⾥,我们将这个别名作为⽹络地址进⾏访问。
## ......
database:
networks:
backend:
aliases:
- backend.database
## ......
webapp:
networks:
backend:
aliases:
- backend.webapp
frontend:
aliases:
- frontend.webapp
## ......
端口映射
类似与docker CLI
中-p
的选项,但是需要注意的是,由于 YAML 格式对 xx:yy 这种格式的解析有特殊性,在设置⼩于 60 的值时,会被当成时间⽽不是字符串来处理,所以我们最好使⽤引号将端⼜映射的定义包裹起来,避免歧义。