2.1 hello world
安装好docker环境并启动docker服务后,我们就可以跑一个“hello world!”试试了
命令如下:
[root@localhost ~]# docker run centos echo "Docker,hello world"
Unable to find image 'centos:latest' locally
latest: Pulling from centos
47d44cb6f252: Pull complete
168a69b62202: Pull complete
812e9d9d677f: Pull complete
4234bfdd88f8: Pull complete
ce20c473cd8a: Pull complete
centos:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:3aaab9f1297db9b013063c781cfe901e2aa6e7e334c1d1f4df12f25ce356f2e5
Status: Downloaded newer image for centos:latest
Docker,hello world
命令说明:
docker run :标准容器启动命令
centos :镜像名称
echo及后面的内容 :容器启动后执行的命令
2.2 启动一个交互式容器
当然我们也可以再复杂一点,增加-it参数,可以启动一个bash,实现与容器的交互,并向操作虚拟机一样操作容器:
[root@localhost ~]# docker run -it centos /bin/bash
[root@110baabc10bc /]# echo "Docker,hello world"
Docker,hello world
*注:-t标示在心容器内指定一个伪终端或终端,-i标示允许我们对容器内的STDIN进行交互
我们在容器中执行一个ps命令,可以看到容器与虚拟机最大的不同,容器仅允许了一个需要允许的进程,无内核相关的其他进程,如下:
[root@110baabc10bc /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 02:05 ? 00:00:00 /bin/bash
root 17 1 0 02:06 ? 00:00:00 ps -ef
2.3 以服务方式启动一个docker容器
如果你实际测试,估计也发现了,第一个“hello world”容器启动后执行完echo命令就退出了,而第二个交互式的容器,只要用户退出当前容器的bash,容器也退出了。这明显不能满足一个服务长时间运行的要求,好找docker run提供了‘-d’参数,可以实现将容器以守护进程方式启动。
演示如下:
[root@localhost ~]# docker run -d centos /bin/bash -c "while true; do echo Docker,hello world; sleep 2; done"
5ff7a2ac73469a4ff30d3709ceaa4d9ee14a87bf075fdf5ba4cb751b7077edf3
[root@localhost ~]# docker logs 5ff7a2ac73469a4ff30d3709ceaa4d9ee14a87bf075fdf5ba4cb751b7077edf3
Docker,hello world
Docker,hello world
Docker,hello world
Docker,hello world
Docker,hello world[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ff7a2ac7346 centos "/bin/bash -c 'while 21 seconds ago Up 20 seconds elegant_jang
这是一个荒谬的hello word进程:一个脚本会一直输出"Docker,hello world"
为什么不是我们看到的一大堆的"hello word"?而是docker返回的一个很长的字符串:
5ff7a2ac73469a4ff30d3709ceaa4d9ee14a87bf075fdf5ba4cb751b7077edf3
这个长的字符串叫做容器ID。它是容器的唯一标识,所以我们可以使用它来操作容器,比如查看日志、停止或删除容器等。
而为什么使用一个死循环来输出呢?
因为如果不是死循环,一次输出后,容器中的进程就结束了。容器的唯一进程都结束了,容器就停止了。因此如果要在容器中运行具体的服务,这项服务本身在容器中也必须是已守护进程方式运行的。
容器的操作是不是很简单的呢?下文我们将探讨docker镜像。