☰
Docker全套学习笔记|从入门到企业实战【带示意图说明版】
2026/9/28 20:32:43 网站建设 项目流程

一、Docker基础介绍

Docker是一款开源容器引擎,依托Linux内核Namespace、Cgroups、联合文件系统实现容器技术。容器共享宿主机内核,具备轻量、秒级启动的特点。

示意图解读:

  • 虚拟机:Hypervisor层,每台虚拟机拥有完整独立内核+操作系统,资源开销巨大。
  • Docker容器:直接复用宿主机Linux内核,每个容器只隔离用户态程序,开销极小。

容器与虚拟机对比

对比项虚拟机Docker容器
操作系统拥有完整独立GuestOS共享宿主机内核
镜像大小GB级别MB级别
启动速度分钟级秒级
性能虚拟化带来性能损耗几乎原生硬件性能
隔离性完全硬件级隔离内核级隔离
单机实例数量几十个单机可跑上千容器

示意图解读:

  1. 镜像image:只读模板,相当于应用系统模板。
  2. 容器container:镜像运行后的实例,具备可读写层。
  3. 仓库registry:存放分发镜像,分为公共Docker Hub、企业私有Harbor。

客户端发送build/pull/run请求给docker daemon守护进程,daemon完成镜像、容器管理,并与远程仓库交互。

RHEL9部署docker‑ce(阿里云镜像源)

#1 配置docker阿里云yum软件源cat>/etc/yum.repos.d/docker.repo<<EOF [docker] name = docker baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.8/x86_64/stable/ gpgcheck = 0 EOF#生成yum元数据缓存dnf makecache#卸载系统自带podman,防止软件冲突dnf removepodman-y#搜索docker相关软件包dnf searchdocker#安装docker‑cednfinstalldocker-ce-y#修改docker service配置,启用iptables网络模式vim/lib/systemd/system/docker.serviceExecStart=/usr/bin/dockerd-Hfd://--containerd=/run/containerd/containerd.sock--iptables=true#加载内核br_netfilter网桥模块echobr_netfilter>/etc/modules-load.d/docker_mod.conf modprobe-abr_netfilter#配置内核网络转发参数cat>/etc/sysctl.d/docker.conf<<EOF net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOFsysctl--system#重载systemd配置,启动并设置docker开机自启systemctl daemon-reload systemctlenable--nowdocker

示意图解读:docker默认访问国外Docker Hub,国内访问较慢。配置镜像加速器后,请求转发到国内镜像站点,加速镜像下载。

配置国内镜像加速器

cat>/etc/docker/daemon.json<<EOF { "registry-mirrors": ["https://docker.1ms.run"] } EOFsystemctl restartdocker#验证加速器配置是否生效dockerinfo

二、镜像与容器常用命令

示意图解读:
镜像(只读) → docker run 创建容器(增加读写层);
容器可以 stop 停止,start 启动;
docker rm 删除容器,docker rmi 删除镜像;
docker commit 可把容器读写层变更打包生成新镜像。

2.1 镜像管理命令

#查看本地所有镜像dockerimages#搜索远程仓库镜像dockersearch nginx#拉取镜像,不加tag默认latestdockerpull nginxdockerpull busybox#查看镜像分层构建历史dockerhistorybusybox:latest#导出镜像做本地备份dockersave-ogame2048-latest.tar timinglee/game2048:latest#导入本地tar镜像包dockerload-igame2048-latest.tar#删除本地镜像dockerrmi timinglee/mario:latest

2.2 容器生命周期管理

#后台运行容器 -d,--name 指定容器名称dockerrun-d--nameweb nginx:1.26#查看当前正在运行的容器dockerps#查看全部容器,包含已经停止的容器dockerps-a#交互式运行容器,分配终端dockerrun-it--namebusybox busybox:latest#快捷键说明# Ctrl+p+q :退出交互,容器继续后台运行【重点!】# Ctrl+d :退出并且直接停止容器#启动已经停止的容器dockerstart busybox#优雅停止容器(发送信号,等待进程处理完业务)dockerstop busybox#强制杀死容器进程(直接kill进程,业务会中断)dockerkillbusybox#exec进入正在运行的容器(推荐使用,新建会话,退出不会停止容器)dockerexec-itweb /bin/bash#查看容器完整元数据信息(IP、挂载、环境变量全部在这里)dockerinspect busybox#删除容器,-f强制删除正在运行的容器dockerrm-fbusybox

