从零开始学习docker(零)简单介绍Dockerfile
如果不使用docker,面臨的問題有:
- 部署非常慢
- 成本非常高
- 資源浪費(fèi)
- 難于遷移和擴(kuò)展
- 可能會被限定硬件廠商
虛擬化技術(shù)的優(yōu)點(diǎn):
- 虛擬化技術(shù)出現(xiàn)以后,一個(gè)物理機(jī)可以部署多個(gè)App,每個(gè)App獨(dú)立運(yùn)行在一個(gè)VM里。
- 資源池,一個(gè)物理機(jī)的資源分配到了不同的虛擬機(jī)里
- 容易擴(kuò)展,加物理機(jī)或者虛擬機(jī)。
- 很容易云化,亞馬遜AWS,阿里云等。
虛擬化技術(shù)的局限性:
- 每一個(gè)虛擬機(jī)都是一個(gè)完整的操作系統(tǒng),要給其分配資源,當(dāng)虛擬機(jī)數(shù)量增多時(shí),操作系統(tǒng)本身消耗的資源勢必增多。
?docker 命令每次都需要使用sudo來執(zhí)行,不太方便,如何去掉sudo?
? ? 2.?更新用戶組?
newgrp docker? ? 3. 重啟docker服務(wù)
iie4bu@hostdocker:~$ sudo service docker restart? ? ?4. 重新登錄終端即可,這樣就不需要加sudo了 ,非常方便
從零構(gòu)建第一個(gè)hello world
目標(biāo):構(gòu)建一個(gè)最簡單的hello world
新建目錄hello-world
第一步寫一個(gè)最簡單的c語言,新建hello.c
#include<stdio.h> int main() {printf("hello docker \n"); }編譯hello.c,輸出為hello
iie4bu@hostdocker:~/ddy/hello-world$ gcc -static hello.c -o hello在當(dāng)前目錄下新建Dockerfile
FROM scratch ADD hello / CMD ["/hello"]Dockerfile是一個(gè)包含用于組合映像的命令的文本文檔。可以使用在命令行中調(diào)用任何命令。 Docker通過讀取Dockerfile中的指令自動生成映像。
Dockerfile文件說明與常用命令
Docker以從上到下的順序運(yùn)行Dockerfile的指令。為了指定基本映像,第一條指令必須是FROM。一個(gè)聲明以#字符開頭則被視為注釋。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
在這里列出了一些常用的說明
FROM
該指令用于設(shè)置后續(xù)指令的基本映像。有效的Dockerfile必須使用FROM作為其第一條指令。表示我們想要在哪個(gè)base image之上來build我們的image。例如我們FROM centos,表示我們想要在centos的基礎(chǔ)之上去build我們的image。
FROM scratch # 制作base image FROM centos # 制作base image FROM ubuntu:xenialscratch表示空鏡像。
盡量使用官方的image作為base image!(為了安全)
LABEL
可以為映像添加標(biāo)簽來組織項(xiàng)目的映像。需要使用LABEL指令設(shè)置映像的標(biāo)簽。定義了我們的metadata。
LABEL maintainer="vincent" LABEL version="1.0" LABEL description="This is description"RUN
該指令用于執(zhí)行當(dāng)前映像的任何命令。一般我們安裝一些軟件的時(shí)候需要使用RUN,
RUN yum update && yum install -y vim \python-dev # 反斜線換行 RUN apt-get update && apt-get install -y perl \pwgen --no-install-recommends && rm -rf \/var/lib/apt/lists/* # 注意清理cache RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'RUN需要注意的是我們每運(yùn)行一次RUN都會生成新的一層container,所以說對于RUN來講,為了避免無用的分層,合并多條命令成一行。為了美觀,復(fù)雜的RUN請用反斜線換行!
CMD
這用于執(zhí)行映像的應(yīng)用程序。應(yīng)該以下列形式總是使用CMD -?
CMD ["executable", "param1", "param2"?]這是使用CMD的首選方法。Dockerfile文件中只能有一個(gè)CMD。如果使用多個(gè)CMD,則只會執(zhí)行最后一個(gè)CMD。
ADD 和 COPY
ADD和COPY的作用很像,都是通過把本地的一些文件,添加到我們的docker image里面。例如我們把本地的hello的一個(gè)可執(zhí)行文件拷貝到根目錄中,該指令用于將來自源的新文件或目錄復(fù)制到目的地的容器的文件系統(tǒng)。
ADD hello / #把本地的hello的一個(gè)可執(zhí)行文件拷貝到根目錄中 ADD test.tar.gz / #添加到根目錄并解壓 COPY abc/ /xyzADD與COPY的區(qū)別是,ADD可以解壓縮。
ADD和COPY往往和WORKDIR一起使用。
WORKDIR /root ADD hello test #/root/test/hello大部分情況,COPY要比ADD優(yōu)先去使用。ADD除了COPY以外,還有解壓縮的功能。如果要添加遠(yuǎn)程文件/目錄請使用curl或者wget
規(guī)則
- source路徑必須在構(gòu)建的上下文之內(nèi)。無法使用COPY ../something /something,因?yàn)閐ocker構(gòu)建的第一步是將上下文目錄(和子目錄)發(fā)送到docker守護(hù)程序。
- 如果source是目錄,則會復(fù)制目錄的全部內(nèi)容,包括文件系統(tǒng)元數(shù)據(jù)。
ENV
通過設(shè)置環(huán)境變量來設(shè)置一個(gè)常量?
ENV MYSQL_VERSION 5.6 #設(shè)置常量 RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \&& rm -rf /var/lib/apt/lists/* #引用常量WORKDIR
用于設(shè)定當(dāng)前工作目錄的。與linux下面的cd命令很像。WORKDIR用于為Dockerfile中的RUN,CMD和COPY指令設(shè)置工作目錄。如果工作目錄不存在,它默認(rèn)將會創(chuàng)建。
我們可以在Dockerfile文件中多次使用WORKDIR。
使用WORKDIR,而不要使用RUN cd? 盡量使用絕對目錄!不要使用相對目錄。
RUN:執(zhí)行命令并創(chuàng)建新的Image Layer
CMD:設(shè)置容器啟動后默認(rèn)執(zhí)行的命令和參數(shù)
ENTRYPOINT:設(shè)置容器啟動時(shí)運(yùn)行的命令
CMD和ENTRYPOINT有什么區(qū)別呢?
在介紹CMD和ENTRYPOINT區(qū)別之前,先介紹Shell和Exce格式
Shell格式,把我們要運(yùn)行的命令當(dāng)成shell來執(zhí)行,如下所示:
RUN apt-get install -y vim CMD echo "hello docker" ENTRYPOINT echo "hello docker"Exec格式,需要特定的格式去指明我們要運(yùn)行的命令以及命令所跟的參數(shù),如下所示:
RUN [ "apt-get", "install", "-y", "vim" ] CMD [ "/bin/echo", "hello docker" ] ENTRYPOINT [ "/bin/echo", "hello docker"]目前我們還不知道Shell和Exec有什么區(qū)別,下面來解釋,首先新建兩個(gè)Dockerfile
Dockerfile1:
FROM ubuntu:xenial ENV name Docker ENTRYPOINT echo "hello $name"Dockerfile2:
FROM ubuntu:xenial ENV name Docker ENTRYPOINT ["/bin/echo", "hello $name"]這兩個(gè)Dockerfile看起來功能是一樣的。
我們在命令行執(zhí)行第一個(gè)Dockerfile
iie4bu@hostdocker:~/ddy/docker1$ docker build -t vincent/ubuntu-entrypoint-shell . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM ubuntu:xenial---> 5e8b97a2a082 Step 2/3 : ENV name Docker---> Running in 6be14dd0ab64 Removing intermediate container 6be14dd0ab64---> 0ebb88d446f9 Step 3/3 : ENTRYPOINT echo "hello $name"---> Running in acdad580ef15 Removing intermediate container acdad580ef15---> 37a8a7654a8f Successfully built 37a8a7654a8f Successfully tagged vincent/ubuntu-entrypoint-shell:latest然后我們查看我們的image
iie4bu@hostdocker:~/ddy/docker1$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE vincent/ubuntu-entrypoint-shell latest 37a8a7654a8f 17 seconds ago 114MB有了新的image,然后我們創(chuàng)建一個(gè)container。如下:
iie4bu@hostdocker:~/ddy/docker1$ docker run vincent/ubuntu-entrypoint-shell hello Docker iie4bu@hostdocker:~/ddy/docker1$然后我們將執(zhí)行Exec格式的Dockerfile。然后build一個(gè)新的image如下:
iie4bu@hostdocker:~/ddy/docker2$ docker build -t vincent/ubuntu-entrypoint-exec . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM ubuntu:xenial---> 5e8b97a2a082 Step 2/3 : ENV name Docker---> Using cache---> 0ebb88d446f9 Step 3/3 : ENTRYPOINT ["/bin/echo", "hello $name"]---> Running in 01984afd1b19 Removing intermediate container 01984afd1b19---> 9d4f9618de5d Successfully built 9d4f9618de5d Successfully tagged vincent/ubuntu-entrypoint-exec:latest然后我們創(chuàng)建一個(gè)container。如下:
iie4bu@hostdocker:~/ddy/docker2$ docker run vincent/ubuntu-entrypoint-exec hello $name iie4bu@hostdocker:~/ddy/docker2$也就是說,它并沒有把我們$name替換成我們ENV中定義的常量。如何得到正確結(jié)果呢?需要修改Dockerfile,內(nèi)容如下:
FROM ubuntu:xenial ENV name Docker ENTRYPOINT ["/bin/bash", "-c", "echo", "hello $name"]-c表示后面的是我們的參數(shù)
然后重新生成image,然后再次生成container,發(fā)現(xiàn)輸出結(jié)果為空:
iie4bu@hostdocker:~/ddy/docker2$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE vincent/ubuntu-entrypoint-exec latest eec8fd1389b2 30 seconds ago 114MB iie4bu@hostdocker:~/ddy/docker2$ docker run vincent/ubuntu-entrypoint-execiie4bu@hostdocker:~/ddy/docker2$原因是通過/bin/bash -c去執(zhí)行命令的時(shí)候,要把后面所有的命令作為一個(gè)命令來執(zhí)行。修改Dockerfile如下:
FROM ubuntu:xenial ENV name Docker ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]重新build 和 run 這樣結(jié)果就正常輸出了:
iie4bu@hostdocker:~/ddy/docker2$ docker build -t vincent/ubuntu-entrypoint-exec . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM ubuntu:xenial---> 5e8b97a2a082 Step 2/3 : ENV name Docker---> Using cache---> 0ebb88d446f9 Step 3/3 : ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]---> Running in 83332f6ed34f Removing intermediate container 83332f6ed34f---> 02dde803e324 Successfully built 02dde803e324 Successfully tagged vincent/ubuntu-entrypoint-exec:latest iie4bu@hostdocker:~/ddy/docker2$ docker run vincent/ubuntu-entrypoint-exec hello Docker iie4bu@hostdocker:~/ddy/docker2$CMD
- 容器啟動時(shí)默認(rèn)執(zhí)行的命令
- 如果docker run指定了其他命令,CMD命令會被忽略
- 如果定義了多個(gè)CMD,只有最后一個(gè)會執(zhí)行
ENTRYPOINT
- 讓容器以應(yīng)用程序或者服務(wù)的形式運(yùn)行,例如啟動一個(gè)數(shù)據(jù)庫服務(wù)
- 不會被忽略,一定會執(zhí)行
- 最佳實(shí)踐:寫一個(gè)shell腳本作為entrypoint
小技巧
? ? 如何刪除掉已經(jīng)停止的container的image?
? ? 如果一個(gè)container已經(jīng)停止,是無法直接刪除這個(gè)image的,需要先把這個(gè)container刪除掉。
命令:docker container rm $(docker ps -qa)
新建Dockerfile,內(nèi)容如下:
FROM ubuntu:xenial ENV name Docker CMD echo "hello $name"構(gòu)建這個(gè)image?
iie4bu@hostdocker:~/ddy/docker3$ docker build -t vincent/ubuntu-cmd-shell . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM ubuntu:xenial---> 5e8b97a2a082 Step 2/3 : ENV name Docker---> Using cache---> 0ebb88d446f9 Step 3/3 : CMD echo "hello $name"---> Running in a06dce28b737 Removing intermediate container a06dce28b737---> 04b36269a3c8 Successfully built 04b36269a3c8 Successfully tagged vincent/ubuntu-cmd-shell:latest查看我們現(xiàn)在有哪些image?
iie4bu@hostdocker:~/ddy/docker3$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE vincent/ubuntu-cmd-shell latest 04b36269a3c8 About a minute ago 114MB vincent/ubuntu-entrypoint-exec latest 02dde803e324 20 minutes ago 114MB vincent/ubuntu-entrypoint-shell latest 37a8a7654a8f 36 minutes ago 114MB我們執(zhí)行ubuntu-cmd-shell
iie4bu@hostdocker:~/ddy/docker3$ docker run vincent/ubuntu-cmd-shell hello Docker iie4bu@hostdocker:~/ddy/docker3$可以正常執(zhí)行。如果我們用-it,那么就不會打印輸出hello Docker了
iie4bu@hostdocker:~/ddy/docker3$ docker run -it vincent/ubuntu-cmd-shell /bin/bash root@bf0f8f7f6de1:/#然而,我們使用ubuntu-entrypoint-shell就不會出現(xiàn)這種情況,依然會打印輸出hello Docker
iie4bu@hostdocker:~/ddy/docker3$ docker run -it vincent/ubuntu-entrypoint-shell /bin/bash hello Docker iie4bu@hostdocker:~/ddy/docker3$EXPOSE
會把我們運(yùn)行的container中的端口暴露出來。
構(gòu)建Dockerfile
iie4bu@hostdocker:~/ddy/hello-world$ docker build -t ddy/hello-world . Sending build context to Docker daemon 916.5kB Step 1/3 : FROM scratch---> Step 2/3 : ADD hello /---> d1a03c513631 Step 3/3 : CMD ["/hello"]---> Running in 7d10f24a5f54 Removing intermediate container 7d10f24a5f54---> 9fe0d93646ea Successfully built 9fe0d93646ea Successfully tagged ddy/hello-world:latest iie4bu@hostdocker:~/ddy/hello-world$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ddy/hello-world latest 9fe0d93646ea 12 seconds ago 913kB使用docker history imageID可以查看鏡像的層級
iie4bu@hostdocker:~/ddy/hello-world$ docker history 9fe0d93646ea IMAGE CREATED CREATED BY SIZE COMMENT 9fe0d93646ea About a minute ago /bin/sh -c #(nop) CMD ["/hello"] 0B d1a03c513631 About a minute ago /bin/sh -c #(nop) ADD file:ac94667f27379ec68… 913kB運(yùn)行鏡像
iie4bu@hostdocker:~/ddy/hello-world$ docker run ddy/hello-world hello docker說明鏡像構(gòu)建好了。
container
container是通過Image構(gòu)建,是在image layer(只讀)之上建立的container layer(可讀可寫)。好比是java中類與對象之間的關(guān)系。image負(fù)責(zé)App的存儲和分發(fā),container負(fù)責(zé)運(yùn)行App。
使用docker run IMAGENAME 可以創(chuàng)建一個(gè)container。默認(rèn)不寫tag會指定latest版本
iie4bu@hostdocker:~/ddy/hello-world$ docker run ddy/hello-world列舉正在運(yùn)行的container:
iie4bu@hostdocker:~$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES可以發(fā)現(xiàn)什么都沒有,因?yàn)閔ello-world container運(yùn)行完hello docker后就退出了,不是一個(gè)常駐內(nèi)存的進(jìn)程。可以使用docker container ls -a來列舉出所有容器包括正在運(yùn)行的和退出的。
iie4bu@hostdocker:~$ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6d9bcf87eac4 ddy/hello-world "/hello" About an hour ago Exited (0) About an hour agoDockerfile中的CMD就是這里的COMMAND命令。
交互式運(yùn)行容器
命令:docker run -it hello-word
例如我們有一個(gè)ubuntu的景象:
iie4bu@hostdocker:~/ddy/hello-world$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu xenial 5e8b97a2a082 12 months ago 114MB嘗試交互式運(yùn)行ubuntu:
iie4bu@hostdocker:~$ docker run -it ubuntu:xenial root@51f52b351e2c:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var查看當(dāng)前container運(yùn)行:
iie4bu@hostdocker:~/ddy/hello-world$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 51f52b351e2c ubuntu:xenial "/bin/bash" 44 seconds ago Up 43 seconds zealous_spence當(dāng)我們退出ubuntu鏡像時(shí),使用exit命令,這時(shí)docker container ls就不會有這個(gè)鏡像了,使用docker container ls -a可以看到剛剛的鏡像已經(jīng)退出了。
iie4bu@hostdocker:~$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES iie4bu@hostdocker:~$ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 51f52b351e2c ubuntu:xenial "/bin/bash" 6 minutes ago Exited (127) 13 seconds ago zealous_spence我們每創(chuàng)建一個(gè)容器,都會在我們之前的image之上多了一層。
docker container ls -a 與 docker ps -a 命令是一樣的。
刪除一個(gè)container命令:
iie4bu@hostdocker:~$ docker container rm 51f52b351e2c 51f52b351e2c實(shí)際上使用命令docker rm?51f52b351e2c 默認(rèn)就是刪除一個(gè)container
docker image rm imageID 等同于 docker rmi imageID
docker image ls 等同于 docker images
docker container ls 等同于 docker ps
?docker container commit
這條命令的意思是基于某個(gè)image創(chuàng)建一個(gè)container,然后我們在這個(gè)container里面做一些變化,例如安裝了一些軟件,然后我們可以把已經(jīng)改變的container給commit一個(gè)新的image。這個(gè)命令一般可以簡寫成docker commit
我們先運(yùn)行一個(gè)ubuntu的鏡像:
iie4bu@hostdocker:~$ docker run -it ubuntu:xenial root@803945a2c2d1:/# vim bash: vim: command not found root@803945a2c2d1:/#這個(gè)鏡像里面沒有vim命令,然后我們安裝vim
root@803945a2c2d1:/# apt-get update root@803945a2c2d1:/# apt-get install vim安裝vim成功后,我們將這個(gè)container變?yōu)閕mage
退出當(dāng)前容器。查看當(dāng)前容器:
root@803945a2c2d1:/# exit exit iie4bu@hostdocker:~$ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 803945a2c2d1 ubuntu:xenial "/bin/bash" 7 minutes ago Exited (0) 8 seconds ago sharp_turing將當(dāng)前container commit為一個(gè)新的image:
iie4bu@hostdocker:~$ docker commit sharp_turing vincent/ubuntu-vim sha256:697cdaba05dc77867ea5067b9d729b78f91aa05cbed872897d5e28cc40decd21 iie4bu@hostdocker:~$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE vincent/ubuntu-vim latest 697cdaba05dc 22 seconds ago 213MB我們看到我們自己的image已經(jīng)生成了。我們查看這個(gè)image與之前ubuntuimage的層級結(jié)構(gòu)有什么不同。
iie4bu@hostdocker:~$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE vincent/ubuntu-vim latest 697cdaba05dc 22 seconds ago 213MB ddy/hello-world latest 9fe0d93646ea 5 hours ago 913kB <none> <none> 37705341d15d 2 months ago 643MB prom/prometheus latest 0694fc214c9f 2 months ago 109MB dgraph/dgraph <none> a3b60a6ee9a7 3 months ago 144MB hello-world latest fce289e99eb9 5 months ago 1.84kB tomcat latest 78b258e36eed 7 months ago 463MB <none> <none> 0e2ca16d4311 11 months ago 45.4GB ubuntu xenial 5e8b97a2a082 12 months ago 114MB docker.elastic.co/elasticsearch/elasticsearch 6.2.3 d8d340eb391b 15 months ago 542MB java 8 d23bdf5b1b1b 2 years ago 643MB iie4bu@hostdocker:~$ docker history 5e8b97a2a082 IMAGE CREATED CREATED BY SIZE COMMENT 5e8b97a2a082 12 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 12 months ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B <missing> 12 months ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$… 2.76kB <missing> 12 months ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B <missing> 12 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B <missing> 12 months ago /bin/sh -c #(nop) ADD file:d37ff24540ea7700d… 114MB iie4bu@hostdocker:~$ docker history 697cdaba05dc IMAGE CREATED CREATED BY SIZE COMMENT 697cdaba05dc 2 minutes ago /bin/bash 99.3MB 5e8b97a2a082 12 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 12 months ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B <missing> 12 months ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$… 2.76kB <missing> 12 months ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B <missing> 12 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B <missing> 12 months ago /bin/sh -c #(nop) ADD file:d37ff24540ea7700d… 114MB我們看到新的image與5e8b97a2a082的image是一樣的,我們只是在5e8b97a2a082的基礎(chǔ)上加了一些東西。
這種方式創(chuàng)建image一般并不提倡,因?yàn)槲覀內(nèi)绻l(fā)布出去這個(gè)image,別人拿到這個(gè)image并不知道這個(gè)image是怎么產(chǎn)生的,很可能會把不安全的東西放到image中發(fā)布出去,這樣就有安全問題。
我們一般提倡使用Dockerfile方式。
docker image build
可以簡寫為docker build。
我們先將上面的ubuntu-vim鏡像刪除掉:
iie4bu@hostdocker:~$ docker image rm 697 Untagged: vincent/ubuntu-vim:latest Deleted: sha256:697cdaba05dc77867ea5067b9d729b78f91aa05cbed872897d5e28cc40decd21 Deleted: sha256:91ddbb337bcf4e6a6a13b3be81a86b195fbac5e66823c6be625a8cd46ffdab32我們新建目錄docker-ubuntu-vim,進(jìn)入這個(gè)目錄中新建Dockerfile,內(nèi)容如下:
FROM ubuntu:xenial RUN apt-get update RUN apt-get install -y vimFROM: 必不可少的命令,從某個(gè)鏡像作為基。如 FROM <image_name> ,或者 FROM <image_name>:<tag>. 如果不加tag,默認(rèn)為latest。先從本地鏡像倉庫去搜索基鏡像,如過本地沒有,在去網(wǎng)上docker registry去尋找。
apt-get install -y vim 如果不加-y,那么會被中斷,導(dǎo)致安裝不成功。
iie4bu@hostdocker:~/ddy/docker-ubuntu-vim$ docker build -t mydocker_id/ubuntu-vim-new . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM ubuntu:xenial---> 5e8b97a2a082 Step 2/3 : RUN apt-get update---> Running in 37b5a57504d0我們看到直接使用了ubuntu本地的image layer,5e8b97a2a082
在build的過程中,生成了一個(gè)臨時(shí)的container,這個(gè)container id為37b5a57504d0,隨后會把這個(gè)container刪除掉,這一過程會在build的整個(gè)階段可能會執(zhí)行很多次。
查看image:
iie4bu@hostdocker:~/ddy/docker-ubuntu-vim$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE mydocker_id/ubuntu-vim-new latest ddad98db69ba 8 minutes ago 213MB?
總結(jié)
以上是生活随笔為你收集整理的从零开始学习docker(零)简单介绍Dockerfile的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker安装配置分布式elastic
- 下一篇: 从零开始搭建spring-cloud(2