摘要:我們可以了解到,鏡像的定制實(shí)際上就是定制每一層所添加的配置文件。指令之指令的目的就是來指定基礎(chǔ)鏡像。指令之指令是用來執(zhí)行命令行命令的。由于命令行的強(qiáng)大能力,指令在定制鏡像時(shí)是最常用的指令之一。構(gòu)建鏡像這里我們使用了命令進(jìn)行鏡像構(gòu)建。
我們可以了解到,鏡像的定制實(shí)際上就是定制每一層所添加的配置、文件。如果我們可以把每一層修改、安裝、構(gòu)建、操作的命令都寫入一個(gè)腳本,用這個(gè)腳本來構(gòu)建、定制鏡像,那么之前提及的無法重復(fù)的問題、鏡像構(gòu)建透明性的問題、體積的問題就都會(huì)解決。這個(gè)腳本就Dockerfile。認(rèn)識(shí)Dockerfile
Dockerfile 是一個(gè)文本文件,其內(nèi)包含了一條條的 指令(Instruction),每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建。接下來以nginx為列通過Dockerfile文件來制定鏡像。
在一個(gè)空白目錄中,建立一個(gè)文本文件,并命名為 Dockerfile :
$ mkdir mynginx $ cd mynginx $ touch Dockerfile
Dockerfile內(nèi)容如下:
這個(gè) Dockerfile 很簡單,一共就兩行。涉及到了兩條指令, FROM 和 RUN 。接下來就先了解這兩個(gè)指令。
FROM指令的目的就是來指定基礎(chǔ)鏡像。
所謂定制鏡像,那一定是以一個(gè)鏡像為基礎(chǔ),在其上進(jìn)行定制。而FROM就是指定基礎(chǔ)鏡像,因此一個(gè) Dockerfile 中 FROM 是必備的指令,并且必須是第一條指令。
在 Docker Hub 上有非常多的高質(zhì)量的官方鏡像,有可以直接拿來使用的服務(wù)類的鏡像,如 nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat等;也有一些方便開發(fā)、構(gòu)建、運(yùn)行各種語言應(yīng)用的鏡像,如node 、 openjdk 、 python 、 ruby 、 golang 等。可以在其中尋找一個(gè)最符合我們最終目標(biāo)的鏡像為基礎(chǔ)鏡像進(jìn)行定制。
Dockerfile指令之RUNRUN 指令是用來執(zhí)行命令行命令的。由于命令行的強(qiáng)大能力, RUN 指令在定制鏡像時(shí)是最常用的指令之一。其格式有兩種:
shell 格式: RUN <命令> ,就像直接在命令行中輸入的命令一樣。剛才寫的Dockerfile 中的 RUN 指令就是這種格式。
RUN echo "Hello, Docker!
" > /usr/share/nginx/html/index.html
exec 格式: RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"] ,這更像是函數(shù)調(diào)用中的格式。
前面的文章有說過,Dockerfile 中每一個(gè)指令都會(huì)建立一層, RUN 也不例外。每一個(gè)RUN 的行為,就和剛才我們手工建立鏡像的過程一樣:新建立一層,在其上執(zhí)行這些命令,執(zhí)行結(jié)束后, commit 這一層的修改,構(gòu)成新的鏡像。
構(gòu)建鏡像這里我們使用了 docker build 命令進(jìn)行鏡像構(gòu)建。其格式為:
docker build [選項(xiàng)] <上下文路徑/URL/->
在這里我們指定了最終鏡像的名稱 -t nginx:v2 ,構(gòu)建成功后,就可以運(yùn)行這個(gè)鏡像了。
在Dockerfile所在目錄執(zhí)行如下圖命令來進(jìn)行鏡像的構(gòu)建:
從命令的輸出結(jié)果中,我們可以清晰的看到鏡像的構(gòu)建過程。在 Step 2/2 中,如同我們之前所說的那樣, RUN 指令啟動(dòng)了一個(gè)容器 7c6c2f17c3fc ,執(zhí)行了所要求的命令,并最后提交了這一層 c3d8143457af,隨后刪除了所用到的這個(gè)容器 7c6c2f17c3fc 。
可以看到,我們剛才構(gòu)建的ngnix:v2鏡像就已存在了,那么就可以以這個(gè)鏡像為基礎(chǔ)啟動(dòng)一個(gè)容器
這里再次簡單說下運(yùn)行一個(gè)容器的命令:
mynginx-test 容器名稱。 -d 設(shè)置容器在在后臺(tái)一直運(yùn)行。 -p 端口進(jìn)行映射,將本地 80 端口映射到容器內(nèi)部的 80 端口。
最后我們?cè)跒g覽器輸入localhost就可以在網(wǎng)頁中看到通過Dockerfile文件構(gòu)建鏡像的文本了。
這里看到了內(nèi)容出現(xiàn)編碼導(dǎo)致亂碼的問題,這是因?yàn)槎鄶?shù)docker基礎(chǔ)鏡像使用locale查看編碼,發(fā)現(xiàn)默認(rèn)編碼都是POSIX,這會(huì)導(dǎo)致中文亂碼。解決方法如下:
首先使用locale -a查看容器所有語言環(huán)境
其次,dockerfile中加入以下參數(shù)重新生成鏡像
ENV LANG=en_US.UTF-8
ENV TZ=Asia/Shanghai
如果有 en_US.utf8 優(yōu)先使用
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/27908.html
摘要:分層存儲(chǔ)因?yàn)殓R像包含操作系統(tǒng)完整的文件系統(tǒng),其體積往往是龐大的,因此在設(shè)計(jì)時(shí),就充分利用的技術(shù),將其設(shè)計(jì)為分層存儲(chǔ)的架構(gòu)。分層存儲(chǔ)的特征還使得鏡像的復(fù)用定制變的更為容易。 什么是Docker Docker 是一個(gè)開源的應(yīng)用容器引擎,基于 Go 語言 并遵從Apache2.0協(xié)議開源。Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 L...
摘要:列出項(xiàng)目中目前的所有容器。刪除所有停止?fàn)顟B(tài)的服務(wù)容器。一般的,當(dāng)指定數(shù)目多于該服務(wù)當(dāng)前實(shí)際運(yùn)行容器,將新創(chuàng)建并啟動(dòng)容器反之,將停止容器。命令說明恢復(fù)處于暫停狀態(tài)中的服務(wù)。 Compose 項(xiàng)目是 Docker 官方的開源項(xiàng)目,負(fù)責(zé)實(shí)現(xiàn)對(duì) Docker 容器集群的快速編排。其代碼目前在 https://github.com/docker/com... 上開源。 介紹 Compose 定位...
摘要:列出項(xiàng)目中目前的所有容器。刪除所有停止?fàn)顟B(tài)的服務(wù)容器。一般的,當(dāng)指定數(shù)目多于該服務(wù)當(dāng)前實(shí)際運(yùn)行容器,將新創(chuàng)建并啟動(dòng)容器反之,將停止容器。命令說明恢復(fù)處于暫停狀態(tài)中的服務(wù)。 Compose 項(xiàng)目是 Docker 官方的開源項(xiàng)目,負(fù)責(zé)實(shí)現(xiàn)對(duì) Docker 容器集群的快速編排。其代碼目前在 https://github.com/docker/com... 上開源。 介紹 Compose 定位...
摘要:而鏡像名稱是,因此將會(huì)獲取官方鏡像倉庫中標(biāo)簽為的鏡像。如并且下載結(jié)束后,給出該鏡像完整的的摘要,以確保下載一致性。這是指用鏡像為基礎(chǔ)來啟動(dòng)容器。其中倉庫名標(biāo)簽在之前有提到過。鏡像則是鏡像的唯一標(biāo)識(shí),一個(gè)鏡像可以對(duì)應(yīng)多個(gè)標(biāo)簽。 我們知道Image(鏡像)是Docker的三大組件之一,Docker 運(yùn)行容器前需要本地存在對(duì)應(yīng)的鏡像,如果本地不存在該鏡像,Docker 會(huì)從鏡像倉庫下載該鏡像...
閱讀 1211·2023-04-26 02:20
閱讀 3337·2021-11-22 14:45
閱讀 4111·2021-11-17 09:33
閱讀 971·2021-09-06 15:00
閱讀 1479·2021-09-03 10:30
閱讀 3837·2021-07-26 22:01
閱讀 990·2019-08-30 15:54
閱讀 530·2019-08-30 15:43