【发布时间】: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 完美适应这种变化(动态添加/删除代理,重新加载配置)。
那么,我应该开始研究哪种技术来替换我当前的系统?另外,我不打算运行很多机器,最初只有两台(主+备份),但在任何时候,我都希望能够添加更多机器并在它们之间分配负载,并且只需更改配置文件中的一些设置。
目前解决这些问题的方法是什么?
【问题讨论】: