docker创建image与Dockerfile一些规则

container 和 image 的关系

image 类比为 类,container 类比为对象
我们运行container(对象)中并去修改相应的变量等,一些操作如下:

docker container ls -a

交互运行container(即可进入这个container,进行操作!)
docker run -it centos

列出image
docker images

列出containers
docker ps -a

列出所有container 的id
docker container ls -aq

清理 所有container
docker rm $(docker container ls -aq)

停container服务
docker container stop $(docker container ls -aq)

按条件查看container
docker container ls -f “status=exited”

用docker commit 创建一个image

1,查看现在有没container
ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

2,开启一个交互的container

ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker run -it centos
[root@bc83c32ee2d0 /]# ls /
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@bc83c32ee2d0 /]# vim
bash: vim: command not found
[root@bc83c32ee2d0 /]#

3,另启一个ssh ls一个container

ming@ming-CW35S:~$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
bc83c32ee2d0        centos              "/bin/bash"         47 seconds ago      Up 46 seconds                           nostalgic_kalam

4, 在交互 container中 安装 vim

yum install -y vim

5,exit后查看container

ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker container ls -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                       PORTS                  NAMES
bc83c32ee2d0        centos                   "/bin/bash"              2 minutes ago       Exited (0) 24 seconds ago                           nostalgic_kalam

我们会发现列表中有刚才的container

6,通过docker commit 把container生成image,并查看

ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker commit nostalgic_kalam gminghubdocker/mycentos
sha256:ca0652906b7a54b5bd859b9c6030bd38477fc1fd6e6420ea603131d57d7739c4

ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
gminghubdocker/mycentos   latest              ca0652906b7a        5 seconds ago       327MB

如下,我们建立 了一个image并打成了一个包

7,查看下这个image

ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker history ca0652906b7a
IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
ca0652906b7a        About a minute ago   /bin/bash                                       126MB
1e1148e4cc2c        2 days ago           /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           2 days ago           /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           2 days ago           /bin/sh -c #(nop) ADD file:6f877549795f4798a…   202MB

docker build 成一个image

这种方式即以Dockerfile的内容生成一个image,由于过程都很清晰,所以推荐用这种方式!!!

1,编写一个Dockerfile

FROM centos
RUN yum install -y vim

2,docker build 成一个 image并查看

docker build -t gminghubdocker/myc .
... 这里会有一段时间


// 查看:

ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
gminghubdocker/myc       latest              65757f068b5b        10 seconds ago      327MB

3,查看下这个image

ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker history 65757f068b5b
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
65757f068b5b        3 minutes ago       /bin/sh -c yum install -y vim                   126MB
1e1148e4cc2c        2 days ago          /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           2 days ago          /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           2 days ago          /bin/sh -c #(nop) ADD file:6f877549795f4798a…   202MB

一些dockerfile的语法和资料

官方的Dockerfile
https://github.com/docker-library/mysql/blob/master/5.7/Dockerfile

dockerfile 的官方文档
https://docs.docker.com/engine/reference/builder/#environment-replacement

run 还是 cmd 还是entrypoint

1,概要

run 执行命令并创建 新的image layer,这是在build的时候去执行,和下面在run时候运行是不一样的!! (yum 安装一些内容)

cmd 设置容器启动后默认执行的命令和参数
ENTRYPOINT :设置容器启动时运行的命令

2,shell 和 exec 格式来执行

这只是一种格式,三者都可以用。

shell格式
run apt-get install -y vim
cmd echo “hello docker”
ENTRYPOINT echo “hello docker”

exec 格式
run [“apt-get”,“install”,"-y",“vim”]
CMD ["/bin/echo",“hello docker”]
ENTRYPOINT ["/bin/echo",“hello docker”]

FROM centos
ENV name Docker
CMD echo “hello $name”

