手把手教你制作一个Presto的docker镜像

系统中经常出现各种依赖的组件,比如mysql、hive、kafka等等,docker能够快速地将一个环境部署到其他机器上,节省了大量的安装环境的时间。只需要写一个“recipe”,docker就能如法炮制,复制一模一样的环境到你的机器上,让程序员更加专注于开发。
下面开始手把手建立一个presto的docker image。Presto是Facebook开源的一个SQL查询引擎, 不清楚presto是什么的可以查看https://prestodb.io

Dockerfile制作

1. 基础环境准备

FROM registry.docker-cn.com/library/java:8
MAINTAINER Jack "Jack@aaa.com"

LABEL os="debian"
LABEL app="presto"
LABEL version="0.180"

RUN echo 'deb http://mirrors.aliyun.com/debian/ jessie main non-free contrib\n\
deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ jessie main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib\n'\  >/etc/apt/sources.list

RUN java -version

Dockerfile就像一个列表清单,告诉docker从头到尾建立一个项目都需要准备什么东西,最后怎么跑起来等。最开始我们要确定一个项目是基于什么环境的,比如presto依赖java开发环境,所以我们用 From registry.docker-cn.com/library/java:latest , 这样就不需要去搭建java环境了,比如有些开源组件是python写的,那么这个FROM就应该去docker registry搜索python相关的image。利用好FROM 可以让我们的docker制作过程快速很多,比如我可以先制作一个python flask web开发的环境,如果有其他的docker image也依赖这个基础环境, 就可以直接拿过来用了, 而且构建的速度快很多~

  • MAINTAINER 设置docker镜像的作者信息. 已经deprecated, 官方建议使用LABEL
  • LABEL 是给这个docker image打上标签,标签的作用方面统一管理docker images, 可以打多个标签
  • RUN RUN会执行任何shell命令, 并commit结果, 随后的命令就能够获取到该执行结果.
  • 镜像加速: 国内的网速你懂的, 需要修改软件源为国内镜像加速, 把加速链接添加到/etc/apt/sources.list文件. 参考国内镜像加速

2. 安装依赖

上一步做了一些基础的准备, 下面开始安装presto的依赖项.


# install python
RUN apt-get update
RUN apt-get install -y python2.7
RUN mv /usr/bin/python2.7 /usr/bin/python
RUN python --version

# install mysql no password prompt
RUN apt-get install -y debconf-utils
# set password same as that in presto catalog below
RUN echo 'mysql-server mysql-server/root_password password 123456' | debconf-set-selections
RUN echo 'mysql-server mysql-server/root_password_again password 123456' | debconf-set-selections
RUN apt-get update && apt-get -y install mysql-server
RUN mysql --version
RUN apt-get install -y mysql-client

# change user root to mysql in order to start mysql properly
RUN touch /var/run/mysqld/mysqld.sock
RUN chown -R mysql:mysql /var/run/mysqld
RUN chown -R mysql:mysql /var/lib/mysql


ENV PRESTO_VERSION 0.180
ENV PRESTO_DIR /opt/presto
ENV PRESTO_ETC_DIR /opt/presto/etc
ENV PRESTO_DATA_DIR /data


RUN mkdir -p ${PRESTO_DIR} ${PRESTO_ETC_DIR}/catalog \
 && curl -s https://repo1.maven.org/maven2/com/facebook/presto/presto-server/${PRESTO_VERSION}/presto-server-${PRESTO_VERSION}.tar.gz \
 | tar --strip 1 -vxzC ${PRESTO_DIR}

WORKDIR ${PRESTO_DIR}
RUN pwd

# config node.properties
RUN echo "node.environment=ci\n\
node.id=faaaafffffff-ffff-ffff-ffff-ffffffffffff\n\
node.data-dir=${PRESTO_DATA_DIR}\n"\ > ${PRESTO_ETC_DIR}/node.properties

