Dockerfile編寫教程

2022-06-09 07:21:08 字數 4343 閱讀 1015

本文大部分內容來自於:

建立乙個目錄並進入到該目錄下建立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...