docker-compose 使用

在此页面上,您将构建一个在Docker Compose上运行的简单的Python Web应用程序。该应用程序使用Flask框架,并在Redis中维护一个命中计数器。虽然示例使用Python,但这里展示的概念应该是可以理解的,即使您不熟悉它。

步骤1:设置

  1. 为项目创建一个目录:
    $ mkdir composetest
    $ cd composetest
    
  2. app.py在您的项目目录中创建一个名为“
    from flask import Flask
    from redis import Redis
    
    app = Flask(__name__)
    redis = Redis(host='redis', port=6379)
    
    @app.route('/')
    def hello():
        count = redis.incr('hits')
        return 'Hello World! I have been seen {} times.\n'.format(count)
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)
    

    在此示例中,redis是应用程序网络上的redis容器的主机名。我们使用Redis的默认端口6379

  3. requirements.txt在您的项目目录中创建另一个文件,并将其粘贴到:
    flask
    redis
    

这些定义了应用程序的依赖关系。

步骤2:创建一个Docker文件

在此步骤中,您将编写一个构建Docker映像的Docker文件。该图像包含Python应用程序所需的所有依赖项,包括Python本身。

在您的项目目录中,创建一个名为Dockerfile并粘贴以下内容的文件:

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

这告诉Docker:

  • 从Python 3.4映像开始构建一个图像。
  • 将当前目录添加./code图像中的路径中。
  • 将工作目录设置为/code
  • 安装Python依赖关系。
  • 将容器的默认命令设置为python app.py

有关如何编写Dockerfiles的更多信息,请参阅Docker用户指南 和Dockerfile引用

步骤3:在Compose文件中定义服务

创建一个docker-compose.yml在你的项目目录中调用的文件并粘贴以下内容:

version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: "redis:alpine"

此撰写文件定义了两个服务,webredis。网络服务:

  • 使用从Dockerfile当前目录中构建的映像。
  • 将容器上暴露的端口5000转发到主机上的端口5000。我们使用Flask Web服务器的默认端口5000
  • 将主机上的项目目录安装在/code容器内,允许您修改代码,而无需重新构建映像。

redis服务使用从Docker Hub注册表提取的公共 Redis映像。

提示:如果您的项目在Users目录(cd ~)之外,则需要共享您正在使用的Dockerfile和卷的驱动器或位置。如果出现指示未找到应用程序文件的运行时错误,则会拒绝卷挂载,否则服务无法启动,请尝试启用文件或驱动器共享。卷安装需要在C:\Users(Windows)或/Users(Mac)以外的项目使用共享驱动器 ,并且对于使用Linux容器的 Docker for Windows的任何项目都是必需的。有关详细信息,请参阅Docker for Windows上的共享驱动器, Docker for Mac上的文件共享以及如何在容器中管理数据的常规示例。

步骤4:使用Compose构建和运行您的应用程序

  1. 从您的项目目录,启动您的应用程序。
     $ docker-compose up
     Pulling image redis...
     Building web...
     Starting composetest_redis_1...
     Starting composetest_web_1...
     redis_1 | [8] 02 Jan 18:43:35.576 # Server started, Redis version 2.8.3
     web_1   |  * Running on http://0.0.0.0:5000/
     web_1   |  * Restarting with stat
    

    Compose提取Redis映像,为代码构建映像,并启动您定义的服务。

  2. http://0.0.0.0:5000/在浏览器中输入以查看运行的应用程序。

    如果您在Linux上使用Docker,那么Web应用程序现在应该在Docker守护程序主机上监听5000端口。如果http://0.0.0.0:5000 不解决,你也可以尝试http://localhost:5000

    如果您在Mac上使用Docker Machine,请使用docker-machine ip MACHINE_VM以获取Docker主机的IP地址。然后,http://MACHINE_VM_IP:5000在浏览器中打开。

    您应该在浏览器中看到一条消息:

    Hello World! I have been seen 1 times.

  3. 刷新页面。

    数字应该增加。

提示:您可以列出本地图像docker image ls并使用它们进行检查docker inspect <tag or id>。在这一点上清单图片应返回redisweb

步骤5:更新应用程序

因为使用卷将应用程序代码安装到容器中,您可以更改其代码并立即查看更改,而无需重新构建映像。

  1. 改变问候语app.py并保存。例如:
    return 'Hello from Docker! I have been seen {} times.\n'.format(count)
    
  2. 在浏览器中刷新应用程序。应该更新问候语,计数器应该继续递增。

注意:如果您在较旧的Windows操作系统上使用Oracle VirtualBox,则可能会遇到此VB故障单中所述的共享文件夹问题。较新的Windows系统满足Docker for Windows的要求,不需要VirtualBox。

步骤6:尝试一些其他命令

如果您想在后台运行您的服务,您可以将-d标志(“分离”模式)传递给docker-compose up并用于docker-compose ps查看当前运行的内容:

$ docker-compose up -d
Starting composetest_redis_1...
Starting composetest_web_1...

$ docker-compose ps
Name                 Command            State       Ports
-------------------------------------------------------------------
composetest_redis_1   /usr/local/bin/run         Up
composetest_web_1     /bin/sh -c python app.py   Up      5000->5000/tcp

docker-compose run命令允许您为您的服务运行一次性命令。例如,要查看web服务可用的环境变量 :

$ docker-compose run web env

docker-compose --help参阅其他可用的命令。您还可以为bash和zsh shell 安装命令完成,这也将显示可用的命令。

如果您开始撰写docker-compose up -d,您可能希望在完成后停止您的服务:

$ docker-compose stop

您可以把所有的东西都放下,用down 指令完全取出容器。传递--volumes也删除Redis容器使用的数据量:

$ docker-compose down --volumes

在这一点上,您已经看到了Compose的工作原理。

发表评论

电子邮件地址不会被公开。 必填项已用*标注