这里分别从运维视角和开发视角去看待理解Docker,看看有什么不同。此外Docker还有一种快速启动的方式,叫做Play With Docker(PWD)。PWD是一个基于Web界面的Docker环境,并且可免费使用,可以作为临时启动Docker环境来用。
4.1 运维视角
安装Docker的时候,会涉及到两个主要组件:Docker客户端和Docker daemon(有时也被称为“服务端”或者“引擎”)。daemon实现了Docker引擎的API。
使用Linux默认安装时,客户端和daomon之间的通信是通过本地IPC/UNIXSocket完成的(/var/run/docker.sock)。可以通过 docker version
来查看。
[pangcm@docker02 ~]$ docker version
Client: Docker Engine - Community
Version: 19.03.4
API version: 1.40
Go version: go1.12.10
Git commit: 9013bf583a
Built: Fri Oct 18 15:52:22 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.4
API version: 1.40 (minimum version 1.12)
Go version: go1.12.10
Git commit: 9013bf583a
Built: Fri Oct 18 15:50:54 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.10
GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339
runc:
Version: 1.0.0-rc8+dev
GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
docker-init:
Version: 0.18.0
GitCommit: fec3683
4.1.1 镜像
将Docker镜像理解为一个包含了OS文件系统和应用的对象会很有帮助,与虚拟机做对比的话,可以类比为虚拟机的模板。在Docker的世界中,镜像实际上等价于未运行的容器。如果你是一名开发,可以把镜像类比为类(Class)。
要查看Docker的镜像,使用 docker image ls
命令来查看。
[pangcm@docker02 ~]$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 10 months ago 1.84kB
上面的那个hello-world镜像是前面安装docker演示的时候拉取的,获取镜像的操作称为拉取(pulling),比如下面的命令我会拉取一个ubuntu的镜像。
docker pull ubuntu
关于镜像的存储位置以及镜像内部构成,本书会在后续的章节中详细介绍。现在,读者只需要知道镜像包含了基础操作系统,以及应用程序运行所需要的代码和依赖包。上面拉取的ubuntu镜像有一个精简版的Ubuntu Linux文件系统,其中包含部分的Ubuntu常用工具。如果拉取的是nginx这类的应用程序,则里面还会包括了运行Nginx所需的代码。
重要的是,Docker的每个镜像都有自己唯一的ID。用户可以通过引用镜像的ID或名称来使用镜像。如果用户选择使用镜像ID,通常只需要输入ID开头的几个字符即可——因为ID是唯一的,Docker知道用户想要引用的具体镜像是哪一个。
4.1.2 容器
我们启动下前面我们拉取的Ubuntu镜像,使用docker container run
命令来启动,当然你也可以不输入container,直接使用docker run
。
[pangcm@docker02 ~]$ docker container run -it ubuntu:latest /bin/bash
root@fd1e2f056f5e:/#
我们运行这个命令的时候,可以看到提示符发生了变化,这是因为 -it参数会将shell切换到容器的终端中去,也就是说你已经位于容器内部了。
接下来分析下docker container run命令。docker container run告诉docker daemon 启动新的容器。其中 -it 参数告诉Docker开启容器的交互模式并将读者当前的Shell连接到容器的终端去。接下来,命令告诉Docker,用于想基于ubuntu:latest镜像启动容器。最后,命令告诉Docker,用户想要在容器内部运行哪个程序(bash).
在容器内部运行ps命令查看当前运行的全部进程。
root@fd1e2f056f5e:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:54 pts/0 00:00:00 /bin/bash
root 10 1 0 13:58 pts/0 00:00:00 ps -ef
可以看到,容器中实际运行的进程只有一开始指定的 /bin/bash。输入exit会退出容器,并且会关闭容器。要退出容器的同时还保持容器的运行,请使用组合键 Ctrl-PQ。我们使用组合键退出后用ps命令(也就是看我们主机的进程)
[pangcm@docker02 ~]$ ps -ef
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 31395 ep_pol 17:33 ? 00:00:02 /usr/lib/syste
1 S root 2 0 0 80 0 - 0 kthrea 17:33 ? 00:00:00 [kthreadd]
1 S root 4 2 0 60 -20 - 0 worker 17:33 ? 00:00:00 [kworker/0:0H]
1 S root 6 2 0 80 0 - 0 smpboo 17:33 ? 00:00:00 [ksoftirqd/0]
1 S root 7 2 0 -40 - - 0 smpboo 17:33 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp 17:33 ? 00:00:00 [rcu_bh]
1 S root 9 2 0 80 0 - 0 rcu_gp 17:33 ? 00:00:00 [rcu_sched]
......
可以明显看到主机运行的进程比容器中的进程多很多的,要查看运行状态的容器,可以使用docker container ls
来查看。
[pangcm@docker02 ~]$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd1e2f056f5e ubuntu:latest "/bin/bash" 11 minutes ago Up 11 minutes musing_easley
这里可以看到这个容器是在11分钟之前创建的,并且一直在运行着的。
4.1.3 连接到运行中的容器
执行docker container exec 命令,可以将shell连接到一个运行中的容器终端。因为之前示例中的容器已经被关闭,我按照上面的办法重新运行了一个ubuntu的镜像,下面使用命令连接到该容器上。
[pangcm@qcloud01 ~]$ docker container exec -it d69 bash
root@d691ce0106ab:/#
这里使用的是镜像ID的前面3个字符,其实我们很少这么操作。通常情况下我们都是在启动容器的时候,给容器指定一个名称,后续对容器的操作都是用这个名字。这方面的内容后面会有介绍。这里可以看到我们已经连接进入到了docker容器里面了。那些参数的使用和前面介绍的docker container run 的时候一样的。
下面我们来演示如何停止以及删除容器,首先我们和前面一样用组合键(Ctrl-PQ)退出容器,然后使用docker container stop和docker container rm命令来停止并删除容器。
[pangcm@qcloud01 ~]$ docker stop d69
d69
[pangcm@qcloud01 ~]$ docker rm d69
d69
然后我们使用docker container ls -a 去确认还有没有该容器的存在。
4.2 开发视角
容器即应用!
开发人员可以使用Dockerfile来构建他们的应用,将应用代码容器化,最终以容器的方式运行。
这里书中有演示一个Node.js 的web应用,需要从作者的github上下载示例的Dockerfile。这里不做介绍,针对Dockerfile后面会有详细的介绍。
4.3 本章小结
在运维部分,我们下载了Docker镜像,启动容器并且登录到容器内部执行相应的命令,最后停止删除容器。
在开发部分,我们完成了简单应用容器化的过程:从GitHub拉取应用源代码,并且通过Dockerfile中的指令,将应用代码构建到镜像中。接着运行了该容器化应用。
网友评论