吃透Docker!从原理、安装、核心命令到镜像制作、网络实战(保姆级入门教程)
前言大家好这是我耗时半个月、利用所有休闲时间整理的完整版Docker保姆级学习笔记全篇两万余字覆盖Docker入门到进阶几乎所有核心功能、实操命令、落地实战。作为我的第一篇CSDN长文全程从零梳理、纯新手友好无晦涩套话所有知识点均搭配实操案例和命令演示。如果文章有表述不当、内容疏漏的地方欢迎各位大佬在评论区斧正、交流学习读完本文你将彻底搞懂Docker核心原理、与虚拟机的区别、环境部署、镜像/容器/数据卷操作、Dockerfile自定义镜像、镜像云端发布、Docker网络原理等全套知识点完全满足日常开发、测试、部署的所有Docker使用场景。一、Docker 核心背景知识1.1 什么是DockerDocker直译是“码头工人”核心作用就是搬运、打包、部署应用它是一款开源的应用容器引擎也是目前行业主流的轻量级虚拟化解决方案。简单来说开发者可以将应用程序、所有依赖库、环境配置统一打包成一个可移植的容器实现一次打包、随处运行彻底解决“本地能跑、线上报错”的环境兼容问题。Docker容器基于沙盒机制运行容器之间相互隔离、无交互、互不影响几乎无性能损耗可快速部署在任意Linux服务器、数据中心且不依赖开发语言、框架和系统环境兼容性极强。小知识沙盒机制沙盒Sandbox是计算机安全领域的虚拟隔离技术程序在独立沙盒环境中运行所有操作被限制隔离若程序存在恶意行为或异常不会侵入、破坏宿主机系统最大程度保障服务器安全。Docker 由dotCloud公司开源基于LXC容器技术开发底层采用Go语言编写遵循Apache2.0开源协议源码完全公开托管在GitHub。官方相关地址GitHub源码地址Moby项目https://github.com/moby/mobyDocker官网https://www.docker.comDocker中文社区https://www.docker.org.cn/小知识LXC容器技术LXCLinux Container是Linux内核级虚拟化技术无需硬件虚拟化实现轻量级进程与资源隔离。核心依赖Linux内核两大能力Namespace实现进程、网络、文件系统、主机名、用户权限的完全隔离Cgroup实现CPU、内存、磁盘IO等系统资源的配额限制与调度管理。1.2 Docker容器 vs 传统虚拟机核心区别Docker容器技术和虚拟机技术本质都属于虚拟化技术核心目的都是隔离环境、部署应用但底层架构、性能、资源占用天差地别。传统虚拟机VMware/KVM虚拟机是完整硬件层级虚拟化需要通过Hypervisor虚拟化硬件资源每台虚拟机都包含独立的完整操作系统内核、硬件驱动、系统文件层级冗余极高。特点启动慢分钟级、占用资源大、镜像体积大、性能损耗高、隔离性极强。Docker容器Docker属于系统层级轻量化虚拟化无需虚拟化硬件直接复用宿主机内核仅隔离用户进程和资源省去了完整操作系统的冗余开销。特点启动快秒级、资源占用极低、镜像体积小、几乎无性能损耗、进程级隔离。1.3 Docker核心优势对比虚拟机轻量极速容器镜像体积远小于虚拟机镜像启动仅需几秒分发、部署、迁移效率大幅提升跨平台兼容打包后不依赖具体操作系统任意支持Docker的Linux/Windows/Mac设备均可运行生态成熟谷歌、微软、亚马逊、IBM等头部厂商全面支持企业生产环境主流方案开发运维统一彻底消除开发、测试、生产环境差异实现环境一致性分布式适配专为构建、发布、运行分布式应用设计完美适配微服务、云原生架构。1.4 Docker局限性Docker的核心定位是计算服务运行载体而非存储工具存在明显的场景局限性容器生命周期内产生的日志、数据库数据、持久化文件无法依赖容器本身存储容器删除后内部数据会丢失。因此生产环境中数据需通过外部挂载方式持久化支持NFS、IPsan、MFS等存储或通过Docker-v数据卷挂载实现数据留存。总结Docker只负责计算持久化存储交给外部服务。1.5 Docker核心工作流程新手入门只需先记住核心流程学完全文可回头复盘深化理解启动Docker服务守护进程常驻后台从Docker Hub拉取官方/自定义镜像到本地基于本地镜像启动容器实例运行应用服务。重要建议新手务必注册Docker Hub账号后续镜像拉取、自定义镜像上传、共享都需要用到是Docker学习和实操的核心工具1.6 Docker核心特性文件系统隔离每个容器拥有独立的根文件系统互不干扰资源隔离通过Cgroup限制容器CPU、内存、磁盘资源避免单容器抢占整机资源网络隔离每个容器拥有独立网络空间、虚拟网卡和IP地址日志记录自动收集容器标准输入、输出、错误日志支持实时和批量检索变更管理容器内的配置、文件变更可提交为新镜像重复复用无需重复配置交互式终端支持分配虚拟终端可直接进入容器操作命令行。二、Docker 超详细安装部署CentOS72.1 Docker版本区别避坑重点很多新手疑惑Docker三种安装命令的区别这里一次性讲清楚yum install dockerDocker最早期旧版本现已淘汰yum install docker-engine中期迭代版本同样停止维护yum install docker-ce当前主流免费社区版本生产、学习首选。2017年初Docker官方进行架构拆分核心规则Moby开源社区源代码项目任何人可基于源码二次开发、定制容器产品Docker-CEDocker公司基于Moby维护的免费开源产品版日常使用Docker-EEDocker公司商业闭源版本提供企业级SLA服务、安全加固付费使用。简单区分Moby是源码Docker-CE/EE是编译后的可运行产品包个人学习、开发部署统一使用Docker-CE。2.2 实验环境CentOS 7.6 64位、服务器可正常访问外网用于拉取镜像和依赖2.3 安装依赖环境安装Docker必备的系统依赖工具yum install -y yum-utils device-mapper-persistent-data lvm2若提示Nothing to do代表已安装依赖可直接下一步。2.4 配置阿里云Docker YUM源官方源下载速度极慢替换为阿里云国内镜像源提升安装和拉取速度yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo校验源配置是否成功cd /etc/yum.repos.d ls目录中出现docker-ce.repo文件即配置成功。2.5 安装Docker-CEyum -y install docker-ce docker-ce-cli containerd.io组件说明docker-ceDocker核心服务程序docker-ce-cliDocker命令行客户端工具containerd.io容器运行时依赖。2.6 开启内核网络转发必配Docker容器联网、端口映射依赖IP转发功能未开启会导致容器启动报错、无法联网。默认系统可能自动开启手动配置方式# 编辑内核配置文件 vim /etc/sysctl.conf # 写入配置 net.ipv4.ip_forward 1 # 生效配置 sysctl -p # 校验是否开启返回1即为成功 cat /proc/sys/net/ipv4/ip_forward2.7 关闭防火墙学习环境推荐避免防火墙拦截容器端口和网络访问学习环境直接关闭# 关闭并禁用开机自启防火墙 systemctl stop firewalld systemctl disable firewalld # 重启Docker适配网络规则 systemctl restart docker # 查看Docker自动生成的iptables规则 iptables -nL2.8 启动Docker服务并开机自启systemctl start docker systemctl enable docker2.9 基础校验命令# 查看Docker版本可看到C/S架构 docker version # 查看Docker全局系统信息 docker info通过docker version可清晰看出Docker是客户端服务端C/S架构命令行是客户端后台守护进程是服务端。2.10 配置阿里云镜像加速器解决拉取超时默认Docker Hub国外源极易出现TLS handshake timeout超时错误必须配置国内加速器。1、登录阿里云控制台https://cr.console.aliyun.com获取个人专属加速地址2、编辑Docker守护进程配置文件vim /etc/docker/daemon.json写入以下内容替换为自己的加速地址{ registry-mirrors: [https://eu5rxjvf.mirror.aliyuncs.com] }3、重载配置并重启Dockersystemctl daemon-reload systemctl restart docker4、通过docker info查看显示阿里云加速地址即配置成功。三、Docker 入门核心命令全覆盖3.1 基础帮助命令docker version # 查看Docker详细版本信息 docker info # 查看系统全局信息镜像数、容器数、仓库配置 docker --help # Docker全部命令帮助手册3.2 镜像核心命令镜像是容器的模板所有容器都由镜像启动核心操作如下docker images # 查看本地所有镜像 docker search 镜像名 # 从Docker Hub搜索镜像 docker pull 镜像名[:标签] # 拉取镜像默认latest最新版 docker rmi 镜像名/镜像ID # 删除本地镜像-f强制删除 docker rmi -f $(docker images -aq) # 批量删除全部镜像 docker tag 旧镜像:版本 新镜像:版本 # 复制并重命名镜像 docker commit # 提交容器变更为新镜像自定义镜像核心 docker save -o 保存路径 镜像名 # 导出镜像为tar包 docker load -i tar包路径 # 从tar包导入镜像命令详解docker searchdocker search centos搜索镜像表头含义NAME镜像名称DESCRIPTION镜像功能描述STARS收藏/下载量热度OFFICIAL是否为官方镜像官方镜像安全稳定优先使用。3.3 容器核心命令容器是镜像运行后的实例是真正提供服务的载体docker run [参数] 镜像名[:标签] # 启动容器无镜像自动拉取 docker ps # 查看正在运行的容器 docker ps -a # 查看所有容器含已停止 docker top 容器ID # 查看容器内运行进程 docker logs 容器ID # 查看容器日志 docker inspect 容器ID # 查看容器/镜像详细元数据 docker start 容器ID # 启动停止的容器 docker restart 容器ID # 重启容器 docker stop 容器ID # 优雅停止容器 docker kill 容器ID # 强制杀死容器进程 docker rm 容器ID # 删除停止的容器-f强制删除运行中容器 docker rm -f $(docker ps -aq) # 批量删除所有容器 docker exec -it 容器ID /bin/bash # 进入容器新终端退出不停止容器 docker attach 容器ID # 进入容器原终端退出容器停止 docker cp 容器ID:容器路径 主机路径 # 容器文件拷贝到主机 docker cp 主机路径 容器ID:容器路径 # 主机文件拷贝到容器 exit # 退出容器并停止 CtrlPQ # 退出容器后台持续运行docker run 核心参数详解重中之重--name自定义容器名称方便管理-d后台守护进程模式运行容器常用-i保持容器标准输入开启交互式运行-t分配伪终端搭配-i使用-p 主机端口:容器端口端口映射外部访问容器核心-P随机映射主机端口-v 主机路径:容器路径数据卷挂载实现数据持久化。四、Docker 实战Nginx服务部署新手第一个实战通过部署Nginx完整串联镜像拉取、容器启动、端口映射、外网访问全流程。4.1 搜索Nginx镜像docker search nginx4.2 拉取最新版Nginx镜像docker pull nginx4.3 查看本地镜像docker images4.4 启动Nginx容器docker run -d --name nginx01 -p 80:80 nginx4.5 查看运行中的容器docker ps4.6 本地测试访问curl 127.0.0.1:804.7 进入容器修改页面docker exec -it 容器ID /bin/bash4.8 外网访问开放服务器80端口通过服务器公网IP/域名即可直接访问Nginx默认页面。4.9 容器运行模式总结新手必记交互式前台容器docker run -it 镜像名 /bin/bashexit退出后容器直接停止守护进程后台容器docker run -id 镜像名后台持续运行需通过docker exec进入操作。五、Docker镜像底层原理分层机制详解5.1 镜像定义Docker镜像是轻量级、可执行的独立软件包包含软件代码、运行依赖、系统库、环境变量、配置文件等所有运行所需资源是启动容器的只读模板。5.2 核心底层UnionFS联合文件系统UnionFS是Docker镜像的底层支撑是一种分层、轻量级、高性能的文件系统支持将多个文件系统叠加挂载为一个完整系统。核心特性多文件系统分层叠加外部仅展示一个统一文件系统所有底层文件、目录全部合并生效。5.3 镜像分层结构Docker镜像由两层核心文件系统组成1、bootfs引导文件系统包含bootloader引导程序和Linux内核用于系统启动引导。宿主机启动后内核已加载至内存Docker启动时会直接卸载bootfs所有容器共用宿主机内核。2、rootfs根文件系统位于bootfs上层包含/dev、/proc、/bin、/etc等Linux基础目录和命令是不同操作系统发行版的核心区别CentOS、Ubuntu差异化所在。镜像体积小的核心原因Docker仅需提供精简rootfs直接复用宿主机内核无需完整系统因此镜像仅几十~几百MB。5.4 分层机制优势Docker拉取镜像时逐层下载最大优势是资源共享多个镜像基于同一个基础镜像构建时宿主机仅需存储一份基础镜像内存也仅加载一次所有容器共享调用极大节省磁盘和内存资源。核心特性镜像层全部只读容器层可读写。容器启动时会在所有镜像层顶部新增一层可写容器层所有容器操作、文件修改均记录在容器层镜像层永久不变。5.5 自定义镜像docker commit将修改后的容器打包生成新的自定义镜像。核心命令docker commit -m提交描述 -a作者信息 容器ID 新镜像名:版本实操案例定制Tomcat镜像# 启动tomcat容器 docker run -itd -p 8080:8080 tomcat:latest /bin/bash # 进入容器 docker exec -it 容器ID /bin/bash # 补充默认缺失的网页文件官方镜像默认无首页 cp -r webapps.dist/* webapps/ # 提交为自定义镜像 docker commit -a自定义Tomcat -m补充默认首页文件 容器ID tomcat02:1.0六、Docker容器数据卷数据持久化核心6.1 数据卷作用容器默认数据存储在容器可写层容器删除数据永久丢失。数据卷Volume的核心作用就是实现数据持久化、容器数据共享完全独立于容器生命周期容器删除后数据卷数据保留。6.2 数据卷核心特点支持多容器共享、复用数据宿主机与容器文件双向同步修改实时生效数据变更不影响镜像层保证镜像纯净生命周期独立无容器挂载时才会失效。6.3 基础挂载指定路径挂载核心命令docker run -it -v 宿主机目录:容器目录 镜像名 /bin/bash实操演示# 挂载宿主机/home/test01到容器/home目录 docker run -it -v /home/test01:/home centos /bin/bash挂载后宿主机/home/test01和容器/home目录双向实时同步任意一端新增、修改、删除文件另一端同步变更。通过docker inspect 容器ID查看Mounts字段可校验挂载状态。6.4 匿名挂载 具名挂载Docker支持两种无需指定完整路径的挂载方式自动存储在Docker默认卷目录/var/lib/docker/volumes/。1、匿名挂载仅指定容器内路径不指定宿主机路径自动生成随机卷名docker run -d -P --name nginx01 -v /etc/nginx nginx2、具名挂载自定义卷名称便于识别和管理docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx查看所有数据卷docker volume ls6.5 挂载权限控制ro只读权限容器仅可读取无法修改rw读写权限默认权限。# 只读挂载 docker run -d --name nginx-ro -v test:/etc/nginx:ro nginx # 读写挂载 docker run -d --name nginx-rw -v test:/etc/nginx:rw nginx七、Dockerfile 自定义镜像企业必备7.1 什么是DockerfileDockerfile是镜像构建脚本文件由多条逐层执行的指令组成每一条指令对应镜像的一层。通过docker build命令可自动编译生成自定义镜像是企业标准化打包镜像的核心方案。7.2 核心关系梳理Dockerfile源码脚本定义镜像构建规则开发编写Docker Image编译生成的镜像成品部署使用Docker Container镜像运行后的服务实例。7.3 Dockerfile 全套指令详解指令建议大写从上至下顺序执行# 为注释FROM指定基础镜像必须为首指令LABEL镜像元数据作者、版本、描述替代废弃的MAINTAINERRUN构建镜像时执行的命令安装依赖、配置环境WORKDIR设置容器默认工作目录ENV定义环境变量全局生效COPY将宿主机文件拷贝到镜像ADD高级拷贝支持自动解压压缩包、远程文件EXPOSE声明容器对外开放端口仅声明不自动映射VOLUME定义容器数据卷挂载CMD容器启动默认命令可被run命令覆盖仅最后一条生效ENTRYPOINT容器启动入口命令不会被覆盖支持参数追加USER指定容器运行用户ONBUILD镜像被继承时触发执行。7.4 实操自定义CentOS镜像带vim、网络工具1、创建工作目录mkdir dockerfile cd dockerfile2、编写Dockerfile文件vim mydockerfile写入以下内容FROM centos LABEL authortest-user email123qq.com ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim-enhanced RUN yum -y install net-tools EXPOSE 80 CMD echo Dockerfile build success! CMD /bin/bash3、构建镜像docker build -f mydockerfile -t mycentos:1.0 .参数说明-f指定Dockerfile文件-t指定镜像名和版本末尾.为构建上下文目录。4、查看镜像构建分层docker history mycentos:1.0八、镜像云端发布Docker Hub8.1 注册账号官网注册https://hub.docker.com/8.2 服务器登录Docker Hubdocker login -u 你的DockerHub账号 # 输入密码提示Login Succeeded即为登录成功 # 退出登录 docker logout8.3 镜像重命名必做Docker Hub要求推送镜像必须以账号名/镜像名:版本格式命名docker tag mycentos:1.0 账号名/mycentos:1.08.4 推送镜像到云端docker push 账号名/mycentos:1.0推送完成后登录Docker Hub官网即可看到自己上传的公共镜像全网可拉取使用。九、Docker网络原理容器互通核心9.1 宿主机网络基础安装Docker后宿主机默认生成三大网络lo本地回环网卡127.0.0.1本机访问eth0宿主机外网物理网卡公网通信docker0Docker默认虚拟网桥容器内网通信核心。安装网桥工具查看网络yum -y install bridge-utils brctl show9.2 核心技术veth-pairveth-pair是一对虚拟网卡接口成对出现一端连接宿主机docker0网桥一端连接容器内部网卡充当容器与宿主机、容器与容器之间的通信桥梁。每启动一个容器Docker自动生成一组veth-pair设备实现网络互通。9.3 Docker四大网络模式docker network ls # 查看所有Docker网络Bridge默认桥接模式默认模式容器独立IP连接docker0网桥实现内网互通适合大多数场景Host主机模式容器直接复用宿主机IP和端口无独立网络隔离性能最高Container容器互通模式新容器复用已有容器的IP和网络极少使用None无网络模式关闭容器所有网络功能仅本地运行无网络通信。9.4 自定义网桥网络支持域名互通默认docker0网桥不支持容器域名访问仅能通过IP互通自定义网桥可完美解决此问题。1、创建自定义网络docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 testnet2、查看网络详情docker network inspect testnet3、启动容器加入自定义网络docker run -d -P --name tomcat01 --net testnet tomcat:7 docker run -d -P --name tomcat02 --net testnet tomcat:74、容器域名互通测试# 支持直接通过容器名ping通无需IP docker exec -it tomcat01 ping tomcat02十、全文总结本篇万字笔记完整覆盖Docker零基础到进阶核心内容简单复盘核心重点1、Docker核心是轻量化容器虚拟化基于Namespace和Cgroup实现资源隔离相比虚拟机更轻、更快、资源占用更低2、生产环境统一使用docker-ce版本必须配置国内镜像加速器解决拉取超时问题3、核心核心链路镜像拉取→容器启动→端口映射→数据卷持久化是日常部署的基础4、镜像基于UnionFS分层机制只读分层顶层可写容器层支持资源共享、自定义打包5、Dockerfile是企业标准化镜像打包方案所有自定义镜像均通过脚本构建可复用、可维护6、Docker网络核心是veth-pair网桥自定义网络支持容器域名互通适配微服务多容器通信场景。容器技术是云原生、微服务、K8s的基础吃透Docker是后端、运维、测试工程师的必备技能希望这篇笔记能帮大家从零入门、彻底掌握Docker。