吃透Docker!从原理、安装、核心命令到镜像制作、网络实战(保姆级入门教程)
前言
大家好!这是我耗时半个月、利用所有休闲时间整理的完整版Docker保姆级学习笔记,全篇两万余字,覆盖Docker入门到进阶几乎所有核心功能、实操命令、落地实战。
作为我的第一篇CSDN长文,全程从零梳理、纯新手友好,无晦涩套话,所有知识点均搭配实操案例和命令演示。如果文章有表述不当、内容疏漏的地方,欢迎各位大佬在评论区斧正、交流学习!
读完本文,你将彻底搞懂:Docker核心原理、与虚拟机的区别、环境部署、镜像/容器/数据卷操作、Dockerfile自定义镜像、镜像云端发布、Docker网络原理等全套知识点,完全满足日常开发、测试、部署的所有Docker使用场景。
一、Docker 核心背景知识
1.1 什么是Docker?
Docker直译是“码头工人”,核心作用就是搬运、打包、部署应用,它是一款开源的应用容器引擎,也是目前行业主流的轻量级虚拟化解决方案。
简单来说:开发者可以将应用程序、所有依赖库、环境配置统一打包成一个可移植的容器,实现一次打包、随处运行,彻底解决“本地能跑、线上报错”的环境兼容问题。
Docker容器基于沙盒机制运行,容器之间相互隔离、无交互、互不影响,几乎无性能损耗,可快速部署在任意Linux服务器、数据中心,且不依赖开发语言、框架和系统环境,兼容性极强。
小知识:沙盒机制
沙盒(Sandbox)是计算机安全领域的虚拟隔离技术,程序在独立沙盒环境中运行,所有操作被限制隔离,若程序存在恶意行为或异常,不会侵入、破坏宿主机系统,最大程度保障服务器安全。
Docker 由dotCloud公司开源,基于LXC容器技术开发,底层采用Go语言编写,遵循Apache2.0开源协议,源码完全公开托管在GitHub。
官方相关地址
GitHub源码地址(Moby项目):https://github.com/moby/moby
Docker官网:https://www.docker.com
Docker中文社区:https://www.docker.org.cn/
小知识:LXC容器技术
LXC(Linux 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 超详细安装部署(CentOS7)
2.1 Docker版本区别(避坑重点)
很多新手疑惑Docker三种安装命令的区别,这里一次性讲清楚:
yum install docker:Docker最早期旧版本,现已淘汰;yum install docker-engine:中期迭代版本,同样停止维护;yum install docker-ce:当前主流免费社区版本,生产、学习首选。
2017年初,Docker官方进行架构拆分,核心规则:
Moby:开源社区源代码项目,任何人可基于源码二次开发、定制容器产品;
Docker-CE:Docker公司基于Moby维护的免费开源产品版(日常使用);
Docker-EE:Docker公司商业闭源版本,提供企业级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-CE
yum -y install docker-ce docker-ce-cli containerd.io组件说明:
docker-ce:Docker核心服务程序;
docker-ce-cli:Docker命令行客户端工具;
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、重载配置并重启Docker:
systemctl 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 search
docker 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 # 退出容器并停止 Ctrl+P+Q # 退出容器,后台持续运行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/bash,exit退出后容器直接停止;守护进程后台容器:
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 什么是Dockerfile?
Dockerfile是镜像构建脚本文件,由多条逐层执行的指令组成,每一条指令对应镜像的一层。通过docker build命令可自动编译生成自定义镜像,是企业标准化打包镜像的核心方案。
7.2 核心关系梳理
Dockerfile:源码脚本,定义镜像构建规则(开发编写);
Docker Image:编译生成的镜像成品(部署使用);
Docker Container:镜像运行后的服务实例。
7.3 Dockerfile 全套指令详解
指令建议大写,从上至下顺序执行,# 为注释:
FROM:指定基础镜像(必须为首指令);
LABEL:镜像元数据(作者、版本、描述,替代废弃的MAINTAINER);
RUN:构建镜像时执行的命令(安装依赖、配置环境);
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 author="test-user" email="123@qq.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 Hub)
8.1 注册账号
官网注册:https://hub.docker.com/8.2 服务器登录Docker Hub
docker 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:宿主机外网物理网卡,公网通信;
docker0:Docker默认虚拟网桥,容器内网通信核心。
安装网桥工具查看网络:
yum -y install bridge-utils brctl show9.2 核心技术:veth-pair
veth-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。
