文章目录
1.dockerfile常用命令
1)FROM:指定base镜像,如果本地不存在会从远程仓库下载。
2)MAINTAINER:镜像作者,写入邮箱就可以了。
3)COPY:
1.1 COPY拷贝一个文件
1)构建一个dockerfile:将目录下的testfile拷贝到镜像中的/tmp目录下以原名命名。
[root@docker dockerfile]# vim dockerfile
FROM busybox
COPY testfile /tmp
2)在构建目录中建立testfile:
[root@docker dockerfile]# echo copytest > testfile
[root@docker dockerfile]# ll
total 8
-rw-r--r-- 1 root root 32 Sep 7 14:23 dockerfile
-rw-r--r-- 1 root root 9 Sep 7 14:25 testfile
3)构建镜像:
[root@docker dockerfile]# docker build -t song:v3 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM busybox
---> edabd795951a
Step 2/2 : COPY testfile /tmp
---> dafd703a5ab5
Successfully built dafd703a5ab5
Successfully tagged song:v3
4)使用新建镜像创建容器查看:文件已经在镜像中了
[root@docker dockerfile]# docker run -it --name copytest song:v3
/ # ls
bin dev etc home proc root sys tmp usr var
/ # cd tmp/
/tmp # ls
testfile
/tmp # cat testfile
copytest
1.2 ADD
ADD与拷贝指令是一样的,但是ADD的功能更强,ADD可以解压压缩包,如果镜像中没有带解压命令就可以使用ADD。ADD是在拷贝到容器内之前就已经解压了。
ADD后面还可以接URL,也就是说包不一定需要在本地,也可以是在网络上的。
1)给构建目录下下载一个nginx的包:
[root@docker dockerfile]# ls
dockerfile nginx-1.15.9.tar.gz testfile
2)编写dockerfile:将nginx压缩包解压拷贝到/tmp下。
[root@docker dockerfile]# vim dockerfile
FROM busybox
COPY testfile /tmp
ADD nginx-1.15.9.tar.gz /tmp
3)构建镜像:
[root@docker dockerfile]# docker build -t song:v4 .
Sending build context to Docker daemon 1.036MB
Step 1/3 : FROM busybox
---> edabd795951a
Step 2/3 : COPY testfile /tmp
---> Using cache
---> dafd703a5ab5
Step 3/3 : ADD nginx-1.15.9.tar.gz /tmp
---> 394c9bf68cd7
Successfully built 394c9bf68cd7
Successfully tagged song:v4
4)构建容器进行查看:解压成功
[root@docker dockerfile]# docker run -it --name addtest song:v4
/ # ls
bin dev etc home proc root sys tmp usr var
/ # cd tmp/
/tmp # ls
nginx-1.15.9 testfile
/tmp # cd nginx-1.15.9/
/tmp/nginx-1.15.9 # ls
CHANGES LICENSE auto configure html src
CHANGES.ru README conf contrib man
1.3 EXPOSE暴露端口
1)将端口暴露出来供用户使用访问,也方便我们做端口影射:
例如下图中:
[root@docker dockerfile]# docker history game2048:latest
IMAGE CREATED CREATED BY SIZE COMMENT
19299002fdbe 3 years ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "sed … 0B
<missing> 3 years ago /bin/sh -c #(nop) EXPOSE 80/tcp 0B #暴露80端口
<missing> 3 years ago /bin/sh -c #(nop) COPY dir:cb74e9c037a3d501c… 600kB
<missing> 3 years ago /bin/sh -c #(nop) MAINTAINER Golfen Guo <go… 0B
<missing> 3 years ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 3 years ago /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp 0B
<missing> 3 years ago /bin/sh -c #(nop) COPY file:d15ceb73c6ea776c… 1.1kB
<missing> 3 years ago /bin/sh -c #(nop) COPY file:af94db45bb7e4b8f… 643B
<missing> 3 years ago /bin/sh -c GPG_KEYS=B0F4253373F8F6F510D42178… 50.1MB
<missing> 3 years ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.11.7 0B
<missing> 3 years ago /bin/sh -c #(nop) MAINTAINER NGINX Docker M… 0B
<missing> 3 years ago /bin/sh -c #(nop) ADD file:7afbc23fda8b0b387… 4.8MB
1.4 VOLUME
申明数据卷,通常指定的是应用的数据挂载点。
1)修改 数据挂载点:挂载点没有,就会自动新建目录
[root@docker dockerfile]# vim dockerfile
FROM busybox
COPY testfile /tmp
ADD nginx-1.15.9.tar.gz /tmp
VOLUME ["/data"] # 数据挂载在data
2)构建镜像:
[root@docker dockerfile]# docker build -t song:v5 .
Sending build context to Docker daemon 1.036MB
Step 1/4 : FROM busybox
---> edabd795951a
Step 2/4 : COPY testfile /tmp
---> Using cache
---> dafd703a5ab5
Step 3/4 : ADD nginx-1.15.9.tar.gz /tmp
---> Using cache
---> 394c9bf68cd7
Step 4/4 : VOLUME ["/data"]
---> Running in e406d3b8e4b2
Removing intermediate container e406d3b8e4b2
---> f1763ebb3e9b
Successfully built f1763ebb3e9b
Successfully tagged song:v5
3)构造容器查看:目录构建成功。
[root@docker dockerfile]# docker run -it --name datatest song:v5
/ # ls
bin data dev etc home proc root sys tmp usr var
/ # cd data
/data # ls
/data #
4)保持容器继续运行,退出容器:容器后台运行
/data #
[root@docker dockerfile]#
[root@docker dockerfile]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b50b059a9ec4 song:v5 "sh" About a minute ago Up About a minute datatest
5)查看容器的数据卷挂载:如果封装的时候声明了数据卷,那么容器在启动的时候docker引擎会在本地自动生成数据目录,并且挂解在容器内的挂载点:
[root@docker dockerfile]# docker inspect datatest
"Source": "/var/lib/docker/volumes/3b2141568eed397b7f18f4aff7d0cf1bf5f3068a8a3ca216abc1d286bd3b0087/_data",
6)进入本地的mount数据卷挂载目录:建立文件1文件2测试
[root@docker dockerfile]# cd /var/lib/docker/volumes/3b2141568eed397b7f18f4aff7d0cf1bf5f3068a8a3ca216abc1d286bd3b0087/_data
[root@docker _data]# ls
[root@docker _data]# touch file1
[root@docker _data]# touch file2
7)进入datatest容器查看:文件在容器中已经存在。
[root@docker ~]# docker attach datatest
/data # ls
file1 file2
/data #
8)还可以手工指定挂载目录:在建立容器的时候使用-v进行影射
[root@docker ~]# docker run -it --name datatest1 -v /opt/data:/data song:v5
/ # cd data
/data # touch file1 file2
/data # ls
file1 file2
/data # [root@docker ~]#
[root@docker ~]# cd /opt/data/
[root@docker data]# ls
file1 file2
1.5 WORKDIR 切换目录
类似于cd,剩下的指令就再这个目录下运行。
如果目录不存在,就自动创建。
1.6 RUN 在容器中进行修改
RUN可以在容器中运行多条,但是每次运行一次,镜像就会多一层。
1.7 CMD 与ENTRYPOINT 容器启动后运行的指令
CMD会被docker run 后的指令覆盖;而ENTRYPOINT是不会被忽略,一定会执行。
docker run 后面的参数可以传递给ENTRYPOINT指令当作参数。
dockerfile中只能有一个ENTRYPOINT,如果指定多个,只有最后一个生效。
1.7.1 ENTRYPOINT的shell模式
1)编写dockerfile:
[root@docker dockerfile]# vim dockerfile
FROM busybox
ENV name world
ENTRYPOINT echo "hello $name"
2)创建镜像:
[root@docker dockerfile]# docker build -t song:v6 .
Sending build context to Docker daemon 1.036MB
Step 1/3 : FROM busybox
---> edabd795951a
Step 2/3 : ENV name world
---> Running in 8437efe24007
Removing intermediate container 8437efe24007
---> 4dcbf3779b8c
Step 3/3 : ENTRYPOINT echo "hello $name"
---> Running in 5d579e011f35
Removing intermediate container 5d579e011f35
---> 1ce2cec5704f
Successfully built 1ce2cec5704f
Successfully tagged song:v6
3)创建一次性镜像:变量已经被解析。
[root@docker dockerfile]# docker run --rm song:v6
hello world
[root@docker dockerfile]# cat dockerfile
FROM busybox
ENV name world
ENTRYPOINT echo "hello $name"
1.7.2 ENTRYPOINT的exec模式*
1)编写dockerfile:其实shell时使用/bin/sh执行脚本,所以我们只需要写上就行。
FROM busybox
ENV name world
ENTRYPOINT ["/bin/sh","-c","echo hello,$name"]
2)创建镜像:
[root@docker dockerfile]# docker build -t song:v8 .
Sending build context to Docker daemon 1.036MB
Step 1/3 : FROM busybox
---> edabd795951a
Step 2/3 : ENV name world
---> Using cache
---> 4dcbf3779b8c
Step 3/3 : ENTRYPOINT ["/bin/sh","-c","echo hello,$name"]
---> Running in af3f7f7eb98e
Removing intermediate container af3f7f7eb98e
---> 56a063a0055b
Successfully built 56a063a0055b
3)创建一次性镜像:变量已经被解析。
[root@docker dockerfile]# docker run --rm song:v9
hello,world
1.7.3 CMD
CMD会被docker run后面覆盖,也可以使用传参的方式。
1)编写dockerfile:
FROM busybox
ENTRYPOINT ["/bin/echo", "hello"]
CMD ["world"]
2)构建镜像:
[root@docker dockerfile]# docker build -t song:v10 .
Sending build context to Docker daemon 1.036MB
Step 1/3 : FROM busybox
---> edabd795951a
Step 2/3 : ENTRYPOINT ["/bin/echo", "hello"]
---> Running in a2bba95de7d8
Removing intermediate container a2bba95de7d8
---> 3f9b622db0fc
Step 3/3 : CMD ["world"]
---> Running in a2f2af495387
Removing intermediate container a2f2af495387
---> 1adcb732a012
Successfully built 1adcb732a012
Successfully tagged song:v10
3)一次性运行:
[root@docker dockerfile]# docker run --rm song:v10
hello world
[root@docker dockerfile]#
4)运行容器跟一个参数:会替换CMD的内容
[root@docker dockerfile]# docker run --rm song:v10 song
hello song
本文介绍了Dockerfile的常用命令,包括FROM、MAINTAINER、COPY、ADD、EXPOSE、VOLUME、WORKDIR、RUN、CMD和ENTRYPOINT。详细讲解了如何使用这些命令构建和操作Docker镜像,以及容器的启动和端口映射。特别强调了ENTRYPOINT的shell和exec模式的区别。


被折叠的 条评论
为什么被折叠?



