溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Docker構建服務

發(fā)布時間:2021-11-12 10:18:09 來源:億速云 閱讀:153 作者:小新 欄目:云計算

這篇文章給大家分享的是有關怎么使用Docker構建服務的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

6.1 使用Jekyll框架和Apache構建應用

需要構建兩個鏡像:

  • 一個鏡像安裝了Jekyll以及其他用于構建Jekyll網站的必要的軟件包;

  • 一個鏡像通過Apache來讓Jekyll網站工作起來。

工作流程如下:

  1. 創(chuàng)建Jekyll基礎鏡像和Apache鏡像;

  2. 從Jekyll鏡像創(chuàng)建一個容器,這個容器存放通過卷掛載的網站源代碼;

  3. 從Apache鏡像創(chuàng)建一個容器,這個容器利用包含編譯后的網站的卷為其創(chuàng)建服務;

  4. 在網站需要更新時,清理并重復上面的步驟。

這個例子可以看做是創(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構建服務”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI