🐳 Linux Docker 基本命令参数详解
📘 1. Docker 简介
Docker 是一个开源的容器化平台,它通过将应用及其依赖打包到一个轻量级、可移植的容器中,从而实现跨平台运行。Docker 采用 C/S 架构,服务端称为 Docker Daemon,客户端通过 CLI 工具与其交互。
核心概念包括:
- 镜像(Image):只读模板,包含操作系统、应用程序及其依赖。
- 容器(Container):镜像的运行实例,具备轻量、快速启动等优势。
- 仓库(Registry):存放镜像的远程服务器,如 Docker Hub。
- 网络(Network):用于容器之间或容器与主机之间的通信。
Docker 的安装和配置详见:
Linux 安装与配置 Docker
🛠️ 2. Docker 命令及参数
📦 2.1 容器命令
🔄 2.1.1 容器运行状态转换命令
用于管理容器的生命周期,包括创建、启动、暂停、恢复、停止、强制终止和删除等操作。
-
docker create
创建一个新容器但不启动,适用于需要先设置参数再手动启动的场景。
命令格式:bashsudo docker create [-it] \ [--name 容器名] \ [-p 容器端口:宿主机端口] \ [-e 环境变量] \ [-v 宿主机路径:容器路径] \ <镜像名或镜像ID>
说明:
[-it]
: 这里的 -i 表示保持标准输入流开放; -t 表示分配一个伪终端,适用于交互式容器运行[--name]
: 容器名:如果你在使用 Docker 容器命令的时候不想输入一长串哈希值,那你最好在这里给容器起一个简单好记得名字[-p 容器端口]
:宿主机端口:对于需要开放端口的容器,将容器的端口映射到宿主机的端口,这样容器服务就可对外访问[-e 环境变量]
:设置容器的环境变量[-v 宿主机路径]
:容器路径:挂载宿主机目录到容器内部,方便保存和修改容器中的目录<镜像名或镜像ID>
:创建容器所使用的镜像的名字或ID,对应 docker images命令显示的 IMAGE ID 和 REPOSITORY
提示:一般在专业的技术文档中[]内部的参数为可选参数,<>内部的参数为必选参数
效果:
解释:这里通过交互终端的方式创建了一个 tomcat 容器,容器名为 tomcat_1,将宿主机的 5555 端口映射到容器的 8080 端口,添加设置时区为上海的环境变量,将容器内
/usr/local/tomcat/webapps
目录挂载到当前路劲下webapps
文件夹中
注意:一般为了让容器持续运行,都会加-it
参数。因为有很多非服务性质的容器,打开后 docker 检测到容器内没有进程持续再跑就会自动把容器关闭。-it
参数会再容器内挂一个持续在跑的交互式终端进程,这样容器内就至少有一个进程再跑,就不会被 docker 自动关闭了
-
docker run
创建并立即运行一个容器,相当于
docker create
和docker start
的组合。
命令格式:bashsudo docker run [-d] \ [-it] \ [--name 容器名] \ [-p 容器端口:主机端口] \ [-e 环境变量] \ [-v 主机路径:容器路径] \ <镜像名或镜像ID>
说明:
- 大多数
docker create
的参数docker run
都能用。还有一些设置执行方式的参数docker create
不能用但是docker run
能用,比如-d
表示终端后台执行
效果:
解释:这里用
docker run
命令以后台启动的方式启动了一个 tomcat 容器,容器名称为 tomcat_3,开启交互式终端进程,将宿主机的 5555 端口映射到容器的 8080 端口,添加设置时区为上海的环境变量,将容器内/usr/local/tomcat/webapps
目录挂载到当前路劲下webapps
文件夹中
注意:docker run 不能启动已经由 docker create 创建的容器 - 大多数
-
docker start
启动一个已经存在但处于停止状态的容器,不会创建新容器。
命令格式:bashsudo docker start [-a] [-i] <容器名或ID>
说明:
[-a]
:将容器的标准输出(stdout)和标准错误输出(stderr)附加到当前终端。这意味着你能看到容器中程序的输出信息,适合调试或实时查看日志。[-i]
:保持标准输入(stdin)打开,使你可以向容器内发送输入,通常与 -a 配合使用以实现交互式操作(如进入容器后执行命令)<容器名或ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释:这里用
docker start
命令启动了 ubuntu_1 容器,可以看到启动后直接进入终端交互界面。需要注意-ai
一般都是用在有交互界面的容器比如 Ubuntu 或 CentOS 上,像 tomcat 这种服务类型的容器即使加了-ai
也无法在终端输入命令。解释: 这里用
docker start
命令启动了刚被创建的 tomcat_1 容器,容器状态从 Created 转变为 Up 。
-
docker pause
暂停容器中所有进程,常用于临时挂起服务或调试容器状态。
命令格式:bashsudo docker pause <容器名或ID>
说明:
<容器名或ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释:这里暂停了容器 ubuntu_1 ,容器状态从 Up 转变为 Up(Paused) 。
-
docker unpause
恢复被暂停的容器进程,使其继续运行。
命令格式:bashsudo docker unpause <容器名或ID>
说明:
<容器名或ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释:这里解除暂停了容器 ubuntu_1 ,容器状态从 Up(Paused) 转变为 Up 。
-
docker stop
正常停止容器,先发送 SIGTERM 信号,若未在限定时间内关闭,则发送 SIGKILL。
命令格式:bashsudo docker stop <容器名或ID>
说明:
<容器名或ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释:这里用
docker stop
停止了 ubuntu_1 容器,容器的状态从 Up 转变为 Exited 。
-
docker kill
强制终止容器进程,直接发送 SIGKILL 信号,不等待容器自行关闭。
命令格式:bashsudo docker kill <容器名或ID>
说明:
<容器名或ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释: 这里强制关闭了容器 tomcat_1,容器状态从 Up 转变为 Exited 。
-
docker restart
重启容器,相当于先执行
stop
再start
,适用于配置变更或服务重启。
命令格式:bashsudo docker restart <容器名或ID>
说明:
<容器名或ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释:这里重新启动了 tomcat_1 容器,容器状态从26秒前的 Up 变成了4秒前的 Up,可见应该是重开过一回了。
-
docker rm
删除已停止的容器,释放系统资源,需先确保容器不在运行中。
命令格式:bashsudo docker rm <容器名或ID>
说明:
<容器名或ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释: 这里用
dcoker rm
移除了 ubuntu_1 容器,可以看到移除后的容器已经无法用docker ps
命令找到了
🧩 2.1.2 容器系统操控命令
本节介绍的命令用于对已启动的容器进行交互、查看或文件操作,是日常维护和调试容器中最常用的工具。
-
docker exec
在运行中的容器中执行命令,常用于调试、进入容器内部操作或运行额外程序。
命令格式:bashsudo docker exec [-it] <容器名或容器ID> [启动程序]
说明:
[-i]
:保持标准输入流(stdin)开启,即使未连接终端。[-t]
:分配一个伪终端(TTY),与 -i 一起使用以实现交互式操作。<容器名或容器ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。[启动程序]
:容器内要执行的命令或程序,例如 /bin/bash、ls、top 等。
效果:
解释:这里用 docker exec 进入了 tomcat 容器,可以看到进入容器后能够正常进行交互查看容器内容
-
docker attach
附加到容器的主进程终端,显示容器当前的标准输出,可用于查看日志或与主进程交互。
命令格式:bashsudo docker attach <容器名或容器ID>
说明:
<容器名或容器ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
提示:其实 attach 也有很多可选参数,像
--no-stdin
之类的,但是开发或调试都基本上用不到。那这些参数设计出来是干什么的?我觉得是用来折磨客户的,为什么这么说,你看我写的第三节注意事项就知道了效果:
解释:这里用 dockere attach 进入了 ubuntu 容器,可以看到进入容器后能够正常进行交互查看容器内容
解释:这里用 docker attach 进入了 tomcat 容器,可以看到进入了以后不能输入任何信息只能看 tomcat 的日志,这是因为 tomcat 默认没有终端交互功能。要想看 tomcat 容器中的文件需要用 docker exec 命令
-
docker cp
在宿主机与容器之间复制文件或目录,支持双向操作。
命令格式:bashsudo docker cp <源路径> <目标路径>
说明:
<源路径>
:可以是宿主机路劲也可以是容器路径,如果是容器路径需要在路径前添加<容器名>:
。<目标路径>
:可以是宿主机路劲也可以是容器路径,如果是容器路径需要在路径前添加<容器名>:
。
效果:
解释:这里用了 docker cp 命令将 tomcat 容器中的 README.md 文件复制出来,可以看到当前路径下多了 README.md 文件
🔍 2.1.3 容器信息检查命令
本小节介绍用于检查 Docker 容器状态、资源使用情况和日志输出的常用命令,适用于日常监控、调试和排查容器运行状态。
-
docker ps
列出当前运行中的容器,显示容器的 ID、镜像、创建时间、状态、端口映射及名称等基础信息。
命令格式:bashdocker ps [-a] [-q]
说明:
[-a]
:列出所有容器,包括已停止的容器(不加这个参数 docker ps 仅显示运行中的容器)。[-q]
:仅输出容器 ID(常用于脚本中进一步处理)。
效果:
解释:这里依次使用了 docker ps 以及带
-a
和 带-aq
的 docker ps ,可以看到 docker ps 显示的信息根据参数的不同而产生的变化。这里使用 docker ps -aq 命令配合 docker stop 命令实现全部容器的停止,docker ps -aq 命令还可以和其他容器状态转换命令配合使用达到所有容器统一操作的效果。
-
docker top
查看指定容器内运行的进程信息,类似于 Linux 系统中的 ps 命令,展示 PID、用户、启动时间、CPU 使用情况等。
命令格式:bashdocker top <容器名或容器ID>
说明:
<容器名或容器ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释:这里利用 docker top 命令查看了 tomcat 容器内再跑的进程状态
-
docker stats
实时显示一个或多个容器的资源使用情况,包括 CPU 使用率、内存使用量/限制、网络 I/O、块设备 I/O 等。
命令格式:bashdocker stats [容器名或容器ID]
说明:
[容器名或容器ID]
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。如果不指定容器则默认监控所有正在运行的容器
效果:
解释:在执行了
docker status tomcat_1
命令以后就会进入这个状态界面,这里会详细的显示容器的 CPU 占用率和内存占用率,按下 Ctrl+C 可以退出这个界面
-
docker diff
显示自容器创建以来文件系统的变化,列出被添加(A)、删除(D)或修改(C)的文件或目录。
命令格式:bashdocker diff <容器名或容器ID>
说明:
<容器名或容器ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释:这里 docker diff 显示内容中 C 表示修改过的目录,A 表示新增的目录
-
docker logs
查看容器日志输出。
命令格式:bashdocker logs [-f] [--tail 行数] [--since 时间] [--timestamps] <容器名或容器ID>
说明:
[-f]
:实时输出日志内容(follow 模式,类似 tail -f)。[--tail 行数]
:仅显示指定数量的最新日志,例如 --tail 100。[--since 时间]
:显示自指定时间以来的日志,如 --since 10m(最近10分钟)。[--timestamps]
:在日志行前显示时间戳。<容器名或容器ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释:这里查看了10条 tomcat 的日志
-
docker port
显示容器内部端口和宿主机端口之间的映射关系,适用于验证服务暴露状态和网络通信设置。
命令格式:bashdocker port <容器名或容器ID>
说明:
<容器名或容器ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释:这里用 docker port 查看了 tomcat 容器的端口映射。
-
docker inspect
以 JSON 格式输出容器的详细配置信息,包括挂载卷、网络设置、环境变量、启动命令、IP 地址等。
命令格式:bashdocker inspect <容器名或容器ID>
说明:
<容器名或容器ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释:这里用 docker inspect 查看了 tomcat 容器的详细信息,这条命令的输出一般会很长,有时可能会冲掉好几个屏幕,建议配合 grep 命令过滤掉无用的信息。
🧱 2.2 镜像命令
🛠️ 2.2.1 镜像操作命令
本小节介绍 Docker 镜像的常用操作命令,涵盖从构建、打包、上传、下载到删除镜像的整个生命周期,适用于本地开发与远程部署场景。
-
docker commit
基于正在运行的容器生成新的镜像,常用于容器内手动修改后的持久化保存。
命令格式:bashdocker commit [-a] \ [-m] \ [--pause] \ <容器ID或容器名> \ <目标镜像名:标签>
说明:
[-a]
:指定镜像的作者信息。[-m]
:添加一条提交说明,用于描述镜像的变更内容[--pause]
:在提交时是否暂停容器(默认值为 true,推荐保持),可防止写入过程中状态不一致<容器名或容器ID>
:这里的容器名指的就是docker ps
中的 NAMES , ID 指的就是CONTAINER ID。<目标镜像名:标签>
:给镜像起个名字,顺便带个版本号。
效果:
解析:这里利用正在运行的 ubuntu 容器,生成了一个新的镜像 ubuntu1:1.0
-
docker pull
从远程镜像仓库(如 Docker Hub)拉取指定镜像到本地。
命令格式:bashdocker pull <镜像名:标签>
说明:
<镜像名:标签>
:你们公司 docker 仓库里的镜像名,以及版本号。
效果:
解释:这里我从公共仓库直接拉取了 nginx 镜像,如果是要到私有仓库拉取镜像需要先用 docker login 登录。
-
docker tag
为已有镜像打上新的标签(tag),可用于本地重命名或准备推送到私有仓库。
命令格式:bashdocker tag <源镜像名:标签> <目标镜像名:标签>
说明:
<源镜像名:标签>
:你在进行修改操作的镜像名称以及对应版本号。<源镜像名:标签>
:你想创建的新的镜像的名称以及版本号。
效果:
解释:这里可以通过 docker images 的信息看出,我将进行修改后的 tomcat 镜像打上标签,创建了一个新的镜像
-
docker push
将本地镜像上传到远程镜像仓库。
命令格式:bashdocker push <镜像名:标签>
说明:
<镜像名:标签>
:你要上传到公司 docker 仓库的镜像名,以及版本号。
效果:
解释:要推送镜像的前提是需要登录 docker,我这里登录了 docker Hub 将 huyulun/vim-net:1.0 这个镜像推送到远程仓库。
解释:推送成功后打开 docker hub 网站登录账号可以看到上传的镜像
-
docker build
根据指定路径下的 Dockerfile 构建新的镜像。
命令格式:bashdocker build -t <镜像名:标签> <路径>
说明:
<镜像名:标签>
:你要上传到公司 docker 仓库的镜像名,以及版本号。<路径>
:构建 docker 镜像的上下文路径(通常是含有 Dockerfile 的目录)
** 效果:**
解释:这里我利用当前目录下的 Dockerfile 文件构建了镜像,可以看到构建成功后新的镜像会显示在 docker images 中
-
docker save
将一个或多个镜像保存为本地 tar 包文件,方便分发或备份。
命令格式:bashdocker save -o <包名.tar> <镜像名:标签>
说明:
<包名.tar>
:给你的 tar 包起个名字。<镜像名:标签>
:你要打成 tar 包的镜像名,以及版本号。
效果:
解释:docker save 执行成功后会在当前路径下生成一个镜像的 tar 包
-
docker load
从本地 tar 包文件中导入镜像,常与 docker save 搭配使用。
命令格式:bashdocker load -i <镜像文件.tar>
说明:
<镜像文件.tar>
:你要导入的镜像文件 tar 包。
效果:
解释:这里我导入了当前目录下的 at5.tar 镜像包,可以看到 docker images 中多了一个 at5:1.0 的镜像
-
docker rmi
删除本地镜像(remove image),支持单个或多个镜像同时删除。
命令格式:bashdocker rmi <镜像名或ID> [...]
说明:
<镜像名或ID> [...]
:创建容器所使用的镜像的名字或ID,对应 docker images命令显示的 IMAGE ID 和 REPOSITORY 。可以一次性填写多个镜像名或ID。
提示:一般在专业的技术文档中[...]表示前面跟的那个参数的数量可以是单数也可以是复数
效果:
解释:对比前后的 docker images,可以看到我利用 docker rmi 删除了 at5:1.0 和 tomcat:1.1 两个镜像
🔍 2.2.2 镜像信息检查命令
镜像信息检查命令用于查看镜像的基本信息、详细配置以及远程仓库中可用的镜像资源,有助于开发者进行筛选、管理和调试。
-
docker search
用于在远程镜像仓库(如 Docker Hub)中搜索公开镜像。支持模糊匹配关键字,并返回镜像名称、描述、星级(Star 数)等信息,方便用户选择合适的基础镜像。
命令格式:bashdocker search <关键字>
说明:
- <关键字>:你要搜索的镜像的名字。
示例:
解释:这里列出来的就是你能 docker pull 到的公共镜像。该功能需要访问外网,并且只能搜索Docker Hub上的公共仓库。如果不擅长配置 Docker 服务的网络代理,可以直接上 Docker Hub 官网 搜索
-
docker images
/docker image ls
用于列出本地所有已下载的镜像,包括镜像仓库名(REPOSITORY)、标签(TAG)、镜像 ID、创建时间和占用空间等。
命令格式:bashdocker images docker image ls
示例:
解释:两个命令唯一的区别就是
docker images
可以少打一个空格和一个 l 。
-
docker inspect
显示镜像的底层详细信息,返回 JSON 格式的数据,包括镜像的创建时间、分层信息、配置参数、标签、构建指令等。该命令非常适用于调试镜像构建问题或验证构建元数据。
命令格式:bashdocker inspect <镜像名或镜像ID>
说明:
- <镜像名或镜像ID>:你要查看的目标镜像的名字或ID
示例:
解释:这条命令会显示一串很长的 JSON 数组,建议配合 grep 搜索命令使用,例如
sudo docker inspect tomcat | grep -A 10 "Layer"
🏢 2.3 Docker 网络命令
🕸️ 2.3.1 Docker 组网命令
Docker 支持自定义网络管理功能,允许用户创建、连接、断开和删除网络资源,从而灵活地配置容器之间的通信方式。
-
docker network create
用于创建一个自定义的 Docker 网络,支持指定网络驱动类型、子网范围、网关地址等参数。
命令格式:
bashdocker network create \ --driver <网络驱动> \ --subnet <子网地址/掩码> \ --gateway <网关地址> \ <网络名称>
说明:
- --driver <网络驱动>:这里的网络驱动需要在 bridge, host, none 之中三选一。
- --subnet <子网地址/掩码>:根据你的组网策略选择子网地址和掩码,不懂的话就写
192.168.0.0/16
。 - --gageway <网关地址>: 根据你的地址填写网关地址,不懂的话就写
192.168.0.1
。 - <网络名称>:给你自定义创建的网络起个帅气的名字。
效果:
解释:这里创建完以后显示的一长串是镜像的完整 ID,放心,不是乱码,没有报错。
-
docker network rm
用于删除一个或多个未被使用的 Docker 网络。如果某个网络中仍有容器在运行,将无法被删除,必须先断开容器连接或停止容器。
命令格式:
bashdocker network rm <网络名或ID>
说明:
- <网络名或ID>:这里的网络名指的就是
docker network ls
中的 NAME , ID 指的就是 NETWORK ID。
效果:
- <网络名或ID>:这里的网络名指的就是
-
docker network connect
将一个运行中的容器连接到指定的 Docker 网络,使其具备与该网络中其他容器通信的能力。一个容器可以同时连接到多个网络。
命令格式:
bashdocker network connect <网络名或ID> <容器名或ID>
说明:
- <网络名或ID>:这里的网络名指的就是
docker network ls
中的 NAME , ID 指的就是 NETWORK ID。 - <容器名或ID>:这里的容器名指的就是
docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释:命令执行完成后不会显示任何信息,但是可以通过 docker inspect 来确认容器是否已经成功加入网络
- <网络名或ID>:这里的网络名指的就是
-
docker network disconnect
将容器从指定的 Docker 网络中断开。断开后该容器将无法再通过该网络与其他容器通信。
命令格式:
bashdocker network disconnect <网络名或ID> <容器名或ID>
说明:
- <网络名或ID>:这里的网络名指的就是
docker network ls
中的 NAME , ID 指的就是 NETWORK ID。 - <容器名或ID>:这里的容器名指的就是
docker ps
中的 NAMES , ID 指的就是CONTAINER ID。
效果:
解释:命令执行完成后不会显示任何信息,但是可以通过 docker inspect 来确认容器是否已经成功从网络中移除
- <网络名或ID>:这里的网络名指的就是
🔍 2.3.2 Docker 网络信息检查命令
Docker 网络信息检查命令主要用于查看当前系统中存在的网络资源及其详细配置,帮助用户理解容器之间如何连接、隔离以及与外部通信的方式。
-
docker network ls
查看网络列表。
命令格式:bashdocker network ls
效果:
解释:这里显示的 NAME 为 bridge, host, none 的网络为 Docker 自动创建的网络。bridge 网络中的容器会被分配虚拟 IP ; host 网络中的容器会共享宿主机的 IP ; none 网络中的容器没有 IP。创建容器的时候不跟
--net
参数的话默认会被分配到 bridge 网络中。
-
docker network inspect
查看网络配置详情。
命令格式:
bashdocker inspect <网络名或ID>
说明:
- <网络名或ID>:这里的网络名指的就是
docker network ls
中的 NAME , ID 指的就是 NETWORK ID
效果:
- <网络名或ID>:这里的网络名指的就是
🧰 2.4 Docker 仓库命令
在实际开发或部署过程中,企业通常会搭建私有镜像仓库(如 Harbor、JFrog Artifactory),用于集中管理项目镜像、控制权限、提升部署效率。而默认情况下,Docker 使用的是官方镜像仓库 Docker Hub。以下是与仓库认证相关的基本命令:
-
docker login
用于登录镜像仓库,以便后续拉取(
pull
)或推送(push
)镜像。登录过程会将凭据保存在本地配置文件中(如~/.docker/config.json
),用于身份验证。命令格式:
bashdocker login -u <用户名> <仓库地址>
说明:
- -u <用户名> :公司给你分配的 Docker 仓库账号,或者是你在 Docker Hub 上注册的账号。
- <仓库地址>:你们公司的仓库地址。如果是登录 Docker Hub,仓库地址可省略。
效果:
解释:命令执行后系统会提示输入密码,输入完成后按回车即可登录。这里我用自己的账号登录 Docker Hub。登录成功后,即可在私有仓库中执行镜像上传、下载等操作。
提示:其实docker login -u <用户名> -p <密码>
可以一步登录,但是这样我的密码就被你知道了)
-
docker logout
用于登出当前登录的镜像仓库账户,清除本地保存的认证信息。
命令格式:
bashdocker logout [仓库地址]
说明:
-
仓库地址\]:你们公司的仓库地址。如果未指定地址,则默认登出 Docker Hub。
-
⚠️ 3. 注意事项
🍁 docker build 构建镜像失败 exit code:100
再使用 Dockerfile 构建镜像的时候出现以下情况

