暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Docker(4)-Compose

技术白小白 2019-11-28
268

Docker(4)-ComposeInstall Docker ComposePrerequisitesInstall ComposeDocker Compose实例使用python创建一个应用编写Dockerfile构建镜像在Compose 文件中定义服务使用Compose构建并运行应用常用命令参考文档

Compose是定义和运行多容器Docker应用程序的工具。

我们部署一个应用时,需要先安装配置mysql,nginx...
等应用,然后才可以运行应用,这样显得非常麻烦,Compose
帮解决了这个问题,通过使用YAML文件配置应用服务,然后通过一个命令从配置中创建并启动所有服务。

使用Compose

  1. Dockerfile
    定义应用环境

  2. 定义程序依赖的服务,docker-compose.yml
    ,可以使服务在隔离环境中一起运行

  3. docker-compose up
    命令启动并运行整个应用程序

A docker-compose.yml
looks like this:

 version: '3'
 services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
 volumes:
  logvolume01: {}
复制

Install Docker Compose

Prerequisites

Docker Compose
依赖于Docker
运行,需要先安装Docker

Install Compose

下载DockerCompose稳定版本

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

安装其他版本Docker Compose ,需要替换 1.25.0
 为Compose版本号。

 $ sudo chmod +x /usr/local/bin/docker-compose
复制

测试安装是否完成

 $ docker-compose --version
 docker-compose version 1.25.0, build 1110ad01
复制
  • bash
    and zsh
    shell 命令补全(可选)

  • 卸载Docker Compose

     $ sudo rm /usr/local/bin/docker-compose
    复制

Docker Compose实例

使用python创建一个应用

  1. 创建项目目录

 $ mkdir composetest
 $ cd composetest
复制
  1. 创建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)
复制
  1. 在项目中创建requirements.txt
    文件

 flask
 redis
复制

编写Dockerfile构建镜像

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

 FROM python:3.7-alpine
 WORKDIR /code
 ENV FLASK_APP app.py
 ENV FLASK_RUN_HOST 0.0.0.0
 RUN apk add --no-cache gcc musl-dev linux-headers
 COPY requirements.txt requirements.txt
 RUN pip install -r requirements.txt
 COPY . .
 CMD ["flask", "run"]
复制

这个文件表示:

  • Python 3.7
    构建镜像

  • 设置工作目录为/code

  • 设置环境变量

  • 安装gcc

  • 复制requirements.txt
    ,安装依赖

  • 复制当前项目目录到镜像的工作目录

  • 设置默认运行命令为flask run

在Compose 文件中定义服务

创建docker-compose.yml
文件:

 version: '3'
 services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"
复制

web服务通过Doclerfile构建镜像,然后绑定容器和主机的端口5000。

使用Compose构建并运行应用

在项目目录中,运行启动应用程序docker-compose up

项目目录结构如下:

 $ pwd
 /home/test/composetest
 $ ls
 app.py docker-compose.yml Dockerfile requirements.txt
复制
  1. 启动并运行项目:

 $ docker-compose up
 Creating network "composetest_default" with the default driver
 Creating composetest_web_1 ...
 Creating composetest_redis_1 ...
 Creating composetest_web_1
 Creating composetest_redis_1 ... done
 Attaching to composetest_web_1, composetest_redis_1
 web_1   | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 redis_1 | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
 redis_1 | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started
 redis_1 | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
 web_1   | * Restarting with stat
 redis_1 | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.
 redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
 web_1   | * Debugger is active!
 redis_1 | 1:M 17 Aug 22:11:10.483 # Server initialized
 redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
 web_1   | * Debugger PIN: 330-787-903
 redis_1 | 1:M 17 Aug 22:11:10.483 * Ready to accept connections
复制

在浏览器输入http://111.231.89.202:5000/  可以看到程序已经启动运行,输出

 Hello World! I have been seen 1 times.
复制

刷新页面,数字增加。

 Hello World! I have been seen 30 times.
复制

此时查看镜像目录,会发现出现了刚刚构建的镜像

 $ docker image ls
 REPOSITORY             TAG                 IMAGE ID           CREATED       SIZE
 composetest_web         latest             8d6cc9c12cd4        6 days ago     213 MB
 docker.io/python        3.7-alpine         8922d588eec6        12 days ago    98.4 MB
 docker.io/redis         alpine             6f63d037b592        5 weeks ago    29.3 MB
复制
  1. 查看镜像

 $ docker inspect <tag or id>
复制
  1. 停止服务

 $ docker-compose down
复制

我们已经通过Docker Compose构建了一个简单的应用程序。

接下来我们尝试对web服务添加绑定安全

  1. 添加绑定安全

 version: '3'
 services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"
复制

environment
设置环境变量,表示在开发模式下运行,并在更改时重新加载代码。

volumes
将主机项目目录安装到容器/code
目录,可以直接修改代码而不需要再次重新构建镜像。

  1. 重新构建

 $ docker-compose up
 Creating network "composetest_default" with the default driver
 Creating composetest_web_1 ...
 Creating composetest_redis_1 ...
 Creating composetest_web_1
 Creating composetest_redis_1 ... done
 Attaching to composetest_web_1, composetest_redis_1
 web_1   | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 ...
复制
  1. 更新应用程序

在这里将app.py
中最后一行修改为

 return 'Hello from baymux, I have been seen {} times.\n'.format(count)
复制

由于我们已将程序代码安装到容器中,所以这里不需要在重新构建镜像,直接打开浏览器http://111.231.89.202:5000/,显示如下内容

 Hello from baymux, I have been seen 25 times.
复制

常用命令

 # 后台构建应用并启动
 $ docker-compose up -d
 Starting composetest_redis_1 ... done
 Starting composetest_web_1   ... done
 # 验证启动的服务
 $ docker-compose ps
        Name                     Command               State           Ports        
 -------------------------------------------------------------------------------------
 composetest_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp              
 composetest_web_1     flask run                       Up      0.0.0.0:5000->5000/tcp
 # 停止服务
 $ docker-compose stop
 # 完全停止删除容器
 $ docker-compose down --volumes
 Stopping composetest_web_1   ... done
 Stopping composetest_redis_1 ... done
 Removing composetest_web_run_1 ... done
 Removing composetest_web_1     ... done
 Removing composetest_redis_1   ... done
 Removing network composetest_default
 # docker-compose run 运行一次性命令,哪些环境变量可用于 web服务
 $ docker-compose run web env
 PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 HOSTNAME=f47e2b7395a3
 TERM=xterm
 FLASK_ENV=development
 LANG=C.UTF-8
 GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
 PYTHON_VERSION=3.7.5
 PYTHON_PIP_VERSION=19.3.1
 PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/ffe826207a010164265d9cc807978e3604d18ca0/get-pip.py
 PYTHON_GET_PIP_SHA256=b86f36cc4345ae87bfd4f10ef6b2dbfa7a872fbff70608a1e43944d283fd0eee
 FLASK_APP=app.py
 FLASK_RUN_HOST=0.0.0.0
 HOME=/root
复制

参考文档

  • [Overview of Docker Compose]:  https://docs.docker.com/compose/


文章转载自技术白小白,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论