Docker新手入门——————dockerfile详解、常用的命令

本文介绍了Dockerfile的常用命令,包括FROM、MAINTAINER、COPY、ADD、EXPOSE、VOLUME、WORKDIR、RUN、CMD和ENTRYPOINT。详细讲解了如何使用这些命令构建和操作Docker镜像,以及容器的启动和端口映射。特别强调了ENTRYPOINT的shell和exec模式的区别。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值