这是因为 Dockerfile 中有下载安装软件的指令,而 Ubuntu:latest 镜像默认软件源 http://ports.ubuntu.com/ubuntu-ports
是失效的,需要切换到国内有效的软件源,才能进行软件仓库的更新以及软件的下载和安装。但是我们在构建镜像的时候又无法进入容器修改配置文件,所以只能采取通过 sed 命令在系统安装软件之前强制修改配置文件内容的方法了:
Dockerfile
RUN sed -i -e 's|http://ports.ubuntu.com/ubuntu-ports|http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports|g' /etc/apt/sources.list.d/ubuntu.sources && \
apt-get update && \
apt-get install -y vim
💦 docker 容器起不来
如果你用 docker start 启动容器时遇到以下情况

或者用 docker run 启动容器时遇到以下情况

那么你需要检查你的容器内部有没有持续运行的进程。如果你的容器不是服务类型的(比如 tomcat 或 nginx ),而且你在启动的时候没有添加 -it
参数,那么容器启动后会因为没有持续运行的进程而被 docker 关闭。所以一般不管时什么性质的容器,只要他不报错,我都会在启动容器的时候加上 -it
参数。
💔Tomcat 容器 docker attach 卡死
如果你通过 docker attach 链接 Tomcat 容器时遇到以下情况

光标就这样卡在那儿不动了。这个时正常情况,因为 tomcat 是服务性质的容器,即使你添加了 -it
参数也无法在他的主进程中和他进行交互,这时候正确的做法应该是按下 Ctrl+C 然后使用带 it
参数的 docker run 启动 tomcat ,这样才能进入到 tomcat 容器中。
但如果你闲的没事使用了 docker attach 命令的 --no-stdin
参数去链接 tomcat 容器

那么恭喜你,发现了一个能够卡死终端的新方法。在这种情况下,你无论输入任何指令终端都不会有相应,包括 Ctrl+C 和 Ctrl+P+Q 。原因是 docker attach 的 --no-stdin 参数会让容器无视一切标准输入中的指令,这相当于给本来就不怎么聪明的 tomcat 容器又灌了一瓶毒奶粉,这是真的没救了,只能重开终端了。
至于为什么会有这种参数,我个人猜测是某些开发者有特殊的需求,希望客户在使用容器的时候,出于安全的角度(我就是想折磨客户😈),防止客户误输入指令导致容器状态异常,才设计出来的。