定义和运行多个 Docker 容器的应用,一个项目每每包含多个容器,每次重启都须要手动重启多个容器,显得太不简洁,而docker-compose就是一个完美的解决方案。mysql
$pip install docker-compose $docker-compose --version
由于docker-compose 是根据docker提供的api进行的一层封装,所以,只须要咱们熟练掌握docker的命令,docker-compose的命令我想只须要记住以下两个便可。web
$docker-compose up
该命令十分强大,它将尝试自动完成包括构建镜像,(从新)建立服务,启动服务,并关联服务相关容器的一系列操做。
连接的服务都将会被自动启动,除非已经处于运行状态。
能够说,大部分时候均可以直接经过该命令来启动一个项目。
默认状况,docker-compose up 启动的容器都在前台,控制台将会同时打印全部容器的输出信息,能够很方便进行调试。
当经过 Ctrl-C 中止命令时,全部容器将会中止。
若是使用 docker-compose up -d,将会在后台启动并运行全部的容器。通常推荐生产环境下使用该选项。redis
$docker-compose down
此命令将会中止 up 命令所启动的容器,并移除网络.sql
模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但你们不用担忧,这里面大部分指令跟 docker run 相关参数的含义都是相似的。docker
默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。apache
version: '3' services: db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=root volumes: - /data/mysql:/var/lib/mysql ports: - 3306:3306 restart: always
下面介绍几个关键的指令,指令太多,生产环境下也不是都用得上,遵循二八原则嘛。api
指定 Dockerfile 所在文件夹的路径(能够是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,而后使用这个镜像。网络
version: '3' services: webapp: build: ./dir
覆盖容器启动后默认执行的命令。app
command: echo "hello world"
解决容器的依赖、启动前后的问题。如下栗子会先启动db,redis,再启动webless
version: '3' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
指定为镜像名称或镜像 ID。若是镜像在本地不存在,Compose 将会尝试拉取这个镜像
暴露端口信息。
使用宿主端口:容器端口
数据卷所挂载路径设置,但这里能够有两个选择:
version: '3' services: db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=root volumes: - mysql:/var/lib/mysql ports: - 3306:3306 ... volumes: mysql:
指定容器名称
$docker network create myNet # 新建网络
version: "3" services: some-service: networks: - some-network - other-network networks: some-network: other-network:
随着 Docker 网络的完善,强烈建议你们将容器加入自定义的 Docker 网络来链接多个容器,多容器间经过容器名-DNS解析进行互联。
重启机制
version: '2' services: web: image: apache restart: always
设置环境变量,语法有以下两种
environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET