Docker

Docker 启动容器

Docker 启动容器有两种方式:
  1. 基于镜像新建一个容器并启动;
  2. 将处于终止状态 (**exited**)的容器重新启动;

一、基于镜像新建容器并启动

通过如下命令来启动容器:
  1. docker run IMAGE:TAG
参数说明:
  • IMAGE**:镜像名称;**
  • TAG**:标签,镜像版本号;**
举个例子🌰,比如想启动一个 ubuntu 容器,并通过终端输出 Hello world

docker 启动容器

执行命令如下:
  1. docker run ubuntu:latest /bin/echo 'Hello world'

docker 启动 ubuntu 容器并输出 hello world

注意,上面这行命令运行容器,在输出 Hello world 后就会终止运行。如果想以交互的方式运行容器,执行如下命令:
  1. docker run -t -i ubuntu:latest /bin/bash

以交互的方式运行 docker 容器

参数说明:
  • **<font style="color:rgb(60, 112, 198);">-t</font>**:让 Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上;
  • **<font style="color:rgb(60, 112, 198);">-i</font>**:让容器的标准输入保持打开;
如此,就可以直接在终端执行命令了:
  1. root@c355025f2241:/# ls
  2. bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
  3. root@c355025f2241:/# date
  4. Sun Jul 3 03:47:41 UTC 2022

1.1 拓展知识:执行 <font style="color:rgb(60, 112, 198);">docker run</font> 后,Docker 都干了些啥?

  • 检查本地是否存在指定的镜像,不存在就从 registry 下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

1.2 以 daemon 守护态方式运行容器

实际应用中,需要让容器以后台的方式运行,以此保证一个稳定的服务。 运行容器时添加 <font style="color:rgb(60, 112, 198);">-d</font> 参数可以让容器以后台的方式运行,例如启动一个 Ubuntu 后台容器,并每隔一秒打印 Hello world,命令如下:
  1. docker run -d ubuntu:latest /bin/sh -c "while true; do echo hello world; sleep 1; done"
执行成功后,会返回一个容器 ID。

docker 以后台的方式运行容器

后台运行的容器可以通过 <font style="color:rgb(60, 112, 198);">docker logs</font> 命令来查看日志:
  1. docker container logs [container ID or NAMES]

二、启动终止状态的容器

执行如下命令,可以将已经终止 (exited)运行的容器重启。
  1. docker container start [container ID or NAMES]
测试一波好不好使,先通过 <font style="color:rgb(60, 112, 198);">docker ps</font> 命令获取正在运行的容器:

获取 docker 容器 id

本地有个 Redis 容器正在运行,先拿到容器 ID 或者容器名称,执行 <font style="color:rgb(60, 112, 198);">docker stop</font> 停止它后,再执行 <font style="color:rgb(60, 112, 198);">docker container start</font> 命令重启这个 Redis 容器:

重启 redis 容器

可以看到,成功重启了一个终止状态的容器。

Docker 查看容器

查看正在运行中、停止运行的容器

  • **<font style="color:rgb(60, 112, 198);">docker ps</font>**:查看正在运行中的容器;
  • **<font style="color:rgb(60, 112, 198);">docker ps -a</font>**:查看所有容器,包括运行中的、已经停止运行的容器。

docker 查看容器

返回字段说明:
  • CONTAINER ID**:容器 ID;**
  • IMAGE**:创建容器时使用的镜像;**
  • COMMAND**:容器最后运行的命令;**
  • CREATED**:容器创建时间;**
  • STATUS**:容器状态;**
  • PORTS**:端口信息;**
  • NAMES** :容器名:和容器 ID 一样,可以标识容器的唯一性,同一台宿主机上不允许有同名容器存在,否则会冲突;**

拓展命令

  • **<font style="color:rgb(60, 112, 198);">docker ps -l</font>**:查看最新创建的容器,注意,只列出最后创建的容器。
  • **<font style="color:rgb(60, 112, 198);">docker ps -n=2</font>****<font style="color:rgb(1, 1, 1);">: </font>****<font style="color:rgb(60, 112, 198);">-n=2</font>** 指定列出最新创建的 2 个容器。

Docker 进入容器

要想进入到已运行的 Docker 容器,主要有如下两种方式:
  • 使用 **<font style="color:rgb(60, 112, 198);">docker exec</font>** 命令;
  • 使用 **<font style="color:rgb(60, 112, 198);">docker attach</font>** 命令;

一、exec 命令(推荐)

Docker 在 1.3.X 版本后开始支持 <font style="color:rgb(60, 112, 198);">exec</font> 命令进入容器,命令如下:
  1. docker exec -it [container ID or NAMES]
举个例子🌰,比如想进入到本地的 Redis 容器中:

Docker 准备进入 redis 容器

可以通过容器 ID 或者名称进入容器:
  1. docker exec -it redis /bin/bash

docker 通过 exec 命令进入到容器

