掌握 Docker 的镜像下载,运行新的容器、登录新容器、再容器内运行命令,以及销毁容器。

当安装 Docker 的时候,会涉及两个主要组件:Docker 客户端和 Docker daemon。

daemon 实现了 Docker 引擎的 API

使用 Linux 默认安装时,客户端与 daemon 之间的通信是通过本地 IPC/UNIX Socket 完成的(/var/run/docker.sock);在 Windows 上是通过名为 npipe:////./pipe/docker_engine 的管道(pipe)完成的。

docker version 命令的使用

可以使用 docker version 命令来检测客户端和服务端是否已经正常运行并且可以相互通信

[root@centos7 ~]# docker version
Client: Docker Engine - Community        ---客户端响应
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 17:03:45 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community        ----服务端响应
 Engine:
  Version:          19.03.13
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       4484c46d9d
  Built:            Wed Sep 16 17:02:21 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.3.7
  GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

成功获取来自客户端和服务端的响应。

使用 linux 的时候,服务端返回了异常响应,可以尝试在命令的前面加上 sudo,如 sudo docker version。

镜像

Docker 的镜像就是一个包含了 OS 文件系统以及应用的对象。与虚拟机的模板类似,虚拟机模板本质上就是处于关机状态的虚拟机。

Docker 主机运行 docker image ls 命令

[dockeruser@centos7 ~]$ docker image ls
REPOSITORY       TAG       IMAGE ID       CREATED         SIZE

如果运行命令环境是刚完成 Docker 安装的主机,或者是 Play With Docker,那么 Docker 主机中应当没有任何镜像。

在 Docker 主机上获取镜像的操作被称为拉取(pulling)。如果使用 linux,那么会拉取 ubuntu:lastest 镜像;如果使用 windows,则会拉取 microsoft/powershell:nanoserver 镜像

查找镜像

镜像源配置成功后使用 dokcer search mysql 来查找你需要的镜像源
NAME         DESCRIPTION                                STARS          OFFICIAL       AUTOMATED
ubuntu   Ubuntu is a Debian-based Linux operating sys…   11417                         [OK]
  • NAME字段是镜像的名字
  • DESCRIPTION字段是对镜像的简单描述
  • STARS数量反映了用户的喜爱程度
  • OFFICIAL字段如果是OK,代表了这个镜像是官方提供的,可以信任
  • AUTOMATED字段如果是OK,代表了这个镜像是基于公开的脚本制作的,可以信任
  • 如果OFFICIAL和AUTOMATED都不为OK,那使用的时候需要额外小心了,这类镜像中可能包含恶意软件,不过对于个人非敏感数据还是可以使用的。

拉取镜像

[root@centos7 ~]# docker pull mysql

更换镜像拉取源

使用阿里云加速器加速镜像下载

{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
}

再次运行 docker image ls 命令查看刚刚拉取的进项

