摘要:用于系統(tǒng)引導(dǎo)的文件系統(tǒng),包括和容器啟動(dòng)完成后會(huì)被卸載以節(jié)約內(nèi)存資源位于之上,表現(xiàn)為容器的根文件系統(tǒng)鏡像原理鏡像的文件系統(tǒng)被設(shè)計(jì)為分層存儲(chǔ)的架構(gòu)。分層存儲(chǔ)的特征使得鏡像的復(fù)用,定制變得更加容易。
docker鏡像概述
操作系統(tǒng)分為內(nèi)核kernel和用戶空間。對(duì)于Linux而言,內(nèi)核(bootfs)啟動(dòng)后會(huì)掛載root文件系統(tǒng)為其提供用戶空間支持。而docker鏡像,就相當(dāng)于是一個(gè)root文件系統(tǒng)(rootfs)。
bootfs:用于系統(tǒng)引導(dǎo)的文件系統(tǒng),包括bootloader和kernel,容器啟動(dòng)完成后會(huì)被卸載以節(jié)約內(nèi)存資源
rootfs:位于bootfs之上,表現(xiàn)為docker容器的根文件系統(tǒng)
鏡像原理鏡像的root文件系統(tǒng)被設(shè)計(jì)為分層存儲(chǔ)的架構(gòu)。鏡像在構(gòu)建時(shí),會(huì)一層一層構(gòu)建,前一層是后一層的基礎(chǔ)。每一層構(gòu)建完就不會(huì)再發(fā)生改變,后一層上的任何改變只會(huì)發(fā)生在自己這一層。
分層存儲(chǔ)的特征使得鏡像的復(fù)用,定制變得更加容易??梢允褂脴?gòu)建好的鏡像作為基礎(chǔ)層,再進(jìn)一步的添加新的層,以定制自己所需的內(nèi)容,構(gòu)建新的鏡像。
簡(jiǎn)單來(lái)說(shuō),鏡像是:
文件和metedata的集合(rootfs)
鏡像是分層存儲(chǔ)的,并且每一層都可以添加改變刪除文件,成為一個(gè)新的鏡像
不同鏡像可以共享相同的layer(層)
鏡像本身是read-only的
鏡像獲取鏡像的獲取方式:
從鏡像倉(cāng)庫(kù)(registry)獲取
通過(guò)commit命令將容器保存為鏡像
通過(guò)Dockerfile定制容器(推薦使用)
通過(guò)rootfs壓縮包導(dǎo)入
docker save和docker load命令
鏡像管理從Registry拉取鏡像
在docker hub上有大量高質(zhì)量的鏡像可以使用,從鏡像倉(cāng)庫(kù)拉取鏡像的命令格式是:
docker pull [選項(xiàng)] [Docker Registry 地址[:端口號(hào)]/]倉(cāng)庫(kù)名[:標(biāo)簽]
鏡像的名稱格式
Docker鏡像倉(cāng)庫(kù)地址:<域名/IP>[:端口號(hào)],默認(rèn)地址是docker hub
倉(cāng)庫(kù)名:<用戶名>/<軟件名>,對(duì)于docker hub,如果不給出用戶名,默認(rèn)是library,也就是官方鏡像
標(biāo)簽:標(biāo)簽一般是鏡像的版本信息,不指定標(biāo)簽?zāi)J(rèn)是latest
例如:docker pull centos
$ docker pull centos Using default tag: latest latest: Pulling from library/centos a02a4930cb5d: Pull complete Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426 Status: Downloaded newer image for centos:latest
這條命令沒(méi)有給出鏡像倉(cāng)庫(kù)地址,默認(rèn)從Docker Hub上獲取。而鏡像名稱是centos,因此會(huì)獲取官方鏡像library/centos中標(biāo)簽為latest的鏡像
配置鏡像加速器
因?yàn)閐ocker hub地址是在國(guó)外,從國(guó)內(nèi)拉取鏡像倉(cāng)庫(kù)中的鏡像會(huì)比較慢,此時(shí)可以配置鏡像加速器。
目前Docker官方和國(guó)內(nèi)的云服務(wù)商都有提供國(guó)內(nèi)加速服務(wù)。
Docker官方提供的中國(guó)加速器
阿里云加速器
配置阿里云加速器為例:
環(huán)境說(shuō)明
系統(tǒng)環(huán)境:centos7 docker版本:Docker version 18.03.0-ce
創(chuàng)建目錄文件
$ mkdir -p /etc/docker $ vim /etc/docker/daemon.json
添加配置內(nèi)容,配置內(nèi)容在阿里云容器鏡像服務(wù)中可以獲取,每個(gè)阿里云賬號(hào)都有自己的鏡像加速器。
{ "registry-mirrors": ["https://這里的配置每個(gè)人都有.mirror.aliyuncs.com"] }
然后就是重新加載文件和重啟docker,就可以了
$ systemctl daemon-reload $ systemctl restart docker
列出鏡像
列出本地鏡像的命令是:
$ docker image ls
或者
$ docker images
刪除鏡像
刪除本地鏡像的命令:
$ docker image rm [選項(xiàng)] <鏡像1> [<鏡像2> ...]
鏡像可以是鏡像短ID,長(zhǎng)ID,鏡像名或者鏡像摘要。
下面看$ docker images列出的鏡像信息。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 2 months ago 202MB busybox latest 59788edf1f3e 4 months ago 1.15MB django-compose_web latest cfd70f0cb009 5 months ago 969MB postgres latest ac25c2bac3c4 5 months ago 228MB my-compose_web latest 4867e7c35cc9 5 months ago 86.5MB
其中REPOSITORY+TAG稱為鏡像名,IMAGE ID是鏡像ID,取前幾位就是鏡像短ID。
比如用鏡像名刪除centos鏡像:
$ docker image rm centos:latest Untagged: centos:latest Untagged: centos@sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426 Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb Deleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956
使用鏡像短ID刪除鏡像:
$ docker image rm 59788ed Untagged: busybox:latest Untagged: busybox@sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bffffd8d92465812 Deleted: sha256:59788edf1f3e78cd0ebe6ce1446e9d10788225db3dedcfd1a59f764bad2b2690 Deleted: sha256:8a788232037eaf17794408ff3df6b922a1aedf9ef8de36afdae3ed0b0381907b
可以看到busybox這個(gè)鏡像已經(jīng)被刪除。
也可以類似管道一樣,結(jié)合其他命令的結(jié)果來(lái)刪除鏡像,比如docker image ls -q,先看看這個(gè)命令的執(zhí)行結(jié)果。
$ docker image ls -q python 449d3495be0e 825141134528 825141134528 40792d8a2d6d
這個(gè)命令執(zhí)行返回本地鏡像中所有python鏡像的鏡像ID,有了ID就可以結(jié)合docker image rm來(lái)刪除了。
docker image rm $(docker image ls -q)
這條命令對(duì)想要成批刪除鏡像很有幫助。
給鏡像打標(biāo)簽
給鏡像打標(biāo)簽的命令是docker tag 原鏡像 新鏡像名:標(biāo)簽,注意,打標(biāo)簽會(huì)新生成一個(gè)鏡像,而且這個(gè)新的鏡像ID和原鏡像一樣。
注意:鏡像的唯一標(biāo)識(shí)是其ID和摘要,一個(gè)鏡像可以有多個(gè)標(biāo)簽。當(dāng)刪除鏡像的時(shí)候,實(shí)際上是刪除某個(gè)標(biāo)簽的鏡像。
$ docker tag busybox busybox:version1 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest d8233ab899d4 12 days ago 1.2MB busybox version1 d8233ab899d4 12 days ago 1.2MB
啟動(dòng)鏡像為容器
啟動(dòng)鏡像為容器的命令,列舉常用的一條命令:
docker run -itd (鏡像名/ID/鏡像摘要)
$ docker run -itd busybox aa6ef78ae7b93704cbf9f99e184c2e2cb53924d693ca67c370fa74f52ff38d15
上面示例啟動(dòng)了busybox鏡像為容器,不添加標(biāo)簽說(shuō)明默認(rèn)啟動(dòng)busybox:latest。
選項(xiàng)說(shuō)明:
-i表示讓容器的標(biāo)準(zhǔn)輸入打開,
-t表示分配一個(gè)偽終端,
-d表示后臺(tái)啟動(dòng)。
要把-i -t -d 放到鏡像名字前面。
查看運(yùn)行狀態(tài)的容器
查看容器運(yùn)行狀態(tài)使用docker ps只能查看運(yùn)行中的容器,-a選項(xiàng)查看全部容器,包括未運(yùn)行的容器。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aa6ef78ae7b9 busybox "sh" 23 minutes ago Up 23 minutes thirsty_brattain ee0034f44bc6 wordpress:latest "docker-entrypoint.s…" 5 months ago Up About an hour 0.0.0.0:8000->80/tcp wordpress-compose_wordpress_1 cbcb7baa5b2f mysql:5.7 "docker-entrypoint.s…" 5 months ago Up About an hour 3306/tcp, 33060/tcp wordpress-compose_db_1 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aa6ef78ae7b9 busybox "sh" 23 minutes ago Up 23 minutes thirsty_brattain 341ea8ff6424 django-compose_web "python3 manage.py r…" 5 months ago Exited (137) 5 months ago django-compose_web_1 bffde084f040 django-compose_web "django-admin.py sta…" 5 months ago Exited (0) 5 months ago django-compose_web_run_1 0f68cb4ccae0 postgres "docker-entrypoint.s…" 5 months ago Exited (0) 5 months ago django-compose_db_1 ee0034f44bc6 wordpress:latest "docker-entrypoint.s…" 5 months ago Up About an hour 0.0.0.0:8000->80/tcp wordpress-compose_wordpress_1使用commit構(gòu)建鏡像
鏡像是容器的基礎(chǔ),每次執(zhí)行 docker run 的時(shí)候都會(huì)指定哪個(gè)鏡像作為容器運(yùn)行的基礎(chǔ)。
鏡像是多層存儲(chǔ),每一層是在前一層的基礎(chǔ)上進(jìn)行的修改;
而容器同樣也是多層存儲(chǔ),是在以鏡像為基礎(chǔ)層,在其基礎(chǔ)上加一層作為容器運(yùn)行時(shí)的存儲(chǔ)
層。
因此,在運(yùn)行的容器對(duì)容器進(jìn)行添加修改操作,也就是修改容器的存儲(chǔ)層,docker提供了commit命令可以將容器存儲(chǔ)層保存下來(lái)稱為鏡像。用例子看一下吧:
首先啟動(dòng)一個(gè)nginx鏡像:
docker run --name webser -d -p 9000:80 nginx
這條命令會(huì)啟動(dòng)一個(gè)nginx鏡像并命名為webser,把本地的9000端口映射到容器內(nèi)的80端口,這樣可以用瀏覽器去訪問(wèn)。
現(xiàn)在對(duì)這個(gè)webserver的默認(rèn)界面進(jìn)行修改。
進(jìn)入容器,進(jìn)行修改
$ docker exec -it webser bash root@432bcf4daf84:/# echo "Hello, Docker!
" > /usr/share/nginx/html/index.html root@432bcf4daf84:/# exit
重新訪問(wèn)可以看到改變。
我們修改了這個(gè)容器的存儲(chǔ)層,接下來(lái)就可以使用commit命令來(lái)保存為鏡像了。
docker commit的命令格式是:
docker commit [選項(xiàng)] <容器ID或容器名> [<倉(cāng)庫(kù)名>[:<標(biāo)簽>]]
將上面修改的nginx容器保存提交為鏡像:
$ docker commit -a "mori" -m "修改了默認(rèn)網(wǎng)頁(yè)" webser nginx:v2 sha256:25d8d84191b7e2ecbfb3c387797c47c1fa631386c418f63b78ab88067f62e365
-a也就是author,上面-a也可以改成--author,指定作者信息
-m是--message,可以改成--message ,說(shuō)明
webser是容器名稱,也可以是容器id,容器id通過(guò)docker ps查看
nginx:v2就是保存的鏡像名稱。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx v2 25d8d84191b7 6 minutes ago 109MB
可以看到鏡像已經(jīng)保存在本地了。接下來(lái)停止剛剛啟動(dòng)的nginx容器
$ docker stop webser
再啟動(dòng)新保存的鏡像nginx:v2
$ docker run --name webser2 -d -p 9000:80 nginx:v2
瀏覽器訪問(wèn),結(jié)果不是nginx默認(rèn)網(wǎng)頁(yè),而是修改后的界面。
注意:docker commit雖然可以很好理解鏡像的構(gòu)成,但是盡量不要用,雖然上面只是簡(jiǎn)單修改了網(wǎng)頁(yè)文件,但是使用docker diff webser 可以發(fā)現(xiàn)有很多文件被改動(dòng)或者添加,這會(huì)使鏡像變得臃腫。
首先去下載一個(gè)壓縮包
http://openvz.org/Download/te... //下載速度不快,我下載了一個(gè)centos6的模板
下載完導(dǎo)入該鏡像的命令為:
$ cat centos-6-x86-minimal.tar.gz|docker import - centos6
docker images查看導(dǎo)入的鏡像
把現(xiàn)有鏡像,導(dǎo)出為一個(gè)文件:
$ docker save -o moli_nginx.tar nginx
我們還可以用該文件恢復(fù)本地鏡像:
$ docker load --input moli_nginx.tar #或者 $ docker load < moli_nginx.tar鏡像構(gòu)建之Dockerfile
Dockerfile是什么?
Dockerfile是用來(lái)構(gòu)建docker鏡像的鏡像文件,是由一系列命令和參數(shù)構(gòu)成的腳本。
構(gòu)建步驟
手動(dòng)編寫一個(gè)Dockerfile文件(這個(gè)文件最好創(chuàng)建在一個(gè)空白目錄下),必須符合Dockerfile文件規(guī)范
有了這個(gè)文件后,使用docker build命令生成一個(gè)自定義的鏡像
然后就docker run
這個(gè)Dockerfile文件長(zhǎng)什么樣?
以centos為例,文件內(nèi)容如下:
FROM scratch ADD centos-7-docker.tar.xz / LABEL org.label-schema.schema-version="1.0" org.label-schema.name="CentOS Base Image" org.label-schema.vendor="CentOS" org.label-schema.license="GPLv2" org.label-schema.build-date="20181205" CMD ["/bin/bash"]
所謂定制鏡像,也就是在一定鏡像的基礎(chǔ)上,而FROM指令的作用就是指定基礎(chǔ)鏡像?;A(chǔ)鏡像是必須指定的,而且必須是Dockerfile文件的第一條指定。關(guān)于其他指令見下面。
Dockerfile文件中常見的指令
指令 | 說(shuō)明 |
---|---|
FROM | 指定基礎(chǔ)鏡像,當(dāng)前新鏡像是基于哪個(gè)鏡像的 |
MAINTAINER | 鏡像維護(hù)者的姓名和郵箱地址 |
RUN | 容器構(gòu)建時(shí)需要運(yùn)行的命令 |
EXPOSE | 當(dāng)前容器對(duì)外暴露的端口 |
WORKDIR | 指定在創(chuàng)建容器后,終端默認(rèn)登錄進(jìn)來(lái)的工作目錄,一個(gè)落腳點(diǎn) |
ENV | 用來(lái)在構(gòu)建鏡像過(guò)程中設(shè)置環(huán)境變量,這個(gè)變量可以被后續(xù)的RUN命令,WORKDIR命令使用 |
ADD | 將宿主機(jī)目錄下的文件拷貝進(jìn)鏡像并且ADD命令會(huì)自動(dòng)處理URL和解壓tar壓縮包 |
COPY | 類似ADD命令,拷貝目錄文件到鏡像中 |
VOLUME | 容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作 |
CMD | 指定一個(gè)容器啟動(dòng)時(shí)要運(yùn)行的命令,Dockerfile中可以有多個(gè)CMD,但只有最后一個(gè)生效,CMD會(huì)被docker run之后的參數(shù)替換掉 |
ENTRYPOINT | 和CMD類似,都是指定一個(gè)容器啟動(dòng)時(shí)要運(yùn)行的命令,不過(guò)他不會(huì)被替換,而是追加 |
ONBUILD | 當(dāng)構(gòu)建一個(gè)被繼承的Dockerfile時(shí)運(yùn)行命令,父鏡像在被子繼承后父鏡像的onbuild被觸發(fā) |
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/27716.html
摘要:容器作為一類操作系統(tǒng)層面的虛擬化技術(shù),其目標(biāo)是在單一主機(jī)交付多套隔離性環(huán)境,容器共享同一套主機(jī)操作系統(tǒng)內(nèi)核。與其它容器平臺(tái)不同,引入了一整套與容器管理相關(guān)的生態(tài)系統(tǒng)。每個(gè)容器都是相互隔離的保證安全的平臺(tái)。 導(dǎo)讀:本文章對(duì)Docker技術(shù)進(jìn)行了介紹,闡述了Docker的技術(shù)發(fā)展歷程、容器與虛擬機(jī)的差異、Docker原理、特點(diǎn)、Docker三組件和Docker帶來(lái)的影響,為我們進(jìn)一步理解D...
摘要:是系統(tǒng)提供的容器化技術(shù),簡(jiǎn)稱,它結(jié)合和技術(shù)為用戶提供了更易用的接口來(lái)實(shí)現(xiàn)容器化。公司結(jié)合和以下列出的技術(shù)實(shí)現(xiàn)了容器引擎,相比于,具備更加全面的資源控制能力,是一種應(yīng)用級(jí)別的容器引擎。 showImg(https://segmentfault.com/img/bVbtPbG?w=749&h=192); 題外話 最近對(duì)Docker和Kubernetes進(jìn)行了一番學(xué)習(xí),前兩天做了一次技術(shù)...
摘要:本文從定義,作用,技術(shù)架構(gòu),安裝和使用等全方位帶你看懂。如圖中左邊紅框中和右邊的紅框中都唯一表示為同一個(gè)鏡像。最后,于開發(fā)者而言提供了一種開發(fā)環(huán)境的管理辦法,與測(cè)試人員而言保證了環(huán)境的同步,于運(yùn)維人員提供了可移植的標(biāo)準(zhǔn)化部署流程。 作者丨唐文廣:騰訊工程師,負(fù)責(zé)無(wú)線研發(fā)部地圖測(cè)試。 導(dǎo)語(yǔ):Docker,近兩年才流行起來(lái)的超輕量級(jí)虛擬機(jī),它可以讓你輕松完成持續(xù)集成、自動(dòng)交付、自動(dòng)部署...
閱讀 1700·2021-09-22 15:25
閱讀 1619·2021-09-07 10:06
閱讀 3254·2019-08-30 15:53
閱讀 1151·2019-08-29 13:12
閱讀 3458·2019-08-29 13:07
閱讀 802·2019-08-28 18:19
閱讀 2348·2019-08-27 10:57
閱讀 1042·2019-08-26 13:29