Docker Compose入门学习

在本文我们来学习使用docker compose来构建一个简单的Python web应用程序。这个应用程序使用的是Flask框架并在Redis维护一个点击计数器。虽然这个示例使用到了Python,不过即使你不熟悉Python也可以很容易理解这些操作。

第一步:配置

1.创建一个项目目录:

  1. $ mkdir composetest
  2. $ cd composetest

2.在项目目录中创建一个app.py文件并复制下面的内容到这个文件:

  1. from flask import Flask
  2. from redis import Redis
  3.  
  4. app = Flask(__name__)
  5. redis = Redis(host='redis', port=6379)
  6.  
  7. @app.route('/')
  8. def hello():
  9.     count = redis.incr('hits')
  10.     return 'Hello World! I have been seen {} times.\n'.format(count)
  11.  
  12. if __name__ == "__main__":
  13.     app.run(host="0.0.0.0", debug=True)

3.在项目目录创建另一个文件requirements.txt并复制下面这些内容:

  1. flask
  2. redis

这个文件定义了应用程序的依赖。

第二步:创建一个Dockerfile

在这个步骤中,我们创建一个Dockerfile用来构建docker镜像。这个镜像包含了Python应用程序所需的所有依赖,包含Python。

在项目目录中,创建一个Dockerfile文件并复制如下内容:

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

这个文件解释如下:

  • 从Python 3.4镜像开始构建镜像
  • 添加当前的目录到镜像中的/code目录
  • 设置工作目录为/code
  • 安装Python依赖
  • 设置容器的默认命令为python app.py
  • 第三步:在compose文件中定义服务

    在项目目录中创建docker-compose.yml文件并复制如下内容:

    1. version: '2'
    2. services:
    3.   web:
    4.     build: .
    5.     ports:
    6.      - "5000:5000"
    7.     volumes:
    8.      - .:/code
    9.   redis:
    10.     image: "redis:alpine"

    compose文件定义了两个服务,web和redis。web服务部分介绍如下:

  • 使用了一个从当前目录的Dockerfile构建的镜像。
  • 映射容器的5000端口到主机的5000端口。
  • 挂载主机上的项目目录到容器内的/code目录,这样更新代码时就不需要重建镜像了。
  • redis服务使用了从docker hub registry拉取的公共Redis镜像。

    第四步:使用compose构建和运行你的app

    1.从项目目录,启动你的应用程序。

    1. $ docker-compose up
    2.  Pulling image redis...
    3.  Building web...
    4.  Starting composetest_redis_1...
    5.  Starting composetest_web_1...
    6.  redis_1 | [8] 02 Jan 18:43:35.576 # Server started, Redis version 2.8.3
    7.  web_1   |  * Running on http://0.0.0.0:5000/
    8.  web_1   |  * Restarting with stat

    compose拉取一个redis镜像,为你的代码构建了一个镜像并启动你所定义的服务。

    2.在浏览器键入http://0.0.0.0:5000/来查看你的应用程序运行情况。
    3.刷新页面。数字应该会递增了。

    第五步:更新应用程序

    因为使用了数据卷把应用程序代码挂载到了容器里,可以对代码进行更新,然后就会马上看到更新了,而不需要重建镜像。
    1.更新app.py并保存。例如:

    1. return 'Hello from Docker! I have been seen {} times.\n'.format(count)

    2.在浏览器中刷新app。应该能看到更新了。

    第六步:尝试一些其它命令

    如果想让你的服务在后台运行,传递-d参数到docker-compose up并使用docker-compose ps查看现在运行的是什么。

    1. $ docker-compose up -d
    2. Starting composetest_redis_1...
    3. Starting composetest_web_1...
    4.  
    5. $ docker-compose ps
    6. Name                 Command            State       Ports
    7. -------------------------------------------------------------------
    8. composetest_redis_1   /usr/local/bin/run         Up
    9. composetest_web_1     /bin/sh -c python app.py   Up      5000->5000/tcp

    docker-compose run命令允许你对你的服务运行一次性的命令。例如,查看web服务有哪些可用的环境变量:

    1. $ docker-compose run web env

    通过docker-compose –help可以查看其它可用的命令。

    如果使用了docker-compose up -d启动应用,当不需要时可能要停止服务:

    1. $ docker-compose stop

    使用down命令可以关掉所有,删除整个容器。传递–volume也会删除由redis容器使用的数据卷:

    1. $ docker-compose down --volumes
    标签:Docker 发布于:2019-11-19 04:37:24