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的语句.