Docker-compose 安装与基本使用(四)

Scroll Down

安装 Docker-Compose

Compose有多种安装方式,例如通过 shell, pip以及将 Compose作为容器安装等。本次安装以Shell 为主。

  1. 通过以下命令自动下载并安装适应系统版本的 Compose:
curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 为安装脚本添加执行权限
chmod +x/usr/local/bin/docker-compose

这样, Compose就安装完成了。
可使用以下命令测试安装结果:

docker-compose --version

可输出类似于如下的内容:4 586bhjnkmv

docker-compose version 1.10.0, build 4bd6f1a

说明 Compose已成功安装。

安装 Compose命令补全工具

现在已成功安装 Compose,然而当输 Docker Compose并按下Tab键时, Compose并没有补全命令。要想使用 Compose的命令补全,需要安装命令补全工具。
命令补全工具在Bash和zsh下的安装方式不同,本次以Bash安装为主。
执行以下命令,即可安装命令补全工具:

curl -l https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

这样,在重新登录后,输入 docker-compose并按下Tab键,compose就可自动补全命令了。

Docker Compose 快速入门

基本步骤

使用 Docker Compose 大致有 3 个步骤:

  • 使用 Dockerfile (或其他方式)定义应用程序环境,以便在任何地方重现该环境。
  • 在 docker-compose.yml 文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行。
  • 运行 docker-compose up 命令,启动并运行整个应用程序。

人门示例

下面以 wzq-swagger-mng 为例讲解 compose 的基本步骤。

  1. 使用 mvn clean package 命令打包项目,获得 wzq-swagger-mng.jar。
  2. 在 wzq-swagger-mng.jar 所在路径(默认是项目的 target 目录)创建 Dockerfile 文件,并在其中添加如下内容。
FROM java:8
VOLUME /tmp
ADD wzq-swagger-mng.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 10086
ENTRYPOINT ["java","-Djava.security.edg=file:/dev/.urandom","-jar","/app.jar"]
  1. 在 wzq-swagger-mng.jar 所在路径创建文件 docker-compose.yml,在其中添加如下内容。
version: '2'# 表示该docker-compose.yml文件使用的是version 2 file
services:
  wzq-swagger-mng:# 指定服务名称
    build:#指定Dockerfile所在文件夹的路径
      context: ./
      dockerfile: ./Dockerfile
    ports:
     - "10086:10086"# 指定端口映射,类似 docker run 的 -p 选项,注意使用字符串形式。
  1. 在 docker-compose.yml 所在路径执行以下命令:
    docker-compose up
    Compose就会自动构建镜像并使用镜像启动容器。也可使用 docker-compose up -d后台启动并运行这些容器。
  2. 测试访问
    docker-compose测试页面

工程、服务、容器

Docker Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker Compose运行目录下的所有文件( docker-compose.yml、extends文件或环境变量文件等)组成一个工程(默认为 docker-compose.yml所在目录的目录名称)。一个工程可包含多个服务,每个服务中定义了容器运行的镜像、参数和依赖,一个服务可包括多个容器实例。
对应上面案例中工程名称是 docker-compose.yml 所在的目录名。该工程包含了1个服务,服务名称是 wzq-swagger-mng。执行 docker-compose up -d 时,启动了 wzq-swagger-mng 服务的1个容器实例。

docker-compose.yml 常用命令

docker-compose.yml是 Compose的默认模板文件。该文件有多种写法,例如 Version 1 file format、 Version2 file format、Version2. 1 file format、 Version3 file format等。其中, Version 1 file format将逐步被被弃用, Version2x及 Version3x基本兼容,是未来的趋势。本次只讨论 Version2 file format下的常用命令。

  1. build
    配置构建时的选项, Compose会利用它自动构建镜像。buld的值可以是一个路径
    例如
build:./Dockerfile

也可以是一个对象,用于指定 Dockerfile和参数,
例如

build:
  context: ./
  dockerfile: ./Dockerfile
agrs:
  jacob: 1
  1. command
    覆盖容器启动后默认执行的命令,示例
command: bundle exec thin -p 3000

也可以是一个list,类似于 Dockerfile中的CMD指令,格式如下:

command: [bundle, exec, thin,-p, 3000]
  1. dns
    配置dns服务器。可以是一个值,也可以是一个列表。示例:
dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9
  1. dns_search
    配置DNS的搜索域,可以是一个值,也可以是一个列表。示例
dns_search:example.com
dns_search:
  - dc1.example.com
  - dc2.example.com
  1. environment
    环境变量设置,可使用数组或字典两种方式。示例:
environment
  RACK_ENV: development
  SHOW: true
  SESSION SECRET

environment
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET
  1. env_file
    从文件中获取环境变量,可指定一个文件路径或路径列表。如果通过 docker-compose FILe指定了 Compose 文件,那么 eny_file中的路径是 Compose 文件所在目录的相对路径。使用 environment 指定的环境变量会覆盖 eny_file指定的环境变量。示例
eny_file: .env
eny_file
  - /common.env
  - /apps/web.env
  - /opt/secrets. env
  1. expose
    暴露端口,只将端口暴露给连接的服务,而不暴露给宿主机。示例:
expose:
  - "3000"
  - "8090"
  1. external_links
    连接到 docker-compose.yml外部的容器,甚至并非 Compose 管理的容器,特别是提供共享或公共服务的容器。格式跟 links类似,例如:
external_links:
  - redis_1
  - project_db_1: mysql
  - project_db_1: postgresql
  1. image
    指定镜像名称或镜像Id,如果本地不存在该镜像, Compose会尝试下载该镜像。
    示例
image: Java
  1. links
    连接到其他服务的容器。可以指定服务名称和服务别名( SERVICE: ALIAS),也可只指定服务名称。例如:
web:
  links:
    - db
    - db:database
    - redis
  1. networks
    详细查看:Docker-compose 常用命令及网络设置(五)

  2. network_mode
    设置网络模式。示例

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
  1. ports
    暴露端口信息,可使用H0ST:CONTAINER的格式,也可只指定容器端口(此时宿主机将会随机选择端口),类似于 docker run-p。
    需要注意的是,当使用H0ST:CONTAINER格式映射端口时,容器端口小于60将会得到错误的接口,因为yaml会把xx:yy的数字解析为60进制。因此,建议使用字符串的形式。示例:
ports
  - "3000"
  - "3000-3905"
  - "8000:8000"
  - "9099-9091:8080-8081"
  - "49100:22"
  - "127.0.0.1:8001:8001"
  - "127,0.0.1:5000-5010:5000-5010"
  1. volumes
    卷挂载路径设置。可以设置宿主机路径(HOST:CONTAINER),也可指定访问模式(HOST:C0ONTAINER:ro)。示例:
volumes
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql
  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql
  # Path on the host relative to the Compose file
  - ./cache:/tmp/cache
  # User-relative path
  - ~/configs:/etc/configs/:ro
  #f Named volume
  - datavolume:/var/lib/mysql
  1. volumes_from
    从另一个服务或容器挂载卷。可指定只读(ro)或读写(rw),默认是读写(rw)。
    示例
volumes from
  - service_name
  - service_name:ro
  - container:container_name
  - container:container_name:rw

docker-compose.yml还有很多其他命令,比如 depends_on、pid、 devices等。
本次仅挑选常用的命令进行讲解,其他命令不再赘述。感兴趣的读者们可参考官方文档:https://docs.docker.com/compose/compose-file/

学习于:《Spring Cloud与Docker 微服务架构实战》 — 周立