Docker尝鲜之Airflow快速安装

个人初步理解使用Docker应该尽量满足数据和应用隔离,数据尽量有mount在宿主机上;另外,与虚拟机相比,容器有一个很大的差异,它们被设计用来运行单进程,无法很好地模拟一个完整的环境,所以不建议一个容器塞太多的应用——容器的启动是非常廉价的。Docker设计者极力推崇“一个容器一个进程的方式”,所以遵循这样的应用原则就没错了。另外,docker exec是支持用户操作类似ssh这样的操作的,可以进入到docker内部,但是同样不推荐,这样的场景尽量限制在测试就好。

Docker安装

操作系统使用Centos7,查看官网安装方式(主要是获取相关的repo,否则直接使用yum install安装的版本不是最新的),如下
https://docs.docker.com/engine/installation/linux/centos/

vim /etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

然后安装

yum install -y docker-engine

注意,安装完毕后,需要启动docker服务,systemctl start docker.service(就是那艘蓝鲸大船),而后续运行的docker命令启动的只是docker container(容器,即集装箱)。好的,这个设计很棒是不是,有点类似Java JVM和Java应用的关系,只要有JVM在,就可以忽略底层操作系统;docker同样满足这样的能力。

启动Airflow

首先,我们查看下github上面的docker-airflow项目,具体路径是https://github.com/puckel/docker-airflow。使用git命令下载到Linux服务器上

git clone https://github.com/puckel/docker-airflow.git

下载后可以看到相应目录下有docker-airflow文件,进入该文件夹,根据githup说明,运行docker run -d -p 8082:8080 puckel/docker-airflow,该命令会先查看本地是否已经下载了相关的应用文件,如果没有,则需要从远程仓库下载,该远程仓库是国外网站,下载就需要碰运气了。。。
等待了漫长的下载,看到如下结果
Docker尝鲜之Airflow快速安装_第1张图片
就已经完成docker容器的启动,非常快,秒级就启动完毕。提醒下,很奇怪的一点是这种模式只启动了Airflow的web-server,并没有启动scheduler,需要进入docker:docker exec -it [name] bash

关闭和启动容器

[root@cdh docker-airflow]# docker ps  ##查看docker进程
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS                                        NAMES
51051eb885d6        puckel/docker-airflow   "./entrypoint.sh"   38 minutes ago      Up 38 minutes       5555/tcp, 8793/tcp, 0.0.0.0:8082->8080/tcp   furious_wright
#其中,furious_wright是该docker容器的可读名称
docker stop furious_wright #停止容器
#注意,stop只是停止了容器,并没有删除容器
docker rm furious_wright #这才算移除容器

挂载目录——实现应用和数据分离

数据卷让你可以不受容器生命周期影响进行数据持久化。它们表现为容器内的空间,但实际保存在容器之外,从而允许你在不影响数据的情况下销毁、重建、修改、丢弃容器。Docker允许你定义应用部分和数据部分,并提供工具让你可以将它们分开。使用Docker时必须做出的最大思维变化之一就是:容器应该是短暂和一次性的。 ——摘自《Docker入门实战》

使用的时候发现要创建Airflow DAG需要进入到docker内部创建,这个很麻烦,因为一般为了节约docker使用资源,不会安装太多不必要的工具,比如vi/vim等,所以在docker container内部编辑文本是非常麻烦的事情,要不就得安装,这就多少违背了docker精简的使用理念。那如何破呢?这个时候就可以考虑将docker内部目录挂载在特定的宿主机目录下。指定方式是使用-v {宿主机路径}:{docker container路径},我做了如下尝试

[root@cdh docker-airflow]#  docker run -d -p 8082:8080 -v /data/airflow:/usr/local/airflow puckel/docker-airflow
c06524023e6b4b223386a39b4c133a7ded7918a50fdda21630440bf1cf0ba777
docker: Error response from daemon: invalid header field value "oci runtime error: container_linux.go:247: starting container process caused \"exec: \\\"./entrypoint.sh\\\": stat ./entrypoint.sh: no such file or directory\"\n".

从日志看,已经可以正常启动docker,但是不能正常启动Airflow,这是为什么,我们详细分析日志,虽然看着很凌乱,但确实说明了entrypoint.sh这个脚本找不到。依然使用docker run -d -p 8082:8080 puckel/docker-airflow命令正常启动容器,进入容器可以发现该脚本就在/usr/local/airflow路径下——所以,可以猜测,启动docker,先执行了目录挂载,然后启动指定的脚本,发现脚本不存在,因而报错。于是,处理方式就直接指定到/usr/local/airflow/dags子目录,毕竟要的起始就是这个路径而已。这样的做的好处就是docker内部的dags目录文件可以托管到SVN,不怕docker删除后的数据丢失。完整的命令如下enter code here

另外,提醒使用者,挂载目录后,该目录在docker内部是没有操作权限的,操作在宿主机上完成,这个可以接受,本来目的就是在宿主机上操作数据。

安装docker-compose,部署Airflow的LocalExecutor和CeleryExecutor模式

根据githup/docker-airflow官方文档说明,启动LocalExecutor和CeleryExecutor模式(这两个模式与SequenceExecutor的差异回头在Airflow介绍中详述)需要先安装docker-compose。这个安装详见docker-compose-install。执行curl -L "https://github.com/docker/compose/releases/download/1.8.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose,这个命令执行也是靠运气,本人拉取花了5个小时…执行完毕后,需要给目录授权chmod +x /usr/local/bin/docker-compose。完毕后,即可执行docker-compose。由于docker-compose是Python模块,也可以使用pip install安装,速度会快很多,如下

yum install -y python-pip python-dev
pip install -U docker-compose

For LocalExecutor :

docker-compose -f docker-compose-LocalExecutor.yml up -d

For CeleryExecutor :

docker-compose -f docker-compose-CeleryExecutor.yml up -d

其中,可以通过修改docker-compose-*.yml文件,设定volumes参数,实现数据卷在宿主机的挂载。

volumes:
     - /data/datadev/wise-data/dags:/usr/local/airflow/dags

注意,使用该版本的docker-LocalExecutor是无法读取到日志的,这个作者是这么解释的
Since Docker 1.10, Docker don't use (update) anymore /etc/hosts file, he use an embeded DNS server. 8793 is openned by airflow worker, not by scheduler or webserver. And worker works with CeleryExecutor...so for the moment I've no idea how to deal with that issue with airflow in LocalExecutor mode.
看来是破不了,我选择使用了CeleryExecutor,不需要特别指定log的挂载日志就能正常查看到日志。

你可能感兴趣的:(分布式)