文章目录
- 镜像仓库
- 容器生命周期
- 容器
- 容器清理
- 镜像类
- 部分重要命令详解
-
- [1. `docker run`:运行容器](#1.
docker run:运行容器) - [2. `docker exec`:进入运行中的容器](#2.
docker exec:进入运行中的容器) - [3. `docker build`:自定义镜像](#3.
docker build:自定义镜像) - [4. `docker logs`:查看容器日志](#4.
docker logs:查看容器日志) - [5. `docker diff`:查看指定容器对系统文件的更改情况](#5.
docker diff:查看指定容器对系统文件的更改情况) - [6. `docker cp`:容器数据和宿主机的数据拷贝](#6.
docker cp:容器数据和宿主机的数据拷贝) - [7. `docker export`和`docker import`:](#7.
docker export和docker import:)
- [1. `docker run`:运行容器](#1.
wen♥的提示
在学习这些命令前,务必先了解docker的相关概念,不然可能云里雾里。
镜像仓库
| 命令 | 主要作用 | 常用示例 |
|---|---|---|
docker login |
登录到一个 Docker 镜像仓库 | docker login (登录 Docker Hub) |
docker pull |
从镜像仓库拉取(下载)一个镜像 | docker pull nginx:latest |
docker push |
将一个本地镜像推送(上传)到镜像仓库 | docker push myusername/my-app:v1 |
docker search |
在 Docker Hub 中搜索镜像 | docker search ubuntu (用的少,一般直接官网看) |
docker logout |
从一个 Docker 镜像仓库登出 | docker logout |
容器生命周期
| 命令 (Command) | 描述 (Description) | 使用示例 (Example) |
|---|---|---|
docker create |
创建容器 :创建容器但不立即启动,容器进入 created 状态。 |
docker create --name my-nginx nginx_image |
docker run |
创建并运行 :一步完成创建和启动,容器直接进入 running 状态。 |
docker run -d -p 80:80 --name web nginx_image |
docker start |
启动容器 :将一个已创建或已停止的容器转为 running 状态。 |
docker start my-nginx_contianer |
docker stop |
停止容器 :将一个运行中的容器优雅地 转入 stopped 状态。 |
docker stop web_container |
docker kill |
强制停止容器 :强制 让容器转入 stopped 状态。(退出速度很快,但是不推荐,因为可能引起数据丢失,除非你不要了) |
docker kill web |
docker restart |
重启容器 :将一个运行中的容器先停止再启动,最终进入 running 状态。 |
docker restart web_container |
docker pause |
暂停容器 :将容器内的所有进程挂起,容器进入 paused 状态。 |
docker pause web_container |
docker unpause |
恢复容器 :取消暂停状态,让容器恢复到 running 状态。 |
docker unpause web_container |
docker rm |
删除容器 :将一个处于 stopped 或 created 状态的容器永久删除。 |
docker rm my-nginx_container |
容器
| 命令 (Command) | 功能 (Function) | 使用示例 (Example) |
|---|---|---|
docker create |
创建一个新容器,但不立即启动。 | docker create --name my-nginx nginx |
docker run |
创建并立即启动一个新容器。 | docker run -it --name my-ubuntu ubuntu /bin/bash |
docker attach |
连接到一个正在运行的容器的终端。 | docker attach my-ubuntu |
docker commit |
根据容器的当前状态创建一个新的镜像。(这个用的很少,一般通过Dockerfile创建镜像) | docker commit my-ubuntu my-ubuntu-image:v1 |
docker cp |
在容器和宿主机之间复制文件或文件夹。 | docker cp /root/index.html my-nginx:/usr/share/nginx/html/ 或 docker cp docker_nginx:/docker_dir/html /root |
docker diff |
检查容器文件系统与镜像相比发生的变化。 | docker diff my-nginx |
docker exec |
在一个正在运行的容器内部执行命令。 | docker exec -it my-ubuntu ls -l / |
docker export |
将容器的文件系统导出为一个 .tar 压缩包。 |
docker export -o my-ubuntu.tar my-ubuntu |
docker inspect |
查看一个或多个容器的详细配置信息。 | docker inspect my-nginx |
docker kill |
强制停止(杀死)一个或多个正在运行的容器。 | docker kill my-nginx |
docker logs |
获取一个容器的日志输出。 | docker logs -f my-nginx |
docker ps |
列出所有正在运行的容器。 | docker ps -a (列出所有容器) |
docker pause |
暂停一个容器内的所有进程。 | docker pause my-nginx |
docker port |
查看容器的端口映射情况。 | docker port my-nginx |
docker prune |
清理所有已停止的容器。 | docker container prune |
docker rename |
重命名一个已存在的容器。 | docker rename my-nginx my-web-server |
docker restart |
重启一个或多个容器。 | docker restart my-nginx |
docker rm |
删除一个或多个容器。 | docker rm my-ubuntu |
docker start |
启动一个或多个已经停止的容器。 | docker start my-nginx |
docker stats |
实时显示容器的资源使用情况(CPU, 内存等)。 | docker stats |
docker stop |
优雅地停止一个或多个正在运行的容器。 | docker stop my-nginx |
docker top |
显示一个运行中容器内部的进程。 | docker top my-nginx |
docker unpause |
恢复一个被暂停的容器内的所有进程。 | docker unpause my-nginx |
docker update |
更新一个或多个容器的配置。 | docker update --cpus="2" my-nginx |
docker wait |
阻塞并等待一个或多个容器停止 容器停止后,返回状态码,一般CI/CD的脚本用的多。 | docker wait my-nginx1 my-nginx2 |
容器清理
关于
悬空文件的概念解释:悬空意思是不被任何镜像或者容器等别的程序所使用,类似于c++中的野指针,没有任何用处了,只会占用磁盘空间,因此自然应该被删除。
| 命令 | 清理对象 | 详细说明 | 常用场景/注意事项 |
|---|---|---|---|
docker container prune |
已停止的容器 | 只删除所有已经停止的容器。对正在运行的容器没有影响。 | 最安全、最常用的清理命令,用于回收容器占用的少量资源。 |
docker image prune |
悬空镜像 (默认) | 默认只删除悬空镜像 (即没有标签,且不被任何容器引用的镜像)。使用 -a (--all) 标志可以删除所有未被任何容器使用的镜像。 |
释放由旧的、无用的镜像占用的磁盘空间。-a 选项非常有用但需确认镜像不再需要。 |
docker volume prune |
悬空数据卷 | 删除所有当前未被任何容器(包括已停止的容器)使用的数据卷。 | 谨慎使用! 确认不再需要持久化数据时,用它来回收磁盘空间。docker volume rm <卷名1> <卷名2..> |
docker network prune |
未使用的网络 | 删除所有未被任何容器使用 的自定义网络。不会删除 Docker 默认的 bridge, host, none 网络。 |
清理因实验或容器被强制删除而遗留的网络配置。 |
docker system prune |
多种资源 | 这是一个一键清理 命令,会执行 container prune, image prune (悬空), 和 network prune。默认不清理数据卷 。使用 --volumes 标志会额外执行 volume prune。 |
定期对开发环境进行全面清理。在生产环境中使用 --volumes 标志时要极度小心! |
镜像类
| 命令 (Command) | 描述 (Description) | 使用示例 (Example) |
|---|---|---|
docker images |
列出本地存储的所有镜像。 | docker images |
docker build |
使用 Dockerfile 构建一个新的镜像。 | docker build -t my-app:1.0 . |
docker pull |
从远程仓库(如 Docker Hub)拉取(下载)一个镜像。 | docker pull nginx:latest |
docker push |
将一个本地镜像推送(上传)到远程仓库。 | docker push myusername/my-app:v1 |
docker rmi |
删除一个或多个本地的镜像。 | docker rmi nginx:latest |
docker tag |
为一个已存在的镜像创建一个新的标签(别名)。 | docker tag nginx:latest my-nginx:v1.0 |
docker save |
将一个或多个镜像打包成一个 .tar 归档文件。 |
docker save -o nginx.tar nginx:latest |
docker load |
从一个 .tar 归档文件加载一个镜像。 |
docker load -i nginx.tar (-i是input的意思,把对应的压缩文件转成镜像) |
docker inspect |
查看一个镜像的详细配置信息。 | docker image inspect nginx:latest |
docker history |
查看镜像的构建历史(分层) | docker history ubuntu:latest |
部分重要命令详解
1. docker run:运行容器
docker run 是 Docker 中功能最强大、选项最多的命令。它实际上是 docker create 和 docker start 两个命令的组合。
-
幕后机制 :当你执行
docker run时,Docker 在后台执行了以下操作:- 检查本地是否存在指定的镜像,如果不存在,则从远程仓库
pull下来。 - 使用该镜像创建一个新的容器(等同于
docker create)。 - 分配文件系统,并挂载一个可读写的层。
- 分配网络接口,并从宿主机桥接一个 IP 地址。
- 启动容器(等同于
docker start)。 - 执行你在命令中指定的应用程序或命令。
- 检查本地是否存在指定的镜像,如果不存在,则从远程仓库
-
常用选项:
| 选项 (Option) | 作用 | 示例 |
|---|---|---|
-d, --detach |
后台运行:让容器在后台运行,并返回容器 ID。这是运行服务的标准姿势。 | docker run -d nginx |
-it |
交互式终端 :-i (interactive) 保持标准输入打开,-t (tty) 分配一个伪终端。通常组合使用,用于进入容器内部进行交互。 |
docker run -it ubuntu /bin/bash |
-p |
端口映射 :将宿主机的端口映射到容器的端口。格式为 宿主机端口:容器端口。 |
docker run -d -p 8080:80 nginx (访问宿主机的 8080 端口即访问容器的 80 端口) |
-v, --volume |
数据卷挂载 :将宿主机的目录挂载到容器内,实现数据持久化。格式为 宿主机绝对路径:容器内路径。 |
docker run -d -v /my/html:/usr/share/nginx/html nginx (将宿主机的 /my/html 目录内容同步到容器的 Nginx 网站根目录) |
--name |
指定容器名称:为容器指定一个易于记忆的名称,方便后续操作。 | docker run -d --name my-web-server nginx |
--rm |
自动删除:当容器退出时,自动删除该容器。常用于测试或一次性任务。 | docker run --rm ubuntu echo "Hello World" |
-e, --env |
设置环境变量:在容器内设置环境变量,常用于传递配置信息。 | docker run -d -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql |
--link |
与其他容器进行网络连接【已废弃】: 原理是在/etc/hosts路径下生成 对应的域名,这样输入对应名称就可以解析到指定ip。不过这种链接方式是单向的! | docker run -it --name 'app2' --link app1:网络名称 新容器名称:tag /bin/bash |
2. docker exec:进入运行中的容器
当容器在后台运行时(使用 -d 选项),我们如何与它交互?docker exec 就是答案。
-
幕后机制 :
docker exec会在一个已经运行的容器内部 启动一个新的进程。 -
常用选项与示例 :
最常见的用法是结合
-it获取一个交互式的 Shell:bash# 在名为 my-web-server 的容器中启动一个 bash 终端,指定/bin/bash作为shell解释器 docker exec -it my-web-server /bin/bash你也可以用它来执行单个命令,而无需进入容器:
bash# 查看 my-web-server 容器内 /etc 目录的文件列表 docker exec my-web-server ls /etc
3. docker build:自定义镜像
docker build 命令通过读取 Dockerfile 文件的指令来自动构建镜像。
-
幕后机制:
- Docker 客户端将
Dockerfile所在目录(称为"构建上下文")的所有文件打包发送给 Docker守护进程。 - 守护进程逐行解析
Dockerfile的指令。 - 每执行一条指令,就在上一层的基础上创建一个新的镜像层。
- Docker 会利用缓存机制,如果某条指令及其依赖文件没有变化,会直接使用之前构建的缓存层,从而大大加快构建速度。
- Docker 客户端将
-
常用选项:
| 选项 (Option) | 作用 | 示例 |
|---|---|---|
-t, --tag |
命名和打标签 :为构建好的镜像指定一个 名称:标签。这是最重要的选项。 |
docker build -t my-app:1.0 . |
. (末尾的点) |
构建上下文路径 :指定 Dockerfile 所在的目录。. 表示当前目录。 |
docker build -t my-app:1.0 . |
-f, --file |
指定 Dockerfile 文件 :如果你的 Dockerfile 文件名不是 Dockerfile,或者不在当前目录,用此选项指定。 |
docker build -f /path/to/MyDockerfile -t my-app . |
--no-cache |
禁用缓存:强制 Docker 在构建时不使用任何缓存,确保所有指令都重新执行。 | docker build --no-cache -t my-app:1.0 . |
4. docker logs:查看容器日志
对于后台运行的服务,查看日志是定位问题的唯一途径。
-
幕后机制 :
docker logs命令会获取并显示容器主进程的标准输出 (stdout) 和标准错误 (stderr)。 -
常用选项:
| 选项 (Option) | 作用 | 示例 |
|---|---|---|
-f, --follow |
实时跟踪 :持续输出日志,类似于 tail -f 命令,方便实时监控。 |
docker logs -f my-web-server |
--tail |
查看末尾日志:只显示日志的最后 N 行。 | docker logs --tail 100 my-web-server |
--since |
显示最近某段时间的日志(m是分钟) | docker logs --since 15m <容器名称或ID> |
5. docker diff:查看指定容器对系统文件的更改情况
bash
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1f43583dbef nginx:latest "/docker-entrypoint...." 15 minutes ago Up 15 minutes 80/tcp oom_st
docker diff $(docker ps -q)
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
C /run
A /run/nginx.pid
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
如上,查看了nginx容器对linux文件的修改情况:
- A(Added):表示这个文件原始镜像不存在,是启动容器后新增的
- C(Changed):原始镜像含有这个文件,但是运行期间修改了该文件
- D(Deleted):删除了原始镜像的指定文件
6. docker cp:容器数据和宿主机的数据拷贝
1、容器->宿主机
以nginx为例,我们把nginx的/usr/share/nginx/html/index.html从容器中拷贝出来:
bash
docker ps #查看nginx容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1f43583dbef nginx:latest "/docker-entrypoint...." 29 minutes ago Up 29 minutes 80/tcp oom_st
docker exec -it $(docker ps -aq) /bin/bash #进入nginx容器,查看是否含有index文件
cd /usr/share/nginx/html
ls -lh
total 8.0K
-rw-r--r-- 1 root root 497 Oct 28 12:05 50x.html
-rw-r--r-- 1 root root 615 Oct 28 12:05 index.html #有index文件
pwd
/usr/share/nginx/html # 获取地址
exit #从容器交互界面退出
docker cp $(docker ps -aq):/usr/share/nginx/html/index.html ./ #执行拷贝命令
Successfully copied 2.56kB to /root/./
ls -lh | grep index
-rw-r--r-- 1 root root 615 Oct 28 20:05 index.html # 拷贝成功
2、宿主机->容器
加入我们想把nginx容器的默认页面替换成这样:

操作步骤:
bash
ls -lh | grep index
-rw-r--r-- 1 root root 615 Oct 28 20:05 index.html #我们要替换的宿主机上的index.html
docker cp ./index.html $(docker ps -aq):/usr/share/nginx/html #执行拷贝
Successfully copied 2.56kB to c1f43583dbef:/usr/share/nginx/html
curl localhost # 查看是否生效
<!DOCTYPE html>
<html>
<head>
<title>Welcome to hyy blog</title> # <<<<---生效了
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to hyy blog</h1>
7. docker export和docker import:
这一组命令实际用的很少,了解即可
这两个命令是针对容器使用的。docker export把正在运行或者停止的容器,打包成tar文件;docker import可以把对应的tar文件转为新的容器。
这里转化的容器有一下特点:
- 比原有容器内存要小一些(结构扁平化),因为它不会存储构建历史
- 丢失CMD启动命令以及环境变量等元数据
- 和
docker save/docker load的tar文件不可混用
操作方式:
bash
docker export -o oom_st.tar oom_st #镜像转tar文件
ls -lh
total 649M
-rw------- 1 root root 147M Feb 1 16:33 oom_st.tar
docker import oom_st.tar my_oom_nginx:v1 #导出为镜像
sha256:59ae3d65ef77e97f215482f35b58d73bf729ac35590506c7cc0ad85dfebc371e
docker images #查看是否导出
REPOSITORY TAG IMAGE ID CREATED SIZE
my_oom_nginx v1 59ae3d65ef77 About a minute ago 150MB