ENTRYPOINT echo “hell $name” //OK
ENTRYPOINT ["/bin/echo",“hello $name”] //不OK
ENTRYPOINT ["/bin/bash","-c",echo hello $name"] //OK

3,CMD和entrypoint的区别
  • CMD的操作:

容器run时默认执行的命令
如果docker run 指定了命令,则会被忽略 即 docker run -it [image] /bin/bash输出,则cmd会被忽略!
定义了多个cmd ,只有最后一个会执行

以下为测试:

****Dockerfile为:****
FROM centos
ENV name Docker
CMD echo "hello $name"


****下面build然后处理****

ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker build -t gminghubdocker/test_cmd .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM centos
 ---> 1e1148e4cc2c
Step 2/3 : ENV name Docker
 ---> Running in cedc67b4c0b8
Removing intermediate container cedc67b4c0b8
 ---> d18fe34d6a8f
Step 3/3 : CMD echo "hello $name"
 ---> Running in bfe5bb10bd0a
Removing intermediate container bfe5bb10bd0a
 ---> 4236541e7835
Successfully built 4236541e7835
Successfully tagged gminghubdocker/test_cmd:latest
ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker run gminghubdocker/test_cmd
hello Docker

ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker run -it gminghubdocker/test_cmd /bin/bash    ****这里自定义一下cmd,则Dockerfile里的cmd会被忽略,所以不会执行hello $name****
[root@f9f771770748 /]#   ****由于用了-i ,且cmd是/bin/bash ,则这里进了container****
[root@f9f771770748 /]#
[root@f9f771770748 /]#
[root@f9f771770748 /]# exit
exit
ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ 

  • ENTRYPOINT的操作:

让容器以应用程序 或者服务的形式运行
不会被忽略 ,一定会执行 (下面的实验发现多个entrypoint 也会只执行最后一个)
常用在写一个shell脚本作为entrypoint.如:

COPY abc.sh /usr/local/bin/
ENTRYPOINT ["abc.sh"]

一个测试例子:

****Dockerfile为:****
FROM centos
ENV name Docker
CMD echo "hello $name"


****下面build然后处理****


ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker build -t gminghubdocker/test_entrypoint .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM centos
 ---> 1e1148e4cc2c
Step 2/3 : ENV name Docker
 ---> Using cache
 ---> d18fe34d6a8f
Step 3/3 : ENTRYPOINT echo "hello $name"
 ---> Running in 5b310ba43f5d
Removing intermediate container 5b310ba43f5d
 ---> e2ed341433bb
Successfully built e2ed341433bb
Successfully tagged gminghubdocker/test_entrypoint:latest

ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker run gminghubdocker/test_entrypoint
hello Docker
ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker run -it gminghubdocker/test_entrypoint
hello Docker
ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker run -it gminghubdocker/test_entrypoint /bin/bash
hello Docker
ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$

如果是entrypoint 的话, docker run -it [image] /bin/bash也不会进入交互式的环境!!!..

  • 实验多个 cmd与多个entrypoint
FROM centos
ENV name Docker
CMD echo "hello cmd"
ENTRYPOINT echo "hello $name"

****执行情况 :****
ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker run gminghubdocker/test35
hello Docker


ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker run -it gminghubdocker/test35 /bin/bash
hello Docker
ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$

多个entrypoint和cmd:

FROM centos
ENV name Docker
CMD echo "hello cmd"
CMD echo "hello cmd"
CMD echo "hello cmd"
ENTRYPOINT echo "hello e1"
ENTRYPOINT echo "hello e2"
ENTRYPOINT echo "hello e3"



ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker run gminghubdocker/test35:latest
hello e3
ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$


ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$ docker run -it gminghubdocker/test35:latest /bin/bash
hello e3
ming@ming-CW35S:~/dgame/project/docker_pratise/mytest128$


多个entrypoint和run:


FROM centos
ENV name Docker
CMD echo "hello cmd"
RUN yum install -y screen
CMD echo "hello cmd"
CMD echo "hello cmd"
ENTRYPOINT echo "hello e1"
RUN yum list zlib
ENTRYPOINT echo "hello e2"
ENTRYPOINT echo "hello e3"


上面这个逻辑在build的时候会 走run的语句.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值