在前面的實驗中咱們屢次用到的 Dockerfile,在本實驗裏咱們將經過完成一個實例來學習Dockerfile的編寫。html
本節中,咱們須要依次完成下面幾項任務:web
本次實驗的需求是完成一個Dockerfile,經過該Dockerfile建立一個Web應用,該web應用爲apache託管的一個靜態頁面網站,換句話說,咱們寫一個Dockerfile,用來建立一個實驗樓公司的網站應用,就是http://www.simplecloud.cn這個站點。這個站點是純靜態的頁面,咱們也能夠直接下載獲得。docker
1、實驗準備apache
一、建立 Dockerfile 文件ubuntu
首先,須要建立一個目錄來存放 Dockerfile 文件,目錄名稱能夠任意,在目錄裏建立Dockerfile文件:vim
cd /home/shiyanlou mkdir shiyanloutest cd shiyanloutest touch Dockerfile
使用vim/gedit編輯Dockerfile文件,根據咱們的需求輸入內容。瀏覽器
2、Dockerfile 基本框架bash
Dockerfile通常包含下面幾個部分:架構
FROM 基礎鏡像名稱
MANITAINER 名字/郵箱
RUN 命令
CMD 命令
或ENTRYPOINT
在本節實驗中,咱們依次先把這四項信息填入文檔。Dockerfile中的#
標誌後面爲註釋,能夠不用寫,另外實驗樓的環境不支持中文輸入,比較惋惜。app
依次輸入下面的基本框架內容:
# Version 0.1 # 基礎鏡像 FROM ubuntu:latest # 維護者信息 MAINTAINER shiyanlou@shiyanlou.com # 鏡像操做命令 RUN apt-get -yqq update && apt-get install -yqq apache2 && apt-get clean # 容器啓動命令 CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
上面的Dockerfile很是簡單,建立了一個apache的鏡像。包含了最基本的四項信息。
其中FROM
指定基礎鏡像,若是鏡像名稱中沒有制定TAG,默認爲latest
。RUN
命令默認使用/bin/sh
Shell執行,默認爲root權限。若是命令過長鬚要換行,須要在行末尾加\
。CMD
命令也是默認在/bin/sh
中執行,而且默認只能有一條,若是是多條CMD
命令則只有最後一條執行。用戶也能夠在docker run
命令建立容器時指定新的CMD
命令來覆蓋Dockerfile裏的CMD
。
這個Dockerfile已經可使用docker build
建立新鏡像了,先構建一個版本shiyanloutest:0.1:
cd /home/shiyanlou/shiyanloutest docker build -t shiyanloutest:0.1 .
構建須要安裝apache2,會花幾分鐘,最後查看新建立的鏡像:
使用該鏡像建立容器web1,將容器中的端口80映射到本地80端口:
使用實驗環境桌面上的firefox瀏覽器打開localhost
進行測試,查看是否apache已運行:
3、Dockerfile 編寫經常使用命令
在上述基本的架構下,咱們根據需求能夠增長新的內容到Dockerfile中。後續的擴展操做都須要放置在Dockerfile的鏡像操做部分。其中部分命令在本實驗中並不會用到,但須要有所瞭解。
一、指定容器運行的用戶
該用戶將做爲後續的RUN命令執行的用戶。這個命令本實驗不須要,但在一些須要指定用戶來運行的應用部署時很是關鍵,好比提供hadoop服務的容器一般會使用hadoop
用戶來啓動服務。
命令使用方式,例如使用shiyanlou用戶來執行後續命令:
USER shiyanlou
二、指定後續命令的執行目錄
因爲咱們須要運行的是一個靜態網站,將啓動後的工做目錄切換到/var/www/html
目錄:
WORKDIR /var/www/html
三、對外鏈接端口號
因爲內部服務會啓動Web服務,咱們須要把對應的80端口暴露出來,能夠提供給容器間互聯使用,可使用EXPOSE
命令。
在鏡像操做部分增長下面一句:
EXPOSE 80
四、設置容器主機名
ENV
命令可以對容器內的環境變量進行設置,咱們使用該命令設置由該鏡像建立的容器的主機名爲shiyanloutest
,向Dockerfile中增長下面一句:
ENV HOSTNAME shiyanloutest
五、向鏡像中增長文件
向鏡像中添加文件有兩種命令:COPY
和ADD
。
COPY simplecloudsite /var/www/html
ADD
命令支持添加本地的tar壓縮包到容器中指定目錄,壓縮包會被自動解壓爲目錄,也能夠自動下載URL並拷貝到鏡像,例如:
ADD html.tar /var/www ADD http://www.shiyanlou.com/html.tar /var/www
根據實驗需求,咱們把須要的一個網站放到鏡像裏,須要把一個tar
包添加到apache的/var/www
目錄下,所以選擇使用 ADD
命令:
ADD html.tar /var/www
4、CMD 與 ENTRYPOINT
ENTRYPOINT
容器啓動後執行的命令,讓容器執行表現的像一個可執行程序同樣,與CMD
的區別是不能夠被docker run
覆蓋,會把docker run
後面的參數看成傳遞給ENTRYPOINT
指令的參數。Dockerfile中只能指定一個ENTRYPOINT
,若是指定了不少,只有最後一個有效。docker run
命令的-entrypoint
參數能夠把指定的參數繼續傳遞給ENTRYPOINT
。
在本實驗中兩種方式均可以選擇。
5、掛載數據卷
將apache訪問的日誌數據存儲到宿主機能夠訪問的數據卷中:
VOLUME ["/var/log/apche2"]
6、設置容器內的環境變量
使用ENV
設置一些apache啓動的環境變量:
ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apche2 ENV APACHE_PID_FILE /var/run/apache2.pid ENV APACHE_RUN_DIR /var/run/apache2 ENV APACHE_LOCK_DIR /var/lock/apche2
7、使用 Supervisord
CMD若是隻有一個命令,那若是咱們須要運行多個服務怎麼辦呢?最好的辦法是分別在不一樣的容器中運行,經過link進行鏈接,好比先前實驗中用到的web,app,db容器。若是必定要在一個容器中運行多個服務能夠考慮用Supervisord
來進行進程管理,方式就是將多個啓動命令放入到一個啓動腳本中。
首先安裝Supervisord
,添加下面內容到Dockerfile:
RUN apt-get install -yqq supervisor RUN mkdir -p /var/log/supervisor
拷貝配置文件到指定的目錄:
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
其中supervisord.conf
文件須要放在/home/shiyanlou/shiyanloutest
下,文件內容以下:
[supervisord] nodaemon=true [program:apache2] command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2ctl -D FOREGROUND"
若是有多個服務須要啓動能夠在文件後繼續添加[program:xxx]
,好比若是有ssh服務,能夠增長[program:ssh]
。
修改CMD
命令,啓動Supervisord
:
CMD ["/usr/bin/supervisord"]
8、從 Dockerfile 建立鏡像
將上述內容完成後放入到/home/shiyanlou/shiyanloutest/Dockerfile
文件中,最終獲得的Dockerfile文件以下:
# Version 0.2 # 基礎鏡像 FROM ubuntu:latest # 維護者信息 MAINTAINER shiyanlou@shiyanlou.com # 鏡像操做命令 RUN apt-get -yqq update && apt-get install -yqq apache2 && apt-get clean RUN apt-get install -yqq supervisor RUN mkdir -p /var/log/supervisor VOLUME ["/var/log/apche2"] ADD html.tar /var/www COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf WORKDIR /var/www/html ENV HOSTNAME shiyanloutest ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apche2 ENV APACHE_PID_FILE /var/run/apache2.pid ENV APACHE_RUN_DIR /var/run/apache2 ENV APACHE_LOCK_DIR /var/lock/apche2 EXPOSE 80 # 容器啓動命令 CMD ["/usr/bin/supervisord"]
同時在/home/shiyanlou/shiyanloutest
目錄下,添加supervisord.conf
文件:
[supervisord] nodaemon=true [program:apache2] command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2ctl -D FOREGROUND"
並下載靜態頁面文件壓縮包:
cd /home/shiyanlou/shiyanloutest wget http://labfile.oss.aliyuncs.com/courses/498/html.tar
將http://simplecloud.cn
網站的頁面tar包下載到/home/shiyanlou/shiyanloutest
目錄:
docker build
執行建立,-t
參數指定鏡像名稱:
docker build -t shiyanloutest:0.2 /home/shiyanlou/shiyanloutest/
docker images
查看建立的新鏡像已經出如今了鏡像列表中:
docker inspect shiyanloutest:0.2
查看該鏡像的詳細信息:
由該鏡像建立新的容器web2,並映射本地的80端口到容器的80端口:
docker run -d -p 80:80 --name web2 shiyanloutest:0.2
最後打開桌面上的firefox瀏覽器,輸入本地地址訪問127.0.0.1
,看到咱們克隆的琛石科技的網站:
請務必保證本身可以動手完成整個實驗,只看文字很簡單,真正操做的時候會遇到各類各樣的問題,解決問題的過程纔是收穫的過程。