掌握 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 还可以查看到正在运行