2.3 宿主机与容器互相拷贝文件

示意图解读:docker cp 可以实现宿主机与容器之间的双向文件复制,不需要启动容器也能拷贝。

#宿主机文件拷贝到容器内部dockercpindex.html webserver:/usr/share/nginx/html#容器内部文件拷贝到宿主机磁盘dockercpwebserver:/usr/share/nginx/html/index.html /mnt

2.4 docker commit提交容器为镜像

⚠️ 生产环境不推荐,适合测试环境。

示意图解读:docker commit 会把容器读写层的所有改动打包,生成新镜像;但无法完整记录操作历史,也不利于审计,企业环境优先使用Dockerfile。

#修改完容器内容后提交生成新镜像dockercommit-m"add index.html"webserver nginx_index:latest#使用新构建镜像启动容器测试dockerrun-d--namewebserver-p80:80 nginx_index:latest

三、Dockerfile镜像构建

示意图解读:
Dockerfile每一条指令生成一层镜像,下层只读,最上层是容器读写层。镜像分层可以复用缓存,加速构建。

多阶段构建的核心思路是:第一阶段使用包含编译工具的大镜像完成编译,第二阶段只把编译产物拷贝到极简运行镜像中,从而丢弃编译工具,显著减小最终镜像体积。

3.1 Dockerfile核心指令说明

指令作用说明
FROM指定基础镜像,通常是Dockerfile第一行
COPY复制文件到镜像,不会自动解压压缩包
ADD复制文件,自动解压tar压缩包,支持远程URL
LABEL设置镜像元数据标签,替代旧版MAINTAINER
ENV设置环境变量,构建和运行阶段均可读取
RUN构建镜像阶段执行shell命令
EXPOSE声明容器端口,仅作文档说明,不会实际开放端口
VOLUME声明数据卷挂载点
WORKDIR设置工作目录,目录不存在自动创建
CMD容器启动默认命令,docker run可以直接覆盖
ENTRYPOINT容器入口命令,run后面的内容会作为参数传入,不容易被覆盖

CMD与ENTRYPOINT核心区别:

  • CMD:可以被docker run 镜像 新命令直接替换。
  • ENTRYPOINT:不会被直接替换,run后面的内容会作为参数传给ENTRYPOINT。

Dockerfile基础示例

FROM busybox:latest LABEL Creater=lee COPY timinglee /root ADD test.tar.gz /mnt ENV NAME=timinglee EXPOSE 8080 VOLUME "/mnt" WORKDIR "/mnt" RUN ["/bin/sh","-c", "touch /root/$NAME" ] CMD ["/bin/sh", "-c", "echo $NAME"]

构建镜像命令:

# -t 指定镜像名字:tag,末尾 . 代表当前目录为构建上下文dockerbuild-ttiminglee:v1.

多阶段构建镜像瘦身(企业重点)

#编译构建阶段(大镜像,包含gcc编译工具,仅编译使用,最终不保留) FROM debian:latest AS build ADD nginx-1.30.4.tar.gz /mnt WORKDIR /mnt/nginx-1.30.4 RUN apt update && apt install -y ca-certificates && apt install -y build-essential libpcre2-dev zlib1g zlib1g-dev libssl-dev libgd-dev libxml2-dev libxslt-dev && ./configure --with-http_ssl_module --with-http_stub_status_module && make && make install #最终运行阶段,使用distroless极简镜像,不带编译环境,只拷贝编译好的nginx程序 FROM gcr.io/distroless/base-debian13:latest COPY --from=build /opt / EXPOSE 80 443 VOLUME ["/usr/local/nginx/html"] ENTRYPOINT ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
dockerbuild-tnginx-lee:v1.

四、Docker私有镜像仓库

示意图解读:

  • Registry:Docker官方简易私有仓库,主要提供镜像存储功能,一般没有独立Web界面。
  • Harbor:企业级私有仓库,基于Registry封装,增加了Web UI、RBAC权限管理、日志审计、镜像扫描和复制同步等能力。

4.1 简易registry私有仓库(HTTP无加密)

坑点说明:Docker客户端默认强制HTTPS,HTTP仓库必须配置insecure-registries,否则推送会报错。

#导入registry镜像包dockerload-iregistry-202608.tar#后台启动registry私有仓库,端口5000dockerrun-d--nameregistry\--restart=always-p5000:5000 registry:latest#给镜像打标签,格式:仓库地址:端口/镜像名:tagdockertag nginx-lee:v1172.25.254.10:5000/nginx-lee:v1#http仓库推送会报错:server gave HTTP response to HTTPS client#修改daemon.json添加不安全http仓库配置vim/etc/docker/daemon.json{"registry-mirrors":["https://docker.1ms.run"],"insecure-registries":["http://172.25.254.10:5000"]}systemctl restartdocker#推送镜像到私有仓库dockerpush172.25.254.10:5000/nginx-lee:v1#http接口查看仓库内镜像列表curlhttp://172.25.254.10:5000/v2/_catalog#其他节点下载私有仓库镜像dockerpull172.25.254.10:5000/nginx-lee:v1

4.2 registry开启TLS HTTPS加密传输

示意图解读:通过自签证书实现HTTPS加密通信,防止镜像传输过程中明文泄露。

  1. openssl生成自签名证书
mkdircerts openssl req-newkeyrsa:4096-nodes\-keyoutcerts/timinglee.org.key\-addext"subjectAltName = DNS:reg.timinglee.org"\-x509-days365-outcerts/timinglee.org.crt
  1. 挂载证书启动registry
dockerrun-d--nameregistry\--restart=always-p443:443\-v/root/certs:/certs\-eREGISTRY_HTTP_ADDR=0.0.0.0:443\-eREGISTRY_HTTP_TLS_CERTIFICATE=/certs/timinglee.org.crt\-eREGISTRY_HTTP_TLS_KEY=/certs/timinglee.org.key\registry
  1. docker客户端信任自签证书
mkdir-p/etc/docker/certs.d/reg.timinglee.orgcpcerts/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt systemctl restartdocker

4.3 registry开启htpasswd账号密码认证

开启认证后,推拉镜像必须先执行docker login登录账号密码。

dnfinstallhttpd-tools-ymkdirauth htpasswd-cBauth/htpasswd admin#带账号认证启动registrydockerrun-d--nameregistry\--restart=always-p443:443\-v/root/certs:/certs\-eREGISTRY_HTTP_ADDR=0.0.0.0:443\-eREGISTRY_HTTP_TLS_CERTIFICATE=/certs/timinglee.org.crt\-eREGISTRY_HTTP_TLS_KEY=/certs/timinglee.org.key\-v/root/auth:/auth\-e"REGISTRY_AUTH=htpasswd"\-e"REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"\-eREGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd\registry#登录私有仓库dockerlogin reg.timinglee.org#退出登录dockerlogoutreg.timinglee.org

4.4 Harbor企业级私有仓库

Harbor基于Docker Compose实现,提供Web图形界面、RBAC权限管理、镜像扫描、镜像复制同步等能力,更适合企业生产环境。

#解压harbor离线安装包tarzxf harbor-offline-installer-v2.14.0.tgz-C/opt/cd/opt/harborcpharbor.yml.tmpl harbor.ymlvimharbor.yml hostname: reg.timinglee.org certificate: /data/certs/timinglee.org.crt private_key: /data/certs/timinglee.org.key harbor_admin_password: lee#执行harbor安装脚本./install.sh#配置systemd管理harbor服务vim/lib/systemd/system/harbor.service[Unit]Description=harbor with Docker ComposeDocumentation=https://reg.timinglee.com/compose/After=docker.service network-online.targetRequires=docker.service[Service]Type=oneshotWorkingDirectory=/opt/harborExecStart=/usr/bin/docker compose up-dExecStop=/usr/bin/docker compose downRemainAfterExit=yes[Install]WantedBy=multi-user.target systemctl daemon-reload systemctlenable--nowharbor.service

浏览器访问https://reg.timinglee.org,使用admin账号登录,新建项目后即可推拉镜像。

五、Docker网络

示意图解读:docker0是宿主机Linux网桥,每个容器拥有一对veth虚拟网卡,一端连接网桥,一端位于容器网络命名空间。默认bridge没有内置DNS解析,容器之间通常只能通过IP通信。

Docker安装完成后内置3种原生网络:bridge、host、none。

