本期目录
- 1. 帮助启动类命令
- 2. 镜像命令
- 2.1 列出镜像
- 2.2 搜索远程库镜像
- 2.3 拉取镜像
- 2.4 查看所占空间
- 2.5 删除镜像
- 2.6 面试题
- 3. 容器命令
- 3.1 新建+启动容器
- 1)启动交互式容器
- 3.2 列出当前所有正在运行的容器
- 3.3 退出容器
- 3.4 启动已停止的容器
- 3.5 重启容器
- 3.6 停止容器
- 3.7 强制停止容器
- 3.8 删除已停止的容器
- 4. 容器命令进阶
- 4.1 启动守护式容器(后台启动)
- 1)后台运行容器的注意问题
- 2)Redis前后台启动举例
- 4.2 查看容器日志
- 4.3 查看容器内运行的进程
- 4.4 查看容器内部细节
- 4.5 进入正在运行的容器并以命令行交互
- 4.6 从容器拷贝文件到主机上
- 4.7 导入和导出容器
1. 帮助启动类命令
命令 | 作用 |
---|---|
systemctl start docker | 启动 Docker 服务引擎 |
systemctl stop docker | 停止 Docker 服务引擎 |
systemctl restart docker | 重启 Docker 服务引擎 |
systemctl status docker | 查看 Docker 服务引擎运行状态 |
systemctl enable docker | Docker 服务引擎开机自启 |
docker info | 查看概要信息 |
docker --help | 查看总体帮助文档 |
docker 具体命令 --help | 查看命令帮助文档 |
举例:查看命令 cp
的帮助文档。
$ docker cp --help
2. 镜像命令
命令 | 作用 |
---|---|
docker images | 列出本地仓库的镜像 |
docker search 镜像名称 | 从远程库搜索镜像 |
docker pull 镜像名称 | 从远程库拉取镜像 |
docker system df | 查看镜像/容器/数据卷所占空间 |
docker rmi 镜像ID | 删除镜像 |
2.1 列出镜像
$ docker images [OPTIONS] [REPOSITORY[:TAG]]
[OPTIONS] 说明:
-a
:列出本地仓库所有镜像 (含历史映像层)-q
:仅显示镜像 ID
举例:
$ docker images -a
$ docker images -q
-
表头说明:
表头 说明 REPOSITORY 表示镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像 ID CREATED 镜像创建时间 SIZE 镜像大小 -
其中,同一仓库源可以有多个 TAG 版本,代表这个仓库源不同的版本。我们使用
REPOSITORY:TAG
来定义不同的镜像。如果不指定镜像的版本标签 TAG ,则默认使用最新的 latest 镜像。例如,ubuntu:latest
。
2.2 搜索远程库镜像
$ docker search [OPTIONS] 镜像名称
[OPTIONS] 说明:
--limit n
:只列出前 n 个镜像,默认 25 个
举例:
$ docker search redis
表头说明:
表头 | 说明 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 镜像介绍 |
STARS | 点赞数 |
OFFICIAL | 是否 Docker 官方出品的镜像源 |
AUTOMATED | 是否自动构建 |
2.3 拉取镜像
- 把远程仓库的镜像下载到本地仓库。
$ docker pull [OPTIONS] 镜像名称[:TAG]
[OPTIONS] 说明:
- 没有加
[:TAG]
默认下载最新的 latest 版本。
举例:
$ docker pull redis:6.2.7
2.4 查看所占空间
- 查看 Docker 所有镜像/容器/数据卷所占硬盘空间。
$ docker system df
举例:
$ docker system df
2.5 删除镜像
- 根据镜像 ID 删除本地仓库的一个或多个镜像。
$ docker rmi [OPTIONS] 镜像ID
[OPTIONS] 说明:
-f
:强制删除镜像。当该镜像创建了正在运行的容器时,必须加-f
才能删除。
举例:
$ docker rmi -f feb5d9fea6a5
- 除了使用镜像 ID 删除,还可以根据
镜像名称:TAG
来删除。删除多个使用空格分隔。
举例:
$ docker rmi -f nginx:latest redis:latest
- Docker 命令还可以通过
$()
来嵌套使用。
举例:删除全部本地镜像。
$ docker rmi -f $(docker images -qa)
这个命令把 $()
中命令的输出当作是删除命令的入参。
2.6 面试题
面试题:谈谈 Docker 虚悬镜像是什么?
-
虚悬镜像 (Dangling Image) ,就是仓库名、Tag 标签都是
<none>
的镜像。没啥用,删除就是了。后续章节 Dockerfiles 中再详细介绍。
3. 容器命令
-
有镜像才能创建容器,这是根本前提。本节笔者将以 Ubuntu 镜像来演示。
-
首先从远程仓库拉取 Ubuntu 镜像。
$ docker pull ubuntu
3.1 新建+启动容器
- Java 中用
new
来创建对象,Docker 中用run
创建并启动容器,生成鲸鱼背上的集装箱。
$ docker run docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
[OPTIONS] 说明:
-
-name="容器名称"
:为容器指定一个名称; -
-d
:后台运行容器并返回容器 ID ,也即启动守护式容器 (后台运行) ; -
-i
:以交互模式运行容器 (前台运行) ,通常与-t
同时使用; -
-t
:为容器重新分配一个伪输入终端,通常与-i
同时使用;(也即交互式容器,前台有伪终端,等待交互) -
-P
:随机端口映射,大写 P ; -
-p
:指定端口映射,小写 p ;参数 说明 -p hostPort:containerPort 端口映射,如 -p 8080:80 -p ip:hostPort:containerPort 配置监听地址,如 -p10.0.0.100:8080:80
1)启动交互式容器
举例:以前台运行 Ubuntu 容器,并进入 Ubuntu 的 bash 伪终端。
$ docker run -it ubuntu:latest /bin/bash
可以看到 root@
后面带上了 Ubuntu 容器 ID ,这就进入了 Ubuntu 容器的伪终端了,这就进入了一个 mini 型的 Ubuntu 操作系统。相当于进入了鲸鱼背 (Docker 服务引擎) 上的集装箱 (Container 容器) 里面开始干活了。
- 输入
exit
即可退出。
3.2 列出当前所有正在运行的容器
- 默认只列出正在运行的容器,停止的容器不显示。
$ docker ps [OPTIONS]
[OPTIONS] 说明:
-a
:列出当前所有正在运行的容器+历史上运行过的容器;-l
:显示最近创建的容器;-n
:显示最近 n 个创建的容器;-q
:静默模式,只显示容器编号;
举例:在刚刚前台启动 Ubuntu 容器后,另起一个终端窗口输入:
$ docker ps
表头说明:
表头 | 说明 |
---|---|
CONTAINER ID | 容器 ID |
IMAGE | 镜像 |
COMMAND | 启动命令 |
CREATED | 启动时间 |
STATUS | 运行状态 |
PORTS | 对外暴露的端口 |
NAMES | 容器名称 |
由于创建 Ubuntu 容器时没有指定容器名称,因此 Docker 帮我们随机分配容器名称。在实际开发中最好指定容器名称:
$ docker run -it --name=myu1 ubuntu:latest bash
再次查看正在运行的容器列表:
举例:列出当前所有正在运行的容器+历史上运行过的容器。
$ docker ps -a
3.3 退出容器
两种退出容器的方式:
exit
:退出容器,容器停止 (dead) 。- 键盘按下 Ctrl + P + Q :退出容器但不停止容器 (running) 。
举例:
-
先看目前正在运行的容器列表:
-
使用
exit
方式退出第一个 Ubuntu 容器myu1
。 -
使用键盘按下 Ctrl + P + Q 退出容器但不停止容器。
-
再次查看目前正在运行的容器列表:
只有使用键盘快捷键的容器 ID 尾号为
8dc5
的容器仍在运行;而容器 ID 尾号为60c0
的容器已经停止了。
3.4 启动已停止的容器
- 启动一个或多个已经停止的容器。
$ docker start [OPTIONS] CONTAINER [CONTAINER...]
[OPTIONS] 说明:
--
举例:
-
先列出最近 5 个创建的容器。
$ docker ps -n 5
-
把第一行已经停掉的容器 (容器 ID 尾号为
60c0
) 重新启动。$ docker start 6e031bad60c0
可以看到容器 ID 尾号为
60c0
的容器已经重新启动了。
3.5 重启容器
$ docker restart [OPTIONS] CONTAINER [CONTAINER...]
3.6 停止容器
$ docker stop [OPTIONS] CONTAINER [CONTAINER...]
3.7 强制停止容器
$ docker kill [OPTIONS] CONTAINER [CONTAINER...]
3.8 删除已停止的容器
$ docker rm [OPTIONS] CONTAINER [CONTAINER...]
[OPTIONS] 说明:
-f
:把正在运行的容器强制删除;
举例:一次删除全部的容器。
$ docker rm -f $(docker ps -aq)
4. 容器命令进阶
-
本节使用 Redis 镜像演示,先拉取 Redis 镜像。
$ docker pull redis:6.2
4.1 启动守护式容器(后台启动)
- 只需要在 run 命令后加
-d
就能让容器在后台运行。
$ docker run -d IMAGE [COMMAND] [ARG...]
1)后台运行容器的注意问题
举例:后台启动 Ubuntu 容器。
$ docker run -d ubuntu:latest
使用 docker ps
查看当前正在运行的容器。
发现根本没有 Ubuntu 容器在后台运行,容器是已经运行 (返回容器 ID ) 但又马上停止了。这是 Docker 的机制导致的:Docker 容器后台运行,必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令 (比如运行 top 、tail ) ,就会自动退出并停止容器。
2)Redis前后台启动举例
前台交互式启动:
$ docker run -it redis:6.2
熟悉的 Redis 启动 Logo ,但是如果 Ctrl + C 退出的话,容器也就停止了。
实际开发中,我们更习惯让 Redis 默默在后台运行即可。
后台守护式启动:
$ docker run -d redis:6.2
查看正在运行的容器:发现 Redis 成功在后台运行。
4.2 查看容器日志
$ docker logs [OPTIONS] CONTAINER
举例:查看后台运行的 Redis 容器的日志。
$ docker logs c75160ca6a9b
4.3 查看容器内运行的进程
任何一个容器都是简易版的 Linux 系统,容器内也有自己的进程。
$ docker top CONTAINER
举例:查看Redis 容器内运行的进程。
$ docker top c75160ca6a9b
Redis 容器内只有 redis-server 一个进程正在运行。
4.4 查看容器内部细节
$ docker inspect [OPTIONS] NAME|ID [NAME|ID...]
举例:查看Redis 容器内部细节。
$ docker inspect c75160ca6a9b
返回的是一大堆有关容器内部信息的 JSON 字符串。这部分在高级篇才会反复用到。
4.5 进入正在运行的容器并以命令行交互
有两个命令可以重新进入正在运行的 Docker 容器:
$ docker exec -it 容器ID bash
和
$ docker attach 容器ID
两者的区别是:
exec
是在容器中打开新的终端,并且可以启动新的进程,用exit
退出容器时不会停止容器;attach
直接进入容器启动命令行终端,不会启动新的进程,用exit
退出容器时会停止容器。
因此在实际开发中更推荐使用 exec
,因为退出容器终端,不会导致容器的停止。
举例:分别使用 docker exec
和 docker attach
进入正在运行的 Redis 容器并 exit
退出容器。
$ docker exec -it c75160ca6a9b bash
exit 退出容器后,Redis 容器仍然存活。
$ docker attach c75160ca6a9b
退出容器后,Redis 容器就已经停止了。
4.6 从容器拷贝文件到主机上
这个命令可以把容器内的一些重要文件备份到主机上,避免容器被删除后重要文件丢失。
$ docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
其中,CONTAINER:SRC_PATH
是容器内的源文件路径;DEST_PATH
是主机目标路径。
本节将使用 Ubuntu 容器来演示,以前台交互式创建一个 Ubuntu 容器。
$ docker run -it ubuntu:latest /bin/bash
在临时目录 /tmp
创建一个文本文件 test.txt
。
$ cd /tmp
$ touch test.txt
退出该容器,执行
$ docker cp 937484124f73:/tmp/test.txt /root
可以看到文件已经复制到主机上的 /root
目录下。
4.7 导入和导出容器
export
导出容器的内容流作为一个 tar 归档文件;
import
从 tar 包中的内容创建一个新的文件系统再导入镜像。
这对命令互为逆过程。
$ docker export [OPTIONS] CONTAINER > xxx.tar
$ cat xxx.tar | docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
举例:导出 Ubuntu 容器为一个名为 abc.tar
的包。
$ docker export 937484124f73 > abc.tar
然后删除这个 Ubuntu 容器。
$ docker rm -f 937484124f73
再从 tar 包导入镜像。
$ cat abc.tar | docker import - ouc/ubuntu:1.0.0
最后才是创建这个镜像的容器。
$ docker run -it ouc/ubuntu:1.0.0 /bin/bash
容器中的 test.txt
文件仍然在。