Docker 的镜像与容器

文章目录

一、Docker 镜像

下载镜像

Docker Pull 命令用来从仓库下载镜像。

bash 复制代码
docker pull docker.io/library/nginx:latest

一个 Docker 镜像下载地址包含 4 部分内容:

  • docker.io: registry:仓库地址 / 注册表,如果是 Docker 官方仓库,则可以省略这个地址。
  • library: 命名空间(镜像作者),为了防止不同用户上传同一个名字的镜像 发生冲突。"library" 是 docker 官方仓库的命名空间,这个空间下的所有镜像都是由 Docker 官方维护。如果是官方的命名空间 则可以省略不写
  • nginx: 镜像名
  • latest: 标签名、版本号。写 "latest" 或者不写 表示获取最新版本的镜像。

镜像库

repository: 镜像库,存放一个镜像的不同版本,"docker.io/library/nginx" 就是一个镜像库。

简化后的命令如下:

bash 复制代码
# 从 Docker 官方仓库的官方命名空间里面下载最新的 Nginx Docker 镜像
docker pull nginx

其他例子:

bash 复制代码
# 从 docker.n8n.io 的私有仓库下载 n8nio 上传的 n8n 镜像
docker pull docker.n8n.io/n8nio/n8n

Docker Hub

docker 官方的镜像仓库地址为 https://hub.docker.com可以在这个上面搜索自己需要的镜像,标有 "Docker Offcial Images" 表示 Docker 官方维护的镜像。

如果打不开 可以通过 https://docker.fxxk.dedyn.io/ 镜像站来搜索镜像。

镜像源配置

在国内的网络环境中,如果执行 docker pull可能会出现 下载失败的问题,可以参考这篇文档配置镜像站解决:

复制代码
https://github.com/tech-shrimp/docker_installer?tab=readme-ov-file#2-pull%E9%95%9C%E5%83%8F

拉取特定架构的镜像

cmd 复制代码
docker pull --platform=xxx nginx

默认情况下,docker 会选择当前宿主机 CPU 架构的镜像,大部分情况下我们不需要关注这个参数。

Mac 目前的 M 系列 CPU 都是 arm 架构的,但在运行 AMD64 架构的容器时,会自动调用 QEMU 来模拟 x86_64 指令集,从而实现兼容 AMD64 的镜像,不过可能会存在一些兼容性问题 以及额外的性能开销。

查看镜像

cmd 复制代码
docker images

使用此命令可以查看 所有 Pull 到本地的镜像

删除镜像

cmd 复制代码
docker rmi [镜像标识]

# 例如
docker rmi nginx

使用此命令可以删除 pull 到本地的镜像,镜像标识可以选择 镜像的 ID(image id)或者镜像的名称(repository)

二、Docker 容器

创建并运行容器

cmd 复制代码
docker run [镜像标识]

使用 run 命令 可以通过 镜像创建一个容器,并启动它。镜像标识可以是 镜像 ID 或者镜像名称。

例如:docker run nginx 就是创建一个 Nginx 容器。

docker pull 命令可以省略,直接使用 docker run 运行,如果 docker 发现本地没有这个镜像 则会自动拉取。

分离模式

默认情况下 docker run 创建容器后会导致当前终端挂起,不能进行其他操作,可以增加 -d 参数 表示容器在后台运行,不阻塞当前窗口。

cmd 复制代码
C:\Users\xinjie> docker run redis
Starting Redis Server
1:C 25 Dec 2025 06:07:08.379 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 25 Dec 2025 06:07:08.380 * Redis version=8.4.0, bits=64, commit=00000000, modified=1, pid=1, just started
1:C 25 Dec 2025 06:07:08.380 * Configuration loaded
1:M 25 Dec 2025 06:07:08.381 * monotonic clock: POSIX clock_gettime
1:M 25 Dec 2025 06:07:08.384 * Running mode=standalone, port=6379.

自定义容器名称

cmd 复制代码
docker run -d -name my-redis redis

容器的名称和 容器 ID 的效果是等价的,但是名字更方便记忆。

端口映射

容器的网络和宿主机的网络是隔离的,例如运行了一个 Nginx 容器,容器内的 Nginx 监听了 80 端口。这时通过宿主机的 80 端口是无法访问到 Nginx 服务的。

所以需要 -p {宿主机端口}:{容器端口} 命令进行映射,例如 -p 8080:80 标识将 Nginx 容器的 80 端口映射到宿主机的 8080 端口。

目录映射(绑定挂载)

与端口映射类似的就是目录映射,将容器外和容器内的目录进行绑定,容器内对文件的修改会影响宿主机的文件夹,宿主机的修改也会影响容器内文件夹。这种目录也被称为 挂载卷,他的最大作用是数据的持久化。 当容器删除时,容器内的所有数据都会被删除,但通过挂载卷映射到宿主机的文件夹将得以保留。

cmd 复制代码
docker run -d -p 8080:80 -v ./:/usr/share/nginx/html nginx

使用绑定挂载的时候,宿主机的文件会暂时覆盖掉容器内的目录。除了这种用法 还有一种叫 Docker 卷,可以在容器之间共享和重用。

环境变量

可以在命令行通过 -e 参数传递环境变量到容器内部,例如创建一个数据库应用,需要在 创建容器时,就指定数据库的账户、密码等信息。

cmd 复制代码
docker run -d -p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=tech \
-e MONGO_INITDB_ROOT_PASSWORD=dbkuaizi \
mongo

如果不知道容器的环境变量有哪些,可以在 Docker Hub 上搜索一下,或者去 Github 上看一下 readme 文档,都有详细的描述。

进入容器

cmd 复制代码
docker run -it alpine

通过 -it 参数可以在创建一共容器时,同时进入容器内部的终端。

退出删除

cmd 复制代码
docker run -it --rm alpine

--rm 表示当退出容器时,自动删除这个容器。一般和 -it 命令配合使用

容器重启策略

cmd 复制代码
docker run -d --restart always nginx

--restart 参数用来表示 容器在停止时的重启策略,它有两个选项:

  • always: 只要容器停止了,就会立即重启。包含容器因为内部错误崩溃,或者宿主机断电等场景
  • unless-stopped: 与 always 类似,唯一区别是:手动停止的容器不会尝试重启了

创建容器

cmd 复制代码
docker create nginx

run 命令功能类似,区别在于只创建容器,不自动启动。

容器列表

cmd 复制代码
C:\Users\xinjie>docker ps
CONTAINER ID   IMAGE           COMMAND                   CREATED       STATUS       PORTS                                     NAMES
c4acace9689b   vue3-vue3-app   "/docker-entrypoint...."   4 hours ago   Up 4 hours   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   vue3-app

ps 是 Process Status (进程状态) 的缩写,也是 Linux 上的一个经典命令,用于查看进程的状态信息。这一命令也被继承到 Docker 里面了

这些列含义如下:

  • CONTAINER ID 容器 ID,每个容器在创建时会生成一个唯一的 ID
  • IMAGE 基于那个镜像创建出来的
  • CREATED 镜像创建时间
  • STATUS 镜像当前状态
  • PORTS 镜像使用端口
  • NAMES 容器的名字,如果创建容器时没有指定名字,系统就会随机分配一个。

增加 -a 参数可以看到所有的容器,包括正在运行的和已经停止的。

启停容器

每次使用docker run运行都会创建一个新的容器,如果我们需要对同一个容器进行持续的操作,可以通过 容器的启停命令来控制。

cmd 复制代码
# 启动容器
docker start {容器标识}
# 停止容器
docker stop {容器标识}

使用 start 启停容器的时候,不需要再传递创建容器时的 端口映射、挂载卷、环境变量等参数都不需要重新写了,docker 已经自动保存了,重新启动可以按照原因运行。

删除容器

cmd 复制代码
docker rm {容器标识}

使用 rm 命令可以删除容器,如果要删除运行中的容器 需要加 -f 参数强制删除。

容器内部

cmd 复制代码
# 进入容器内部
docker exec -it {容器标识} bash

使用 exec -it 命令 可以进入容器,在容器内部执行 shell 命令

shell 复制代码
docker exec {容器标识} {shell 命令}

也可以通过这种方式 在容器外部执行容器内部的命令

shell 复制代码
# 查看容器 alpine 中的进程信息
docker exec alpine ps -ef

注意 docker 镜像为了尽可能缩小镜像体积,内部一般是一个极简的操作系统,很多系统工具、基础命令都是缺失的

查看创建信息

cmd 复制代码
docker inspect {容器标识}

使用这个命令可以看到容器的所有信息,输出的是一个 JSON 格式,可以直接丢给 ai 帮忙解析

容器日志

cmd 复制代码
docker logs {容器标识}

这个命令可以看容器的日志,加上 -f 命令,可以持续输出,滚动查看。


👉点击进入 我的网站

相关推荐
Mr. Cao code2 小时前
Docker匿名数据卷实战指南
运维·ubuntu·docker·容器
Blossom.1182 小时前
AI Agent的长期记忆革命:基于向量遗忘曲线的动态压缩系统
运维·人工智能·python·深度学习·自动化·prompt·知识图谱
HehuaTang2 小时前
requests 调大并对齐 limits 提升POD高负载场景下性能
java·docker·kubernetes
shawnyz2 小时前
RHCSE--ansible1-入门和模块
linux·运维·ansible
星辰&与海3 小时前
Docker 资源调度限制
docker
陕西小伙伴网络科技有限公司3 小时前
CentOS-7 编译glibc-2.29
linux·运维·centos
清风拂山岗 明月照大江3 小时前
MySQL运维
运维·数据库·mysql
米高梅狮子3 小时前
02. 配置DNS服务器
运维·服务器·centos
宴之敖者、4 小时前
Linux——指令
linux·运维·服务器