[root@centos7 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              8e85dd5c3255        5 days ago          544MB

镜像包含了基础操作系统,以及应用程序运行所需的代码和依赖包。刚才拉取的 Ubuntu 镜像有一个精简版的 Ubuntu linux 文件系统,其中包含部分 Ubuntu 常用工具。

而 Windows 示例中拉取的 microsoft/powershell 镜像,则包含了带有 PowerShell 的 Windows Nano Server 操作系统。

如果拉去了如 nginx 或者 microsoft/iis 这样的应用容器,就会得到一个包含操作系统的镜像,并且在镜像中还包括了运行 Nginx 或 IIS 所需的代码。

重要的是,Docker 的每个镜像都会有自己唯一 ID。用户可以通过引用镜像的 ID 或名称来使用镜像。

容器

如果已经拥有一个拉取到本地的镜像可以使用 docker container run 命令从镜像来启动容器

使用 docker container run 命令滚从镜像启动容器

linux 中启动容器的命令如下

[root@centos7 ~]# docker container run -it mysql /bin/bash
root@0b76ae67c420:/#

仔细观察输出结果,会发现每个实例的提示符都发生了变化,因为 -it 参数会将 shell 直接切换到容器终端,现在已经在容器内部了。

分析一下 docker container run 命令。docker container run 告诉 docker daemon(引擎)来启动新的容器

- -it 参数告诉 docker daemon(引擎),用户要将终端直接连接到容器中
- 并且告诉 docker daemon 用户想基于哪个镜像启动容器
- 最后命令告诉 docker 用户想在哪个容器中运行哪个进程
- 在容器内部运行 ps 命令查看当前正在运行的全部进程

-it 参数告诉 docker 开启容器的交互模式并将读者当前的 shell 连接到容器终端。接下来,命令告诉 docker,用户想基于 ubuntu:laster 镜像启动容器

最后,命令告诉 docker 用户想在哪个容器内部运行哪个进程。对于 linux 示例来说是运行 bash shell

容器中运行 ps 命令是查看当前正在运行的全部进程

root@12c51d7d2191:/# ps -elf
F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root          1      0  0  80   0 -  1007 wait   12:35 pts/0    00:00:00 /bin/bash
4 R root         10      1  0  80   0 -  1361 -      12:36 pts/0    00:00:00 ps -elf

Linux 容器中仅包含两个进程

  • PID 1:代表 /bin/bash 进程,该进程是通过 docker container run 命令来通知容器运行的
  • PID 9:代表 ps -elf 进程,查看当前运行中所使用的命令/进程

命令输出中展示的 ps -elf 进程存在一定的误导,因为这个程序在 ps 命令推出后就结束了,这意味着容器内长期运行的进程其实只有一个 /bin/bash 用来接收容器运行指令的进程在运行

windows 容器中的进程要比 linux 多

连接到运行中的容器 docker container exec 可以将 shell 连接到一个正在运行中的容器终端。因为之前示例中的容器仍在运行,所以下面的示例会创建该容器的新连接。

docker container exec -it #######

docker container exec 命令格式如下

docker container exec <options> <container-name or container-id> <command/app>

使用十六进制 ID 的方式也可以很容易地引用具体容器

docker container ls 命令来确认容器是否仍处于运行状态,使用 Ctrl+PQ 可以临时退出镜像但是不会关闭镜像的进程

[root@centos7 /]# docker container ls
CONTAINER ID     IMAGE       COMMAND        CREATED     STATUS        PORTS          NAMES
e95928e60580        i386/ubuntu     "/bin/bash"     10 minutes ago    Up 10 minutes    lucid_gauss

上述的输出显示只有一个运行中的容器。这就是前面示例中创建的那个容器。输出中有该容器,证明了容器在退出后依然是运行的。可以看到这个进程是 10min 之前创建的,并且一直在运行。

连接到运行中的容器 docker container exec

docker container exec -it [NAMES] /bin/bash            # 切换到已经暂停的容器
[root@centos7 /]# docker container exec -it lucid_gauss /bin/bash
root@e95928e60580:/# ps -elf
F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root          1      0  0  80   0 -  1007 poll_s 12:52 pts/0    00:00:00 /bin/bash
4 S root         36      0  0  80   0 -  1007 wait   13:06 pts/1    00:00:00 /bin/bash
0 R root         45     36  0  80   0 -  1361 -      13:06 pts/1    00:00:00 ps -elf

# 可以看到系统不是连接到上次的连接,而是新开一个 bash 终端

再次使用 Ctrl+PQ 退出当前的容器

只会显示正在运行的容器,同样的进程则不会显示
[root@centos7 /]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e95928e60580        i386/ubuntu         "/bin/bash"         19 minutes ago      Up 19 minutes                           lucid_gauss

停止删除正在运行的容器

[root@centos7 /]# docker stop lucid_gauss        ---停止正在运行的容器,停止后进程停止再次使用 docker container ls 则查看不到,必须要使用 docker container ls -a 因为要查看 docker 的所有正在运行的容器,包括停止状态
lucid_gauss
[root@centos7 /]# docker rm happy_lovelace        ---删除正在运行的容器,删除容器必须要先停止容器后才能删除容器
Error response from daemon: You cannot remove a running container 3cbfccbce83d9840d55c4f303359d8325036fca8dc192bf527bb85aeffddf260. Stop the container before attempting removal or force remove

容器的状态

[root@centos7 ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS               NAMES
53770a16478d        i386/ubuntu         "/bin/bash"              33 seconds ago      Up 32 seconds                                        boring_northcutt
d06d902a87f5        i386/ubuntu         "/bin/bahs"              36 seconds ago      Created                                              cool_heyrovsky
3cbfccbce83d        i386/ubuntu         "/bin/bash"              13 minutes ago      Exited (0) 8 minutes ago                             happy_lovelace
e95928e60580        i386/ubuntu         "/bin/bash"              37 minutes ago      Exited (0) 14 minutes ago                            lucid_gauss

-Exited 停止
-Up 正在运行
-Created 创建,但是没有成功,可以直接进行删除

删除停止后的容器

[root@centos7 etc]# docker rm cool_heyrovsky
cool_heyrovsky

命令总结

docker container ls [-a]        # 查看正在运行的主机,加上 -a 那么输出的内容是所有状态的主机
docker container exec -it [NAMES] /bin/bash    # 通过 ls 查看到的 NAMES 来运行
docker container run -it [IMAGE] /bin/bash # 运行一个容器
docker pull [IMAGE]            # 拉取镜像到本地
docker image ls                # 查看已经拥有的镜像
docker images 等同于 docker image ls
docker stop [NAMES]            # 停止 docker 到后台
docker rm [NAMES]            # 删除 dokcer
Ctrl+PQ                # 将容器调度到后台并不会关闭,通过 docker container ls 还可以查看到正在运行