dockernetworkls
  1. bridge(docker0默认网桥):容器通过NAT访问外网;默认bridge没有内置DNS解析,不能直接用容器名通信。
  2. host模式:容器直接复用宿主机完整网络栈,网络隔离较弱,端口会直接占用宿主机端口。
  3. none模式:容器禁用所有网络,仅保留lo本地回环接口。

5.1 自定义bridge网桥(生产推荐)

示意图解读:自定义网桥自带DNS解析,可以直接使用容器名称互相通信。容器重启后IP可能变化,但容器名称保持不变,因此服务访问更稳定。

#创建默认参数自定义桥接网络dockernetwork create mynet1#自定义指定子网与网关dockernetwork create mynet2--subnet192.168.0.0/16--gateway192.168.0.100#容器启动指定自定义网络dockerrun-d--namenginx1--network=mynet1 nginx#给已经运行的容器追加额外网络,实现跨网络容器互通dockernetwork connect mynet1 test1

5.2 container共享网络栈 joined模式

示意图解读:使用--network=container:容器名后,新容器和已有容器共用一套网络命名空间,网卡、端口完全共享,可以通过127.0.0.1访问对方端口。

#示例:phpmyadmin和mysql共享网络栈dockerrun-d--namephpmyadmin--network=mynet1-ePMA_ARBITRARY=1-p80:80 phpmyadmin:latestdockerrun-d--namemysql--network=container:phpmyadmin-eMYSQL_ROOT_PASSWORD='lee'mysql:8.0

phpMyAdmin页面中,数据库地址填写localhost,即可直接访问MySQL的3306端口。

5.3 macvlan实现跨主机容器通信

示意图解读:macvlan可以让容器直接获得物理局域网IP,不需要经过NAT,不同宿主机上的容器可以二层直接互通。

#开启物理网卡混杂模式iplinkseteth1 promisc oniplinksetup eth1#创建macvlan网络,绑定物理网卡eth1dockernetwork create-dmacvlan--subnet1.1.1.0/24--gateway1.1.1.1-oparent=eth1 macvlan1#节点1启动容器dockerrun-it--nametest--rm--network=macvlan1--ip1.1.1.100 busybox:latest#节点2启动容器dockerrun-it--nametest--rm--network=macvlan1--ip1.1.1.200 busybox:latest#两个容器之间可以直接互相ping通

六、Docker数据卷持久化

示意图解读:容器删除后,容器内部读写层的数据会丢失;数据卷通过绕过容器联合文件系统,将数据持久化保存到宿主机磁盘。

常见模式包括:

  • Bind Mount:直接绑定宿主机指定路径;
  • Docker Managed Volume:由Docker统一管理存储目录;
  • Volumes-from:复用其他容器已定义的挂载配置。

容器删除后,容器内部读写层的所有数据都会丢失;数据卷是实现数据持久化的关键。Docker数据卷主要分为bind mount绑定挂载和Docker managed管理卷两种模式。

6.1 bind mount绑定挂载(指定宿主机路径)

#-v 宿主机路径:容器路径:ro ro代表只读权限dockerrun-it--rm--nametest-v/mnt/data:/data-v/etc/passwd:/passwd:ro busybox:latest

6.2 docker managed docker管理卷

Docker自动管理存储目录/var/lib/docker/volumes,不需要写死宿主机绝对路径,可移植性更强。

#创建管理卷dockervolume create timingleedockervolumels#挂载数据卷到容器dockerrun-it--rm-vtiminglee:/data:ro busybox:latest#删除指定数据卷dockervolumermtiminglee#清理所有未被容器使用的闲置卷dockervolume prune

6.3 数据卷容器 --volumes-from

直接复用其他容器已经定义好的全部挂载配置,不需要重复编写多条-v参数。

#创建数据卷容器dockerrun-it--rm--namedata-v/etc/hosts:/hosts:ro-v/data:/data busybox:latest#新容器继承data容器全部挂载dockerrun-it--rm--namelee --volumes-from data busybox:latest

6.4 数据卷备份与数据恢复

#备份:把容器数据卷打包备份到宿主机当前目录dockerrun-it--rm--volumes-from webserver-v$(pwd):/backup busybox:latesttarzcf /backup/html.tar.gz /usr/share/nginx/html#恢复备份包至容器内部dockerrun-it--rm--volumes-from webserver-v$(pwd):/backup busybox:latesttarzxf /backup/html.tar.gz-C/

