Docker-相关总结
概述
Docker 使用了进程隔离的技术来实现容器化。它通过使用 Linux 容器(LXC)技术或更现代的基于容器的技术(如 libcontainer 和 runc)来创建和管理容器。
在 Docker 中,每个容器都是一个独立的进程,运行在宿主机的操作系统上。Docker 使用 Linux 内核的功能,如 cgroups(控制组)和命名空间(namespace),来实现进程的隔离和资源控制。
cgroups
cgroups(Control Groups)是 Linux 内核提供的一种资源管理机制,用于限制和监控进程组的资源使用量。它允许对进程组(或进程的集合)进行资源控制、优先级管理和隔离。
cgroups 的主要功能包括:
-
资源限制:cgroups 可以设置进程组的资源限制,如 CPU 使用率、内存使用量、磁盘 I/O 等。这样可以防止某个进程组过度占用系统资源,影响其他进程组的运行。
-
优先级管理:cgroups 可以为不同进程组分配不同的资源优先级,确保关键任务或重要进程组能够获得足够的资源,提高系统的整体性能和响应能力。
-
资源统计和监控:cgroups 可以统计和监控进程组的资源使用情况,包括 CPU、内存、磁盘等。这样可以实时查看和分析进程组的资源消耗情况,进行性能优化和故障排查。
-
进程隔离:cgroups 可以将进程组隔离在不同的容器或虚拟环境中,每个容器都有自己的资源限制和隔离环境。这样可以实现容器化技术,提供独立的运行环境和隔离性。
cgroups 是 Linux 内核提供的一种强大的资源管理机制,被广泛用于容器化技术(如 Docker、Kubernetes)和虚拟化技术中,以实现资源控制、隔离和优化。它为系统管理员和开发人员提供了灵活和可定制的资源管理手段,帮助提高系统的效率和可靠性。
namespace
namespace(命名空间)是 Linux 内核提供的一种隔离机制,用于将系统资源抽象为不同的独立单元,在每个单元中提供独立的视图和隔离环境。
Linux 内核提供了多种类型的命名空间,用于隔离不同的系统资源,包括以下几种常见的命名空间:
-
PID 命名空间:每个 PID 命名空间都有自己的进程 ID(PID)空间,使得进程在不同的命名空间中具有不同的 PID。这样可以实现进程隔离和独立的进程视图。
-
Network 命名空间:每个 Network 命名空间都有自己的网络栈、网络设备和 IP 地址空间。这样可以实现网络隔离,使得每个命名空间中的进程可以具有独立的网络环境。
-
Mount 命名空间:每个 Mount 命名空间都有自己的文件系统挂载点,使得进程在不同的命名空间中具有不同的文件系统视图。这样可以实现文件系统隔离和独立的文件系统环境。
-
UTS 命名空间:UTS(Unix Timesharing System)命名空间用于隔离主机名和域名。每个 UTS 命名空间都有自己的主机名和域名,使得进程在不同的命名空间中具有不同的标识。
-
IPC 命名空间:IPC(Inter-Process Communication)命名空间用于隔离进程间通信机制,如信号量、消息队列和共享内存等。每个 IPC 命名空间都有自己的 IPC 对象,使得进程在不同的命名空间中具有独立的通信环境。
通过使用命名空间,可以实现进程和资源的隔离,使得不同的命名空间中的进程具有独立的资源视图和环境。这为容器化技术(如 Docker、Kubernetes)和虚拟化技术提供了基础,实现了资源的隔离和独立运行环境的创建。
常用命令
配置Docker软件源
// 腾讯源 dnf config-manager --add-repo=http://mirrors.tencent.com/docker-ce/linux/centos/docker-ce.repo //阿里源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
配置镜像源
vim /etc/docker/daemon.json // 阿里 { "registry-mirrors": ["https://lahhbvh8.mirror.aliyuncs.com"] } //腾讯 { "registry-mirrors": ["https://mirror.ccs.tencentyun.com"] }
基本命令
systemctl start docker // 启动Docker systemctl stop docker // 停止Docker systemctl restart docker // 重启Docker systemctl enable docker // 开机启动 systemctl status docker // 查看状态 docker --version // 查看版本
操作镜像
查看镜像
docker images
pull镜像
docker pull centos //下载最新 docker pull centos:8.3.2011 //指定版本
tag镜像
docker tag 605c77e624dd gorust1999/alpine:v3 //PS:指定用户名(gorust1999)
push镜像
docker login //登录 随后输入账号密码 docker push gorust1999/alpine:v2 //指定用户名 gorust1999 加上Tag
删除镜像
指定Tag || ID
docker rmi 300e315adb2f
docker rmi demo/centos:latest
镜像导出导入
docker save alpine > demo.alpine.tar // 导出 docker load < demo.alpine.tar // 导入
容器操作
查看容器
docker ps // 查看所有运行的容器 docker ps -a // 查看所有容器
Docker run
创建一个新的容器并运行一个命令
docker run 是日常用的最频繁用的命令之一,同样也是较为复杂的命令之一
命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS :选项
-i :表示启动一个可交互的容器,并持续打开标准输入
-t: 表示使用终端关联到容器的标准输入输出上
-d :表示容器放置后台运行
--rm:退出后即删除容器
--name :表示定义容器唯一名称
-p 映射端口
-v 指定路径挂载数据卷
-e 运行容器传递环境变量
IMAGE :表示要运行的镜像
COMMAND :表示启动容器时要运行的命令
docker run -it centos /bin/bash // 启动交互式的容器 并在容器内执行/bin/bash 命令 docker run -it -d centos // 启动一个容器 运行在后台 docker run -it -d --name mydemo centos // --name 自定义启动容器之后的名字
退出容器
exit: 容器停止并退出
ctrl+p+q:容器不停止退出
进入容器
docker exec -it cbfee91bda3b /bin/bash // 进入一个后台运行的容器 并执行命令:/bin/bash docker attach cbfee91bda3b // 进入后台容器
区别:
docker exec:进入容器开启一个新的终端(常用) 执行 exit 退出的时候不会停止容器
docker attach:进入容器正在执行的终端 exit 退出会停止容器
启动/停止容器
docker start 07fb9c32ea61
docker stop 07fb9c32ea61
docker restart 07fb9c32ea61
docker restart MyCentos
删除容器
docker rm myLinux docker rm -f myLinux // 强制删除
查看容器操作日志
docker logs : 获取容器的日志
docker logs 9170ef3ad0fd
语法
docker logs [OPTIONS] CONTAINER
OPTIONS 说明:
-f : 跟踪日志输出
--since :显示某个开始时间的所有日志
-t : 显示时间戳
--tail :仅列出最新 N 条容器日
容器转换为镜像
镜像是没有写入权限的,但是我们可以修改容器把容器制作为镜像
docker commit d4486a7dff1b mylinux_1.txt(镜像name)
端口映射
docker run -p 容器外端口:容器内端口 容器ID
docker run -d -p 84:80 mynginx:v2
数据拷贝
docker cp :用于容器与主机之间的数据拷贝。
将主机/root/wwwroot目录拷贝到容器 5e324512adf1 的/root 目录下。
docker cp /root/wwwroot/ 5e324512adf1:root
将容器 5e324512adf1 的/root/wwwroot 目录拷贝到主机的/root 目录中。
docker cp 5e324512adf1:root/wwwroot /root
挂载数据卷
数据卷不依赖于容器,生命周期不受容器的控制,即多个容器可以共享一个数据卷 进行数据共享
docker run -v 容器外目录:容器内目录 容器 ID
docker run -d -v /root/www:/demo nginx
Dockerfile
指令
FROM:声明基础镜像,使用现有的 Docker 镜像作为基础
MAINTAINER:声明镜像维护者
RUN:在镜像中运行命令
CMD:容器启动时默认执行的命令
EXPOSE:声明容器需要监听的网络端口
ENV:设置环境变量
ADD:添加文件到镜像中,将本地文件复制到镜像中
COPY:将本地文件复制到镜像中
WORKDIR:设置工作目录,用于构建过程中的文件操作
ENTRYPOINT:容器启动时默认执行的命令,与 CMD 不同的是,ENTRYPOINT 指定的命令参数可以在 docker run 调用中被覆盖。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律