文章目录
Docker Compose简介
Docker Compose 能够在Docker结点上,以单引擎模式(Single-Engine Mode)进行多容器应用的部署和管理,Docker Compose并不是通过脚本和冗余的docker命令来将应用组件组织起来,而是通过一个声明式的配置文件描述整个应用,从而使用一条命令完成部署
基本命令
命令 | 作用 |
---|---|
docker-compose --version | 查看Docker Compose 版本 |
docker-compose up & | 使用docker-compose.yml构建应用并启动,由于使用&参数启动,所以是前台运行 |
docker-compose up -d | 使用docker-compose.yml构建应用并启动,使用-d参数后台启动Docker Compose应用 |
docker-compose down | 删除Docker Compose应用,删除对应容器和对应用的定义,仅留下镜像、卷和源码(指的是yaml文件和容器外的文件) |
docker-compose ps | 查看Docker Compose应用状态 |
docker-compose top | 列出Docker Compose应用各个容器内运行的进程 |
docker-compose stop | 停止Docker Compose应用,但并不会删除资源 |
docker-compose restart | 重新启动Docker Compose应用 |
docke network ls | 查看docker中的网络 |
docker volume ls | 查看docker中的卷 |
Docker Compose 使用YAML文件定义应用
- Docker Compose 使用YAML文件来定义多服务应用,YAML是JSON的的一个子集,因此也可以使用JSON
- Docker Compose 默认使用文件名 docker-compose.yml,也可以使用-f参数指定具体文件
version: "3.5"
services:
web-fe:
build: .
command: python app.py
ports:
- target: 5000
published: 5000
networks:
- counter-net
volumes:
- type: volumen
source: counter-vol
target: /code
redis:
image: "redis:alpine"
networks:
counter-net:
networks:
counter-net:
volumes:
counter-vol:
- 这里包含了四个一级key,包括version、services、networks、volumes
- version是必须指定的,而且总是位于文件的第一行,它定义了Compose文件格式(主要是API)的版本,注意version并非定义Docker Compose 或 Docker 引擎的版本号
- services 用于定义不同的应用服务,上面定义了两个服务,一个是名为web-fe的Web前端服务以及一个名为redis的内存数据库服务。Docker Compose 会将每个服务部署在各自的容器中
- networks 用于指引 Docker 创建新的网络,默认情况下,Docker Compose 会创建 bridge网络,这是一种单主机网络,只能够实现同一主机上容器的连接,当然也可以使用driver属性来指定不同的网络类型,如下:
networks:
over-net:
driver: overlay
attachable: true
这里表示创建了一个名为over-net的Overlay网络,允许独立容器(standalone container)连接(attachable)到该网络上
- volumes 用于指引Docker来创建新的卷
- services部门定义了两个二级key,包括web-fe和redis,它们各自定义了一个应用程序服务,Docker Compose会将每个服务部署为一个容器,并且会使用key作为容器名字的一部分
服务定义
- web-fe的服务定义中,包含如下指令,build: .(点) 指定Docker基于当前目录(.)下Dockerfile中定义的指令来构建一个新镜像。该镜像被用于启动该服务的容器
- command: python app.py 指定Docker在容器中执行名为 app.py 的Python脚步作为主程序,因此镜像中必须包含app.py文件以及Python,这一点在Dockerfile中可以得到满足
- ports: 指定Docker将容器内(-target)的5000端口映射到主机(published)的5000端口。这意味着发送到Docker主机5000端口的流量被转发到容器的5000端口,容器中的应用监听端口5000
- networks:使得Docker可以将服务连接到指定的网络上,这个网络应该是已经存在的,或者是在networks一级key中定义的网络。对于Overlay网络来说,它还需要定义一个attachable标志,这样独立的容器才可以连接上它(这时Docker Compose 会部署独立的容器而不是 Docker 服务)
- volumes:指定Docker 将 counter-vol 卷(source:) 挂载到容器内的 /code(target:),counter-vol卷应该是已存在的,或者是在文件下方的volumes一级key中定义的
- 综上所述,Docker Compose会调用Docker来为web-fe服务部署一个独立的容器,该容器基于与 Compose 文件位于同一目录的 Dockerfile 构建的镜像。基于该镜像启动的容器会运行app.py作为其主程序,将5000端口暴露给宿主机,连接到counter-net网络上,并挂载一个卷到/code
- 从技术上讲,并不需要配置 command: python app.py,因为镜像的Dockerfile 已经将python app.py 定义为默认的启动程序,但是在yaml定义的command也可以负载Dockerfile中配置的CMD指令
- redis服务的定义如下,image: redis:alpine 使得Docker可以基于redis:alpine 镜像启动一个独立的名为redis的容器,这个镜像会从Docker Hub拉取下来
- networks:配置redis容器连接到counter-net网络
10.由于两个废物都连接到counter-net网络,因此它们可以通过名称解析到对方的地址
使用Docker Compose 部署应用
docker-compose up &
- 启动一个Compose应用的常用方式就是docker-compose up 命令,通过Compose文件定义的多容器应用称为Compose应用,它会根据 docker-compose.yml 和 Dockerfile构建所需的镜像,根据 docker-compose.yml 创建网络和卷,并启动容器
- 默认情况下docker-compose up会查找名为 docker-compose.yml 或 docker-compose.yaml 的Compose文件,如果Compose文件是其他文件名,则需要通过-f参数来指定,如下命令会基于prod-equus-bass.yml 的Compse文件部署应用
docker-compose -f prod-equus-bass.yml up
docker-compose up -d
docker-compose -f prod-equus-bass.yml up -d
也可以使用-d在后台启动应用
使用Docker Compose管理应用
docker-compose down
- 先尝试关闭web-fe和redis两个服务
- 关闭两个服务成功后,会删除两个服务,删除counter-net网络,然后docker-compose up进程退出
- counter-vol卷并没有被删除,因为卷是应该用于数据的长期持久化存储的,因此卷的生命周期是与相应的容器完全解耦的,卷就主机上的文件和容器内文件进行映射,改变主机上的文件会影响容器内文件,改变容器内文件也会影响主机内文件,但是删除了容器,主机上的文件也不会删除,所以是持久化的
参考
《 深入浅出 Docker 》