gpt4 book ai didi

docker - 如何使用 docker-compose 将此应用程序容器化

转载 作者:行者123 更新时间:2023-12-02 08:11:36 24 4
gpt4 key购买 nike

我正在为一个更大的分布式系统开发一个组件(数据管道),它构成了应用程序的后端基础设施。

我想将该组件(管​​道)的子组件容器化,以便(如果需要)每个子组件或“服务/容器”(Docker 术语)可以在单独的物理机器上运行。

但是,一些子组件本身由其他服务组成。我是 Docker 和 docker-compose 的新手,如果能帮助我整理 docker-compose 文件以创建/配置系统,我将不胜感激。

这是我的开发树结构,主要遵循建议的服务/容器之间的分区:

├── db
│   └── Dockerfile
├── docker-compose.yml
├── ETL
│   ├── archivers
│   ├── Dockerfile
│   └── feeds
│   ├── feeds
│   └── scrapy.cfg
├── mdal
│   ├── data
│   │   └── data_file
│   ├── LICENSE.txt
│   ├── MANIFEST.in
│   ├── README.rst
│   ├── sample
│   │   ├── __init__.py
│   │   └── package_data.dat
│   ├── setup.cfg
│   ├── setup.py
│   ├── tests
│   │   ├── __init__.py
│   │   └── test_simple.py
│   └── tox.ini
├── README
└── restapi
└── Dockerfile

各种服务/组件/容器的定义如下:

Service          Description
======== ===================================================
db postgresql service, mounted on persistant volume
ETL ETL service (uses mdal to load/write from/to db)
mdal Python dbal package used by some components (uses db service)
restapi Nginx + gunicorn + flask app (uses mdal)

这是我对最顶层 docker-compose.yml 文件的尝试:

version: '3'
services:
# PostgreSQL service:
db:
container_name: postgres
restart: always
image: postgres:9.6.1
ports:
# We'll bind our host's port 5432 to postgres's port 5432, so we can use
# our database IDEs with it:
- 5432:5432

environment:
POSTGRES_PASSWORD: PG_PASS


# ETL service
ETL:
container_name: ETL
# Should install mdal package when being built
# Should link to my source files so changes are reflected


# Nginx + Gunicorn + Flask app exposing REST API
restapi:
container_name: restapi
# Should pull (versioned) Docker image for Nginx, Gunicorn, Flask
# Should link to my flask source files so changes are reflected
# Should install mdal package when being built

我将如何编写 docker-copose.yml 文件以获得上述所需的功能?

最佳答案

您对基本结构的理解是正确的,但如果您不熟悉 Docker 及其概念,那么这是一个相当复杂的配置。我将尝试逐步解释如何配置每个服务。

默认值

  • 您的服务将在 docker-compose 网络上以您正在使用的相同名称提供。所以 db 服务将是网络内的 db 主机
  • 所有 docker-compose 服务都可以通信,因此您可以从 ETL 主机访问 db 主机。如果需要,您可以使用 links 创建服务名称别名(注意:链接是一项遗留功能,可能会被删除)

Postgres

数据库只需要附加到 volume根据需要保留数据:

db:
image: postgres:9.6.1
restart: always
volumes:
- ./pg-data:/var/lib/postgresql/data
ports:
# to attach external GUIs
- 5432:5432
environment:
- POSTGRES_PASSWORD: PG_PASS
  • ./pg-data 是主机操作系统上的一个本地目录(相对于您的 docker-compose 文件)(如果不存在则创建)。
  • /var/lib/postgresql/data 是默认的 postgres 默认目录。
  • 你的本地目录./pg-data将被映射到容器/var/lib/postgresql/data,所以postgres会在里面写入。

我在您的 db 目录中看到一个 Dockerfile:如果您使用 the official postgres image你不需要它。

ETL

要构建位于子目录中的服务,您可以使用自定义 build context .我将使用相关 Dockerfile 从指定目录为您构建服务镜像。您可以使用 dockerfile 进一步自定义构建选项。

要将您的源链接到容器,只需使用另一个卷:

ETL:
build:
context: ./ETL
volumes:
- ./ETL:/YOUR/CONTAINER/APP_DIR

这需要你的服务 Dockerfile 应该是这样的:

FROM ubuntu

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Bundle app source
COPY . /usr/src/app
EXPOSE 80
CMD [ "python", "my-app.py"]

在这种情况下,ETL 服务的 docker-compose 卷将是:

  volumes:
- ./ETL:/usr/src/app

问题:- 构建时应该安装 mdal 包:这是什么意思?安装位置和方式?

恢复

Nginx 将成为您的 gunicorn/flask 应用程序的反向代理。所以你需要两个服务:

  • 配置为反向代理的 nginx 服务
  • 运行您的 gunicorn/flask 应用程序的服务(restapi 服务)

Nginx

nginx:
image: nginx
ports:
- "80:80"
volume:
- ./restapi/nginx.conf:/etc/nginx/conf.d/default.conf

Nginx 将是您应用程序的主要访问点,因此端口 80 在您的主机上公开:您可以通过 http://localhost 访问您的应用程序。

volume 是一种“技巧”,可以在不创建自定义镜像的情况下将配置文件添加到官方 nginx 镜像中。默认情况下,nginx 将加载 /etc/nginx/conf.d 中可用的任何 .conf 文件。我们正在覆盖容器 default.conf在运行时使用我们的自定义配置文件。

这是一个示例配置文件,您应该将其保存为./restapi/nginx.conf:

server {
listen 80;
server_name ~^.*$;

location / {
proxy_pass http://restapi:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

gunicorn/flask 应用

在这里,您应该有一个 Dockerfile,它使用类似 gunicorn -w 4 myapp:app 的方式运行您的应用程序(我从 the gunicorn website 中获取了基本示例)。

restapi:
build:
context: ./restapi
expose:
- "8000"

我们将 gunicorn 端口暴露给 docker 网络(您不能直接从您的主机访问它,但 nginx 可以)。

mdal

谁在使用它?哪里需要?

推荐阅读 list

虽然dockerdocker-compose文档非常详细,我建议您阅读一些解释(太多)docker 功能(和怪癖)的书籍:

  • Docker in Action :Dockerfiles、图像、注册表、网络、卷。你需要知道的一切。从我的角度来看,必读。
  • Docker in Practice :许多有趣且有用(甚至极端)的用例和解决方案。一本食谱。
  • The Docker book : 通过实例学习。

关于docker - 如何使用 docker-compose 将此应用程序容器化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46367730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com