在使用Docker上运行ansible-container时应注意的5个要点
首先
大家好,你们使用 Docker 吗?
我使用 Docker 太频繁了,连本地的 Mac 上都没有装 brew。
使用 Docker 可以在不污染本地环境的情况下使用各种语言,也不会被版本切换所困扰。
在这种情况下,我想记录下在尝试使用ansible-container构建开发环境时遇到的困难。
Ansible-Container是什么
ansible-container是一个使用ansible构建docker镜像和容器编排的工具。
简单来说,这就像是扩展了docker-compose的东西。
使用ansible在可以自动构建多个容器的docker-compose中,也可以创建docker镜像,这真是个令人称奇的工具。
您可以使用ansible-container命令部署所创建的容器。
如果已经在使用Ansible进行服务器配置管理,那么可以利用它来轻松地构建Docker环境,于此我尝试使用了它。
Ansible容器的机制
Ansible Container 从构建 Docker 镜像的流程开始,执行一些独特的操作。
-
- 创建conductor image
-
- 创建conductor容器
从第2步创建的conductor image中复制容器
从第2步创建的conductor容器向第3步创建的容器发送ansible
停止第3步创建的容器,并使用docker commit创建docker image
对每个服务依次执行第3到第5步操作
我认为,”conductor”是ansible-container的特点之一。
ansible会对通过SSH连接的服务器执行称为”Role”的一系列任务。
指挥者是指在ansible中作为ssh连接源的容器。
由于它被称为指挥者,它成为执行build、run、deploy命令时的主导角色的容器。
这次不会过多讲解ansible-container,所以我会跳过这部分。但是,如果你看一下这个演示,大体上就能理解了。
虽然开始有点冗长,但在运行ansible-container时需要使用docker。
换句话说,要在docker中执行ansible-container,必然需要使用到docker in docker的配置。
经过实际尝试后我发现,在docker in docker中运行ansible-container时需要注意几个陷阱。
Docker中的Docker及Ansible容器化的问题点。
要在dind中安装Python意外有些麻烦。
并不是说必须要深入研究,但在创建ansible-container执行环境时,如果了解这个东西,就能节省时间,是个不错的选择。
我认为,由于Docker in Docker本身已在Docker Hub上发布了官方库,所以只需使用该库即可。
https://hub.docker.com/_/docker/
然而,由于官方提供的Docker镜像中没有安装Python,因此安装它会很麻烦。
由于执行ansible-container需要一些周边库的支持,所以在alpine linux中安装它们相当麻烦。
因此,我們將選擇在官方的 Python 映像中安裝並使用 Docker-ce 的方法。這樣做要簡單得多。
Dockerfile 的內容如下:
FROM python
RUN apt-get update -y && apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common
RUN curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | apt-key add -
RUN apt-key fingerprint 0EBFCD88
RUN add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable"
RUN apt-get update -y && apt-get install -y docker-ce
VOLUME /var/lib/docker
CMD ["/etc/init.d/docker", "start"]
要点2:如果不加上privileged选项将无法运行。
Docker in Docker有两种执行方法:
1. 在docker run时挂载主机上的docker.sock文件方式。
2. 在docker run时使用–privileged选项的方式。
如果使用Ansible容器,那么选择第2种方式更好。
当使用 conductor 在 ansible 中执行时,我们将角色挂载到 conductor 容器中。然而,使用方法1 时,它试图挂载主机端的路径,导致只挂载了空目录。
顺便提一下,在之前的演示中,会出现以下错误:
ansible.errors.AnsibleError: the role 'django-gunicorn' was not found in ./roles:/src/roles:/etc/ansible/roles:.
按照这种方法,Docker守护程序将在容器端启动,然后为容器挂载路径。
顺便提一下,如果不使用privileged选项来运行,注意容器无法启动docker deamon(从容器侧面无法启动docker deamon),请注意。
重点3:没有音量就不能运行。
请务必在Dockerfile内部添加Volume段落,就像之前的Dockerfile中所写的一样。
虽然我不太清楚原因,但是出现了一些错误。
可能是因为没有在挂载角色时进行Volume配置导致无法找到挂载目标而出错(猜测)。
要点4:docker-py已经更新,无法正常运行。
Ansible-container使用docker-py来操作docker,然而docker-py最近更新到了3.0.1版本。
由于这个更新,导致ansible-container无法正常工作。
如果ansible-container被更新的话,问题就会解决,但如果您想立即运行它,可以通过降低docker-py的版本来解决。
$ pip uninstall docker
$ pip install docker==2.7.0
选项:第5点:ansible-container构建超时。
无论是之前的演示还是现在的情况,ansible-container build的执行时间都很长,会导致超时。如果遇到这种情况,设置以下内容就能解决问题。
$ export DOCKER_CLIENT_TIMEOUT=300
总结
在这句话中,后半部分”Docker in Docker”与”ansible-container”之间并没有太大的关联,但是在Docker上运行ansible-container需要注意一些容易出错的地方。
Docker是一种非常方便和好用的工具,但是如果不熟练使用,可能会因为意外的错误而浪费时间,所以需要特别注意(我就曾因为这个花了一整天…)。
请你用中文给出下列句子的释义,仅需一种选项:
1. Please use this article as a reference for your essay.
https://qiita.com/sugiyasu-qr/items/85a1bedb6458d4573407
请访问这个链接获取更多详情:https://qiita.com/sugiyasu-qr/items/85a1bedb6458d4573407
https://docs.ansible.com/ansible-container/conductor.html
请点击此链接查看https://docs.ansible.com/ansible-container/conductor.html