Docker(1-4) Docker-compose

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。使用前面介绍的 Dockerfile 我们很容易定义一个单独的应用容器。然而在日常开发工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器;再比如在分布式应用一般包含若干个服务,每个服务一般都会部署多个实例。如果每个服务都要手动启停,那么效率之低、维护量之大可想而知。这时候就需要一个工具能够管理一组相关联的的应用容器,这就是 Docker Compose 。

Compose 有 2 个重要的概念:

  • 项目(Project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

  • 服务(Service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

#1. docker compose 安装与卸载

  • step 1:

    sudo curl \
        -L "https://github.com/docker/compose/releases/download/1.29.0/docker-compose-$(uname -s)-$(uname -m)" \
        -o /usr/local/bin/docker-compose
    
    Copied!

    或者

    rz  # 通过 xshell 上传
    mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
    
    Copied!
  • step 2:

    chmod +x /usr/local/bin/docker-compose
    ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    docker-compose --version
    
    Copied!

#2. docker compose 重要命令

#命令选项

命令选项 说明
-f <FILE> 指定使用的 Compose 模板文件,默认为 docker-compose.yml
-p <NAME> 指定项目名称,
默认将使用所在目录名称作为项目名
–verbose 输出更多调试信息
-v 打印版本并退出

#常用 & 重要命令

docker-compose 等同于 docker-compose -f docker-compose.yml 命令,很显然,默认的编排文件的文件名是 docker-compose.yml 。如果你的编排文件的文件名不是 docker-compose.yml,那么你就需要使用 -f 选项给指定。

docker-compose -f xxx.yml 说明
config 验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
此命令不会执行真正的操作,而是显示 docker-compose 程序解析到的配置文件内容。
images 列出 Compose 文件中包含的镜像。
ps 列出项目中目前的所有容器。
build 构建(重新构建)项目中的服务容器。
一般搭配自定义镜像,比如编写的 Dockfile ,功能类似于 docker build .
up 该命令十分强大(重点掌握),它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。具体见下章。
down 此命令停止用 up 命令所启动的容器并移除网络。
stop 停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
如果不指定 service 时是默认停止所有的容器。如 docker-compose -f skywalking.yml stop elasticsearch
选项:-t, --timeout <TIMEOUT> 停止容器时候的超时(默认为 10 秒)
start 启动已经存在的服务容器。用法跟上面的 stop 刚好相反。如果不指定 service 时是默认启动所有的容器。
restart 重启项目中的服务。用法跟上面的 stop,start 一样。
logs 查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。该命令在调试问题的时候十分有用。如
docker-compose -f xxx.yml logs 查看整体的日志
docker-compose -f xxx.yml logs elasticsearch 查看单独容器的日志

#docker up 命令

docker-compose -f xxx.yml up 命令十分强大(重点掌握),它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。

  • docker-compose -f xxx.yml up -d

    默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。

    如果使用docker-compose up -d 将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。

  • docker-compose -f xxx.yml up --no-recreate

    默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。

    如果用户不希望容器被停止并重新创建,可以使用 docker-compose up --no-recreate 。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。

  • docker-compose -f xxx.yml up --no-deps -d <SERVICE_NAME>

    如果用户只想重新部署某个服务,可以使用 docker-compose up --no-deps -d <SERVICE_NAME> 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。

docker-compose -f xxx.yml up 命令总结

  1. -d 在后台运行服务容器。
  2. --no-color 不使用颜色来区分不同的服务的控制台输出。
  3. --no-deps 不启动服务所链接的容器。
  4. --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
  5. --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
  6. --no-build 不自动构建缺失的服务镜像。
  7. -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)

#3. docker-compose.yml 文件

默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。其内容例如:

version: '3'
services:
  mysql-3306:
    container_name: mysql-3306
    image: mysql:8.0.16
    network_mode: "bridge"
    # restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - ./3306/conf.d:/etc/mysql/conf.d
      - ./3306/mysql.conf.d:/etc/mysql/mysql.conf.d
      - ./3306/data:/var/lib/mysql
    ports:
      - "3306:3306"
Copied!

注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等)将会自动被获取,无需在 docker-compose.yml 中重复设置。

docker-compose.yml 文件内容详解 :

<> images

指定为镜像名称或镜像 ID 。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。

image: apache/skywalking-oap-server:6.5.0
image: apache/skywalking-ui:6.5.0
ports

暴露端口信息。使用 宿主端口:容器端口 (HOST:CONTAINER)格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以,端口字符串都使用引号包括起来的字符串格式。

ports: 
    - "3000" 
    - "8080:8080" 
    - "127.0.0.1:8001:8001"
  volumes

数据卷所挂载路径设置。可以设置为宿主机路径HOST:CONTAINER或者数据卷名称VOLUME:CONTAINER,并且可以设置访问模式HOST:CONTAINER:ro

volumes:
  - /app/skywalking/elasticsearch/data:/usr/share/elasticsearch/data:rw
  - conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
  ulimits

指定容器的 ulimits 限制值。例如,指定最大进程数为 65535 ,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制)和 40000(系统硬限制,只能 root 用户提高)

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000
  depends_on

解决容器的依赖、启动先后的问题。以下例子中会先启动 redis mysql 再启动 web

version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
    redis:
      image: redis
  db:
    image: mysql
  environment

设置环境变量。你可以使用数组或字典两种格式。

environment:
  SW_STORAGE: elasticsearch
  SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200

environment:
  - SW_STORAGE=elasticsearch
  - SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200
  restart

指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped 。

restart: always
   

#docker-compose.yml 的 volumes 的第二种写法

docker-compose 里 2 种设置方式都是可以持久化的。

写法一:使用绝对路径 写法二:使用卷标
ghost:  
  image: ghost
  volumes:
      - ./ghost/config.js:/var/lib/ghost/config.js
Copied!
  • 写法一路径直接挂载到本地,比较直观,但需要管理本地的路径;
  • 写法二使用卷标的方式,比较简洁,但你不知道数据存在本地什么位置。

下面说明如何查看 docker 的卷标:

<> 查看所有卷标 查看批量的卷标 查看 volume 详情
docker volume ls 
 
上一篇:jetpack compose之 mutablestate的使用


下一篇:docker-compose安装