一、docker-compose基础

1.1、什么是docker compose

compose 项目是Docker官方的开源项目,负责实现Docker容器集群的快速编排,通过一个单独的 docker-compose.yml模板文件来定义一组相关联的应用容器为一个项目
docker compose两个概念:
    * 服务:一个应用的容器,实际上可以包含若干运行相同镜像的容器实例
    * 项目:由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义

1.2、基本原理

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

1.3、compose安装

  • 直接从github下载即可,前提要先安装Docker,版本要在1.9.1以上

    通过docker -v 可以查看到docker版本。
  • 通过curl命令来进行下载安装
# 下载过程可能比较慢,需要耐心等待
curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 赋权限
chmod +x /usr/local/bin/docker-compose
# 查看版本(验证是否安装成功)
docker-compose --version

1.4、Docker-compose常用参数

1.4.1、build

  • 定义镜像生成,可以指定Dockerfile文件所在的目录路径,支持绝对路径和相对路径
  • 服务可以基于指定的镜像,也可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。
  • build可以指定为包含构建上下文路径的字符串
# 基于tomcat:lates构建docker-compose

# home目录下建一个新的目录
mkdir test_compose
#  在test_compose目录下新建文件Dockerfile
vim Dockerfile
# 编辑Dockerfile
FROM tomcat:latest
RUN echo "hello docker_compose"
#  在test_compose目录下新建文件docker-compose.yml
vim docker-compose.yml
# 编辑 docker-compose.yml
version: "3.7"                               # 版本号
services:                                       # 服务组
        webapp:                               # 服务名称
                build: ./
        db:
                build: ./                        # Dockerfile文件路径

# 启动
docker-compose up

build两个子参数:

  • context
  • dockerfile
version: "3.7"                                    # 版本号
           services:                              # 服务组
                webapp:                           # 服务名称
                     build:
                           context: .        # 指定Dockerfile文件路径
                              dockerfile: Dockerfile-alternate
                                  # 指定Dockerfile文件

1.4.2、container_name

为自定义的容器指定一个名称,而不是使用默认的名称

version: "3.7"
       services:
           webapp:
                build: 
                    context: ./
                    dockerfile: Dockerfile_centos
                    container_name: my-web-container


# container_name必须在build之后

1.4.3、image

从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID,
如果镜像不存在,Compose 会自动拉去镜像。

version: "3.7"      # 版本号
services:           # 服务组
    webapp:         # 服务名称
      image: tomcat:latest  # 指定镜像启动容器
      container_name: my_test_webapp  # 指定容器名称

1.4.4、depends_on

建立容器依赖关系的参数,可以有多个依赖:

  • docker-compose up 以依赖顺序启动服务
  • docker-compose up 自动包含SERVICE依赖
  • docker-compose stop 按依赖顺序停止服务
version: "3.7"
services:
      webapp:
          image: tomcat:latest
          depends_on:      # 设置依赖服务器
                         - db
     db:
        image: mysql

1.4.5、environment

  • 添加环境变量,可以使用数组或字典
  • 设置镜像变量

    # 字典的形式
    environment:
    RACK_ENV: development
    SHOW: 'true'
    SESSION_SECRET:
    
    # 数组的形式
    environment:
    - RACK_ENV=development
    - SHOW=true
    - SESSION_SECRET

1.4.6、 ports

  • 映射端口,可以使用 HOST:CONTAINER 的方式指定端口,也可以指定容器端口(选择临时主机端口),宿主机会随机映射端口
    *

    ports:
    -"3000-3005"
    -"8000:8000"
    -"9090-9091:8080-8081"
    -"49100:22"

1.4.7、 restart

  • 默认值为 no ,即在任何情况下都不会重新启动容器;
  • 当值为 always 时,容器总是重新启动
  • 当值为 on-failure 时,当出现 on-failure 报错容器退出时,容器重新启动

1.4.8、volumes

  • 挂载一个目录或者一个已存在的数据卷容器,可以直接使用 HOST:CONTAINER 这样的格式,或者使用 HOST:CONTAINER:ro 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统

image.png

1.5、Docker-compose常用命令

1.5.1、docker-compose up

  • 自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
  • 参数:

    • -d 在后台运行服务容器
    • --force-recreate 强制重新创建容器,不能与-no-recreate同时使用
    • –no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
    • –no-build 不自动构建缺失的服务镜像
    • –build 在启动容器前构建服务镜像
    • -t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
  • 更多用法:docker-compose up -h/--help

1.5.2、docker-compose ps

  • 列出项目中所有的容器
docker-compose ps [options] [SERVICE...]
  • 更多用法:docker-compose ps -h/--help
  • 注意:必须进入具体的compose 的yaml文件所在目录,才能执行该命令

1.5.3、docker-compose stop

  • 停止正在运行的容器
docker-compose stop [options] [SERVICE...]
  • 参数:-t,-timeout TIMEOUT 停止容器时候的超时时间

1.5.4、docker-compose logs

  • 查看服务容器的输出
docker-compose logs [options] [SERVICE...]
  • -f 跟踪日志输出

1.5.5、docker-compose build

  • 构建(重新构建)项目中的服务容器的镜像
docker-compose build [options] [--build-arg key=val...] [SERVICE...]
  • 参数:

    • -force-rm 删除构建过程中的临时容器
    • -no-cache 构建镜像过程中不使用缓存
    • –pull 始终尝试通过拉取操作来获取更新版本的镜像
    • -m, –memory MEM为构建的容器设置内存大小
    • -build-arg key=val 为服务器设置build-time变量

1.5.6、docker-compose pull

  • 拉取服务依赖的镜像
docker-compose pull [options] [SERVICE...]
  • 参数:

    • –ignore-pull-failures,忽略拉取镜像过程中的错误
    • –parallel,多个镜像同时拉取
    • –quiet,拉取镜像过程中不打印进度信息

    1.5.7、docker-compose restart

  • 拉取服务依赖的镜像
docker-compose pull [options] [SERVICE...]

1.5.8、docker-compose rm

  • 删除所有(停止状态的)服务容器
docker-compose rm [options] [SERVICE...]
  • 参数:

    • -f,-force,强制直接删除,包括非停止状态的容器
    • -v,删除容器所挂载的数据卷

    1.5.9、docker-compose start

  • 启动已存在的服务容器

二、Dockerfile和Compose对比

Dockerfile方式Compose方式
创建一个镜像,它包含安装运行所需的环境、程序代码等,可以基于该镜像来创建容器多个容器的运行(如服务编排)就可以通过 docker-compose 来实现,它可以轻松的将多个容器作为 service 来运行
dockerfile的作用是从无到有的构建镜像docker-compose.yml - 为 docker-compose 准备的脚本,可以同时管理多个 container,包括他们之间的关系、用官方imag还是自己build、各种网络端口定义、储存空间定义等,它记录一个项目(project,一般是多个镜像)的构建过程

测试菜鸟
10 声望3 粉丝

测试小白爱测试!!!