如何使用 Docker Compoe 解决开发环境的依赖

如何使用 Docker Compoe 解决开发环境的依赖

当在玩一些开源项目时,很多都是用docker compose编排的,熟悉了后能大大减少部署所需的时间。当然,单机部署可以使用 docker-compose,但是 docker-compose 无法做到集群调度,想要把多台服务组成容器集群,还是推荐推荐使用**kubernetes**

以下内容主要参照拉钩的深入浅出docker文章。

要想使用 Docker Compose,需要先安装(其中在macOS和Windows系统下,Docker Compose 都是随着Docker的安装一起安装好的)一个 Docker Compose。

安装好后,来编写Docker Compose模板文件。

编写 Docker Compose 模板文件

在使用 Docker Compose 启动容器时, Docker Compose 会默认使用 docker-compose.yml 文件

Docker Compose 文件主要分为三部分: services(服务)、networks(网络) 和 volumes(数据卷)。

  • services(服务):服务定义了容器启动的各项配置,就像我们执行docker run命令时传递的容器启动的参数一样,指定了容器应该如何启动,例如容器的启动参数,容器的镜像和环境变量等。
  • networks(网络):网络定义了容器的网络配置,就像我们执行docker network create命令创建网络配置一样。
  • volumes(数据卷):数据卷定义了容器的卷配置,就像我们执行docker volume create命令创建数据卷一样。

一个典型的 Docker Compose 文件结构如下:

version: "3"
services:
  nginx:
    ## ... 省略部分配置
networks:
  frontend:
  backend:
volumes:
  db-data:

下面我们首先来学习一下如何编写 services 部分的配置。

编写 Service 配置

services 下,首先需要定义服务名称,例如你这个服务是 nginx 服务,你可以定义 service 名称为 nginx,格式如下:

version: "3.8"
services:
  nginx:

服务名称定义完毕后,我们需要在服务名称的下一级定义当前服务的各项配置,使得我们的服务可以按照配置正常启动。常用的 16 种 service 配置如下。如果你比较了解,可以直接跳过看 Volume 配置和后续实操即可。

build: 用于构建 Docker 镜像,类似于docker build命令,build 可以指定 Dockerfile 文件路径,然后根据 Dockerfile 命令来构建文件。使用方法如下:

build:
  ## 构建执行的上下文目录
  context: .
  ## Dockerfile 名称
  dockerfile: Dockerfile-name

cap_add、cap_drop: 指定容器可以使用到哪些内核能力(capabilities)。使用格式如下:

cap_add:
  - NET_ADMIN
cap_drop:
  - SYS_ADMIN

command: 用于覆盖容器默认的启动命令,它和 Dockerfile 中的 CMD 用法类似,也有两种使用方式:

command: sleep 3000
command: ["sleep", "3000"]

container_name: 用于指定容器启动时容器的名称。使用格式如下:

container_name: nginx

depends_on: 用于指定服务间的依赖关系,这样可以先启动被依赖的服务。例如,我们的服务依赖数据库服务 db,可以指定 depends_on 为 db。使用格式如下:

version: "3.8"
services:
  my-web:
    build: .
    depends_on:
      - db
  db:
    image: mysql

devices: 挂载主机的设备到容器中。使用格式如下:

devices:
  - "/dev/sba:/dev/sda"

dns: 自定义容器中的 dns 配置。

dns:
  - 8.8.8.8
  - 114.114.114.114

dns_search: 配置 dns 的搜索域。

dns_search:
  - svc.cluster.com
  - svc1.cluster.com

entrypoint: 覆盖容器的 entrypoint 命令。

entrypoint: sleep 3000

entrypoint: ["sleep", "3000"]

env_file: 指定容器的环境变量文件,启动时会把该文件中的环境变量值注入容器中。

env_file:
  - ./dbs.env

env 文件的内容格式如下:

KEY_ENV=values

environment: 指定容器启动时的环境变量。

environment:
  - KEY_ENV=values

image: 指定容器镜像的地址。

image: busybox:latest

pid: 共享主机的进程命名空间,像在主机上直接启动进程一样,可以看到主机的进程信息。

pid: "host"

ports: 暴露端口信息,使用格式为 HOST:CONTAINER,前面填写要映射到主机上的端口,后面填写对应的容器内的端口。

ports:
  - "1000"
  - "1000-1005"
  - "8080:8080"
  - "8888-8890:8888-8890"
  - "2222:22"
  - "127.0.0.1:9999:9999"
  - "127.0.0.1:3000-3005:3000-3005"
  - "6789:6789/udp"

networks: 这是服务要使用的网络名称,对应顶级的 networks 中的配置。

services:
  my-service:
    networks:
     - hello-network
     - hello1-network

volumes: 不仅可以挂载主机数据卷到容器中,也可以直接挂载主机的目录到容器中,使用方式类似于使用docker run启动容器时添加 -v 参数。

version: "3"
services:
  db:
    image: mysql:5.6
    volumes:
      - type: volume
        source: /var/lib/mysql
        target: /var/lib/mysql

volumes 除了上面介绍的长语法外,还支持短语法的书写方式,例如上面的写法可以精简为:

version: "3"
services:
  db:
    image: mysql:5.6
    volumes:
      - /var/lib/mysql:/var/lib/mysql

