??博主簡介:
??????????云計算領(lǐng)域優(yōu)質(zhì)創(chuàng)作者
??????????2022年CSDN新星計劃python賽道第一名??????????2022年CSDN原力計劃優(yōu)質(zhì)作者
??????????阿里云ACE認證高級工程師
??????????阿里云開發(fā)者社區(qū)專家博主??交流社區(qū):CSDN云計算交流社區(qū)歡迎您的加入!
?
目錄
1.使用Dockerfile創(chuàng)建鏡像
1.1?創(chuàng)建工作目錄
1.2?編寫run.sh腳本和authorized_keys文件
1.3?編寫Dockerfile?
1.4?創(chuàng)建鏡像?
?1.5?測試鏡像,運行容器
2. 鏡像的多級構(gòu)建
3.?Docker image Build 高級
3.1?鏡像 Cache 機制
3.2 Cache 機制的注意事項
3.3?命名方式的 stage?
3.4?Google 內(nèi)部精簡鏡像?
Dockerfile被認為是構(gòu)建Docker鏡像的標(biāo)準方式。人們常常會疑惑Dockerfile對于配置管理意味著什么。讀者也可能會有許多疑問(尤其是在對一些其他配置管理工具有些經(jīng)驗的時候),例如:
??如果基礎(chǔ)鏡像更改會發(fā)生什么?
??如果更改要安裝的包然后重新構(gòu)建會發(fā)生什么?
??它會取代Chef/Puppet/Ansible嗎?
|
事實上,Dockerfile很簡單:從給定的鏡像開始,Dockerfile為Docker指定一系列的shell命令和元指令,從而產(chǎn)出最終所需的鏡像。
Dockerfile提供了一個普通、簡單和通用的語言來配置Docker鏡像。使用 Dockerfile,用戶可以使用任何偏好的方式來達到所期望的最終狀態(tài)。用戶可以調(diào)用Puppet,可以從其他腳本里復(fù)制,甚至可以從一個完整的文件系統(tǒng)復(fù)制!
并不推薦使用
docker commit
的方法來構(gòu)建鏡像。相反,推薦使用被稱為Dockerfile
的定義文件和
docker build
命令來構(gòu)建鏡像。Dockerfile使用基本的基于DSL(Domain Specific Language))語法的指令來構(gòu)建一個Docker鏡像,我們推薦使用Dockerfile
方法來代替docker commit
,因為通過前者來構(gòu)建鏡像更具備可重復(fù)性、透明性以及冪等性。
|
1.使用Dockerfile創(chuàng)建鏡像
1.1?創(chuàng)建工作目錄
首先,創(chuàng)建一個sshd_ubuntu工作目錄:
|
$ mkdir sshd_ubuntu
$ ls
sshd_ubuntu
在其中,創(chuàng)建Dockerfile和run.sh文件:
|
$ cd sshd_ubuntu/
$ touch Dockerfile run.sh
$ ls
Dockerfile run.sh
1.2?編寫run.sh腳本和authorized_keys文件
腳本文件run.sh的內(nèi)容與前面一致:
|
#!/bin/bash
/usr/sbin/sshd -D
在宿主主機上生成SSH密鑰對,并創(chuàng)建authorized_keys文件:
|
$ ssh-keygen -t rsa
...
$ cat ~/.ssh/id_rsa.pub >authorized_keys
1.3?編寫Dockerfile?
下面是Dockerfile的內(nèi)容及各部分的注釋,可以對比上一節(jié)中利用docker commit命令創(chuàng)建鏡像過程,所進行的操作基本一致:
|
#設(shè)置繼承鏡像
FROM ubuntu:14.04
#提供一些作者的信息
MAINTAINER docker_user (user@docker.com)
#下面開始運行更新命令
RUN apt-get update
#安裝ssh服務(wù)
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
#取消pam限制
RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
#復(fù)制配置文件到相應(yīng)位置,并賦予腳本可執(zhí)行權(quán)限
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#開放端口
EXPOSE 22
#設(shè)置自啟動命令
CMD ["/run.sh"]
1.4?創(chuàng)建鏡像?
在sshd_ubuntu目錄下,使用docker build命令來創(chuàng)建鏡像。這里需要注意最后還有一個“.”,表示使用當(dāng)前目錄中的Dockerfile:
|
$ cd sshd_ubuntu
$ docker build -t sshd:Dockerfile .
如果大家使用Dockerfile創(chuàng)建自定義鏡像,那么需要注意的是Docker會自動刪除中間臨時創(chuàng)建的層,還需要注意每一步的操作和編寫的 Dockerfile中命令的對應(yīng)關(guān)系。
|
命令執(zhí)行完畢后,如果讀者可見“Successfully built XXX”字樣,則說明鏡像創(chuàng)建成功??梢钥吹?,以上命令生成的鏡像ID是 570c26a9de68。
在本地查看sshd:Dockerfile鏡像已存在:
|
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
sshd Dockerfile 570c26a9de68 4 minutes ago 246.5 MB
sshd ubuntu 7aef2cd95fd0 12 hours ago 255.2 MB
busybox latest e72ac664f4f0 3 weeks ago 2.433 MB
ubuntu 14.04 ba5877dc9bec 3 months ago 192.7 MB
ubuntu latest ba5877dc9bec 3 months ago 192.7 MB
?1.5?測試鏡像,運行容器
使用剛才創(chuàng)建的sshd:Dockerfile鏡像來運行一個容器。
直接啟動鏡像,映射容器的22端口到本地的10122端口:
|
$ docker run -d -p 10122:22 sshd:Dockerfile 890c04ff8d769b604386ba4475253ae8c21fc92d60083759afa77573bf4e8af1
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
890c04ff8d76 sshd:Dockerfile "/run.sh" 4 seconds ago Up 3 seconds 0.0.0.0:10122->22/tcp high_albattani
在宿主主機新打開一個終端,連接到新建的容器:
|
$ ssh 192.168.1.200 -p 10122
root@890c04ff8d76:~#
效果與前面一致,鏡像創(chuàng)建成功。
|
2. 鏡像的多級構(gòu)建
Dockerfile > 鏡像(寫Dockerfile文件,然后docker build -t 鏡像名 Dockerfile文件路徑 =鏡像)
|
17.09以后的版本才支持,此版本之后的Ddockerfile文件中可以添加多個FROM,多級,前幾級都只是充當(dāng)基礎(chǔ) 編譯型語言才能支持多級構(gòu)建,如:golong語言,java語言等。解釋性語言如php,ruby,python等不支持多級構(gòu)建 即:如何制作鏡像時將 鏡像做到最小。 |
安裝 Docker 最新版軟件 |
yum install -y yum-utils device-mapper-persistent-data lvm2 #先安裝最新版docker所需的依賴及工具
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #配置yum源
yum install -y docker-ce #安裝軟件
mkdir /etc/docker #創(chuàng)建 /etc/docker 目錄
配置 daemon.注入以下內(nèi)容:
|
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"insecure-registries": ["harbor.hongfu.com"],
"registry-mirrors": ["https://kfp63jaj.mirror.aliyuncs.com"]
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload && systemctl restart docker #重啟docker服務(wù)
systemctl enable docker #設(shè)為開機自啟
寫Dockerfile文件,在文件中可以寫多個FROM調(diào)用鏡像,還可以給每個被調(diào)用的鏡像重命名,方便后續(xù)的FROM調(diào)用前面的FROM 例如:Dockerfile文件 |
FROM golang:1.7.3
WORKDIR /go/src/github.com/sparkdevo/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/sparkdevo/href-counter/app . #--from=0即調(diào)用第一個FROM
CMD ["./app"]
3.?Docker image Build 高級
3.1?鏡像 Cache 機制
Docker Daemnon 通過 Dockerfile 構(gòu)建鏡像時,當(dāng)發(fā)現(xiàn)即將新構(gòu)建出的鏡像與已有的某鏡像重復(fù)時,可以選擇放棄構(gòu)建新的鏡像, 而是選用已有的鏡像作為構(gòu)建結(jié)果,也就是采取本地已經(jīng) cache 的鏡像作為結(jié)果
|
3.2 Cache 機制的注意事項
ADD 命令與 COPY 命令:Dockerfile 沒有發(fā)生任何改變,但是命令A(yù)DD run.sh /?中 Dockerfile 當(dāng)前目錄下的 run.sh 卻發(fā)生了 變化,從而將直接導(dǎo)致鏡像層文件系統(tǒng)內(nèi)容的更新,原則上不應(yīng)該再使用cache。那么,判斷 ADD 命令或者 COPY 命令后 緊接 的文件是否發(fā)生變化,則成為是否延用cache 的重要依據(jù)。Docker 采取的策略是:獲取 Dockerfile 下內(nèi)容(包括文件 的部分 inode 信息),計算出一個唯一的 hash 值,若 hash 值未發(fā)生變化,則可以認為文件內(nèi)容沒有發(fā)生變化,可以使 用 cache 機制;反之亦然
|
RUN 命令存在外部依賴:一旦 RUN 命令存在外部依賴,如RUN apt-get update,那么隨著時間的推移,基于同一個基礎(chǔ)鏡像, 一年的 apt-get update 和一年后的 apt-get update, 由于軟件源軟件的更新,從而導(dǎo)致產(chǎn)生的鏡像理論上應(yīng)該不同。如果繼 續(xù)使用cache 機制,將存在不滿足用戶需求的情況。Docker 一開始的設(shè)計既考慮了外部依賴的問題,用戶可以使用參數(shù) --no-cache 確保獲取最新的外部依賴,命令為docker build --no-cache -t="my_new_image" .
|
樹狀的鏡像關(guān)系決定了,一次新鏡像的成功構(gòu)建將導(dǎo)致后續(xù)的 cache 機制全部失效:這一點很好理解,一旦產(chǎn)生一個新的鏡 像,同時意味著產(chǎn)生一個新的鏡像 ID,而當(dāng)前宿主機環(huán)境中肯定不會存在一個鏡像,此鏡像ID的父鏡像 ID 是新產(chǎn)生鏡像 的ID。這也是為什么,書寫 Dockerfile 時,應(yīng)該將更多靜態(tài)的安裝、配置命令盡可能地放在 Dockerfile 的較前位置
|
3.3?命名方式的 stage?
命名方式的 stage:
舊版本的 docker 是不支持 multi-stage 的,只有 17.05 以及之后的版本才開始支持
|
FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/sparkdevo/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/sparkdevo/href-counter/app .
CMD ["./app"]
3.4?Google 內(nèi)部精簡鏡像?
git clone https://github.com/GoogleContainerTools/distroless #訪問不到用下方地址代理
hub.fastgit.org/GoogleContainerTools/distroless
????????結(jié)束語??????
為大家推薦一款刷題神奇?點擊鏈接訪問??途W(wǎng)https://www.nowcoder.com/link/jihexinliang260
各大互聯(lián)網(wǎng)大廠面試真題?;A(chǔ)題庫到進階題庫等各類面試題應(yīng)有盡有!
牛客網(wǎng)面經(jīng)合集,滿足大廠面試技術(shù)深度,快速構(gòu)建Java核心知識體系大廠面試官親授,備戰(zhàn)面試與技能提升,主要考點+主流場景+內(nèi)功提升+真題解析文章來源:http://www.zghlxwxcb.cn/news/detail-837130.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-837130.html
到了這里,關(guān)于【云原生 | 15】Dockerfile構(gòu)建鏡像實戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!