【问题标题】:Managing build and running of docker containers on one host在一台主机上管理 docker 容器的构建和运行
【发布时间】:2018-08-21 03:57:32
【问题描述】:

我有一台运行多个容器的服务器

  • Nginx
  • 搬运工
  • 几个自定义 HTTP 服务器
  • RabbitMQ

我在主目录中有这样的文件夹结构

/docker/dockerfiles/nginx/Dockerfile
/docker/dockerfiles/nginx/README
/docker/dockerfiles/nginx/NOTES
/docker/dockerfiles/portainer/Dockerfile
...
/docker/dockerfiles/rabbitmq/Dockerfile

/docker/volumes/nginx/sites/...
/docker/volumes/nginx/logs/...
/docker/volumes/portainer/
...
/docker/volumes/rabbitmq/

/docker/volumes/ 包含 docker 容器使用的所有文件,它们被映射到容器中,容器不使用真正的 Docker 卷,我真的想避免使用它们。

我还有 3 个 Python 文件:

containers_info.py
containers_build.py
containers_run.py

containers_info.py 基本上是一个字典,其中包含有关容器的基本信息,例如容器的版本和构建日期,是否应该在构建过程中排除/包含,是否应该在运行中包含/排除通过

containers_build.py 导入 containers_info.py 并检查应该构建哪些容器,从 /docker/dockerfiles/.../Dockerfile 读取相应的 Dockerfile,然后使用 Docker Python API 构建容器,收集一些统计信息并创建摘要,通知失败之类的。

containers_run.py 还导入containers_info.py 并检查应该运行哪些容器。它包含要映射到哪些卷、要使用哪些端口的信息,基本上是所有将进入 YAML 文件以描述容器的内容,以及对当前运行容器的一些管理。

它包含多个类似的sn-ps

def run_websites(info):
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  container_name = 'websites'
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  new_container_name = container_name
  if info['auto-run']: rename_and_stop_container(container_name)
  else: new_container_name = container_name + '-prep'
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  container = client.containers.run(
    detach=True,
    name=new_container_name,
    hostname='docker-websites',
    image='myscope/websites:{}'.format(versions['websites']),
    command='python -u server.py settings:docker-lean app:websites id:hp-1 port:8080 domain:www.example.com',
    ports={'8080/tcp': ('172.17.0.1', 10001)},
    working_dir='/home/user/python/server/app',
    volumes={
      '/home/user/docker/volumes/websites': {'bind': '/home/user/python/server', 'mode': 'rw'},
    }
  )
  #patch = 'sed -i.bak s/raise\ ImportError/name\ =\ \\"libc.so.6\\"\ #\ raise\ ImportError/g /usr/lib/python2.7/site-packages/twisted/python/_inotify.py'
  #print container.exec_run(patch, user='root')
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  if info['auto-run'] and info['auto-delete-old']: remove_container(container_name + '-old')
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

现在我想摆脱这种自定义解决方案并使用一些开源的东西,这将使我能够将这种方法扩展到多台机器。目前我可以在服务器之间复制 ~/docker/ 并执行修改后的脚本来获得我需要的机器,但我认为 Docker Swarm 或 Kubernetes 旨在解决这些问题。至少我的印象是这样的。

我的 Python 解决方案是在我学习 Docker 时诞生的,通过 Docker Python API 自动化它对我学习 Dockerfiles 有很大帮助,因为我可以自动化整个过程,而 Dockerfiles 中的错误只会浪费一点时间.

这种 Python 脚本方法的另一个重要好处是,我能够在同一台机器上自动创建数十个 if 网络服务器实例(假设这样做是有意义的)并使 Nginx 完美适应这种变化(动态添加/删除代理,重新加载配置)。

那么,我应该开始研究哪种技术来替换我当前的系统?另外,我不打算运行很多机器,最初只有两台(主+备份),但在任何时候,我都希望能够添加更多机器并在它们之间分配负载,并且只需更改配置文件中的一些设置。

目前解决这些问题的方法是什么?

【问题讨论】:

    标签: python docker


    【解决方案1】:

    在这种情况下,您可以使用许多工具。如果您只打算使用一台机器,docker-compose 可能是您正在寻找的解决方案。它使用yaml 风格的makefile 并支持相同的构建上下文(标准Docker 和kubernetes 也是如此)。让一个 pod 或容器的多个实例运行真的很容易,只需使用 --scale 标志就可以消除很多麻烦

    如果您打算在多台机器上运行它,我会说kubernetes 可能是您最好的选择。它真的很适合它。诚然,我在Swarm 方面没有太多经验,但与我的理解类似。这样做的好处是kubernetes 还可以为您处理负载平衡,而docker-compose 不能,您必须为此使用某种代理(如 Nginx)。这并不可怕,但如果你以前没有做过类似的事情,也不是最直接的

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多