# config jvm.config
RUN echo '-server\n\
-Xmx1G\n\
-XX:+UseG1GC\n\
-XX:G1HeapRegionSize=32M\n\
-XX:+UseGCOverheadLimit\n\
-XX:+ExplicitGCInvokesConcurrent\n\
-XX:+HeapDumpOnOutOfMemoryError\n\
-XX:+ExitOnOutOfMemoryError\n'\ > ${PRESTO_ETC_DIR}/jvm.config

# config log.properties
RUN echo 'coordinator=true\n\
node-scheduler.include-coordinator=true\n\
http-server.http.port=8888\n\
query.max-memory=0.4GB\n\
query.max-memory-per-node=0.2GB\n\
discovery-server.enabled=true\n\
discovery.uri=http://127.0.0.1:8888\n'\ > ${PRESTO_ETC_DIR}/config.properties

# config log.properties
RUN echo 'com.facebook.presto=WARN\n'\ > ${PRESTO_ETC_DIR}/log.properties

# Set the following mysql catalog values: password same as mysql-server installation above
# bind the port to 3307 to avoid port has been used invalid in local env 
RUN echo 'connector.name=mysql\n\
connection-url=jdbc:mysql://127.0.0.1:3307\n\
connection-user=root\n\
connection-password=123456\n'\ > ${PRESTO_ETC_DIR}/catalog/mysql.properties

RUN echo "change mysql port from 3306 to 3307 ..."
RUN sed -i 's/^\(port\s*=\s*\).*$/\13307/' /etc/mysql/my.cnf

COPY ./presto_docker_entrypoint.sh /presto_docker_entrypoint.sh
COPY ./test_presto_catalog_init.sql /test_presto_catalog_init.sql
ENTRYPOINT ["bash", "/presto_docker_entrypoint.sh"]

Presto要求java8版本, 另外也需要python依赖, 修改ENV PRESTO_VERSION 0.180可以安装你指定的官方版本. 按照Presto官方的deployment方法 将config文件在dockerfile中配置好, 我将presto的coordinator设置为master和worker共用, 另外在presto内部配一个mysql, 让presto的catalog能够访问到mysql的一些初始化的数据, 方便用于测试等. 在docker里安装mysql还是比较tricky的.

  • ENTRYPOINT 可以让容器启动之后执行指令. 如果在启动的时候想要执行多条执行, 可以把代码写到shell脚本中. 因为dockerfile只支持一个ENTRYPOINT 或 CMD.

完整的项目代码我放到了github: https://github.com/yamyamyuo/docker/tree/master/presto-docker

3. docker build

有了前期的准备工作, 就可以进入该Dockerfile目录, build镜像.

docker build -t presto:v0.180 -f Dockerfile .

build完成后通过下面命令可以看到我们构件好的docker image

docker/presto-docker(master) » docker images                                        
REPOSITORY    TAG     IMAGE ID    CREATED          SIZE
presto       v0.180   ea18f17c0494  24 seconds ago      1.16GB

4. docker run

把制作好的镜像跑起来看看, 可以通过-p 8888:8888将端口号进行映射, -v /tmp:/data 是将docker镜像内产生的数据和目录挂载到localhost. 也就是说镜像内/data这个路径下的所有文件都可以在本地的/tmp文件夹下找到.

docker run -it -p 8888:8888 -v /tmp:/data presto:v0.180

尾声

到此一个docker镜像就制作好了, 如果遇到问题可以向我提问~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,508评论 15 147
  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 8,720评论 1 21
  • 0. 前言 docker是什么?docker是用GO语言开发的应用容器引擎,基于容器化,沙箱机制的应用部署技术。可...
    sessionboy阅读 3,838评论 2 49
  • 還記得才來贏家的時候,經常聽到很多「新穎」詞彙,像穿越、面對、放下、用心,詞並不是新的,讓我卻有了不同的認知與感受...
    夢瑤阅读 153评论 0 2
  • 在现在的Xcode的版本下,控件的创建可以从控件库里拖进来即可,为了更熟悉手动的创建一个按钮,下面来用代码的方式实...
    GrayWolf阅读 2,547评论 0 0