Docker-实战笔记部署-Compose-应用

2次阅读

共计 5485 个字符,预计需要花费 14 分钟才能阅读完成。

前言

Docker Compose的前身是 FigFig 是一个由 Orchard 公司开发的多容器管理工具。这是一个基于 DockerPython工具,允许用户基于一个 YAML 文件定义多容器应用,从而可以使用 fig 命令行工具进行应用的部署,还能实现对应用的生命周期进行管理。而后,Docker公司收购了 Fig,并更为为Docker Compose,命令行工具fig 更名为 docker-compose,自此成为绑定在Docker 引擎之上的外部工具。

安装 Docker Compose

Linux 上安装 Docker Compose 可分为两步:

  • 使用 curl 命令下载二进制文件
  • 使用 chmod 命令赋予权限
  • 验证版本号

    $ curl -L \
    curl -L https://github.com/docker/compose/releases/download/1.25.1-rc1/docker-compose-\
    `uname -s`-`uname -m` \
    -o /usr/local/bin/docker-compose
    $ chmod +x /usr/local/bin/docker-compose 
    $ docker-compose --version #查看版本
    docker-compose version 1.25.1-rc1, build d92e9bee

Compose 文件

Docker Compose使用 YAML 文件来定义多服务的应用,网络和卷,文件存放的默认路径是:./docker-compose.yml,可传入 -f 参数指定具体文件,并且支持 .yml.yaml扩展名。YAML文件是 JSON 的一个子集(JSONJavaScript 的子集),因此也可以使用 JSON 文件进行数据传输。

YAML文件有以下语法规则:

  • 大小写敏感
  • 使用缩进表示层级关系,相同缩进表示同级key(理解为相同层级)
  • 缩进时不允许使用 Tab 键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略。

使用 Docker Compose 部署应用

  • 帮助文档
$ docker-compose --help #查看帮助
  • 拉取源码,查看项目结构

    $ git clone https://github.com/nigelpoulton/counter-app.git
    $ cd counter-app/
    $ tree -C #查看树状图结构
    .
    ├── app.py
    ├── docker-compose.yml
    ├── Dockerfile
    ├── README.md
    └── requirements.txt

    用 tree 查看工作目录结构,一目了然!

    简要介绍这几个文件:app.py是应用程序代码(一个 Python Flask 应用)同时也是核心文件;docker-compose.ymlCompose 文件,用于指导 Docker 如何部署应用;Dockerfile定义了如何构建应用服务的镜像;requirements.txt列出了应用所需依赖的 Python 包。

  • 启动 Compose 应用

    $ docker-compose up & #前台启动应用,& 表示返回终端窗口

    默认情况下,docker-compose up会查找名为 docker-compose.ymldocker-compose.yamlCompose 文件。* 如果 Compose 文件是其他文件名,则需要通过 -f 参数来指定

    $ docker-compose -f prod-equus-bass.yml up #指定 prod-equus-bass.yml 文件名启动应用

    如果需要在后台启动应用,需要传入 -d 参数:

    $ docker-compose up -f prod-equus-bass.yml up -d #指定文件名在后台启动应用

    查看启动 Compose 应用的过程中构建或者拉取的镜像:

    请注意,第 1 行的镜像名 counter-app_web-fe 会将项目名称 counter-app 和服务应用名称 web-fe 连接,作为新构建的镜像名称。

    $ docker image ls
    REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
    counter-app_web-fe           latest              19989da561d9        14 minutes ago      84.5MB
    redis                        alpine              a49ff3e0d85f        11 days ago         29.3MB
    python                       3.4-alpine          c06adcf62f6e        8 months ago        72.9MB

    查看 Dockerfile 文件信息:

    FROM python:3.4-alpine  #基础镜像
    ADD . /code             #将 app.py 文件复制到镜像中
    WORKDIR /code           #设置工作目录
    RUN pip install -r requirements.txt #安装依赖
    CMD ["python", "app.py"] #设置默认启动的应用

    查看 Docker Container 信息:

    显示出两个容器,都是以项目名称 counter-app 为前缀的容器名称。此外,观察容器名的数组后缀 1 表示容器实例序号——与容器扩缩容有关

    $ docker container ls 
    CONTAINER ID       IMAGE           COMMAND                  CREATED                 STATUS   
    c3a032dfd36b    redis:alpine  "docker-entrypoint.s…"   30 minutes ago          Up 30 minutes
    fa448d107b92   counter-app_web-fe   "python app.py" 30 minutes ago      Up 30 minutes
    PORTS                         NAMES
    6379/tcp                 counter-app_redis_1    #注意这里的数字后缀 1
    0.0.0.0:5000->5000/tcp   counter-app_web-fe_1

    查看网络和卷:

    $ docker network ls #网络
    79a6c4de07ff        bridge                    bridge              local
    e0de8f8c1f7b        counter-app_counter-net   bridge              local
    38598419a27a        host                      host                local
    c90f1a680fa6        none                      null                local
    $ docker volume ls #卷
    local               22ae5189527230e12431b9125d66b28e91d93eb96eaeac86078de217aa25665a
    local               counter-app_counter-vol
  • 应用部署测试

    应用部署成功后,在浏览器输入 ip:port 形式查看应用的运行效果

    由于我们使用的是在前台启动应用,使用 &HTTP状态码和日志返回到终端上,这时候可以看到:

