Docker的那些事儿—容器启动方式(18)
从本节开始,开启容器部分学习。
Docker提供的docker run命令用于创建并启动一个容器实例。
例如:docker run ubuntu
实际上一个容器实例就是宿主机器上的一个独立的进程。这一点我们在前面讲解的时候或多或少已经提过了。每次执行docker run,就创建一个Docker容器进程,拥有独立的文件系统、网络和进程树。使用docker ps或者docker container ls可以查询运行的容器。
那么有人会问,我怎么查询不到呢?ps也查不到相应的进程呢?这是因为容器启动后又退出了。使用docker ps -a或者docker container ls -a查询
确实容器退出了。那我们怎么让容器保持运行呢,exited可不是用户希望的状态。
查看docker run --help
我们看到run的时候,用户可以指定容器启动后需要执行的命令,比如执行一个shell命令一直循环。当然run还提供了其他的丰富可选项,最常用的-i -t -d可选项,
-i, --interactive Keep STDIN open even if not attached
-t, --tty Allocate a pseudo-TTY
-d, --detach Run container in background and printcontainer ID
使用-i选项,容器没退出,但终端界面一直卡主。
主机名变了,docker ps查询这个一连串的数字加字目的主机名是容器ID。实际上-t使得启动容器的同时进入容器了。而run的时候用户也可以使用-h指定容器的主机名
使用-d打印了容器ID,但容器退出了。
同时使用效果是最好的,终端不会卡主,容器处于后台运行状态,还打印了容器ID。实际上,当run一个容器的时候,我一般都会使用这三个可选项。
解释:
c39394704c3e287f33c3b08c0082e6f86ec1ff02baa2a6c240b6a072a4d756e1容器的长ID;
c39394704c3e 容器短ID;
relaxed_heyrovsky 容器名字,用户可以使用--name指定,未指定的话,docker自动生成
那为什么run的时候没有加要执行的命令,容器也没有退出呢?这其实是因为Dockerfile里的CMD命令起作用了,不知道大家还记不记得。
当利用 docker run 来启动容器时,Docker在后台运行的标准操作包括:
1、检查本地是否存在指定的镜像,不存在就从公有仓库下载
2、利用镜像创建一个容器
3、分配一个文件系统,并在只读的镜像层外面挂载一层可读写的容器层
4、从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去,从地址池配置一个ip地址给容器
5、启动容器并执行用户指定的应用程序
6、执行完毕后容器被终止
关于第三点第四点需要说明下:
由于容器内未安装相关网络命令,我们使用docker inspect ContainerID
你也可以在宿主机ifconfig查询,应该多了几个网卡。这些我们都会在docker 网络部分讲解。