聶永的博客

          記錄工作/學(xué)習(xí)的點(diǎn)點(diǎn)滴滴。

          Docker學(xué)習(xí)筆記之二,基于Dockerfile搭建JAVA Tomcat運(yùn)行環(huán)境

          前言

          在第一篇文字中,我們完全人工方式,一個(gè)命令一個(gè)命令輸入,實(shí)現(xiàn)一個(gè)java tomcat運(yùn)行環(huán)境,雖然也初見(jiàn)成效,但很累人。如果依靠依靠腳本構(gòu)建一個(gè)Tomcat容器實(shí)例,一個(gè)命令可以搞定,何樂(lè)而不為呢。好在Docker提供了Dockerfile作為構(gòu)建Docker鏡像腳本,避免人們一行一行的輸入,真是善莫大焉。Dockerfile腳本可以做到隨時(shí)維護(hù)修改,即可以分享,更有利于在模板化,更不用說(shuō)傳輸了,好處那是一大籮筐!

          最終目的:打造一個(gè)支持SSH終端登錄、Tomcat7自動(dòng)運(yùn)行的Docker鏡像。

          編寫(xiě)一個(gè)Dockerfile

          所有環(huán)境,同第一篇文字。在ubuntu下安裝好vim之后(吐槽一下,ubuntu系統(tǒng)內(nèi)置vi命令十分難用,只好求助于vim ):

          sudo vim Dockerfile
          

          編輯一個(gè)Dockerfile文件了,下面就是具體文件內(nèi)容:

          # VERSION 0.0.1
          # 默認(rèn)ubuntu server長(zhǎng)期支持版本,當(dāng)前是12.04
          FROM ubuntu
          # 簽名啦
          MAINTAINER yongboy "yongboy@gmail.com"

          # 更新源,安裝ssh server RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list RUN apt-get update RUN apt-get install -y openssh-server RUN mkdir -p /var/run/sshd
          # 設(shè)置root ssh遠(yuǎn)程登錄密碼為123456 RUN echo "root:123456" | chpasswd

          # 添加orache java7源,一次性安裝vim,wget,curl,java7,tomcat7等必備軟件 RUN apt-get install python-software-properties RUN add-apt-repository ppa:webupd8team/java RUN apt-get update RUN apt-get install -y vim wget curl oracle-java7-installer tomcat7
          # 設(shè)置JAVA_HOME環(huán)境變量 RUN update-alternatives --display java RUN echo "JAVA_HOME=/usr/lib/jvm/java-7-oracle">> /etc/environment RUN echo "JAVA_HOME=/usr/lib/jvm/java-7-oracle">> /etc/default/tomcat7
          # 容器需要開(kāi)放SSH 22端口 EXPOSE 22
          # 容器需要開(kāi)放Tomcat 8080端口 EXPOSE 8080
          # 設(shè)置Tomcat7初始化運(yùn)行,SSH終端服務(wù)器作為后臺(tái)運(yùn)行 ENTRYPOINT service tomcat7 start && /usr/sbin/sshd -D

          需要注意:

          1. ENTRYPOINT,表示鏡像在初始化時(shí)需要執(zhí)行的命令,不可被重寫(xiě)覆蓋,需謹(jǐn)記
          2. CMD,表示鏡像運(yùn)行默認(rèn)參數(shù),可被重寫(xiě)覆蓋
          3. ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一個(gè)生效 多個(gè)存在,只有最后一個(gè)生效,其它無(wú)效!
          4. 需要初始化運(yùn)行多個(gè)命令,彼此之間可以使用 && 隔開(kāi),但最后一個(gè)須要為無(wú)限運(yùn)行的命令,需切記!

          ENTRYPOINT/CMD,一般兩者可以配合使用,比如:

          ENTRYPOINT ["/usr/sbin/sshd"]
          CMD ["-D"]
          

          在Docker daemon模式下,無(wú)論你是使用ENTRYPOINT,還是CMD,最后的命令,一定要是當(dāng)前進(jìn)程需要一直運(yùn)行的,才能夠防容器退出。

          以下無(wú)效方式:

           ENTRYPOINT service tomcat7 start #運(yùn)行幾秒鐘之后,容器就會(huì)退出
           CMD service tomcat7 start #運(yùn)行幾秒鐘之后,容器就會(huì)退出
          

          這樣有效:

          ENTRYPOINT service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out
          # 或者
          CMD service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out
          

          這樣也有效:

           ENTRYPOINT ["/usr/sbin/sshd"]
           CMD ["-D"]
          

          具體請(qǐng)參考官方文檔:Dockerfiles for Images

          構(gòu)建鏡像

          腳本寫(xiě)好了,需要轉(zhuǎn)換成鏡像:

          docker build -t yongboy/java7 .
          

          -t: 為構(gòu)建的鏡像制定一個(gè)標(biāo)簽,便于記憶/索引等

          . : 指定Dockerfile文件在當(dāng)前目錄下

          網(wǎng)速不太好,會(huì)等待很長(zhǎng)時(shí)間。很多操作可能需要科學(xué)上網(wǎng),逼得我只能一直掛著VPN,方能暢通無(wú)阻。

          構(gòu)建鏡像完成之后,看看運(yùn)行效果:

          docker run -d -p 22 -p 8080:8080 yongboy/java7
          

          在運(yùn)行命令中,還得需要顯式指定 -p 22 -p 8080:8080,否則在Docker 0.8.1版本中不會(huì)主動(dòng)映射到宿主機(jī)上。據(jù)悉在Docker 0.4.8版本時(shí),就不擔(dān)心這個(gè)問(wèn)題。 或者,您要有好的方式,不妨告知于我,謝謝。

          在Dockerfile中,若沒(méi)有使用ENTRYPOINT/CMD指令,若運(yùn)行多個(gè)命令,可以這樣做:

          docker run -d -p 22 -p 8080 yongboy/java7 /bin/sh -c "service tomcat7 start && /usr/sbin/sshd -D"

          提交/保存鏡像

          創(chuàng)建好的鏡像,可以保存到索引倉(cāng)庫(kù)中,便于下次使用(當(dāng)然,我們直接共享Dockerfile,是最簡(jiǎn)單的事情,:)) ),但畢竟鏡像可以做到開(kāi)箱即用。

          1. https://index.docker.io/ 注冊(cè)一個(gè)賬號(hào),例如yongboy
          2. 構(gòu)建鏡像

            docker build -t yongboy/java7 .
            

            上面已經(jīng)構(gòu)建OK的話,可省略此步。

          3. 登陸

            docker login
            
          4. 提交到Docker索引倉(cāng)庫(kù)

            docker push yongboy/java7
            

            現(xiàn)在可以起來(lái)喝杯熱水,出去溜達(dá)會(huì),也不一定能夠上傳完畢,那叫一個(gè)慢啊!

            上傳OK的話,可以得到類(lèi)似地址:https://index.docker.io/u/yongboy/java7/

          5. 如何使用鏡像

            docker pull yongboy/java7
            

            剩下的步驟,就很簡(jiǎn)單了。

          小結(jié)

          有關(guān)Dockerfile的進(jìn)階閱讀:

          以上蜻蜓點(diǎn)水一般,更多細(xì)節(jié),請(qǐng)閱讀官方文檔。 若有空,在下篇中,討論一下Docker的一些機(jī)制等。 嗯,最近失業(yè)了,您如有心,可以幫忙推薦一下,謝謝。

          posted on 2013-12-16 15:50 nieyong 閱讀(46951) 評(píng)論(7)  編輯  收藏 所屬分類(lèi): 容器

          評(píng)論

          # re: Docker學(xué)習(xí)筆記之二,基于Dockerfile搭建JAVA Tomcat運(yùn)行環(huán)境 2014-07-15 23:07 3927

          樓主寫(xiě)了這么多辛苦了,最后一段告訴我,就是說(shuō),只要我pull 你的鏡像就可以得到一個(gè)完整的tomcat運(yùn)行環(huán)境對(duì)吧,嘻嘻  回復(fù)  更多評(píng)論   

          # re: Docker學(xué)習(xí)筆記之二,基于Dockerfile搭建JAVA Tomcat運(yùn)行環(huán)境 2014-08-01 12:21 endle

          可以把 Dockerfile 放到 github/bitbucket 里,然后在 docker 里選擇 autobuild,這樣就不用上傳了  回復(fù)  更多評(píng)論   

          # re: Docker學(xué)習(xí)筆記之二,基于Dockerfile搭建JAVA Tomcat運(yùn)行環(huán)境[未登錄](méi) 2014-11-14 16:45 michael

          build 失敗是怎么回事  回復(fù)  更多評(píng)論   

          # re: Docker學(xué)習(xí)筆記之二,基于Dockerfile搭建JAVA Tomcat運(yùn)行環(huán)境 2015-01-28 16:38 肥仔

          該行命令漏了 -y
          RUN apt-get install python-software-properties  回復(fù)  更多評(píng)論   

          # re: Docker學(xué)習(xí)筆記之二,基于Dockerfile搭建JAVA Tomcat運(yùn)行環(huán)境 2015-03-05 09:40 盧not

          @肥仔
          命令中RUN add-apt-repository ppa:webupd8team/java怎么有問(wèn)題,我的是ubuntu13.10  回復(fù)  更多評(píng)論   

          # re: Docker學(xué)習(xí)筆記之二,基于Dockerfile搭建JAVA Tomcat運(yùn)行環(huán)境 2016-05-16 18:18 xawi2000

          @盧not
          加上這句:
          RUN apt-get install -y software-properties-common  回復(fù)  更多評(píng)論   

          # re: Docker學(xué)習(xí)筆記之二,基于Dockerfile搭建JAVA Tomcat運(yùn)行環(huán)境[未登錄](méi) 2016-05-28 18:54 sam

          自己折騰一翻, 看到到此文:比較全面,好些內(nèi)容受教  回復(fù)  更多評(píng)論   

          公告

          所有文章皆為原創(chuàng),若轉(zhuǎn)載請(qǐng)標(biāo)明出處,謝謝~

          新浪微博,歡迎關(guān)注:

          導(dǎo)航

          <2014年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          統(tǒng)計(jì)

          常用鏈接

          留言簿(58)

          隨筆分類(lèi)(130)

          隨筆檔案(151)

          個(gè)人收藏

          最新隨筆

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 民勤县| 公安县| 离岛区| 新邵县| 水城县| 密山市| 舟曲县| 衡东县| 连江县| 固原市| 寿宁县| 斗六市| 张家界市| 郑州市| 武清区| 齐河县| 班玛县| 阜阳市| 平和县| 景德镇市| 石首市| 长沙县| 枝江市| 梁山县| 杭州市| 夏邑县| 扎赉特旗| 桐柏县| 盱眙县| 视频| 高邑县| 高陵县| 贡觉县| 光山县| 盱眙县| 丰顺县| 乌兰察布市| 竹北市| 安远县| 鄢陵县| 丹棱县|