您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關怎么使用Docker構建服務的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
6.1 使用Jekyll框架和Apache構建應用
需要構建兩個鏡像:
一個鏡像安裝了Jekyll以及其他用于構建Jekyll網站的必要的軟件包;
一個鏡像通過Apache來讓Jekyll網站工作起來。
工作流程如下:
創(chuàng)建Jekyll基礎鏡像和Apache鏡像;
從Jekyll鏡像創(chuàng)建一個容器,這個容器存放通過卷掛載的網站源代碼;
從Apache鏡像創(chuàng)建一個容器,這個容器利用包含編譯后的網站的卷為其創(chuàng)建服務;
在網站需要更新時,清理并重復上面的步驟。
這個例子可以看做是創(chuàng)建一個多主機站點最簡單的方法。
1、Jekyll基礎鏡像
建立構建環(huán)境:
mkdir jekyll cd jekyll touch Dockerfile
編寫Dockerfile:
FROM ubuntu:14.04 MAINTAINER James Turnbull <james@example.com> RUN apt-get -yqq update RUN apt-get -yqq install ruby ruby-dev make nodejs RUN gem install --no-rdoc --no-ri jekyll -v 2.5.3 VOLUME /data VOLUME /var/www/html WORKDIR /data ENTRYPOINT [ "jekyll", "build", "--destination=/var/www/html" ]
注意書上的代碼 gem jekyll 后面沒有 -v 2.5.3,會報錯。
在Dockerfile中使用VOLUME指令創(chuàng)建了兩個卷:
/data/,用于存放網站源代碼;
/var/www/html/,用于存放編譯后的Jekyll網站碼。
最后,將工作目錄指定為/data,并通過ENTRYPOINT指令指定自動構建的命令,這個命令將工作目錄/data/中所有的Jekyll網站代碼構建到/var/www/html/目錄中。
2、構建Jekyll基礎鏡像
docker build -t ivan/jekyll .
3、Apache鏡像
建立構建環(huán)境:
mkdir apache cd apache touch Dockerfile
編寫Dockerfile:
FROM ubuntu:14.04 MAINTAINER James Turnbull <james@example.com> RUN apt-get -yqq update RUN apt-get -yqq install apache2 VOLUME [ "/var/www/html" ] WORKDIR /var/www/html ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_PID_FILE /var/run/apache2.pid ENV APACHE_RUN_DIR /var/run/apache2 ENV APACHE_LOCK_DIR /var/lock/apache2 RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR EXPOSE 80 ENTRYPOINT [ "/usr/sbin/apache2" ] CMD ["-D", "FOREGROUND"]
使用了VOLUME指令創(chuàng)建了一個卷——/var/www/html/,這個目錄是用來存放編譯后的jekyll網站的;
最后指定了ENTRYPOINT和CMD指令組合來在容器啟動時默認運行apache。
4、構建Apache鏡像
docker build -t ivan/apache .
5、啟動Jekyll網站
首先將Jekyll的一些源代碼下載:
cd ~ git clone https://github.com/jamtur01/james_blog.git
然后啟動容器:
docker run -v ~/james_blog:/data/ --name james_blog ivan/jekyll
把剛才從github上下載的james_blog目錄作為卷掛載到/data(目錄里有jekyll網站的源碼)。
這里再復習一下卷,卷是在一個或多個容器中特殊指定的目錄,卷會繞過聯(lián)合文件系統(tǒng),為持久化數(shù)據(jù)和共享數(shù)據(jù)提供幾個有用的特性:
卷可以在容器間共享和共用;
共享卷時不一定要運行相應的容器;
對卷的修改會直接在卷上反映出來;
更新鏡像時不會包含對卷的修改;
卷會一直存在,直到沒有容器使用它們。
卷在Docker宿主機的/var/lib/docker/volumes目錄中,通過docker inspect命令可以查看某個卷的具體位置:
docker inspect -f "{{.Volumes}}"
如果想在另一個容器里使用/var/www/html/卷里編譯好的網站,可以創(chuàng)建一個新的容器連接到這個卷(即Apache容器):
docker run -d -P --volumes-from james_blog ivan/apache
--volumes-from標志把指定容器里所有的卷加入新建的容器里。
如果刪除了最后一個使用卷的容器,卷就被刪除了。所以刪除有卷的容器時要小心。
這樣整個服務就啟動好了。
6、備份Jekyll卷
上文說道刪除容器可能不小心將卷刪除了。所以可以利用一下命令備份卷:
docker run --rm --volumes-from james_blog -v $(pwd):/backup ubuntu tar cvf /backup/james_blog_backup.tar /var/www/html
--rm命令表示該容器只使用一次,運行完后就刪除。
將當前目錄掛載到/backup,這樣在容器中將數(shù)據(jù)打包到/backup后,該包其實就在當前目錄下。
tar cvf命令會創(chuàng)建一個名為james_blog_backup.tar的tar文件(該文件包含了/var/www/html目錄里的所有內容)。
7、擴展Jekyll示例
運行多個Apache容器,這些容器都使用james_blog容器的卷,在這些Apache容器前面加一個負載均衡器,就擁有了Web集群;
進一步構建一個鏡像,這個鏡像把用戶提供的源數(shù)據(jù)復制到卷里,再把這個卷掛載到jekyll容器里。這就是一個可遷移的通用方案,而且宿主機本地包含任何源代碼;
在上一個擴展基礎上為我們的服務構建一個Web前段,這個服務用語從指定的源自動構建和部署網站。
6.2 構建一個Java應用服務(Tomcat)
1、WAR文件獲取器
創(chuàng)建構建環(huán)境
mkdir fetcher cd fetcher touch Dockerfile
編寫Dockerfile
FROM ubuntu:14.04 MAINTAINER Ivan Jiang <ivanjz93@163.com> ENV REFRESHED_AT 2016-07-13 RUN apt-get -yqq update RUN apt-get -yqq install wget VOLUME ["/var/lib/tomcat7/webapps/"] WORKDIR /var/lib/tomcat7/webapps/ ENTRYPOINT ["wget"] CMD ["--help"]
容器執(zhí)行時,使用wget從指定的URL獲取文件,并把它保存在/var/lib/tomcat7/webapps目錄。如果運行容器時沒有指定URL,ENTRYPOINT和CMD指令組合起來返回wget的幫助。
2、獲取WAR文件
docke run -t -i --name sample ivan/fetcher https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/sample.war
3、構建Tomcat7應用服務器
創(chuàng)建構建環(huán)境:
mkdir tomcat7 cd tomcat7 touch Dockerfile
編寫Dockerfile:
FROM ubuntu:14.04 MAINTAINER Ivan Jiang <ivanjz93@163.com> ENV REFRESHED_AT 2016-07-13 RUN apt-get -yqq update RUN apt-get -yqq install tomcat7 default-jdk ENV CATALINA_HOME /usr/share/tomcat7 ENV CATALINA_BASE /var/lib/tomcat7 ENV CATALINA_PID /var/run/tomcat7.pid ENV CATALINA_SH /usr/share/tomcat7/bin/catalina.sh ENV CATALINA_TMPDIR /tmp/tomcat7-tomcat7-tmp RUN mkdir -p $CATALINA_TMPDIR VOLUME ["/var/lib/tomcat7/webapps/"] EXPOSE 8080 ENTRYPOINT ["/usr/share/tomcat7/bin/catalina.sh", "run"]
構建鏡像:
docker build -t ivan/tomcat7 .
4、運行tomcat7容器
docker run --name sample_app --volumes-from sample -d -P ivan/tomcat7
查看映射到宿主機的端口號:
docker port sample_app 8080
假設端口號是49154,在瀏覽器訪問:IP地址:49154/sample可查看運行的web app。
在例子中作者使用了命令:
docker inspect -f "{{.Volumes}}" sample
查看sample卷的宿主機掛載位置,但是這個命令報錯。
OSChina上的TimWang回答我的問題說Docker 1.8將Volumes信息從docker inspect 的輸出中刪除了,需改用Mounts:
docker inspect -f "{{.Mounts}}" sample
6.3 多容器的應用棧
1、Node.js鏡像
創(chuàng)建構建環(huán)境:
mkdir nodejs cd nodejs touch Dockerfile
編寫Dockerfile:
FROM ubuntu:14.04 MAINTAINER James Turnbull <james@example.com> ENV REFRESHED_AT 2014-06-01 RUN apt-get -yqq update RUN apt-get -yqq install nodejs npm RUN ln -s /usr/bin/nodejs /usr/bin/node RUN mkdir -p /var/log/nodeapp ADD nodeapp /opt/nodeapp/ WORKDIR /opt/nodeapp RUN npm install VOLUME [ "/var/log/nodeapp" ] EXPOSE 3000 ENTRYPOINT [ "nodejs", "server.js" ]
用ln -s建立軟連接,把二進制文件modejs連接到node,解決Ubuntu上原有的一些無法向后兼容問題(不懂……)。
構建鏡像:
docker build -t ivan/nodejs .
2、Redis基礎鏡像
mkdir redis_base cd redis_base touch Dockerfile
FROM ubuntu:14.04 MAINTAINER James Turnbull <james@example.com> ENV REFRESHED_AT 2014-06-01 RUN apt-get -yqq update RUN apt-get install -yqq software-properties-common python-software-properties RUN add-apt-repository ppa:chris-lea/redis-server RUN apt-get -yqq update RUN apt-get -yqq install redis-server redis-tools VOLUME [ "/var/lib/redis", "/var/log/redis" ] EXPOSE 6379 CMD []
docker build -t ivan/redis .
3、Redis主鏡像
mkdir redis_primary cd redis_primary touch Dockerfile
FROM ivan/redis MAINTAINER James Turnbull <james@example.com> ENV REFRESHED_AT 2014-06-01 ENTRYPOINT [ "redis-server", "--logfile /var/log/redis/redis-server.log" ]
docker build -t ivan/redis_primary
4、Redis從鏡像
mkdir redis_replica cd redis_replica touch Dockerfile
FROM ivan/redis MAINTAINER James Turnbull <james@example.com> ENV REFRESHED_AT 2014-06-01 ENTRYPOINT [ "redis-server", "--logfile /var/log/redis/redis-replica.log", "--slaveof redis_primary 6379" ]
docker build -t ivan/redis_replica .
5、創(chuàng)建Redis集群
啟動Redis主鏡像
docker run -d -h redis-primary --name redis_primary ivan/redis_primary
這里使用-h參數(shù)指定容器的主機名,書中給出的是redis_primary,但是執(zhí)行會報錯,應該是新版本的Docker不支持帶下劃線的主機名,這里改為redis-primary。
啟動Redis從服務
docker run -d -h redis-replical --name redis_replical --link redis_primary:redis_primary ivan/redis_replica
這里對-h參數(shù)做相同的處理。
6、創(chuàng)建Node容器
docker run -d --name nodeapp -p 3000:3000 --link redis_primary:redis_primary ivan/nodejs
在瀏覽器中用 宿主機IP:3000測試。
7、捕獲應用日志
使用Logstash捕獲日志并將日志保存到日志服務器。
mkdir logstash cd logstash touch Dockerfile
FROM ubuntu:14.04 MAINTAINER James Turnbull <james@example.com> ENV REFRESHED_AT 2014-06-01 RUN apt-get -yqq update RUN apt-get -yqq install wget RUN wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | apt-key add - RUN echo 'deb http://packages.elasticsearch.org/logstash/1.4/debian stable main' > /etc/apt/sources.list.d/logstash.list RUN apt-get -yqq update RUN apt-get -yqq install logstash ADD logstash.conf /etc/ WORKDIR /opt/logstash ENTRYPOINT [ "bin/logstash" ] CMD [ "--config=/etc/logstash.conf" ]
Logstash監(jiān)控兩個文件/var/log/nodeapp/nodeapp.log和/var/log/redis/redis-server.log,將其中的新內容捕獲,捕獲到的內容輸出到標準輸出上?,F(xiàn)實中一般會將Logstash的內容輸出到Elasticsearch集群。
構建之前將作者的logstash.conf下載到構建根目錄。
構建鏡像
docker build -t ivan/logstash .
啟動容器
docker run -d --name logstash --volumes-from redis_primary --volumes-from nodeapp ivan/logstash
查看logstash容器的輸出日志
docker logs -f logstash
6.4 不使用SSH管理Docker容器
傳統(tǒng)上,使用SSH登入運行環(huán)境或者虛擬機管理服務。在Docker里,大部分容器只運行一個進程,所以不能使用這種方法??墒鞘褂镁砘蛘哝溄油瓿纱蟛糠止芾聿僮?。如需要給容器發(fā)送信號,可以使用docker kill命令:
docker kill -s <signal> <container>
這個操作會發(fā)送指定的信號給容器,而不是殺掉容器。
可以使用nsenter小工作登入容器,它一般適用于1.2或更早的版本,1.3版本引入的docker exec替換了它大部分的功能。
工具nsenter可以進入Docker用來構成容器的內核命名空間。它可以進入一個已經存在的命名空間,或者在新的一組命名空間里執(zhí)行一個進程。
可以通過Docker容器安裝nsenter:
docker run -v /usr/local/bin:/target jpetazzo/nsenter
這會把nsenter安裝到/usr/local/bin目錄下。
為了使用nsenter,首先要知道要進入的容器的進程ID,可以使用docker inspect命令獲得進程PID:
PID=$(docker inspect --format {{.State.Pid}} <container>)
然后運行下面的命令進入容器:
nsenter --target $PID --mount --uts --ipc --net --pid
也可以將容器內執(zhí)行的命令添加在nsenter命令行的后面:
nsenter --target $PID --mount --uts --ipc --net --pid ls
感謝各位的閱讀!關于“怎么使用Docker構建服務”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。