使用 Docker Compose 管理应用

如果想要对一个应用的生命周期进行管理,可以使用以下命令:

$ docker-compose up #启动应用
$ docker-compose restart #重启应用
$ docker-compose stop #停止应用,不会删除资源
$ docker-compose rm #删除应用和网络,只留下卷和镜像
$ docker-compose down #删除应用和网络,只留下镜像、卷、源码
Stopping counter-app_redis_1  ...
Stopping counter-app_web-fe_1 ...
redis_1   | 1:signal-handler (1575369323) Received SIGTERM scheduling shutdown...
redis_1   | 1:signal-handler (1575369323) Received SIGTERM scheduling shutdown...
redis_1   | 1:signal-handler (1575369323) Received SIGTERM scheduling shutdown...
redis_1   | 1:M 03 Dec 2019 10:35:23.818 # User requested shutdown...
redis_1   | 1:M 03 Dec 2019 10:35:23.818 * Saving the final RDB snapshot before exiting.
redis_1   | 1:M 03 Dec 2019 10:35:23.818 # User requested shutdown...
redis_1   | 1:M 03 Dec 2019 10:35:23.818 * Saving the final RDB snapshot before exiting.
redis_1   | 1:M 03 Dec 2019 10:35:23.818 # User requested shutdown...
redis_1   | 1:M 03 Dec 2019 10:35:23.818 * Saving the final RDB snapshot before exiting.
redis_1   | 1:M 03 Dec 2019 10:35:23.820 * DB saved on disk
redis_1   | 1:M 03 Dec 2019 10:35:23.820 # Redis is now ready to exit, bye bye...
redis_1   | 1:M 03 Dec 2019 10:35:23.820 * DB saved on disk
redis_1   | 1:M 03 Dec 2019 10:35:23.820 # Redis is now ready to exit, bye bye...
redis_1   | 1:M 03 Dec 2019 10:35:23.820 * DB saved on disk
redis_1   | 1:M 03 Dec 2019 10:35:23.820 # Redis is now ready to exit, bye bye...
Stopping counter-app_web-fe_1 ... done
counter-app_web-fe_1 exited with code 0
counter-app_web-fe_1 exited with code 0
counter-app_redis_1 exited with code 0
Stopping counter-app_redis_1  ... done
counter-app_redis_1 exited with code 0
Removing counter-app_redis_1  ... done
Removing counter-app_web-fe_1 ... done
Removing network counter-app_counter-net
[1]   已完成               docker-compose up
[2]-  已完成               docker-compose up
[3]+  已完成               docker-compose up
$ docker-compose ps #查看应用日志
Name   Command   State   Ports
------------------------------

需要特别注意的是,虽然部署应用被删除了,但是 counter-vol 卷并没有被删除,因为 卷是应用于数据的持久化存储的。因此,卷的生命周期与相应的容器应该是完全解耦的,删除或启动容器,并不会影响到卷。

$ docker volume ls #查看卷
local               22ae5189527230e12431b9125d66b28e91d93eb96eaeac86078de217aa25665a
local               counter-app_counter-vol
$ docker-compose ps #查看应用日志
        Name                      Command               State           Ports
--------------------------------------------------------------------------------------
counter-app_redis_1    docker-entrypoint.sh redis ...   Up      6379/tcp
counter-app_web-fe_1   python app.py                    Up      0.0.0.0:5000->5000/tcp

如果再次启动应用,会发现启动速度变得更快了,这是因为 已经存在,不需要再去拉取和构建新的镜像。

如果想要查看应用内的进程,则需要:

$ docker-compose top #查看应用内进程
counter-app_redis_1
  UID      PID    PPID   C   STIME   TTY     TIME         CMD
------------------------------------------------------------------
guest-r+   1216   1165   0   18:42   ?     00:00:00   redis-server

counter-app_web-fe_1
UID    PID    PPID   C   STIME   TTY     TIME                    CMD
------------------------------------------------------------------------------------
root   1231   1181   0   18:42   ?     00:00:00   python app.py
root   1426   1231   0   18:42   ?     00:00:02   /usr/local/bin/python /code/app.py

注意,PID编号是在 docker 主机上,而不是容器(应用)内的进程ID

DockerfileDocker Compose 文件的对比

Dockerfile 文件和 Docker Compose 文件最大的区别是:前者的代码文件是复制到 ./code 目录,而后者的代码文件是 直接挂载到卷上的,如果卷中有任何修改,这种变化会立刻反映到应用中。

查看卷挂载于 Docker 主机上的什么位置:

$ docker volume inspect counter-vol | grep Mount
正文完
 0