确保 Docker 已经就绪

本篇环境为 windows10 环境。

$ docker info

Containers: 8
 Running: 0
 Paused: 0
 Stopped: 8
Images: 4
Server Version: 18.09.6
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
...

说明已经可以了。

接下来我们进行相关的使用学习。

运行第一个容器

$ docker run -it ubuntu /bin/bash

日志如下:

Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
2746a4a261c9: Pull complete 
4c1d20cdee96: Pull complete 
0d3160e1d0de: Pull complete 
c8e37668deea: Pull complete 
Digest: sha256:250cc6f3f3ffc5cdaa9d8f4946ac79821aafb4d3afc93928f0de9336eba21aa4
Status: Downloaded newer image for ubuntu:latest

首先回去本地找这个镜像,没有发现就会直接去仓库中心下载最新的镜像。

命令解释

docker run 代表运行某个镜像。

-i 表示保证容器的 STDIN 是开启的

-t 表示为容器开启一个伪的 tty 终端

这样新创建的容器才能提供一个交互式的终端。

使用第一个容器

我们已经默认进入到终端之中

root@83489077fd36:/#

这里是一个完整的 ubuntu 系统。

获取主机名

# hostname
83489077fd36

这里的主机名就是容器的 container ID。

查看 etc/hosts 文件

# cat /etc/hosts 
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      83489077fd36

查看 ip 网络配置信息

# ip a
bash: ip: command not found

这个命令没找到,略微尴尬。

查看容器进程

# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3  18508  3424 pts/0    Ss   02:22   0:00 /bin/bash
root        13  0.0  0.2  34400  2932 pts/0    R+   02:27   0:00 ps -aux

安装软件

# apt-get update && apt-get install vim

我们首相更新 apt-get,然后安装我们需要的软件。

日志如下:

Ign:1 http://security.ubuntu.com/ubuntu bionic-security InRelease
Ign:2 http://archive.ubuntu.com/ubuntu bionic InRelease
Err:3 http://security.ubuntu.com/ubuntu bionic-security Release
  SECURITY: URL redirect target contains control characters, rejecting. [IP: 91.189.88.162 80]
Ign:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease
Ign:5 http://archive.ubuntu.com/ubuntu bionic-backports InRelease
Err:6 http://archive.ubuntu.com/ubuntu bionic Release
  SECURITY: URL redirect target contains control characters, rejecting. [IP: 91.189.88.24 80]
Err:7 http://archive.ubuntu.com/ubuntu bionic-updates Release
  SECURITY: URL redirect target contains control characters, rejecting. [IP: 91.189.88.24 80]
Err:8 http://archive.ubuntu.com/ubuntu bionic-backports Release
  SECURITY: URL redirect target contains control characters, rejecting. [IP: 91.189.88.24 80]
Reading package lists... Done
E: The repository 'http://security.ubuntu.com/ubuntu bionic-security Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
E: The repository 'http://archive.ubuntu.com/ubuntu bionic Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
E: The repository 'http://archive.ubuntu.com/ubuntu bionic-updates Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
E: The repository 'http://archive.ubuntu.com/ubuntu bionic-backports Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

退出运行

# exit

我们直接输入 exit 就可以退出当前容器。

查看容器运行状态

回到开始的地方,查看镜像信息。

查看运行容器

$ docker ps

发现列表是空的

查看所有容器

我们列出所有状态的容器,我们发现刚才的 ubuntu 进项已经退出了。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS                                NAMES
83489077fd36        ubuntu              "/bin/bash"              9 minutes ago       Exited (100) 7 seconds ago                                        unruffled_wiles

查看最后一次运行的容器

$ docker ps -l

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
83489077fd36        ubuntu              "/bin/bash"         12 minutes ago      Exited (100) 3 minutes ago                       unruffled_wiles

容器的指定方式

每一个容器都有三种方式可以唯一指定:

(1)短 UUID

(2)长 UUID

(3)容器名称

给容器命名

启动时指定名称

这里我们通过 –name 来制定容器名称为 hello-ubuntu

$   docker run --name hello-ubuntu -it ubuntu /bin/bash

退出查看容器名称

我们退出重新查看容器名称:

root@09e662282e01:/# exit
exit
docker@default:~$ docker ps -l 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
09e662282e01        ubuntu              "/bin/bash"         8 seconds ago       Exited (0) 5 seconds ago                       hello-ubuntu

可以发现这次容器名称变成了 hello-ubuntu

命名规范

