本文大部分內容來自於:
建立乙個目錄並進入到該目錄下建立dockerfile檔案
vim /root/test/dockerfile
需要安裝的映象檔案
這裡安裝了最新版的centos和python3.7.4以及安裝過程中所需要的依賴,開放埠為8000埠
from centos:latest
maintainer ryan.liu "[email protected]"
run yum install -y gcc zlib-devel openssl-devel libffi-devel make
workdir /tmp
run curl -o
run tar -zxvf python-3.7.4.tgz
workdir python-3.7.4
run mkdir -p /usr/local/python3
run ./configure --prefix=/usr/local/python3
run make && make install
run echo export path="/usr/local/python3/bin:$path" >> ~/.bashrc
run source ~/.bashrc
run /usr/local/python3/bin/pip3 install django==2.2.3
run /usr/local/python3/bin/pip3 install pymysql
workdir /
expose 8000
dockerfile 中每乙個指令都會建立一層,run
也不例外。每乙個run
的行為,就和剛才我們手工建立映象的過程一樣:新建立一層,在其上執行這些命令,執行結束後,commit
這一層的修改,構成新的映象。
而上面的這種寫法,建立了 7 層映象。這是完全沒有意義的,而且很多執行時不需要的東西,都被裝進了映象裡,比如編譯環境、更新的軟體包等等。結果就是產生非常臃腫、非常多層的映象,不僅僅增加了構建部署的時間,也很容易出錯。 這是很多初學 docker 的人常犯的乙個錯誤。
union fs 是有最大層數限制的,比如 aufs,曾經是最大不得超過 42 層,現在是不得超過 127 層。
from centos:latest
maintainer ryan.liu "[email protected]"
run yum install -y gcc zlib-devel openssl-devel libffi-devel make \
&& cd /tmp \
&& curl -o \
&& tar -zxvf python-3.7.4.tgz \
&& rm -rf python-3.7.4.tgz \
&& mkdir -p /usr/local/python3 \
&& cd python-3.7.4 \
&& ./configure --prefix=/usr/local/python3 \
&& make && make install \
&& echo export path="/usr/local/python3/bin:$path" >> ~/.bashrc \
&& source ~/.bashrc \
&& /usr/local/python3/bin/pip3 install django==2.2.3 \
&& /usr/local/python3/bin/pip3 install pymysql \
&& cd /
expose 8000
執行在dockerfile
所在目錄執行
docker build -t centos7:latest .
映象構建上下文(context)
如果注意,會看到docker build
命令最後有乙個.
。.
表示當前目錄,而dockerfile
就在當前目錄,因此不少初學者以為這個路徑是在指定dockerfile
所在路徑,這麼理解其實是不準確的。如果對應上面的命令格式,你可能會發現,這是在指定上下文路徑。那麼什麼是上下文呢?
首先我們要理解docker build
的工作原理。docker 在執行時分為 docker 引擎(也就是服務端守護程序)和客戶端工具。docker 的引擎提供了一組 rest api,被稱為 docker remote api,而如docker
命令這樣的客戶端工具,則是通過這組 api 與 docker 引擎互動,從而完成各種功能。因此,雖然表面上我們好像是在本機執行各種docker
功能,但實際上,一切都是使用的遠端呼叫形式在服務端(docker 引擎)完成。也因為這種 c/s 設計,讓我們操作遠端伺服器的 docker 引擎變得輕而易舉。
當我們進行映象構建的時候,並非所有定製都會通過run
指令完成,經常會需要將一些本地檔案複製進映象,比如通過copy
指令、add
指令等。而docker build
命令構建映象,其實並非在本地構建,而是在服務端,也就是 docker 引擎中構建的。那麼在這種客戶端/服務端的架構中,如何才能讓服務端獲得本地檔案呢?
這就引入了上下文的概念。當構建的時候,使用者會指定構建映象上下文的路徑,docker build
命令得知這個路徑後,會將路徑下的所有內容打包,然後上傳給 docker 引擎。這樣 docker 引擎收到這個上下文包後,展開就會獲得構建映象所需的一切檔案。
如果在dockerfile
中這麼寫:
這並不是要複製執行docker build
命令所在的目錄下的package.json
,也不是複製dockerfile
所在目錄下的package.json
,而是複製上下文(context)目錄下的package.json
。
現在就可以理解剛才的命令docker build -t nginx:v3 .
中的這個.
,實際上是在指定上下文的目錄,docker build
命令會將該目錄下的內容打包交給 docker 引擎以幫助構建映象。
如果觀察docker build
輸出,我們其實已經看到了這個傳送上下文的過程:
$ docker build -t nginx:v3 .
sending build context to docker daemon 2.048 kb
...
一般來說,應該會將dockerfile
置於乙個空目錄下,或者專案根目錄下。如果該目錄下沒有所需檔案,那麼應該把所需檔案複製乙份過來。如果目錄下有些東西確實不希望構建時傳給 docker 引擎,那麼可以用.gitignore
一樣的語法寫乙個.dockerignore
,該檔案是用於剔除不需要作為上下文傳遞給 docker 引擎的。
那麼為什麼會有人誤以為.
是指定dockerfile
所在目錄呢?這是因為在預設情況下,如果不額外指定dockerfile
的話,會將上下文目錄下的名為dockerfile
的檔案作為 dockerfile。
這只是預設行為,實際上dockerfile
的檔名並不要求必須為dockerfile
,而且並不要求必須位於上下文目錄中,比如可以用-f ../dockerfile.php
引數指定某個檔案作為dockerfile
。
當然,一般大家習慣性的會使用預設的檔名dockerfile
,以及會將其置於映象構建上下文目錄中。
檢視映象
docker images
執行容器
docker run -it --name=centos7 centos7:latest /bin/bash
其他相關命令
Dockerfile編寫記錄
dockerfile 近期幫朋友製作了docker映象以方便使用,在製作的過程中經歷了相容問題,映象size臃腫,映象內多服務問題,下面開始碼例項。from euleros workdir opt add opencv 4.1.0.tar.gz opt run rpm rpmbuilddb yum ...
Dockerfile編寫語法
docker映象本質上就是乙個個基礎映象的堆疊,為了做出我們想要的映象,我們需要考慮最終映象所需的所有基礎環境,然後一層層堆疊.也就是不斷以基礎映象搭建上層映象.先看例子 version 1.0.0 create time 2015 12 25 11 04 author description 基於...
Dockerfile簡單編寫
1.簡單的dockerfilke 1 from alpine 2maintainer aze 3 workdir go src 4copy 5 expose 8777 6 entrypoint test2 test2 workdir 是工作目錄copy 是將當前目錄中的內容複製到工作目錄中 expo...