1. 首页 > 技术教程 > 正文

容器小白入门:镜像、容器、仓库的核心逻辑图解

容器小白入门:镜像、容器、仓库的核心逻辑图解

很多人在学习容器技术时,被镜像、容器、仓库这三个概念绕晕了。别急,这篇文章用最直白的方式,配合图解逻辑,让你一次性搞懂它们是什么、怎么用。如果你正在看主机选的 Linux 教程,或者刚接触服务器运维,这篇文章就是你的第一把钥匙。

容器小白入门:镜像、容器、仓库的核心逻辑图解的图片

一、镜像、容器、仓库分别是什么?

镜像:一个只读的“安装包”

镜像(Image)就相当于一个光盘或 ISO 文件。它包含了运行某个应用所需的一切:代码、运行时环境、系统工具、库文件、配置文件。镜像一旦创建,就不能直接修改,只能基于它创建新的版本。

拉取一个官方的 Nginx 镜像

docker pull nginx:latest

查看本地已有的镜像

docker images

容器:镜像的“运行实例”

容器(Container)是从镜像启动的进程。你可以把镜像比作一个类,容器就是它的实例。每个容器有独立的文件系统、网络和进程空间,但共享宿主机的内核。你可以在容器里修改文件、安装软件,但重启容器后,这些修改默认会丢失——除非你把数据写到挂载卷里。

从 nginx 镜像启动一个容器,名字叫 web1

docker run -d –name web1 -p 8080:80 nginx:latest

查看运行中的容器

docker ps

仓库:存放和分发镜像的“网盘”

仓库(Repository)是集中存储镜像的地方。最常用的是 Docker Hub,还有阿里云、腾讯云、GitHub Container Registry 等。你可以从仓库拉取公共镜像,也可以上传自己的私有镜像。

从 Docker Hub 拉取 Ubuntu 镜像

docker pull ubuntu:22.04

给本地镜像打标签,准备推送到自己的仓库

docker tag myimage:latest myrepo/myimage:v1
docker push myrepo/myimage:v1

二、三者的关系图解

简单说:**镜像存储在仓库里,容器是镜像的运行态。**

画个逻辑图:

仓库 (Registry) → 拉取镜像 (Image) → 启动容器 (Container)
↑ ↓
构建新镜像 ←—— 修改容器后提交

• 从仓库拉取镜像到本地。

• 用镜像创建并启动容器。

• 在容器里做修改后,可以 commit 成一个新镜像。

• 新镜像可以 push 回仓库。

三、常见操作和排障

拉取镜像慢或失败

国内拉 Docker Hub 镜像经常卡住。解决办法是配置镜像加速器。

编辑 Docker 配置文件

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://docker.mirrors.ustc.edu.cn”]
}
EOF

重启 Docker 服务

sudo systemctl daemon-reload
sudo systemctl restart docker

容器启动后立刻退出

最常见原因是容器内的主进程没有保持前台运行。比如启动一个 Ubuntu 容器,默认 bash 执行完就退出了。

错误示范:容器启动后立刻退出

docker run ubuntu:22.04

正确做法:让 bash 保持前台运行

docker run -it ubuntu:22.04 /bin/bash

容器内修改文件后丢失

容器默认是临时性的,所有修改都在容器层,删除容器后数据就没了。解决办法是使用数据卷(Volume)或绑定挂载。

使用数据卷持久化数据

docker run -d –name web2 -v /data/nginx:/usr/share/nginx/html nginx:latest

老鸟叮嘱

**不要在生产环境用 `docker commit` 直接构建镜像!** 这样生成的镜像没有构建历史,不可追溯,也不可复用。正确做法是写 Dockerfile,用 `docker build` 构建。哪怕你只是临时做个测试环境,也养成写 Dockerfile 的习惯。

FAQ

1. 容器和虚拟机有什么区别?

容器共享宿主机内核,启动快、资源占用小;虚拟机有完整操作系统,隔离性更强。容器适合微服务,虚拟机适合需要完整 OS 的场景。

2. 拉取镜像时提示“no matching manifest for linux/amd64”怎么办?

检查你的宿主机架构。如果是 ARM 架构(如树莓派),需要拉取对应架构的镜像。可以在镜像名后加 `–platform linux/arm64` 参数。

3. 容器里的服务访问不了,端口已经映射了?

检查宿主机防火墙是否放行了对应端口。例如 CentOS 用 `firewall-cmd`,Ubuntu 用 `ufw`。另外确认容器内服务监听的是 `0.0.0.0` 而不是 `127.0.0.1`。

4. 容器日志太多,磁盘满了怎么办?

Docker 默认不限制日志大小。建议启动时加上日志限制参数:

docker run -d –log-opt max-size=10m –log-opt max-file=3 nginx:latest

或者全局配置 `/etc/docker/daemon.json` 中的 `log-opts`。

5. 删除所有已停止的容器有什么命令?

docker container prune

或者

docker rm $(docker ps -a -q)

6. 容器网络不通,怎么排查?

先用 `docker exec -it 容器名 ping 目标IP` 测试。如果 ping 不通,检查容器网络模式(bridge/host/none),以及宿主机 iptables 规则是否被清空。

转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9479.html 商家投稿邮箱:zhujixuanblog@qq.com