首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

开始 | Getting started (Compose)

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

先决条件

确保你已经安装了Docker Engine和Docker Compose。您不需要安装Python或Redis,因为两者都由Docker镜像提供。

第1步:安装

  1. 为项目创建一个目录:$ mkdir composetest $ cd composetest
  2. 创建一个名为app.py你的项目目录中的文件,并将其粘贴到:from flask import从redis导入Flask Redis app = Flask(__ name__)redis = Redis(host ='redis',port = 6379)@ app.route('/') def hello():count = redis.incr('hits')return'Hello World!\ n'.format(count)if __name__ ==“__main__”:app.run(host =“0.0.0.0”,debug = True)在本例中,redisredis的主机名容器在应用程序的网络上。我们使用Redis的默认端口6379
  3. requirements.txt在项目目录中创建另一个文件,并将其粘贴到:flask redis

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

第2步:创建一个Dockerfile

在这一步中,您编写一个Dockerfile来构建一个Docker镜像。该图像包含Python应用程序需要的所有依赖项,包括Python本身。

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

代码语言:javascript
复制
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步:在撰写文件中定义服务

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

代码语言:javascript
复制
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

这个撰写文件定义了两个服务,web并且redis。网络服务:

  • 使用Dockerfile当前目录中构建的图像。
  • 将容器上的暴露端口5000转发到主机上的端口5000。我们使用Flask Web服务器的默认端口,5000

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

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

  1. 从您的项目目录中,运行启动您的应用程序 docker-compose up。$ docker-compose up使用默认驱动程序创建网络“composetest_default”创建composetest_web_1 ...创建composetest_redis_1 ...创建composetest_web_1创建composetest_redis_1 ... done添加到composetest_web_1,composetest_redis_1 web_1 | *在http://0.0.0.0:5000/上运行(按CTRL + C退出)redis_1 | 1:C 17 Aug 22:11:10.480#oO0OoO0OoO0Oo Redis正在启动oO0OoO0OoO0Oo redis_1 | 1:C 17 Aug 22:11:10.480#Redis version = 4.0.1,bits = 64,commit = 00000000,modified = 0,pid = 1,刚刚开始redis_1 | 1:C 17 Aug 22:11:10.480#警告:没有指定配置文件,使用默认配置。为了指定配置文件,请使用redis-server /path/to/redis.conf web_1 | *使用stat redis_1 |重新启动 1:M 17 Aug 22:11:10.483 * Running mode = standalone,port = 6379。redis_1 | 1:M 8月17日22:11:10。483#警告:由于/ proc / sys / net / core / somaxconn设置为128的较低值,因此无法强制执行TCP backlog设置511。*调试器处于活动状态!redis_1 | 1:M 17 8月22日11:10.483#服务器初始化redis_1 | 1:M 17 Aug 22:11:10.483#警告您在内核中启用了透明巨大页面(THP)支持。这将导致Redis的延迟和内存使用问题。要解决此问题,请以root身份运行命令'echo never> / sys / kernel / mm / transparent_hugepage / enabled',并将其添加到您的/etc/rc.local中,以便在重新启动后保留设置。必须在禁用THP后重新启动Redis。web_1 | *调试器PIN:330-787-903 redis_1 | 1:M 8月22日:11:10.483 *准备接受连接撰写拉一个Redis图像,为您的代码建立一个图像,并启动您定义的服务。在这种情况下,
  2. http://0.0.0.0:5000/在浏览器中输入以查看应用程序正在运行。如果您在Linux,Docker for Mac或Docker本地使用Docker,则Web应用程序现在应该在Docker守护程序主机上的端口5000上侦听。指向您的网络浏览器http://localhost:5000以查找Hello World消息。如果这不解决,你也可以尝试http://0.0.0.0:5000。如果您在Mac上使用Docker Machine,请使用docker-machine ip MACHINE_VM获取Docker主机的IP地址。然后,http://MACHINE_VM_IP:5000在浏览器中打开。您应该在浏览器中看到一条消息:Hello World!我已经看过1次了。
  1. 刷新页面。数字应该增加。你好,世界!我已经看过2次了。
  1. 切换到另一个终端窗口,然后键入docker image ls以列出本地图像。此时列出图片应返回redisweb。$ docker image ls REPOSITORY TAG IMAGE ID创建大小composetest_web最新e2c21aa48cc1 4分钟前93.8MB python 3.4-alpine 84e6077c7ab6 7天前82.5MB redis alpine 9d8fa9aa0e5b 3周前27.5MB您可以使用图像检查图像docker inspect <tag or id>
  2. 停止应用程序,可以docker-compose down从第二个终端的项目目录中运行,或者在启动应用程序的原始终端中按CTRL + C。

第5步:编辑Compose文件以添加绑定安装

docker-compose.yml在您的项目目录中编辑以添加服务的绑定挂载web

代码语言:javascript
复制
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: "redis:alpine"

volumes键将主机上的项目目录(当前目录)装载到/code容器中,允许您即时修改代码,而无需重新生成映像。

第6步:使用Compose重新构建并运行应用程序

从您的项目目录中键入docker-compose up以使用更新的撰写文件构建应用程序,然后运行它。

代码语言:javascript
复制
$ 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)
...

Hello World再次查看Web浏览器中的消息,然后刷新以查看计数增量。

Shared folders, volumes, and bind mounts

  • 如果您的项目位于Users目录(cd ~)外部,那么您需要共享您正在使用的Dockerfile和卷的驱动器或位置。如果您收到运行时错误,指示找不到应用程序文件,卷挂载被拒绝或服务无法启动,请尝试启用文件或驱动器共享。批量安装需要共享驱动器用于C:\Users(Windows)或/Users(Mac)以外的项目,并且对于使用Linux容器的 Docker for Windows上的任何项目都需要共享驱动器。有关更多信息,请参阅Docker for Windows上的共享驱动器,Docker for Mac上的文件共享以及有关如何管理容器中的数据的一般示例。
  • 如果您在较旧的Windows操作系统上使用Oracle VirtualBox,则可能会遇到如本VB故障单中所述的共享文件夹问题。较新的Windows系统满足Docker for Windows的要求,并且不需要VirtualBox。

第7步:更新应用程序

由于应用程序代码现在使用卷装载到容器中,因此您可以更改代码并立即查看更改,而无需重新构建映像。

  1. 更改问候语app.py并保存。例如,将Hello World!消息更改为Hello from Docker!:return'来自Docker的Hello!我已看过{}次。\ n'.format(count)
  2. 刷新浏览器中的应用程序。问候应该更新,并且柜台应该仍然在递增。

第8步:尝试其他一些命令

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

代码语言:javascript
复制
$ 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服务:

代码语言:javascript
复制
$ docker-compose run web env

请参阅docker-compose --help查看其他可用的命令。您还可以安装bash和zsh shell的命令补全,它还会显示可用的命令。

如果您开始使用撰写作品docker-compose up -d,则可能需要在完成后与其停用服务:

代码语言:javascript
复制
$ docker-compose stop

你可以把所有东西都拿下来,用down命令彻底清除容器。通过--volumes也可以删除Redis容器使用的数据量:

代码语言:javascript
复制
$ docker-compose down --volumes

在这一点上,你已经看到了Compose如何工作的基础知识。

下一步去哪里

  • 接下来,请尝试Django,Rails或WordPress的快速入门指南
  • 浏览Compose命令的完整列表
  • 撰写配置文件参考
  • 要了解有关卷和绑定挂载的更多信息,请参阅管理Docker中的数据

扫码关注腾讯云开发者

领取腾讯云代金券