Docker Compose、Swarm 集群管理

docker-machime和compose、swarm被称为docker三剑客。docker-machine是解决docker运行环境问题,之前已经研究过,下面研究compose和swarm。

1.Docker Compose

dcoker-compose主要是解决本地docker容器编排问题。当然也可以自己编写shell脚本来解决此类问题。

一般是通过yaml配置文件来使用它,这个yaml文件里能记录多个容器启动的配置信息(镜像、启动命令、端口映射等),最后只需要执行docker-compose对应的命令就会像执行脚本一样地批量创建和销毁容器。

1.使用步骤

一般分为3步:

使用 Dockerfile 定义应用程序的环境。

使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

最后,执行 docker-compose up 命令来启动并运行整个应用程序。

2.安装compose

linux下面安装:

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose #下载
sudo chmod +x /usr/local/bin/docker-compose  #赋予可运行权
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose  #创建软连接

 windows安装docker的时候默认会安装。

查看版本:

$ docker-compose --version
docker-compose version 1.20.1, build 5d8c71b2

3.开始使用--构造基于tomcat服务和mysql服务的javaweb项目

(1)准备一个JavaWeb项目,如下:

1535 MINGW64 /e/docker/dockerTest/dockertest4
$ pwd
/e/docker/dockerTest/dockertest4

-1535 MINGW64 /e/docker/dockerTest/dockertest4
$ ls
docker-compose.yml  Dockerfile  ssm.war

(2)文件内容分别如下:

docker-compose.yml内容如下:

# yaml 配置
version: ‘2‘
services:
  #tomcat服务
  tomcat:
    # 指定基于当前./Dockerfile 构建的镜像,这时候无需指定image,如果指定image会代替当前build指定的镜像
    build: .
    # 指定容器名称
    container_name: tomcat_web
    # 指定端口映射
    ports:
     - "8080:8080"
    #volumes:
      #- "$PWD/tomcat/webapps:/usr/local/tomcat/webapps"
    #指定依赖的服务,会先启动依赖服务,后启动自身。停止的时候顺序相反。
    depends_on:
      - mysql
  #mysql服务
  mysql:
    # 指定镜像
    image: "hub.c.163.com/library/mysql"
    container_name: msql_ssm
    ports:
      - "3306:3306"
    # 指定环境变量
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_DATABASE: ssm
    # 覆盖容器启动的默认命令。
    command: [
      ‘--character-set-server=utf8mb4‘,
      ‘--collation-server=utf8mb4_unicode_ci‘      
    ]

该文件定义了两个服务。tomcat和mysql。

tomcat:该服务使用从当前目录下Dockerfile构建的镜像(build指定至于当前目录下Dockerfile的镜像)。端口暴露在8080。

mysql:该服务基于mysql镜像, 

Dockerfile内容如下:(tomcat服务的镜像制作Dockerfile。也就是运行tomcat服务的时候会先基于下面Dockerfile构建镜像,然后启动容器)

FROM hub.c.163.com/library/tomcat
MAINTAINER qlq
COPY ./ssm.war /usr/local/tomcat/webapps

 ssm.war是一个javaweb项目,和上一篇文章自己手动构造的Javaweb镜像一样。

(3)使用 Compose 命令构建和运行您的应用

到 /e/docker/dockerTest/dockertest4目录,也就是docker-compose.yml文件所在的目录。

docker-compose up

如果你想在后台执行该服务可以加上 -d 参数:

docker-compose up -d

(4)我们运行  docker-compose up -d  之后查看镜像和容器信息

1535 MINGW64 /e/docker/dockerTest/dockertest4
$ docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
dockertest4_tomcat             latest              ace88b521179        About an hour ago   350MB
hello_dockerfile               latest              779eab29d6dc        4 days ago          5.59MB
alpine                         latest              e7d92cdc71fe        4 weeks ago         5.59MB
ubuntu                         latest              ccc6e87d482b        4 weeks ago         64.2MB
hello-world                    latest              fce289e99eb9        13 months ago       1.84kB
hub.c.163.com/library/tomcat   latest              72d2be374029        2 years ago         292MB
hub.c.163.com/library/nginx    latest              46102226f2fd        2 years ago         109MB
hub.c.163.com/library/mysql    latest              9e64176cd8a2        2 years ago         407MB

-1535 MINGW64 /e/docker/dockerTest/dockertest4
$ docker ps -a
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                    NAMES
7aa9b3cb61ee        dockertest4_tomcat            "catalina.sh run"        About an hour ago   Up 41 minutes       0.0.0.0:8080->8080/tcp   tomcat_web
279551a99051        hub.c.163.com/library/mysql   "docker-entrypoint.s…"   About an hour ago   Up 41 minutes       0.0.0.0:3306->3306/tcp   msql_ssm

实际上docker compose帮我们创建了一个tomcat镜像,也就是我们Dockerfile中声明的镜像,并且启动了新建的镜像和mysql镜像。

 补充:yml配置文件参考

 (1)version 指定本 yml 依从的 compose 哪个版本制定的。

(2)build 指定为构建镜像上下文路径:

例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:

version: "3.7"
services:
  webapp:
    build: ./dir

或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:

version: "3.7"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
      labels:
        - "com.example.description=Accounting webapp"
        - "com.example.department=Finance"
        - "com.example.label-with-empty-value"
      target: prod

context:上下文路径。

dockerfile:指定构建镜像的 Dockerfile 文件命。

args:添加构建参数,这是只能在构建过程中访问的环境变量。

labels:设置构建镜像的标签。

target:多层构建,可以指定构建哪一层。

(3)cap_add,cap_drop

添加或删除容器拥有的宿主机的内核功能。

cap_add:
  - ALL # 开启全部权限

cap_drop:
  - SYS_PTRACE # 关闭 ptrace权限

(4) cgroup_parent

为容器指定父 cgroup 组,意味着将继承该组的资源限制。

cgroup_parent: m-executor-abcd

(5)command

覆盖容器启动的默认命令。

command: ["bundle", "exec", "thin", "-p", "3000"]

(6)container_name

指定自定义容器名称,而不是生成的默认名称

container_name: my-web-container

(6)depends_on

设置依赖关系。

docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。

docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。

docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。

version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意:web 服务不会等待 redis db 完全启动 之后才启动。

(7) devices

指定设备映射列表。

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

(8)dns 自定义 DNS 服务器,可以是单个值或列表的多个值

dns: 8.8.8.8

dns:
  - 8.8.8.8
  - 9.9.9.9

(9)dns_search

自定义 DNS 搜索域。可以是单个值或列表。

dns_search: example.com

dns_search:
  - dc1.example.com
  - dc2.example.com

(10) entrypoint

覆盖容器默认的 entrypoint。

entrypoint: /code/entrypoint.sh

也可以是以下格式:

entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

(11) env_file

从文件添加环境变量。可以是单个值或列表的多个值。

env_file: .env

也可以是列表格式:

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

(12) environment

添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。

environment:
  RACK_ENV: development
  SHOW: ‘true‘

(13) expose

暴露端口,但不映射到宿主机,只被连接的服务访问。

仅可以指定内部端口为参数:

expose:
 - "3000"
 - "8000"

(14)image

指定容器运行的镜像。以下格式都可以:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # 镜像id

(15)volumes

将主机的数据卷或着文件挂载到容器里。

version: "3.7"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"

(16)network_mode

设置网络模式。

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

2.Swarm

docker-swarm是解决多主机多个容器调度部署得问题。

swarm是基于docker平台实现的集群技术,他可以通过几条简单的指令快速的创建一个docker集群,接着在集群的共享网络上部署应用,最终实现分布式的服务。swarm技术相当不成熟,很多配置功能都无法实现,只能说是个半成品,目前更多的是使用Kubernetes来管理集群和调度容器。

相关推荐