容器的名称有一定的要求,确切的说需要符合正则表达式:

[a-zA-Z0-9_.-]

容器的名称必须唯一。

再次启动被停止的容器

启动

使用 docker start 命令可以启动一个容器,当然后面不仅可以是名称,也可以是 CONTAINER ID

可以自行测试。

docker@default:~$ docker start hello-ubuntu
hello-ubuntu
docker@default:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
09e662282e01        ubuntu              "/bin/bash"         6 minutes ago       Up 4 seconds                            hello-ubuntu

重启

也可以使用 docker restart 来启动容器

docker@default:~$ docker restart 09e662282e01
09e662282e01
docker@default:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
09e662282e01        ubuntu              "/bin/bash"         7 minutes ago       Up 4 seconds                            hello-ubuntu

附着到容器上

docker 容器重新启动的时候,会延续上次 docker run 的指定参数。

我们也可以使用 docker attach 命令,重新附着到该容器的会话上。

$   docker attach hello-ubuntu
root@09e662282e01:/# 

退出之后,直接容器也会随之退出。

创建守护式容器

除了刚才演示的交互式容器(interactive container),也可以建立以下守护式(daemonized container)

守护式进程创建例子

$ docker run --name  daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
395b9fadf0ea3ab97bc703fff8af162053c4d2f70a6214589d862f1fddfe7b8f

–name 指定名称

-d 指定守护进程运行

-c 指定了一个命令,每秒钟打印日志。

查看容器

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
395b9fadf0ea        ubuntu              "/bin/sh -c 'while t…"   17 seconds ago      Up 16 seconds                           daemon_dave

查看容器在作什么

我们指定打印日志怎么才能看到呢?

$ docker logs daemon_dave

可以看到一大堆日志:

hello world
hello world
...

当然也可以实时查看,类似于 tail -f

$ docker logs -f daemon_dave

这里看起来都是一样的不够方便,可以指定时间

$ docker logs -ft daemon_dave

日志如下:

2019-12-23T03:42:02.541350368Z hello world
2019-12-23T03:42:03.545194889Z hello world
2019-12-23T03:42:04.549811173Z hello world

查看容器内的进程

通过 docker top 命令,我们可以查看容器内所有运行的进程。

$ docker top daemon_dave
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                3758                3736                0                   03:35               ?                   00:00:00            /bin/sh -c while true; do echo hello world; sleep 1; done
root                4719                3758                0                   03:46               ?                   00:00:00            sleep 1

在容器内部运行进程

我们可以 docker exec 额外启动新的进程。

守护式

docker exec -d daemon_dave touch /etc/new_config

-d 指定为守护式运行

后面指定需要指定的命令,我们在容器内创建了一个空文件。

交互式

docker exec -it daemon_dave /bin/bash

这里使用交互的方式,打开一个新的命令终端。

这个交互式还是比较常用的命令,比如我们用 docker 部署应用,希望进入容器内查看日志等,都可以通过这种方式。

停止守护进程

docker stop 命令可以停止一个守护进程。

$ docker stop daemon_dave
daemon_dave

这个命令回向系统发送 SIGTERM 信号。,

如果你想快速停止,可以使用 docker kill 命令来发送一个 SIGKILL 信号。

查看已经停止的容器状态

$ docker ps -n 1 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
395b9fadf0ea        ubuntu              "/bin/sh -c 'while t…"   21 minutes ago      Exited (137) 2 minutes ago                       daemon_dave

-n 后面跟的是数量,你可以根据需要自行指定。

自动重启

有时候我们需要自动重启某些容器。

--restart 参数可以检测容器的退出代码,我们可以指定相关的信息,默认是不进行重启的。

一直重启

$ docker run --restart=always --name  daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

这里被设置为永远重启。

指定失败次数

有时候我们希望尝试一定次数之后就不再尝试了。

--restart=on-failure:5

这里是指失败五次之后就不再尝试了。

深入容器

docker inspect 可以获取更加详细的容器信息。

$ docker inspect hello-ubuntu

可以看到关于容器非常详细的信息。

容器的删除

如果一个容器不再需要,我们可以使用 docker rm 直接删除容器。

$ docker rm hello-ubuntu
hello-ubuntu

可以直接删除容器。

总结

本节主要以 ubuntu 这个镜像作为例子,讲述了对于 docker 容器的管理。

拓展阅读

docker 的安装

Mac 安装 Docker

Windows7 安装 Docker

Windows10 安装 Docker

更多学习

参考资料

《第一本 Docker 书》