Docker中注意的细节

ADD和COPY的区别:

COPY指令和ADD指令功能和使用方式类似。只是COPY指令不会做自动解压工作。

CMD和ENTRYPOINT的区别:

  • CMD

先回顾下CMD指令的含义,CMD指令可以在dockerfile中指定容器启动时要执行的命令参数,但它可以被docker run命令的参数覆盖掉。

#test
FROM ubuntu
MAINTAINER xxx
RUN echo hello1 > test1.txt
RUN echo hello2 > /test2.txt
EXPOSE 80
EXPOSE 81
CMD ["/bin/bash"]

除了dockerfile这种方式执行命令参数,还可以通过docker  run命令启动容器时传递命令参数,但是docker  run命令后的参数会覆盖掉dockerfile中CMD的参数。

例如:

          docker run -i -t ubunu   /bin/bash   //表示容器启动时立即在容器内打开一个shell终端,命令参数/bin/bash

                     docker run ubuntu   /bin/ps    //表示容器启动后立即运行 /bin/ps命令参数,显示容器的当前进程。

1、用docker run命令创建并启动容器(myimage  是用上面dockerfile创建的镜像的名称):

docker run -i -t myimage   

此命令是创建并启动容器,打开一个交互式shell,因为上述dockerfile中CMD后有打开shell的参数/bin/bash

而以前的写法是

docker run -i -t myimage  /bin/bash

所以在dockerfile中使用CMD指定命令参数就省去了在docker run中写命令了。

2、即使dockerfile中有CMD指令,我们仍然可以在docker run命令中带上容器启动时执行的命令,这会覆盖dockerfile中的CMD指令指定的命令。如:

docker run -i -t myimage /bin/ps

上面命令,因为/bin/ps覆盖了CMD指令,启动容器时会打印容器内的当前进程,但容器会立即停止,因为/bin/bash被覆盖

了,无法打开交互式shell界面。

3、需要注意的是,dockerfile中可以有多条cmd命令,但只是最后一条有效。

4、CMD命令的参数格式,一般写成 字符串数组的方式,如上面的例子。如:

CMD  ["echo","hello world"]

虽然也可写成CMD echo hello word 方式,但这样docker会在指定的命令前加  /bin/sh -c 执行,有时有可能会出问题。 所

以推荐采用数据结构的方式来存放命令。

  • ENTRYPOINT

ENTRYPOINT 指令和CMD类似,它也可用户指定容器启动时要执行的命令,但如果dockerfile中也有CMD指令,CMD中的参数会被附加到ENTRYPOINT 指令的后面。 如果这时docker run命令带了参数,这个参数会覆盖掉CMD指令的参数,并也会附加到ENTRYPOINT 指令的后面。这样当容器启动后,会执行ENTRYPOINT 指令的参数部分。

可以看出,相对来说ENTRYPOINT指令优先级更高。

#test
FROM ubuntu
MAINTAINER hello
RUN echo hello1 > test1.txt
RUN echo hello2 > /test2.txt
EXPOSE 80
ENTRYPOINT ["echo"]
CMD ["defaultvalue"]

假设通过该Dockerfile构建的镜像名为 myimage。

1、当运行 docker run myimage  输出的内容是 defaultvalue,可以看出CMD指令的参数得确是被添加到ENTRYPOINT指令的后面,然后被执行。
2、当运行docker run myimage hello world  输出的内容是 hello world ,可以看出docker run命令的参数得确是被添加到ENTRYPOINT指令的后面,然后被执行,这时CMD指令被覆盖了。

3、另外我们可以在docker run命令中通过 --entrypoint 覆盖dockerfile文件中的ENTRYPOINT设置,如:

docker run --entrypoint="echo" myimage good  结果输出good

 注意,不管是哪种方式,创建容器后,通过 dokcer ps查看容器信息时,COMMOND列会显示最终生效的启动命令。

发布镜像:

首先要在dokcer hub上注册账户,

docker push 用户名/仓库名[:tag名]

这里的 用户名/仓库名[:tag名]  代表的镜像必须是本机存在的,tag名不写的话默认就是latest。 也就是说在创建镜像时的命名必须是规范的格式(加用户名)。

并且用户名就是自己在docker hub上注册的名称。如这里的jeme.

发布成功后,这时我们用docker search 就能搜到自己提的镜像。

docker search : 

从Docker Hub查找镜像

Docker中注意的细节_第1张图片

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Docker)