一、dockerfile文件
dockerfile是用来构建镜像的文本文件,也可以说是命令参数脚本。
构建命令:docker build
命令中使用-f标志指向文件系统中任何位置的dockerfile。
镜像发布的步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 镜像
4、docker push 镜像(发布镜像到DockerHub、阿里云镜像仓库)
2. dockerfile常用指令说明
指令 | 说明 |
FROM | 指定基础镜像 |
MAINTAINER | 镜像是谁写的,姓名+邮箱 |
RUN | 镜像构建的时候需要运行的命令 |
ADD | 将本地文件添加到容器中,自动解压,可以访问网络资源 |
WORKDIR | 镜像的工作目录 |
VOLUME | 挂载的目录 |
EXPOSE | 保留端口配置(外部可以访问) |
CMD | 指定容器启动的时候要运行的命令(只有最后一个会生效) |
ENTRYPOINT | 指定这个容器启动的时候要运行的命令,可以追加命令 |
COPY | 功能类似ADD,但不会自动解压文件+不能访问网络资源 |
ENV | 构建的时候设置环境变量 |
3.dockerFile文件的脚本注意点
1、每个保留关键字(指令)都必须是大写字母
2、文件中的指令从上到下顺序执行,第一个指令必须是FROM
3、# 号表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
4.简单例子
# dockerfile文件
FROM centos:centos7 #宿主机是centos7版本,所以说要指定centos版本,不然出现下载错误
MAINTAINER cc<1111@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
构建镜像命令:docker build -f dockerfile文件路径 -t 镜像名[:版本号] .(有一点)
上面命令中,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。
最后的那个点表示 dockerfile 文件所在的路径
# 构建成功
➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos v2 5e8e1131f4a4 3 hours ago 425MB
#查看镜像构建步骤
➜ ~ docker history 5e8e1131f4a4
IMAGE CREATED CREATED BY SIZE COMMENT
5e8e1131f4a4 3 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
5dedf62a7963 3 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
38a27a2e9bee 3 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
6dbc95e1a7d6 3 hours ago /bin/sh -c #(nop) EXPOSE 80 0B
242621127033 3 hours ago /bin/sh -c yum -y install vim 221MB
ada5eb0e9576 3 hours ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
88f5c850044f 3 hours ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
ecc4fd6cbd39 3 hours ago /bin/sh -c #(nop) MAINTAINER cc<1111@qq.com> 0B
eeb6ee3f44bd 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:b3ebbe8bd304723d4… 204MB
5.一些类似功能的区别
RUN命令与CMD命令的区别在哪里?
RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;
CMD命令则是在容器启动后执行。 dockerfile 可以包含多个RUN命令,但只能有一个CMD命令。
注意,指定了CMD命令以后,docker run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。
CMD和ENTRYPOINT的区别在哪里?
CMD :指定容器启动的时候要运行的命令,只有最后一个会生效
ENTRYPOINT :指定容器启动的时候要运行的命令,命令可以追加
简单例子 CMD 和 ENTRYPOINT
# 创建一个dockerfile 创建一个镜像
# CMD命令
➜ ~ cd dockerfileCentos
➜ dockerfileCentos ls
dockerfile
➜ dockerfileCentos cat dockerfile
FROM centos
CMD ["ls","-a"]
➜ dockerfileCentos docker build -t centoscmd .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : CMD ["ls","-a"]
---> Running in da80d49d2423
Removing intermediate container da80d49d2423
---> 7bc022996232
Successfully built 7bc022996232
Successfully tagged centoscmd:latest
➜ dockerfileCentos docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centoscmd latest 7bc022996232 7 seconds ago 231MB
# 运行镜像,默认运行ls -a 命令
➜ ~ docker run centoscmd
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 添加其他命令 切换到该命令
➜ ~ docker run -it centoscmd /bin/bash
[root@ec7987955f74 /]#
# ENTRYPOINT 命令
➜ dockerfileCentos cat dockerfile
FROM centos
ENTRYPOINT ["ls","-a"]
➜ dockerfileCentos docker build -t centosentrypoint .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in a5f4835894d7
Removing intermediate container a5f4835894d7
---> dcc0d31c4355
Successfully built dcc0d31c4355
Successfully tagged centosentrypoint:latest
➜ dockerfileCentos docker run centosentrypoint
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
➜ dockerfileCentos docker run centosentrypoint -l
total 0
drwxr-xr-x. 1 root root 6 Apr 13 15:18 .
drwxr-xr-x. 1 root root 6 Apr 13 15:18 ..
-rwxr-xr-x. 1 root root 0 Apr 13 15:18 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Apr 13 15:18 dev
drwxr-xr-x. 1 root root 66 Apr 13 15:18 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 2021 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 248 root root 0 Apr 13 15:18 proc
dr-xr-x---. 2 root root 162 Sep 15 2021 root
drwxr-xr-x. 11 root root 163 Sep 15 2021 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Apr 13 08:49 sys
drwxrwxrwt. 7 root root 171 Sep 15 2021 tmp
drwxr-xr-x. 12 root root 144 Sep 15 2021 usr
drwxr-xr-x. 20 root root 262 Sep 15 2021 var