编写 Volume 配置

如果你想在多个容器间共享数据卷,则需要在外部声明数据卷,然后在容器里声明使用数据卷。例如我想在两个服务间共享日志目录,则使用以下配置:

version: "3"
services:
  my-service1:
    image: service:v1
    volumes:
      - type: volume
        source: logdata
        target: /var/log/mylog
  my-service2:
    image: service:v2
    volumes:
      - type: volume
        source: logdata
        target: /var/log/mylog
volumes:
  logdata:

编写 Network 配置

Docker Compose 文件顶级声明的 networks 允许你创建自定义的网络,类似于docker network create命令。

例如你想声明一个自定义 bridge 网络配置,并且在服务中使用它,使用格式如下:

version: "3"
services:
  web:
    networks:
      mybridge:
        ipv4_address: 172.16.1.11
networks:
  mybridge:
    driver: bridge
    ipam:
      driver: default
      config:
        subnet: 172.16.1.0/24

编写完 Docker Compose 模板文件后,需要使用 docker-compose 命令来运行这些文件。下面我们来学习下 docker-compose 都有哪些操作命令。

Docker Compose 操作命令

我们可以使用docker-compose -h命令来查看 docker-compose 的用法,docker-compose 的基本使用格式如下:

docker-compose [-f <arg>...] [options] [--] [COMMAND] [ARGS...]

其中 options 是 docker-compose 的参数,支持的参数和功能说明如下:

  -f, --file FILE             指定 docker-compose 文件,默认为 docker-compose.yml
  -p, --project-name NAME     指定项目名称,默认使用当前目录名称作为项目名称
  --verbose                   输出调试信息
  --log-level LEVEL           日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  -v, --version               输出当前版本并退出
  -H, --host HOST             指定要连接的 Docker 地址
  --tls                       启用 TLS 认证
  --tlscacert CA_PATH         TLS CA 证书路径
  --tlscert CLIENT_CERT_PATH  TLS 公钥证书问价
  --tlskey TLS_KEY_PATH       TLS 私钥证书文件
  --tlsverify                 使用 TLS 校验对端
  --skip-hostname-check       不校验主机名
  --project-directory PATH    指定工作目录,默认是 Compose 文件所在路径。

COMMAND 为 docker-compose 支持的命令。支持的命令如下:

  build              构建服务
  config             校验和查看 Compose 文件
  create             创建服务
  down               停止服务,并且删除相关资源
  events             实时监控容器的时间信息
  exec               在一个运行的容器中运行指定命令
  help               获取帮助
  images             列出镜像
  kill               杀死容器
  logs               查看容器输出
  pause              暂停容器
  port               打印容器端口所映射出的公共端口
  ps                 列出项目中的容器列表
  pull               拉取服务中的所有镜像
  push               推送服务中的所有镜像
  restart            重启服务
  rm                 删除项目中已经停止的容器
  run                在指定服务上运行一个命令
  scale              设置服务运行的容器个数
  start              启动服务
  stop               停止服务
  top                限制服务中正在运行中的进程信息
  unpause            恢复暂停的容器
  up                 创建并且启动服务
  version            打印版本信息并退出

学习完 Docker Compose 模板的编写和 docker-compose 命令的使用方法,下面我们编写一个 Docker Compose 模板文件,实现一键启动 WordPress 服务

使用 Docker Compose 管理 WordPress

启动 WordPress

第一步,创建项目目录。首先我们在 /tmp 目录下创建一个 WordPress 的目录,这个目录将作为我们的工作目录。

$ mkdir /tmp/wordpress

第二步,进入工作目录。

$ cd /tmp/wordpress

第三步,创建 docker-compose.yml 文件。

$ touch docker-compose.yml

然后写入以下内容:

version: '3'
services:
   mysql:
     image: mysql:5.7
     volumes:
       - mysql_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: mywordpress
       MYSQL_USER: mywordpress
       MYSQL_PASSWORD: mywordpress
   wordpress:
     depends_on:
       - mysql
     image: wordpress:php7.4
     ports:
       - "8080:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: mysql:3306
       WORDPRESS_DB_USER: mywordpress
       WORDPRESS_DB_PASSWORD: mywordpress
       WORDPRESS_DB_NAME: mywordpress
volumes:
    mysql_data: {}

第四步,启动 MySQL 数据库和 WordPress 服务。

$ docker-compose up -d
Starting wordpress_mysql_1 ... done
Starting wordpress_wordpress_1 ... done

执行完以上命令后,Docker Compose 首先会为我们启动一个 MySQL 数据库,按照 MySQL 服务中声明的环境变量来设置 MySQL 数据库的用户名和密码。然后等待 MySQL 数据库启动后,再启动 WordPress 服务。WordPress 服务启动后,我们就可以通过 http://localhost:8080 访问它了,访问成功后,我们就可以看到WordPress界面,然后按照提示一步一步设置就可以拥有属于自己的专属博客系统了。

停止 WordPress

如果你不再需要 WordPress 服务了,可以使用docker-compose stop命令来停止已启动的服务。

posted @ 2021-02-23 15:03  Jeff_blog  阅读(253)  评论(0编辑  收藏  举报