七、Docker Compose容器编排

示意图解读:Docker Compose读取YAML配置文件,调用Docker API批量创建多个容器、网络和数据卷,实现一套业务环境一键启停。

Compose使用YAML文件定义一组关联容器服务,通过单条命令批量启停整套多容器应用。

compose常用命令

#前台启动,占用终端dockercompose up#后台守护进程启动整套服务dockercompose up-d#停止并删除容器、网络(默认不会删除数据卷)dockercompose down#仅停止容器,不删除容器dockercompose stop#启动已经存在的容器服务dockercompose start#重启整套服务dockercompose restart#查看服务运行状态dockercomposeps#查看容器日志dockercompose logs web#构建yml内定义的镜像dockercompose build#手动指定yml配置文件dockercompose-f./xxx.yml up-d

compose示例 phpmyadmin + mysql

services:phpmyadmin:image:phpmyadmin:latestcontainer_name:phpmyadminports:-80:80environment:PMA_ARBITRARY:1mysqlserver:image:mysql:8.0container_name:mysqldbenvironment:MYSQL_ROOT_PASSWORD:leenetwork_mode:service:phpmyadmindepends_on:-phpmyadmin

compose完整示例:自定义网络、自定义数据卷

services:test:image:busybox:latestcontainer_name:busyboxcommand:-/bin/sh--c-sleep 20000volumes:-leevol1:/leenetworks:-mynet1-mynet2networks:mynet1:driver:bridgemynet2:ipam:driver:defaultconfig:-subnet:172.28.0.0/16gateway:172.28.0.254volumes:leevol1:name:timinglee

八、Docker安全加固

容器安全依赖Linux Namespace隔离、Cgroups资源限制和Capabilities权限白名单。

8.1 cgroup容器资源限制

示意图解读:通过cgroup限制容器CPU、内存和IO资源,防止单个容器耗尽宿主机资源,影响其他业务运行。

#CPU限制:周期100000微秒,配额20000,最多占用20%cpudockerrun-it--rm--nametest--cpu-period100000--cpu-quota20000ubuntu#CPU权重优先级,CPU资源抢占时权重越高分得越多时间片dockerrun-it--rm--cpu-shares100ubuntu#内存限制,内存与swap交换分区全部限制200Mdockerrun-d--nametest--memory200M --memory-swap 200M nginx:1.23#磁盘写入IO速率限制dockerrun-it--nametest--rm--device-write-bps /dev/nvme0n1:30M ubuntu

8.2 lxcfs修复容器proc文件隔离问题

问题说明:默认情况下,容器内执行free、top会读取到宿主机全部硬件信息。lxcfs通过虚拟/proc文件,让容器只看到分配给自己的资源。

dnfinstalllxcfs.x86_64-ylxcfs /var/lib/lxcfs&#启动容器挂载lxcfs虚拟proc文件dockerrun-it-m256m\-v/var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw\-v/var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw\-v/var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw\-v/var/lib/lxcfs/proc/stat:/proc/stat:rw\-v/var/lib/lxcfs/proc/swaps:/proc/swaps:rw\-v/var/lib/lxcfs/proc/uptime:/proc/uptime:rw ubuntu

8.3 容器权限控制 cap-add / --privileged

⚠️--privileged会授予容器几乎等同于宿主机root的权限,生产环境应尽量避免使用;优先使用--cap-add按需添加最小权限白名单。

#仅授予网络管理权限dockerrun-it--rm--cap-add CAP_NET_ADMIN busybox:latest

九、全文总结

  1. Docker三大核心:镜像(只读分层模板)、容器(运行读写实例)、仓库(镜像存储分发)。
  2. 构建镜像优先使用Dockerfile,推荐多阶段构建减小镜像体积;生产环境不建议使用docker commit制作镜像。
  3. 网络优先选择自定义bridge,自带DNS容器名解析;跨主机容器通信可以选择macvlan。
  4. 业务数据必须使用volume数据卷持久化,容器删除数据不丢失,并定期做好备份。
  5. 小规模私有镜像仓库可使用Registry;企业级生产环境建议使用Harbor,提供Web UI和RBAC权限管理。
  6. Docker Compose适合单机多容器编排;生产环境必须配置CPU、内存资源限制,遵循最小权限原则,避免滥用--privileged特权。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询