在使用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 镜像的流程开始,执行一些独特的操作。

    1. 创建conductor image

 

    1. 创建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

bannerAds