当前位置:   article > 正文

Docker进阶——Docker Compose 的详细使用_docker-compose up -d

docker-compose up -d

Docker进阶——Docker Compose 的详细使用

1、Docker Compose 概述

现有 docker 进行项目部署存在的问题

1、为了完成一个完整项目势必用到N多个容器(一个容器只运行一个进程)配合完成项目中业务开发,一旦引入N多个容器,容器之间就会形成某种依赖,也就意味某个容器或某些容器的运行需要其他容器优先启动之后才能正常运行。容器的编排显得至关重要,容器的运行一定要有先后顺序。

2、现在这种方式使用容器,没有办法站在项目的角度将一个项目用到的一组容器划分到一起,日后难点在于项目的多服务器部署。比如项目在当前服务器上运行成功,需要将项目再部署到另一台服务器上,但我们不清楚哪组容器是项目引用的,哪组容器是别的引用的。

Docker Compose 简介

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。

快速编排:站在项目角度将一组相关联容器整合在一起,对这组容器按照指定顺序进行启动。

Compose 在GitHub上的地址:https://github.com/docker/compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。使用 Docker Compose 可以轻松、高效的管理容器。

Compose 使用的三个步骤

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

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

  • docker-compose.yml 的配置案例如下:

    version: '3'
    services:
      web:
        build: .
        ports:
       - "5000:5000"
        volumes:
       - .:/code
        - logvolume01:/var/log
        links:
       - redis
      redis:
        image: redis
    volumes:
      logvolume01: {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。

两个重要的概念

  • 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python编写,实现上调用了Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker APl,就可以在其上利用Compose来进行编排管理。

2、Docker Compose 安装与卸载

2.1、安装

注意:只有 Linux 平台上在安装docker时没有安装docker-compose,windows、macos平台安装docker时会自动安装docker-compose。

Linux 在线安装 docker-compose

1、下载 docker-compose文件:

官网下载地址——慢:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • 1

国内镜像加速下载地址——快:

sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • 1

在这里插入图片描述

2、赋予执行权限:

sudo chmod +x /usr/local/bin/docker-compose
  • 1

3、使用命令 docker-compose -v 查看 compose 版本:出现版本号说明安装成功

在这里插入图片描述

Linux 离线安装 docker-compose

1、下载 docker-compose安装包

链接: https://pan.baidu.com/s/1YV4wv8m_qQNwLkQcvtZ3TA?pwd=ap1m

提取码: ap1m

2、放入 /usr/local/bin 目录下

3、赋予执行权限:

sudo chmod +x /usr/local/bin/docker-compose
  • 1

2.2、卸载

rm /usr/local/bin/docker-compose
  • 1

3、Docker Compose 快速开始

我们以官网上的简单示例来看看 docker compose 的使用方法。
官网实例地址:https://docs.docker.com/compose/gettingstarted/

设计这么一个场景,使用 Python 启动一个 Web 服务,输出一个hello()方法,每次访问的时候在 Redis 缓存中进行计数,并且将统计的结果打印到页面中。

Docker Compose官方文档快速开始地址:https://docs.docker.com/compose/gettingstarted/

1、搭建环境

1、为项目创建目录

mkdir composetest
  • 1

2、在项目目录中创建一个名为app.py的文件

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
	app.run(host="0.0.0.0",debug=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

3、在项目目录中创建另一个名为 requirements.txt 文件

flask
redis
  • 1
  • 2

2、创建 Dockerfile

在项目目录中,创建一个名为Dockerfile的文件

FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
  • 1
  • 2
  • 3
  • 4
  • 5

这段代码表示:

  • 使用基础镜像 Python 3.4
  • 将当前目录映射到镜像/code目录下
  • 设置工作目录为 /code
  • 安装 Python 依赖包
  • 启动 app.py 程序

3、定义 docker-compose.yml 文件

在项目目录中创建一个名为docker-compose.yml

version: "3.8"  #代表使用docker-compose项目的版本号
services:
  web:
    build: .  #指定Dockerfile的上下文目录
    ports:  #宿主机和容器的端口映射
      - "5000:5000"
    volumes:
      - .:/code
  redis:
     image: "redis:alpine"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

docker-compose 版本和 docker 版本的对应关系:

docker-compose 版本docker 版本
3.819.03.0+
3.718.06.0+
3.618.02.0+
3.517.12.0+
3.417.09.0+
3.317.06.0+
3.217.04.0+
3.11.13.1+
3.01.13.0+
2.417.12.0+
2.317.06.0+
2.21.13.0+
2.11.12.0+
2.01.10.0+

4、使用 Compose 构建项目

在项目目录下,执行命令 docker-compose up

启动成功后的效果:

在这里插入图片描述

查看启动的两个容器:

在这里插入图片描述

默认服务名:项目名_服务名_副本数量

测试 app.py 应用

在这里插入图片描述

可以看到,每访问一次,计数+1。

docker-compose.yml 帮我们下载了哪些镜像

在这里插入图片描述

docker-compose.yml 创建的网络

在这里插入图片描述

项目中的两个服务都在这个网络下面,查看这个网络的元信息:

docker network inspect 4140354c636c
  • 1

在这里插入图片描述

停止 docker-compose

1、docker-compose.yml 文件同级目录下输入命令:

docker-compose down
  • 1

2、Ctrl + C 暴力停止

4、Compose 模板文件指令

模板文件是使用 Docker Compose 的核心,涉及到的指令关键字也比较多。默认的模板文件名称为 docker-compose.yml ,格式为YAML 格式。一个 docker-compose.yml 文件可以分为三层:

#第一层 版本号
version: "3.8"  #代表使用docker-compose项目的版本号
#第二层:services 服务配置
services:
  web:
    build: .
    ports:  #宿主机和容器的端口映射
      - "5000:5000"
    volumes:
      - .:/code
  redis:
     image: "redis:alpine"
# 第三层 其他配置 网络、卷、全局规划
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

build 指令

指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

version: "3.8" 
services:
  web:
    build: .  #指定Dockerfile的上下文目录为当前目录
  • 1
  • 2
  • 3
  • 4

你也可以使用 context 指令指定 Dockerfile 所在文件夹的路径。

使用 dockerfile 指令指定 Dockerfile 文件名。

使用 arg 指令指定构建镜像时的变量。

version: '3'
services:

  webapp:
    build:
      context: ./dir #定Dockerfile的上下文目录为当前目录的dir目录下
      dockerfile: Dockerfile-alternate
      args: 
        buildno: 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

command 指令

覆盖容器启动后默认执行的命令,类似于docker run image 命令

以下面的Dockerfile文件为例,容器启动后执行的是 java -jar apps.jar

FROM openjdk:8-jre
EXPOSE 8081
ENV APP_PATH=/apps
WORKDIR $APP_PATH
COPY apps.jar $APP_PATH
ENTRYPOINT ["java","-jar"]
CMD ["apps.jar"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果我们想要容器启动后执行的是 java -jar test.jar,在docker-compose.yml文件中使用指令 command: [“test.jar”]

version: '3'
services:
  webapp:
    build:
      context: ./dir #定Dockerfile的上下文目录为当前目录的dir目录下
      dockerfile: Dockerfile-alternate
      args: 
        buildno: 1
    command: ["test.jar"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

container_name 指令(不推荐使用)

指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。

container_name: docker-web-container
  • 1

注意: 指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。

depends_on 指令

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

version: '3'

services:
  web:
    build: .
    depends_on: # web服务依赖于db和web服务
      - db
      - redis

  redis:
    image: redis

  db:
    image: postgres
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

注意:在启动web服务时,并不会等待 redisdb 服务进入ready状态,而只是等到它们被启动状态(running状态)了。

environment 指令

设置环境变量,相当于 docker run -e。你可以使用数组或字典两种格式。

只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。

version: '3'

services:
  mysql:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root  #字典格式
      
#====================================================
    environment:
      - "MYSQL_ROOT_PASSWORD=root"  #数组格式
      - "SESSION_SECRET"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

env_file 指令

从文件中获取环境变量,可以为单独的文件路径或列表。

如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。

如果有变量名称与 environment 指令冲突,则按照惯例,以 environment 为准。

env_file: .env

env_file: #指定多个环境变量文件
  - ./common.env
  - ./.env
  - /opt/secrets.env
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

环境变量文件中每一行必须符合格式,支持 # 开头的注释行。

环境变量文件 .env:推荐使用这种命名,因为在Linux下,这种方式命名的文件属于隐藏文件,一定程度上防止泄露不必要的数据。

MYSQL_ROOT_PASSWORD=root
  • 1

expose 指令

用来指定镜像构建过程中容器暴露的端口号,但不映射到宿主机,只被连接的服务访问。

该指令compose配置文件中一般不用,都在Dockerfile文件中使用EXPOSE指定。

image 指令

指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像,相当于 docker run image(镜像名)。

networks 指令

指定启动容器时使用的网络,相当于 docker run --network

version: "3"
services:

  some-service:
    networks:
     - some-network  #指定使用的网络
     - other-network

networks:   #创建网络
  some-network:
  other-network:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

ports 指令

指定宿主机和容器端口映射,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。

注意:当使用 HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为YAML会自动解析xx:yy这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。

volumes 指令

用来指定宿主机目录和容器目录映射

version: "3"

services:
  my_src:
    image: mysql:8.0
    volumes:  #数据卷名称挂载
      - mysql_data:/var/lib/mysql

volumes:  #定义数据卷名称
  mysql_data:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

restart 指令

指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效。

restart: always
  • 1

5、实战:搭建 WordPress

WordPress是使用PHP语言开发的开源博客平台。
官网

1、创建项目目录

新建一个名为 wordpress 的文件夹,然后进入这个文件夹

2、创建 docker-compose.yml 文件

version: "3"
services:

   db:
     image: mysql:8.0
     command:
      - --default_authentication_plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci     
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
  db_data:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

启动 docker-compose

执行命令 docker-compose up 启动 Compose,

启动成功后,查看运行的容器服务:

在这里插入图片描述

浏览器使用IP:8000 访问测试:

后台

在这里插入图片描述

前台

在这里插入图片描述

6、Docker-Compose 常用命令

6.1、命令对象与格式

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

执行 docker-compose [COMMAND] --help 或者 docker-compose help [COMMAND] 可以查看具体某个命令的使用格式。

docker-compose 命令的基本的使用格式是

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

命令选项说明:

  • -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。

  • -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。

  • --verbose 输出更多调试信息。

  • -v, --version 打印版本并退出。

6.2、命令使用说明

up

  • 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
  • 链接的服务都将会被自动启动,除非已经处于运行状态。
  • 可以说,大部分时候都可以直接通过该命令来启动一个项目。
  • 默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。
  • 当通过 Ctrl-C 停止命令时,所有容器将会停止。
  • 如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
  • 如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。
  • 当使用 docker-compose up 服务id,就是对当前项目中的容器服务进行操作

命令格式为 :

docker-compose up [options] [SERVICE...]
  • 1

选项说明:

  • -d 在后台运行服务容器。

  • --no-color 不使用颜色来区分不同的服务的控制台输出。

  • --no-deps 不启动服务所链接的容器。

  • --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。

  • --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。

  • --no-build 不自动构建缺失的服务镜像。

  • -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

down

docker-compose down

此命令将会停止 up 命令所启动的容器,并移除网络,但不会移除数据卷。

docker-compose down 服务id

停止某个服务。

exec

进入指定的容器。

docker-compose exec 服务id /bin/bash
  • 1

ps

列出项目中目前的所有容器。

docker-compose ps [options] [SERVICE...]
  • 1

选项说明:

  • -q 只打印容器的 ID 信息。

restart

重新启动所有已停止并正在运行的服务。

docker-compose restart [options] [SERVICE...]
  • 1

选项:

  • -t, --timeout TIMEOUT 指定重启前停止容器的超时(默认为 10 秒)。

rm

删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。

docker-compose rm [options] [SERVICE...]
  • 1

选项:

  • -f, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
  • -v 删除容器所挂载的数据卷。

top

查看项目中各个服务容器内运行的进程。

如果加上服务id,就是查看项目中指定服务容器的进程。

unpause 和 pause

pause:暂停一个服务容器。

docker-compose pause [SERVICE...]
  • 1

unpause :恢复处于暂停状态中的服务。

docker-compose unpause [SERVICE...]
  • 1

logs

查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。

查看项目中指定服务的日志:

docker-compose logs 服务id
  • 1

注:上面的 服务id 代表 docker-compose.yml 文件中的服务名

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/399052
推荐阅读
相关标签
  

闽ICP备14008679号