DockerFile 介紹
dockerfile
是用來構(gòu)建docker
鏡像的文件,是命令參數(shù)腳本
- 構(gòu)建步驟:
- 編寫
dockerfile
文件 -
docker build
構(gòu)建成為一個(gè)鏡像 -
docker run
運(yùn)行鏡像 -
docker push
發(fā)送鏡像(DockerHub
袁滥、阿里云鏡像)
- 編寫
-
查看官方鏡像文件的構(gòu)建
DockerFile
構(gòu)建過程
- 基礎(chǔ)知識(shí):
- 每個(gè)保留關(guān)鍵字(指令)都必須是大寫字母
- 指令從上到下順序執(zhí)行
-
#
表示注釋 - 每一個(gè)指令都會(huì)創(chuàng)建提交一個(gè)新的鏡像層,并提交很魂!
-
dockerfile
是面向開發(fā)的堤撵,要發(fā)布項(xiàng)目、做鏡像需要編寫dockerfile
文件绽乔。 -
DockerFile
:構(gòu)建文件补疑,定義了一切的步驟歧沪,源代碼 -
DockerImages
:通過DockerFile
構(gòu)建生成的鏡像,最終發(fā)布和運(yùn)行產(chǎn)品莲组。 -
Docker容器
:容器就是鏡像運(yùn)行起來提供服務(wù)诊胞。
DockerFile
的指令
1. FROM # 基礎(chǔ)鏡像,一切從這里開始構(gòu)建
2. MAINTAINER # 鏡像作者:姓名+郵箱
3. RUN # 鏡像構(gòu)建的時(shí)候需要運(yùn)行的命令
4. ADD # 步驟锹杈。(tomcat鏡像的壓縮包就是一種添加內(nèi)容)
5. WORKDIR # 鏡像的工作目錄
6. VOLUME # 掛載的目錄
7. EXPOSE # 暴露端口配置
8. CMD # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令撵孤,只有最后一個(gè)會(huì)生效,可被替代 (替換)
9. ENTRYPOINT # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令竭望,可以直接追加命令 (追加)
10. ONBUILD # 當(dāng)構(gòu)建一個(gè)被繼承 DockerFile 邪码,這個(gè)時(shí)候就會(huì)運(yùn)行 ONBUILD 的指令,是一種觸發(fā)指令
11. COPY # 類似ADD命令咬清,將我們的文件拷貝到鏡像中
12. ENV # 構(gòu)建的時(shí)候設(shè)置環(huán)境變量
CMD 和 ENTRYPOINT 的區(qū)別:
-
CMD
# 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令闭专,只有最后一個(gè)會(huì)生效糕韧,可被替代 (替換) -
ENTRYPOINT
# 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令,可以直接追加命令(追加)
實(shí)戰(zhàn)測試:
-
centos7
鏡像構(gòu)建
FROM scratch
ADD centos-7-x86_64-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="20200504" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-05-04 00:00:00+01:00"
CMD ["/bin/bash"]
-
Docker Hub
中 99%的鏡像都是從這個(gè)基礎(chǔ)鏡像過來的FROM scratch
喻圃,然后配置需要的軟件和配置來進(jìn)行構(gòu)建。 -
FROM scratch
官方說明:該鏡像是一個(gè)空的鏡像粪滤,可以用于構(gòu)建busybox
等超小鏡像斧拍,可以說是真正的從零開始構(gòu)建屬于自己的鏡像。要知道杖小,一個(gè)官方的ubuntu
鏡像有60MB+肆汹,CentOS
鏡像有70MB+
可以把一個(gè)可執(zhí)行文件扔進(jìn)來直接執(zhí)行 - 注意:
scratch
不可以被pull
-
FROM scratch
專門用于構(gòu)建最小鏡像,直接pull
會(huì)報(bào)以下錯(cuò)誤予权,scratch
是一個(gè)保留名稱
[root@VM-0-6-centos ~]# docker pull scratch
Using default tag: latest
Error response from daemon: 'scratch' is a reserved name
- 如何制作大小為 0 的鏡像
既然scratch
不能被拉取昂勉,如何做到docker image ls
看到一個(gè)0字節(jié)的鏡像
官方給出了下面方法:
tar cv --files-from /dev/null | docker import - scratch
[root@VM-0-6-centos /]# tar cv --files-from /dev/null | docker import - scratch
sha256:ca0b4798edfafb22179f11d84493611112df0cdfbd1bd7c592c67f30a14a3e6f
[root@VM-0-6-centos /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
scratch latest ca0b4798edfa 8 seconds ago 0B
創(chuàng)建一個(gè)自己的 centos
- 新建dockerfile-centos文件
[root@VM-0-6-centos ceshi]# vi dockerfile-centos
- 編寫dockerfile文件
FROM centos # 基礎(chǔ)鏡像是官方原生的centos
MAINTAINER yj<yj@qq.com> # 作者
ENV MYPATH /usr/local # 配置環(huán)境變量的目錄
WORKDIR $MYPATH # 將工作目錄設(shè)置為 MYPATH
RUN yum -y install vim # 給官方原生的centos 增加 vim指令
RUN yum -y install net-tools # 給官方原生的centos 增加 ifconfig命令
EXPOSE 80 # 暴露端口號(hào)為80
CMD echo $MYPATH # 輸出下 MYPATH 路徑
CMD echo "-----end-----"
CMD /bin/bash # 啟動(dòng)后進(jìn)入 /bin/bash
- 構(gòu)建鏡像文件
docker build -f dockerfile-centos -t mycentos:1.0 .
注意帶上版本號(hào),否則每次都回去找最新版latest
[root@VM-0-6-centos ceshi]# docker build -f dockerfile-centos -t mycentos:1.0 .
Sending build context to Docker daemon 4.096kB
Step 1/10 : FROM centos
---> 300e315adb2f
Step 2/10 : MAINTAINER yj<yj@qq.com>
---> Running in 6026cec2776c
Removing intermediate container 6026cec2776c
---> 60feb235dd11
Step 3/10 : ENV MYPATH /usr/local
---> Running in 9e7149e0dc2c
Removing intermediate container 9e7149e0dc2c
---> c08d48a4db30
Step 4/10 : WORKDIR $MYPATH
---> Running in a11c3f9f23d5
Removing intermediate container a11c3f9f23d5
---> 1180ba69b198
Step 5/10 : RUN yum -y install vim
---> Running in 8973448d3648
Step 10/10 : CMD /bin/bash
---> Running in 104b3b2d2b4f
Removing intermediate container 104b3b2d2b4f
---> 201f0cb357f9
Successfully built 201f0cb357f9
Successfully tagged mycentos:1.0
[root@VM-0-6-centos ceshi]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 201f0cb357f9 3 minutes ago 295MB
- 測試運(yùn)行
[root@VM-0-6-centos ceshi]# docker run -it mycentos:1.0
[root@a2a3e933ff8e local]# pwd // 與Dockerfile文件中 WORKDIR 設(shè)置的 MYPATH 一致
/usr/local
[root@a2a3e933ff8e local]# vim // vim 指令可以使用
[root@a2a3e933ff8e local]# ifconfig // ifconfig 指令可以使用
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 14 bytes 1205 (1.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 查看鏡像構(gòu)建歷史步驟
docker history mycentos:1.0
[root@VM-0-6-centos ceshi]# docker history mycentos:1.0
IMAGE CREATED CREATED BY SIZE COMMENT
201f0cb357f9 11 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
c47254ec9a24 11 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
197b57ff7221 11 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
c0ec0ff691f8 11 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
2b19515fe29c 11 minutes ago /bin/sh -c yum -y install net-tools 24.9MB
e770a5ebe23e 11 minutes ago /bin/sh -c yum -y install vim 60.7MB
1180ba69b198 11 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
c08d48a4db30 11 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
60feb235dd11 11 minutes ago /bin/sh -c #(nop) MAINTAINER yj<yj@qq.com> 0B
300e315adb2f 6 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 6 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 6 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
我們平時(shí)拿到一個(gè)鏡像扫腺,可以用 docker history 鏡像id
研究一下是怎么構(gòu)建的
測試CMD:
- 新建一個(gè)dockerfile文件
[root@VM-0-6-centos ceshi]# vim dockerfile-test-cmd
FROM centos
CMD [“l(fā)s”,”-a”] # 啟動(dòng)后執(zhí)行 ls -a 命令
- 構(gòu)建鏡像
docker build -f dockerfile-test-cmd -t cmd-test:0.1 .
- 運(yùn)行鏡像
[root@VM-0-6-centos ceshi]# docker run cmd-test:0.1 # 由結(jié)果可得岗照,運(yùn)行后就執(zhí)行了 ls -a 命令
.
..
.dockerenv
bin
dev
etc
home
- 追加一個(gè)命令
-l
成為ls -al
:展示列表詳細(xì)數(shù)據(jù)
[root@VM-0-6-centos ceshi]# docker run cmd-test:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused “exec: \”-l\”:
executable file not found in $PATH”: unknown.
ERRO[0000] error waiting for container: context canceled
cmd
的情況下-l
替換了CMD[“l(fā)s”,”-l”]
而-l
不是命令所以報(bào)錯(cuò)
測試ENTRYPOINT:
- 編寫dockerfile文件
[root@VM-0-6-centos ceshi]# vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT [“l(fā)s”,”-a”]
- 構(gòu)建鏡像
docker build -f dockerfile-test-entrypoint -t cmd-test:0.1 .
- 運(yùn)行鏡像
[root@VM-0-6-centos ceshi]# docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found …
-
-l
命令,是直接拼接在ENTRYPOINT
命令后面
[root@VM-0-6-centos ceshi]# docker run entrypoint-test:0.1 -l #注意輸出結(jié)果
total 56
drwxr-xr-x 1 root root 4096 May 16 06:32 .
drwxr-xr-x 1 root root 4096 May 16 06:32 ..
-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 May 16 06:32 dev
drwxr-xr-x 1 root root 4096 May 16 06:32 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ….