目录:
环境:ubuntu 24.04
一、Docker
1.1、什么是 Docker
Docker是一个开源平台,用于将应用程序及其所有依赖项打包成标准的容器,从而实现“一次构建,到处运行”。
Docker 与传统虚拟机(Virtual Machine,VM)都是实现环境隔离和应用封装的技术,但它们在架构、性能、资源利用和使用场景上有本质区别。
Docker 容器除了运行其中的应用外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减少系统开销。
传统虚拟机方式运行 N 个不同的应用就要起 N 个不同的虚拟机(每个虚拟机都要单独分配独占的内存、磁盘等资源),而 Docker 只需要启动 N 个隔离的“很薄的”容器,并将应用放进容器内即可。应用获得的是接近原生的运行性能。
| 对比维度 | Docker(容器) | 虚拟机(VM) |
|---|---|---|
| 操作系统 | 共享宿主机内核 | 每个 VM 一个完整 OS |
| 启动速度 | 秒级(0.1~2s) | 分钟级 |
| 镜像大小 | MB ~ 几百 MB | GB 级 |
| 资源开销 | 极低 | 高 |
| 性能 | 接近裸机 | 有一定损耗 |
| 隔离性 | 进程级隔离 | 硬件级隔离 |
| 安全性 | 较弱(共享内核) | 更强 |
| 可移植性 | 非常强 | 一般 |
| 运维成本 | 低 | 高 |
| 密度 | 单机可跑数百容器 | 单机只能跑少量 VM |
虚拟机 = 在硬件上虚拟出一整台“电脑”,解决的是“硬件虚拟化”问题
Docker = 在操作系统上隔离出一个“进程运行环境”,解决的是“应用交付与环境一致性”问题
可以粗略类比为:
- 虚拟机:每个租户 独立一套房子(含水电)
- Docker:每个租户 独立一个房间,共用整栋楼的水电
Docker 官网:Docker: Accelerated Container Application Development
Docker 官方文档:Manuals | Docker Docs
国内中文翻译文档:Docker中文文档(Docker官方文档,Docker官方教程)
1.2、安装 Docker
使用官方安装脚本:
# 下载并执行Docker官方安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
或者通过添加 Docker 软件源安装:
sudo apt-get update
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/ \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
用上面任何一种方法安装完成 Docker 之后启动:
# 启动Docker服务
sudo systemctl start docker
# 设置开机自启
sudo systemctl enable docker
执行以下命令,检查安装结果:
sudo docker info
输出版本信息则说明安装成功。
1.3、更改镜像源
需要说明的是,以往在国内使用很普遍的腾讯云、阿里云和各个大学的 Docker 镜像站点自从 2024 年之后都陆续不可用,现在可使用的镜像源已经很少,也不确定能用多久,
而在国内买了云服务商的服务器的话,可以使用其提供的内网 Docker 镜像,不过只能在其服务器上使用而无法在外网机器上使用。
腾讯云:腾讯云 - 安装 Docker 并配置镜像加速源,阿里云:阿里云 - 容器镜像服务,文档中明确写 https://mirror.ccs.tencentyun.com 只支持内网访问,不再支持外网域名访问加速。
找到配置镜像源的文件(如果文件不存在请新建) /etc/docker/daemon.json ,写入如下内容:
{
"registry-mirrors" :
[
"https://docker.m.daocloud.io",
"https://docker.xuanyuan.me",
"https://docker.1ms.run"
]
}
之后重新启动服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
执行 docker info 命令检查配置是否成功,如果输出内容中 Registry Mirrors 一项变成了配置的镜像源,则说明更改镜像源成功。
二、基本概念
2.1、镜像(Image)
镜像是一个用于创建容器(Container)只读模板,可以粗略理解为面向对象编程中的“类”(Class),其包含了运行一个软件所需的代码、运行环境、库、环境变量和配置文件等。
镜像具有如下特点:
- 不可变:镜像一旦构建完成,内容便默认不可修改
- 分层结构:镜像采用联合文件系统(UnionFS),以分层方式组织文件,使得多个镜像可以共享相同的基础层,从而节省空间
- 可分发:镜像可以被推送到远程注册中心(如 Docker Hub)或从注册中心拉取,实现跨平台使用
2.2、容器(Container)
容器时镜像的运行实例,类似于“对象”,是镜像这个“类”的一个具体实例。当启动一个镜像时,Docker 会基于该镜像创建一个容器,并在其中运行应用程序(例如Nginx、MySQL等)。
容器的特点:
- 可读写:虽然镜像不可修改,但容器在镜像的基础上增加了一个可写层,所有对系统的修改都发生在这个层中。
- 具有生命周期:可以启动、停止、暂停、删除。
- 资源隔离:容器之间默认隔离无法交互的,通过 Linux 的 Namespace 和 Cgroups 技术实现进程、网络、文件系统的资源的隔离与限制。
2.3、标签(Tag)
标签用于标识镜像的特定版本或变体。一个镜像可以有多个标签,但它们可能指向同一个镜像 ID(即内容相同)。
如果不指定标签,默认使用 latest
注意:
latest并不一定代表“最新稳定版”,它只是一个约定俗成的标签,实际含义由镜像维护者决定。
2.4、仓库(Repository)与注册中心(Registry)
-
仓库(Repository):存储同一软件不同标签(版本)镜像的集合。例如
library/nginx是 Docker Hub 上 nginx 的官方仓库。 -
注册中心(Registry):存放多个仓库的服务。最常见的是 Docker Hub,也可以搭建私有 Registry(如 Harbor、GitLab Container Registry)。
-
示例完整镜像名:
docker.io/library/nginx:1.25其中:
docker.io:Registry 地址(默认可省略)library:命名空间(官方镜像通常省略为nginx)nginx:仓库名1.25:标签
二、命令
2.1、镜像管理
Dockerhub 地址:Docker Hub Container Image Library | App Containerization
国内镜像:
从 Dockerfile 构建镜像:
参数:
-t指定镜像标签--file指定 Dockerfile 路径,不存在此参数时默认从当前路径下构建
docker build -t <tag> ./
从远程仓库拉取某个镜像:
镜像标签 <tag> 可省略,默认使用 latest
docker pull <image><:tag>
如果没有配置镜像源只是想要临时通过某个(docker.xuanyuan.me)镜像源拉去镜像:
docker pull docker.xuanyuan.me/<image><:tag>
将本地镜像推送到远程仓库
docker push <image>
列出本地所有镜像
参数:
-a查看所有镜像-q只显示镜像 ID
docker image list
# 等价于:
docker image ls
# 等价于:
docker images
列出与关键词匹配的本地镜像
docker image list <关键词>
# 等价于:
docker image ls <关键词>
# 等价于:
docker images <关键词>
查看镜像的详细信息(以 JSON 格式输出)
docker image inspect <image>
查看镜像的分层历史(各层的创建指令和大小)
docker image history <image>
删除本地镜像文件
参数:
-f强制删除-a删除所有未使用镜像<image>可以是文件名,也可以是镜像 ID
docker image rm <image>
# 简写:
docker rmi <image>
注意:当存在依赖于该镜像创建的容器时,镜像文件默认是无法被删除的。尽管可以使用 -f 参数来强制删除一个存在容器依赖的镜像,但并不推荐。正确的做法是,先删除依赖该镜像的所有容器之后再删除镜像。
删除所有悬空镜像
悬空镜像:Dangling Images,即没有标签且未被容器引用的镜像,通常出现在重新构建同名镜像后,旧镜像失去标签但仍存在)
docker image prune
删除所有未被任何容器使用的镜像
docker image prune -a
将镜像保存为 tar 文件(一般用于离线迁移)
docker save -o <file.tar> <image>
从 tar 文件加载镜像到本地
docker load -i <file.tar>
给镜像打标签:
docker tag <image> <tag>qq
2.2、容器启停
Docker 运行容器前需要本地存在对应的镜像(Image), 如果本地不存在该镜像,Docker 会尝试从配置文件(/etc/docker/daemon.json)的注册中心中下载。
创建并启动容器
参数:
-d后台运行-it交互式终端--name指定容器名-phost:container,端口映射-v/host:/container,卷挂载--restart重启策略
docker run [OPTIONS] <image>
例如:
docker run -d --name nginx-app-test -p 8080:80 nginx
只创建容器,不启动
参数:
--name容器名-v卷挂载
docker create -i <container> --name <name>
启动已经创建的容器:
参数:-i 交互式启动
docker start -i <container>
在运行的容器中执行命令
参数: -it 交互式终端
docker exec -it <container> <command>
停止运行中的容器:
优雅停止容器,会向容器发送 SIGTERM,等待退出
参数:-t 停止等待时间(单位为秒)
docker stop -t <time>
强制停止容器:
会向容器发送 SIGKILL。同Linux的kill -9
docker kill <container>
重启容器:
参数:-t 停止等待时间(单位为秒)
docker restart <container>
2.3、容器管理
查看运行中的容器
参数:
-a查看所有容器-q只显示容器ID
docker ps
# 等价于:
docker container ls
删除已停止的容器
docker rm <container>
若要删除的容器仍在运行,需加上参数 -f:
docker rm -f <container>
删除所有已停止容器
docker container prune
查看容器的标准输出和错误日志:
参数:
-f跟踪日志--tail <n>显示最后 n 行
docker logs <container>
查看容器内运行的进程
docker top <container>
试试监控容器的 CPU、内存、网络等资源使用情况
docker stats <container>
在主机与容器之间复制文件
docker cp ...
-
从主机复制文件到容器:
docker cp <主机路径> <容器名或ID>:<容器内路径> # 例如: docker cp ./app.conf myapp:/etc/app.conf -
从容器复制文件到主机:
docker cp <容器名或ID>:<容器内路径> <主机路径> # 例如: docker cp myapp:/var/log/app.log ./
导出容器为 tar 文件:
参数:-o 指定输出文件名
docker export <container> -o <file.tar>
从 tar 文件导入为镜像:
docker import <file.tar>
2.4、标签管理
给镜像打标签:
docker tag <image> <tag>
删除特定标签:
docker rmi <image>:<tag>
参考文档:
评论