ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Docker全套学习笔记|从入门到企业实战【带示意图说明版】

Docker全套学习笔记|从入门到企业实战【带示意图说明版】 一、Docker基础介绍Docker是一款开源容器引擎依托Linux内核Namespace、Cgroups、联合文件系统实现容器技术。容器共享宿主机内核具备轻量、秒级启动的特点。示意图解读虚拟机Hypervisor层每台虚拟机拥有完整独立内核操作系统资源开销巨大。Docker容器直接复用宿主机Linux内核每个容器只隔离用户态程序开销极小。容器与虚拟机对比对比项虚拟机Docker容器操作系统拥有完整独立GuestOS共享宿主机内核镜像大小GB级别MB级别启动速度分钟级秒级性能虚拟化带来性能损耗几乎原生硬件性能隔离性完全硬件级隔离内核级隔离单机实例数量几十个单机可跑上千容器示意图解读镜像image只读模板相当于应用系统模板。容器container镜像运行后的实例具备可读写层。仓库registry存放分发镜像分为公共Docker Hub、企业私有Harbor。客户端发送build/pull/run请求给docker daemon守护进程daemon完成镜像、容器管理并与远程仓库交互。RHEL9部署docker‑ce阿里云镜像源#1 配置docker阿里云yum软件源cat/etc/yum.repos.d/docker.repoEOF [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--iptablestrue#加载内核br_netfilter网桥模块echobr_netfilter/etc/modules-load.d/docker_mod.conf modprobe-abr_netfilter#配置内核网络转发参数cat/etc/sysctl.d/docker.confEOF 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.jsonEOF { 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:latest2.2 容器生命周期管理#后台运行容器 -d--name 指定容器名称dockerrun-d--nameweb nginx:1.26#查看当前正在运行的容器dockerps#查看全部容器包含已经停止的容器dockerps-a#交互式运行容器分配终端dockerrun-it--namebusybox busybox:latest#快捷键说明# Ctrlpq 退出交互容器继续后台运行【重点】# Ctrld 退出并且直接停止容器#启动已经停止的容器dockerstart busybox#优雅停止容器发送信号等待进程处理完业务dockerstop busybox#强制杀死容器进程直接kill进程业务会中断dockerkillbusybox#exec进入正在运行的容器推荐使用新建会话退出不会停止容器dockerexec-itweb /bin/bash#查看容器完整元数据信息IP、挂载、环境变量全部在这里dockerinspect busybox#删除容器-f强制删除正在运行的容器dockerrm-fbusybox2.3 宿主机与容器互相拷贝文件示意图解读docker cp 可以实现宿主机与容器之间的双向文件复制不需要启动容器也能拷贝。#宿主机文件拷贝到容器内部dockercpindex.html webserver:/usr/share/nginx/html#容器内部文件拷贝到宿主机磁盘dockercpwebserver:/usr/share/nginx/html/index.html /mnt2.4 docker commit提交容器为镜像⚠️ 生产环境不推荐适合测试环境。示意图解读docker commit 会把容器读写层的所有改动打包生成新镜像但无法完整记录操作历史也不利于审计企业环境优先使用Dockerfile。#修改完容器内容后提交生成新镜像dockercommit-madd index.htmlwebserver nginx_index:latest#使用新构建镜像启动容器测试dockerrun-d--namewebserver-p80:80 nginx_index:latest三、Dockerfile镜像构建示意图解读Dockerfile每一条指令生成一层镜像下层只读最上层是容器读写层。镜像分层可以复用缓存加速构建。多阶段构建的核心思路是第一阶段使用包含编译工具的大镜像完成编译第二阶段只把编译产物拷贝到极简运行镜像中从而丢弃编译工具显著减小最终镜像体积。3.1 Dockerfile核心指令说明指令作用说明FROM指定基础镜像通常是Dockerfile第一行COPY复制文件到镜像不会自动解压压缩包ADD复制文件自动解压tar压缩包支持远程URLLABEL设置镜像元数据标签替代旧版MAINTAINERENV设置环境变量构建和运行阶段均可读取RUN构建镜像阶段执行shell命令EXPOSE声明容器端口仅作文档说明不会实际开放端口VOLUME声明数据卷挂载点WORKDIR设置工作目录目录不存在自动创建CMD容器启动默认命令docker run可以直接覆盖ENTRYPOINT容器入口命令run后面的内容会作为参数传入不容易被覆盖CMD与ENTRYPOINT核心区别CMD可以被docker run 镜像 新命令直接替换。ENTRYPOINT不会被直接替换run后面的内容会作为参数传给ENTRYPOINT。Dockerfile基础示例FROM busybox:latest LABEL Createrlee COPY timinglee /root ADD test.tar.gz /mnt ENV NAMEtiminglee 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 --frombuild /opt / EXPOSE 80 443 VOLUME [/usr/local/nginx/html] ENTRYPOINT [/usr/local/nginx/sbin/nginx, -g, daemon off;]dockerbuild-tnginx-lee:v1.四、Docker私有镜像仓库示意图解读RegistryDocker官方简易私有仓库主要提供镜像存储功能一般没有独立Web界面。Harbor企业级私有仓库基于Registry封装增加了Web UI、RBAC权限管理、日志审计、镜像扫描和复制同步等能力。4.1 简易registry私有仓库HTTP无加密坑点说明Docker客户端默认强制HTTPSHTTP仓库必须配置insecure-registries否则推送会报错。#导入registry镜像包dockerload-iregistry-202608.tar#后台启动registry私有仓库端口5000dockerrun-d--nameregistry\--restartalways-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:v14.2 registry开启TLS HTTPS加密传输示意图解读通过自签证书实现HTTPS加密通信防止镜像传输过程中明文泄露。openssl生成自签名证书mkdircerts openssl req-newkeyrsa:4096-nodes\-keyoutcerts/timinglee.org.key\-addextsubjectAltName DNS:reg.timinglee.org\-x509-days365-outcerts/timinglee.org.crt挂载证书启动registrydockerrun-d--nameregistry\--restartalways-p443:443\-v/root/certs:/certs\-eREGISTRY_HTTP_ADDR0.0.0.0:443\-eREGISTRY_HTTP_TLS_CERTIFICATE/certs/timinglee.org.crt\-eREGISTRY_HTTP_TLS_KEY/certs/timinglee.org.key\registrydocker客户端信任自签证书mkdir-p/etc/docker/certs.d/reg.timinglee.orgcpcerts/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt systemctl restartdocker4.3 registry开启htpasswd账号密码认证开启认证后推拉镜像必须先执行docker login登录账号密码。dnfinstallhttpd-tools-ymkdirauth htpasswd-cBauth/htpasswd admin#带账号认证启动registrydockerrun-d--nameregistry\--restartalways-p443:443\-v/root/certs:/certs\-eREGISTRY_HTTP_ADDR0.0.0.0:443\-eREGISTRY_HTTP_TLS_CERTIFICATE/certs/timinglee.org.crt\-eREGISTRY_HTTP_TLS_KEY/certs/timinglee.org.key\-v/root/auth:/auth\-eREGISTRY_AUTHhtpasswd\-eREGISTRY_AUTH_HTPASSWD_REALMRegistry Realm\-eREGISTRY_AUTH_HTPASSWD_PATH/auth/htpasswd\registry#登录私有仓库dockerlogin reg.timinglee.org#退出登录dockerlogoutreg.timinglee.org4.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]Descriptionharbor with Docker ComposeDocumentationhttps://reg.timinglee.com/compose/Afterdocker.service network-online.targetRequiresdocker.service[Service]TypeoneshotWorkingDirectory/opt/harborExecStart/usr/bin/docker compose up-dExecStop/usr/bin/docker compose downRemainAfterExityes[Install]WantedBymulti-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。dockernetworklsbridgedocker0默认网桥容器通过NAT访问外网默认bridge没有内置DNS解析不能直接用容器名通信。host模式容器直接复用宿主机完整网络栈网络隔离较弱端口会直接占用宿主机端口。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--networkmynet1 nginx#给已经运行的容器追加额外网络实现跨网络容器互通dockernetwork connect mynet1 test15.2 container共享网络栈 joined模式示意图解读使用--networkcontainer:容器名后新容器和已有容器共用一套网络命名空间网卡、端口完全共享可以通过127.0.0.1访问对方端口。#示例phpmyadmin和mysql共享网络栈dockerrun-d--namephpmyadmin--networkmynet1-ePMA_ARBITRARY1-p80:80 phpmyadmin:latestdockerrun-d--namemysql--networkcontainer:phpmyadmin-eMYSQL_ROOT_PASSWORDleemysql:8.0phpMyAdmin页面中数据库地址填写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-oparenteth1 macvlan1#节点1启动容器dockerrun-it--nametest--rm--networkmacvlan1--ip1.1.1.100 busybox:latest#节点2启动容器dockerrun-it--nametest--rm--networkmacvlan1--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:latest6.2 docker managed docker管理卷Docker自动管理存储目录/var/lib/docker/volumes不需要写死宿主机绝对路径可移植性更强。#创建管理卷dockervolume create timingleedockervolumels#挂载数据卷到容器dockerrun-it--rm-vtiminglee:/data:ro busybox:latest#删除指定数据卷dockervolumermtiminglee#清理所有未被容器使用的闲置卷dockervolume prune6.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:latest6.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-dcompose示例 phpmyadmin mysqlservices: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:-phpmyadmincompose完整示例自定义网络、自定义数据卷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 ubuntu8.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 ubuntu8.3 容器权限控制 cap-add / --privileged⚠️--privileged会授予容器几乎等同于宿主机root的权限生产环境应尽量避免使用优先使用--cap-add按需添加最小权限白名单。#仅授予网络管理权限dockerrun-it--rm--cap-add CAP_NET_ADMIN busybox:latest九、全文总结Docker三大核心镜像只读分层模板、容器运行读写实例、仓库镜像存储分发。构建镜像优先使用Dockerfile推荐多阶段构建减小镜像体积生产环境不建议使用docker commit制作镜像。网络优先选择自定义bridge自带DNS容器名解析跨主机容器通信可以选择macvlan。业务数据必须使用volume数据卷持久化容器删除数据不丢失并定期做好备份。小规模私有镜像仓库可使用Registry企业级生产环境建议使用Harbor提供Web UI和RBAC权限管理。Docker Compose适合单机多容器编排生产环境必须配置CPU、内存资源限制遵循最小权限原则避免滥用--privileged特权。
返回列表