要想退出容器,只需键入 <font style="color:rgb(60, 112, 198);">exit</font> 命令回车即可:
  1. (base) ~ docker exec -it redis /bin/bash
  2. root@023d93457910:/data#
  3. root@023d93457910:/data#
  4. root@023d93457910:/data#
  5. root@023d93457910:/data# exit
  6. exit

注意:**<font style="color:rgb(60, 112, 198);background-color:rgb(239, 239, 239);">exec</font>** 命令和下面 **<font style="color:rgb(60, 112, 198);background-color:rgb(239, 239, 239);">attach</font>** 命令的区别在于,当使用 **exit** 退出容器时,不会导致容器停止。

二、attach 命令

执行命令格式如下:
  1. docker attach [container ID or NAMES]

注意:这种方式在执行 **exit** 命令退出容器时,会导致容器停止运行。

Docker 停止&关闭容器

有以下两种方式关闭一个正在运行的 Docker 容器:

一、stop 优雅模式

  1. docker container stop [container ID or NAMES]
  2. # 简写模式(可省略关键字 container )
  3. docker stop [container ID or NAMES]
举个例子🌰,比如想要停止下图中的 Ubuntu 容器:

docker 停止关闭 ubuntu 容器

通过容器 ID 或者容器名称都可以停止容器,命令如下:
  1. # 通过容器 ID 关闭容器
  2. docker stop 4e6fc78cc0c4

二、kill 强制模式

<font style="color:rgb(60, 112, 198);">kill</font> 命令强制关闭容器:

  1. docker container kill [container ID or NAMES]
  2. # 简写模式(可省略关键字 container )
  3. docker kill [container ID or NAMES]

对于交互形式运行的容器如何关闭?

前面小节中说到的交互形式运行的容器,可以通过输入 exit 或者 Ctrl+d 退出容器。

查看已经停止运行的容器

执行如下命令,可以看到那些已经停止运行的容器:
  1. docker container ls -a

查看 docker 已经停止运行的容器

想要重启已经停止运行的容器,命令如下:
  1. docker container start [container ID or NAMES]
另外,<font style="color:rgb(60, 112, 198);">docker container restart</font> 命令会将一个已经运行中的容器重新启动。

Docker 重启容器

执行如下命令重启 Docker 容器:
  1. # 不管容器是否启动,直接重启
  2. docker restart [container ID or NAMES]
举个例子🌰,比如想要重启下面的 Redis 容器:

docker 重启 redis 容器

执行如下命令即可:
  1. # 通过容器 ID 或者名称都可以
  2. docker restart redis

<font style="color:rgb(60, 112, 198);">-t</font> 参数

<font style="color:rgb(60, 112, 198);">-t</font>:设置关闭容器的限制时间,若超时未能关闭,则使用 <font style="color:rgb(60, 112, 198);">kill</font> 命令强制关闭,默认值为 10s,这个时间用于容器保存自己的状态。

  1. # 限时 5s 关闭 redis 容器,然后重启
  2. docker restart -t=5 redis

限时5秒重启redis容器

Docker 导出&导入容器

一、导出容器

使用 <font style="color:rgb(60, 112, 198);">docker export</font> 命令可以导出容器,比如想导出下面的 Redis 容器:

查看本地的 docker 容器

  1. docker export 9e8d11aeef0c > redis.tar
导出的 tar 包快照存于当前目录下。

二、导入容器快照

使用 <font style="color:rgb(60, 112, 198);">docker import</font> 命令可以将快照导入为镜像,例如:
  1. cat redis.tar | docker import - test/redis:v1.0
导入成功后,就可以看到新生成的镜像了:

docker 导出容器

除了通过快照的方式导入容器,还可以通过指定 URL 或者某个目录来导入,例如:
  1. docker import http://example.com/exampleimage.tgz example/imagerepo

Docker 删除容器

本小节中将学习如何删除 Docker 容器。

一、删除容器

执行如下命令可以删除一个已经停止运行的容器:
  1. docker container rm [container ID or NAMES]
  2. # 简写模式(可省略关键字 container )
  3. docker rm [container ID or NAMES]
举个例子🌰,比如想要删除下面的 Redis 容器:

docker 查看本地容器

执行如下命令即可:
  1. # 通过容器 ID 删除
  2. docker rm 023d93457910

强制删除容器

添加 <font style="color:rgb(60, 112, 198);">-f</font> 参数可强制删除一个正在运行的容器:

docker 查看正在运行的容器

如图示,强制删除这个 Redis 容器:
  1. # 通过容器 ID 强制删除容器
  2. docker rm -f 207aaf2e3384

二、删除所有已经停止运行的容器

如何一次性删除所有已经停止的容器呢? <font style="color:rgb(60, 112, 198);">docker container ls -a</font> 命令可以查看所有已经创建的包括停止运行的容器,如果数量太多要一个个删除会很麻烦,执行如下命令即可删除掉所有已经停止运行的容器:
  1. docker container prune