7.2.5 启动一个简单容器
启动容器的一个简单的方式是通过 docker container run
命令。
下面的命令启动了一个简单的容器,其中运行了容器化版本的Ubuntu Linux。
$ docker container run -it ubuntu:latest /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
952132ac251a: Pull complete
82659f8f1b76: Pull complete
c19118ca682d: Pull complete
8296858250fe: Pull complete
24e0251a0e2c: Pull complete
Digest: sha256:f4691c96e6bbaa99d9...e95a60369c506dd6e6f6ab
Status: Downloaded newer image for ubuntu:latest
root@3027eb644874:/#
Windows示例。
docker container run -it microsoft/powershell:nanoserver pwsh.exe
命令的基础格式为 docker container run <options> <im- age>:<tag> <app>
。
示例中使用 docker container ru
n来启动容器,这也是启动新容器的标准命令。命令中使用了 -it
参数使容器具备交互性并与终端进行连接。接下来,命令中指定了具体镜像 ubuntu:latest
或者 microsoft/powershell:nanoserver
。最终,在命令中指定了运行在容器中的程序,Linux示例中是Bash Shell,Windows示例中为PowerShell。
当敲击 回车键
之后,Docker客户端选择合适的API来调用Docker daemon。Docker daemon接收到命令并搜索Docker本地缓存,观察是否有命令所请求的镜像。在上面引用的示例中,本地缓存并未包含该镜像,所以Docker接下来查询在Docker Hub中是否存在对应镜像。找到该镜像后,Docker将镜像拉取到本地,存储在本地缓存当中。
注:
在标准的、开箱即用的Linux安装版中,Docker daemon通过位于
/var/run/docker.sock
的本地IPC/Unix socket来实现Docker远程API;在Windows中,Docker daemon通过监听名为npipe:////./pipe/docker_engine
的管道来实现。通过配置,也可以借助网络来实现Docker Client和daemon之间的通信。Docker默认非TLS网络端口为2375,TLS默认端口为2376。
一旦镜像拉取到本地,daemon就创建容器并在其中运行指定的应用。
如果仔细观察,就会发现Shell提示符发生了变化,说明目前已经位于容器内部了。在上面的示例中,Shell提示符已经变为 root@3027eb644874:/#
。@之后的一长串数字就是容器唯一ID的前12个字符。
若尝试在容器内执行一些基础命令,可能会发现某些指令无法正常工作。这是因为大部分容器镜像都是经过高度优化的。这意味着某些命令或者包可能没有安装。下面的示例展示了两个命令——一条执行成功,一条执行失败。
root@3027eb644874:/# ls -l
total 64
drwxr-xr-x 2 root root 4096 Aug 19 00:50 bin
drwxr-xr-x 2 root root 4096 Apr 12 20:14 boot
drwxr-xr-x 5 root root 380 Sep 13 00:47 dev
drwxr-xr-x 45 root root 4096 Sep 13 00:47 etc
drwxr-xr-x 2 root root 4096 Apr 12 20:14 home
drwxr-xr-x 8 root root 4096 Sep 13 2015 lib
drwxr-xr-x 2 root root 4096 Aug 19 00:50 lib64
drwxr-xr-x 2 root root 4096 Aug 19 00:50 media
drwxr-xr-x 2 root root 4096 Aug 19 00:50 mnt
drwxr-xr-x 2 root root 4096 Aug 19 00:50 opt
dr-xr-xr-x 129 root root 0 Sep 13 00:47 proc
drwx------ 2 root root 4096 Aug 19 00:50 root
drwxr-xr-x 6 root root 4096 Aug 26 18:50 run
drwxr-xr-x 2 root root 4096 Aug 26 18:50 sbin
drwxr-xr-x 2 root root 4096 Aug 19 00:50 srv
dr-xr-xr-x 13 root root 0 Sep 13 00:47 sys
drwxrwxrwt 2 root root 4096 Aug 19 00:50 tmp
drwxr-xr-x 11 root root 4096 Aug 26 18:50 usr
drwxr-xr-x 13 root root 4096 Aug 26 18:50 var
root@3027eb644874:/# ping www.docker.com
bash: ping: command not found
从上面的输出中可以看出, ping
工具包并不是官方Ubuntu镜像的一部分。