手把手教你制作一個Presto的docker鏡像

系統中經常出現各種依賴的組件滴某,比如mysql午乓、hive站宗、kafka等等,docker能夠快速地將一個環(huán)境部署到其他機器上益愈,節(jié)省了大量的安裝環(huán)境的時間梢灭。只需要寫一個“recipe”,docker就能如法炮制蒸其,復制一模一樣的環(huán)境到你的機器上敏释,讓程序員更加專注于開發(fā)。
下面開始手把手建立一個presto的docker image摸袁。Presto是Facebook開源的一個SQL查詢引擎, 不清楚presto是什么的可以查看https://prestodb.io

Dockerfile制作

1. 基礎環(huán)境準備

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從頭到尾建立一個項目都需要準備什么東西,最后怎么跑起來等靠汁。最開始我們要確定一個項目是基于什么環(huán)境的蜂大,比如presto依賴java開發(fā)環(huán)境闽铐,所以我們用 From registry.docker-cn.com/library/java:latest , 這樣就不需要去搭建java環(huán)境了,比如有些開源組件是python寫的奶浦,那么這個FROM就應該去docker registry搜索python相關的image兄墅。利用好FROM 可以讓我們的docker制作過程快速很多,比如我可以先制作一個python flask web開發(fā)的環(huán)境澳叉,如果有其他的docker image也依賴這個基礎環(huán)境, 就可以直接拿過來用了, 而且構建的速度快很多~

  • MAINTAINER 設置docker鏡像的作者信息. 已經deprecated, 官方建議使用LABEL
  • LABEL 是給這個docker image打上標簽隙咸,標簽的作用方面統一管理docker images, 可以打多個標簽
  • RUN RUN會執(zhí)行任何shell命令, 并commit結果, 隨后的命令就能夠獲取到該執(zhí)行結果.
  • 鏡像加速: 國內的網速你懂的, 需要修改軟件源為國內鏡像加速, 把加速鏈接添加到/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 可以讓容器啟動之后執(zhí)行指令. 如果在啟動的時候想要執(zhí)行多條執(zhí)行, 可以把代碼寫到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閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件概荷,死亡現場離奇詭異,居然都是意外死亡碌燕,警方通過查閱死者的電腦和手機误证,發(fā)現死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來修壕,“玉大人愈捅,你說我怎么就攤上這事〈瑞” “怎么了蓝谨?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長青团。 經常有香客問我譬巫,道長,這世上最難降的妖魔是什么督笆? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任芦昔,我火速辦了婚禮,結果婚禮上娃肿,老公的妹妹穿的比我還像新娘咕缎。我一直安慰自己,他們只是感情好料扰,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布凭豪。 她就那樣靜靜地躺著,像睡著了一般晒杈。 火紅的嫁衣襯著肌膚如雪嫂伞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音末早,去河邊找鬼。 笑死说庭,一個胖子當著我的面吹牛然磷,可吹牛的內容都是我干的。 我是一名探鬼主播刊驴,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼姿搜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捆憎?” 一聲冷哼從身側響起舅柜,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躲惰,沒想到半個月后致份,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡础拨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年氮块,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诡宗。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡滔蝉,死狀恐怖,靈堂內的尸體忽然破棺而出塔沃,到底是詐尸還是另有隱情蝠引,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布蛀柴,位于F島的核電站螃概,受9級特大地震影響,放射性物質發(fā)生泄漏鸽疾。R本人自食惡果不足惜谅年,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肮韧。 院中可真熱鬧融蹂,春花似錦、人聲如沸弄企。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拘领。三九已至意乓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背届良。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工笆凌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人士葫。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓乞而,卻偏偏與公主長得像,于是被迫代替她去往敵國和親慢显。 傳聞我的和親對象是個殘疾皇子爪模,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內容

  • Docker — 云時代的程序分發(fā)方式 要說最近一年云計算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,532評論 15 147
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,746評論 1 21
  • 0. 前言 docker是什么荚藻?docker是用GO語言開發(fā)的應用容器引擎屋灌,基于容器化,沙箱機制的應用部署技術应狱」补可...
    sessionboy閱讀 3,852評論 2 49
  • 還記得才來贏家的時候,經常聽到很多「新穎」詞彙疾呻,像穿越落塑、面對、放下罐韩、用心憾赁,詞並不是新的,讓我卻有了不同的認知與感受...
    夢瑤閱讀 154評論 0 2
  • 在現在的Xcode的版本下散吵,控件的創(chuàng)建可以從控件庫里拖進來即可龙考,為了更熟悉手動的創(chuàng)建一個按鈕,下面來用代碼的方式實...
    GrayWolf閱讀 2,552評論 0 0