編寫DockerFile
本節內容簡介
在前面的實驗中我們多次用到的 Dockerfile,在本實驗裡我們將通過完成一個例項來學習Dockerfile的編寫。
本節中,我們需要依次完成下面幾項任務:
- Dockerfile 基本框架
- Dockerfile 編寫常用命令
- 從 Dockerfile 構建映象
本次實驗的需求是完成一個Dockerfile
,通過該Dockerfile
建立一個Web應用,該web應用為apache
託管的一個靜態頁面網站,換句話說,我們寫一個Dockerfile
,用來建立一個實驗樓公司的網站應用,就是http://www.simplecloud.cn這個站點。這個站點是純靜態的頁面,我們也可以直接下載得到。
一、實驗準備
1、建立 Dockerfile 檔案
首先,需要建立一個目錄來存放 Dockerfile 檔案,目錄名稱可以任意,在目錄裡建立Dockerfile檔案:
cd /home/shiyanlou
mkdir shiyanloutest
cd shiyanloutest
touch Dockerfile
使用vim/gedit
編輯Dockerfile檔案,根據我們的需求輸入內容。
二、Dockerfile 基本框架
Dockerfile一般包含下面幾個部分:
- 基礎映象:以哪個映象作為基礎進行製作,用法是FROM 基礎映象名稱
- 維護者資訊:需要寫下該Dockerfile編寫人的姓名或郵箱,用法是MANITAINER 名字/郵箱
- 映象操作命令:對基礎映象要進行的改造命令,比如安裝新的軟體,進行哪些特殊配置等,常見的是RUN 命令
- 容器啟動命令:當基於該映象的容器啟動時需要執行哪些命令,常見的是CMD 命令或ENTRYPOINT
在本節實驗中,我們依次先把這四項資訊填入文件。Dockerfile中的**#標誌後面為註釋,可以不用寫,另外實驗樓的環境不支援中文輸入,比較可惜。**
依次輸入下面的基本框架內容:
# 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已執行:
三、Dockerfile 編寫常用命令
在上述基本的架構下,我們根據需求可以增加新的內容到Dockerfile中。後續的擴充套件操作都需要放置在Dockerfile的映象操作部分。其中部分命令在本實驗中並不會用到,但需要有所瞭解。
1、指定容器執行的使用者
該使用者將作為後續的RUN命令執行的使用者。這個命令本實驗不需要,但在一些需要指定使用者來執行的應用部署時非常關鍵,比如提供hadoop服務的容器通常會使用hadoop使用者來啟動服務。
命令使用方式,例如使用shiyanlou使用者來執行後續命令:
USER shiyanlou
2、指定後續命令的執行目錄
由於我們需要執行的是一個靜態網站,將啟動後的工作目錄切換到/var/www/html
目錄:
WORKDIR /var/www/html
3、對外連線埠號
由於內部服務會啟動Web服務,我們需要把對應的80埠暴露出來,可以提供給容器間互聯使用,可以使用EXPOSE
命令。
在映象操作部分增加下面一句:
EXPOSE 80
4、設定容器主機名
ENV命令能夠對容器內的環境變數進行設定,我們使用該命令設定由該映象建立的容器的主機名為shiyanloutest,向Dockerfile中增加下面一句:
ENV HOSTNAME shiyanloutest
5、向映象中增加檔案
向映象中新增檔案有兩種命令: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
四、CMD
與 ENTRYPOINT
ENTRYPOINT
容器啟動後執行的命令,讓容器執行表現的像一個可執行程式一樣,與CMD的區別是不可以被docker run
覆蓋,會把docker run
後面的引數當作傳遞給ENTRYPOINT
指令的引數。Dockerfile
中只能指定一個ENTRYPOINT
,如果指定了很多,只有最後一個有效。docker run
命令的-entrypoint
引數可以把指定的引數繼續傳遞給ENTRYPOINT
。
在本實驗中兩種方式都可以選擇。
五、掛載資料卷
將apache訪問的日誌資料儲存到宿主機可以訪問的資料卷中:
VOLUME ["/var/log/apche2"]
六、設定容器內的環境變數
使用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
七、使用 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"]
八、從 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
,看到我們克隆的琛石科技的網站:
總結
- Dockerfile 基本框架
- Dockerfile 編寫常用命令
- 從 Dockerfile 構建映象
請務必保證自己能夠動手完成整個實驗,只看文字很簡單,真正操作的時候會遇到各種各樣的問題,解決問題的過程才是收穫的過程。
相關文章
- Dockerfile編寫Docker
- 如何編寫DockerfileDocker
- 學習編寫DockerfileDocker
- Docker | dockerfile 檔案編寫Docker
- Docker實戰-編寫DockerfileDocker
- 如何編寫優雅的DockerfileDocker
- 快速編寫Dockerfile----php環境DockerPHP
- Docker的基本使用及DockerFile的編寫Docker
- 高效編寫Dockerfile的幾條準則Docker
- 編寫dockerfile來部署laravel專案(待續)DockerLaravel
- Prometheus之Dockerfile編寫、映象構建、容器啟動PrometheusDocker
- [Docker 系列]docker 學習七,DockerFile 編寫和實戰Docker
- 【Docker 系列】docker 學習七,DockerFile 編寫和實戰Docker
- 一個dockerfile例子(參考著寫dockerfile)Docker
- 如何運用多階構建編寫優雅的DockerfileDocker
- 程式設計師筆記|如何編寫優雅的Dockerfile程式設計師筆記Docker
- 最簡單的Go Dockerfile編寫姿勢,沒有之一!GoDocker
- 最簡單的 Go Dockerfile 編寫姿勢,沒有之一!GoDocker
- 一圖學會寫DockerfileDocker
- 【Docker】動手寫Dockerfile學習DockerDocker
- 你確定你會寫 Dockerfile 嗎?Docker
- [Docker]寫 Dockerfile 的最佳實踐理論Docker
- centos7 vim 編輯Dockerfile顯示高亮CentOSDocker
- DockerfileDocker
- shellcode編寫
- 文件編寫
- vscode編寫markdownVSCode
- Layout的編寫
- Java程式編寫Java
- markdown文件編寫
- Dockerfile技巧Docker
- Dockerfile指令與Docker-compose容器編排-搭建docker私有倉庫Docker
- Sublime 編寫編譯 swift程式碼編譯Swift
- Dockerfile入門(使用Dockerfile生成jdk1.8映象)DockerJDK
- MarkDown文件的編寫
- HTML Email的編寫HTMLAI
- 編寫註冊介面
- 用vim編寫markdown