
涵盖内容Docker部署、镜像管理、容器操作、Dockerfile镜像构建、私有仓库、Docker网络、数据卷、安全加固、Docker Compose编排目录Docker简介Docker部署安装Docker镜像管理Docker容器管理Dockerfile构建镜像Docker私有镜像仓库Docker网络Docker数据卷管理Docker安全加固与资源限制Docker Compose容器编排1 Docker简介1.1 什么是DockerDocker是一套容器引擎实现应用打包、分发、运行属于轻量级虚拟化不是完整虚拟机。镜像Image只读分层文件包软件包复用宿主机内核。容器Container镜像运行实例本质是宿主机上隔离进程容器拥有一层可读写层容器删除可写层数据全部丢失。仓库Registry存储镜像分为公共仓库Docker Hub私有仓库registry、Harbor。1.2 Docker底层三大技术Namespace实现资源隔离PID、网络、挂载、用户等Cgroups限制CPU、内存、磁盘IO资源使用UnionFS联合文件系统镜像分层写时复制CoW实现镜像复用、节省磁盘。类比镜像 类(class)容器 对象实例(object)1.3 Docker优势启动速度秒级资源消耗远小于虚拟机开发、测试、生产环境一致性消除环境差异问题可移植打包应用及全部依赖一次构建到处运行资源利用率高多个容器共享宿主机内核2 Docker部署安装2.1 配置阿里云docker-ce软件源cat /etc/yum.repos.d/docker.repo [docker] name docker baseurl https://mirrors.aliyun.com/docker-ce/linux/rhel/9.8/x86_64/stable/ gpgcheck 0 EOF dnf makecache #卸载系统自带podman避免冲突 dnf remove podman -y2.2 安装docker-cednf install docker-ce -y2.3 修改docker服务配置启用iptablesvim /lib/systemd/system/docker.service #修改ExecStart参数 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock --iptablestrue2.4 配置内核网络模块与sysctl参数#加载br_netfilter内核模块 echo br_netfilter /etc/modules-load.d/docker_mod.conf modprobe -a br_netfilter #内核网络参数 cat /etc/sysctl.d/docker.conf net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOF sysctl --system2.5 配置镜像加速器cat /etc/docker/daemon.json EOF { registry-mirrors: [https://docker.1ms.run] } EOF systemctl daemon-reload systemctl enable --now docker #验证加速器配置 docker info3 Docker镜像管理镜像常用命令汇总命令功能说明docker search nginx在远程仓库搜索镜像docker pull nginx:1.26拉取镜像不写tag默认latestdocker images列出本地所有镜像docker history busybox:latest查看镜像分层历史docker save -o game2048.tar timinglee/game2048:latest导出镜像到本地tar包docker load -i game2048.tar从tar包导入镜像docker rmi timinglee/mario:latest删除本地镜像docker tag 旧镜像:tag 仓库地址/镜像名:tag镜像打标签用于推送私有仓库注意镜像为只读分层相同层自动缓存复用节省存储空间。4 Docker容器管理4.1 docker run常用参数参数说明-d后台守护进程运行容器-it交互式终端分配输入输出--name xxx指定容器名称-p 主机端口:容器端口端口映射--rm容器停止之后自动删除容器--network指定容器使用的网络示例#后台运行nginx docker run -d --name web -p 80:80 nginx:1.26 #交互式运行busybox docker run -it --name test busybox:latest快捷键CtrlD退出容器并且停止容器CtrlPQ退出容器继续后台运行4.2 容器生命周期管理docker ps #查看正在运行的容器 docker ps -a #查看所有容器包含已停止 docker stop web #优雅停止容器 docker kill web #强制杀死容器 docker start web #启动已停止容器 docker restart web #重启容器 docker rm web #删除已经停止的容器 docker rm -f web #强制删除运行中的容器 docker container prune #清理全部停止状态的容器 docker inspect web #查看容器详细元数据信息4.3 进入容器两种方式docker attach 容器名复用容器原有终端退出会停止容器docker exec -it web /bin/bash新建进程进入容器生产推荐退出不会停止容器#在容器执行单条命令不进入交互终端 docker exec web cat /etc/hosts4.4 容器和宿主机之间复制文件#宿主机文件复制到容器内 docker cp index.html web:/usr/share/nginx/html #容器内文件复制到宿主机 docker cp web:/usr/share/nginx/html/index.html /mnt4.5 docker commit提交容器不推荐生产将容器可读写层变更打包生成新镜像缺点镜像不可审计分层混乱生产优先Dockerfile构建镜像。docker commit -m add index.html web nginx_index:latest #-m 填写修改备注信息5 Dockerfile构建镜像5.1 Dockerfile常用指令表指令说明FROM必须第一行指定基础镜像LABEL keyvalue设置镜像元数据、作者信息替代MAINTAINERCOPY src dest复制文件不会自动解压压缩包ADD src dest复制文件自动解压tar压缩包支持URL地址ENV NAMEtiminglee设置环境变量RUN镜像构建阶段执行命令生成镜像层EXPOSE 80声明暴露端口仅文档提示不会真正做端口映射VOLUME [/mnt]声明数据卷挂载点WORKDIR /mnt设置工作目录等价cdCMD [命令,参数]容器启动默认命令可以被docker run参数覆盖ENTRYPOINT [命令]容器启动入口不会被run参数覆盖run参数追加CMD与ENTRYPOINT区别 CMDdocker run 镜像 新命令可以直接覆盖 ENTRYPOINTrun后面内容作为参数追加不能直接覆盖入口程序。5.2 Dockerfile简单示例FROM busybox:latest LABEL Createrlee COPY timinglee /root ENV NAMEtiminglee WORKDIR /root RUN touch test.txt EXPOSE 8080 CMD [/bin/sh]5.3 构建镜像命令# . 代表构建上下文目录 docker build -t timinglee:v1 . # 指定Dockerfile文件名 docker build -t timinglee:v1 -f ./Dockerfile .5.4 多阶段构建镜像瘦身核心第一阶段做编译构建第二阶段仅复制编译产物丢弃编译工具链大幅度减少镜像大小搭配distroless极简基础镜像效果最佳。#编译阶段 FROM debian:13 AS build ADD nginx-1.30.4.tar.gz /mnt WORKDIR /mnt/nginx-1.30.4 RUN apt update apt install -y build-essential libpcre2-dev zlib1g-dev libssl-dev ./configure --with-http_ssl_module --with-http_stub_status_module make make install #最终运行镜像使用极简基础镜像 FROM gcr.io/distroless/base-debian13:latest COPY --frombuild /usr/local/nginx /usr/local/nginx EXPOSE 80 VOLUME [/usr/local/nginx/html] ENTRYPOINT [/usr/local/nginx/sbin/nginx, -g, daemon off;]构建docker build -t nginx-lee:v1 .6 Docker私有镜像仓库6.1 简易registry私有仓库http运行registry容器docker run -d --name registry --restartalways -p 5000:5000 registry:latestDocker默认强制https协议http仓库需要配置不安全仓库cat /etc/docker/daemon.json EOF { registry-mirrors: [https://docker.1ms.run], insecure-registries:[http://172.25.254.10:5000] } EOF systemctl restart docker镜像打标签、推送镜像docker tag nginx-lee:v1 172.25.254.10:5000/nginx-lee:v1 docker push 172.25.254.10:5000/nginx-lee:v1 #查询仓库镜像列表 curl http://172.25.254.10:5000/v2/_catalog #其他节点拉取镜像 docker pull 172.25.254.10:5000/nginx-lee:v16.2 registry仓库TLS加密 htpasswd账号认证openssl生成自签名证书挂载证书目录启动registry配置htpasswd账号密码客户端节点将ca.crt证书放到目录/etc/docker/certs.d/reg.timinglee.org/ca.crt使用docker login reg.timinglee.org登录仓库登录成功才可以推拉镜像。6.3 Harbor企业级私有仓库Harbor是VMware开源企业级镜像仓库提供webUI、RBAC权限、项目管理、镜像扫描、镜像复制同步企业生产环境首选。解压harbor离线安装包复制模板文件harbor.yml.tmpl为harbor.yml修改配置hostname域名、证书路径、harbor_admin_password管理员密码执行./install.sh一键部署harbor编写systemd服务单元文件管理harbor服务底层使用docker compose管理容器。浏览器访问web管理页面新建项目docker login登录tag、push上传镜像。7 Docker网络7.1 查看docker网络docker network lsdocker内置3种网络驱动bridge、host、none扩展驱动macvlan、overlaybridge默认docker0网桥容器默认网络veth‑pair虚拟网卡连接容器与docker0网桥iptables NAT实现容器访问外网默认bridge网络没有内置DNS解析只能IP通信容器重启IP会发生变化。host模式--network host容器完全复用宿主机网络栈没有网络隔离直接使用宿主机网卡端口不需要端口映射缺点端口冲突风险高。none模式--network none容器禁用网络只有lo回环接口适用于完全不需要网络的隔离场景。7.2 自定义bridge网络生产推荐自带DNS解析可以直接使用容器名字通信容器IP变化不影响服务发现。#创建默认自定义网桥自动分配网段 docker network create mynet1 #自定义子网、网关创建网络 docker network create mynet2 --subnet 192.168.0.0/16 --gateway 192.168.0.100 #查看网络详情 docker network inspect mynet1 #容器指定自定义网络启动 docker run -d --name web1 --network mynet1 nginx docker run -it --name test --network mynet1 busybox #容器内部 ping web1可以直接用容器名称解析访问 ping web1不同自定义网络默认隔离无法直接通信。解决docker network connect mynet1 test为容器额外增加网卡接入另外网络。7.3 共享网络栈--networkcontainer:容器名新容器复用已有容器完整网络命名空间两个容器拥有完全相同IP地址可以通过127.0.0.1互相访问。docker run -d --name phpmyadmin -p 80:80 phpmyadmin:latest #mysql复用phpmyadmin网络栈直接localhost访问mysql 3306端口 docker run -d --name mysql --networkcontainer:phpmyadmin -e MYSQL_ROOT_PASSWORDlee mysql:8.07.4 macvlan跨主机容器通信容器分配独立MAC与IP如同物理主机不需要NAT端口映射实现不同宿主机容器二层互通。物理网卡开启混杂模式ip link set eth1 promisc on ip link set up eth1创建macvlan网络绑定物理网卡docker network create -d macvlan --subnet 1.1.1.0/24 --gateway 1.1.1.1 -o parenteth1 macvlan1两台docker主机均创建相同macvlan网络启动容器指定静态IP#node1 docker run -it --name test1 --network macvlan1 --ip 1.1.1.100 busybox #node2 docker run -it --name test2 --network macvlan1 --ip 1.1.1.200 busybox #两台容器互相ping完成跨主机通信8 Docker数据卷管理容器可读写层生命周期和容器绑定容器删除数据丢失数据卷实现数据持久化数据独立容器生命周期。8.1 bind mount 绑定挂载直接挂载宿主机目录/文件到容器ro代表只读。# -v 宿主机路径:容器路径:权限 docker run -it --rm -v /mnt/data:/data:ro busybox8.2 docker managed volumedocker管理卷docker自动管理存储数据存放路径/var/lib/docker/volumes/卷名/_data不需要写宿主机绝对路径。docker volume create timinglee docker volume ls docker volume inspect timinglee #挂载命名卷 docker run -d -v timinglee:/data nginx #清理没有被容器使用的数据卷 docker volume prune8.3 数据卷容器 --volumes‑from复用其他容器全部挂载配置实现多个容器共享数据。#创建数据卷容器 docker run -d --name datacont -v /opt/data:/data busybox sleep 10000 #新容器复用全部挂载 docker run -it --rm --volumes-from datacont busybox8.4 数据卷备份与恢复#备份将容器数据卷打包备份到宿主机当前目录 docker run --rm --volumes-from webserver -v $(pwd):/backup busybox tar zcf /backup/html.tar.gz /usr/share/nginx/html #恢复解压备份包到容器数据卷 docker run --rm --volumes-from webserver -v $(pwd):/backup busybox tar zxf /backup/html.tar.gz -C /9 Docker安全加固与资源限制Docker本质是宿主机进程隔离弱于虚拟机生产环境必须做资源限制、最小权限管控。9.1 CPU资源限制#限制最大CPU使用率period周期100000微秒quota20000代表最多使用20%CPU docker run -it --rm --cpu-period 100000 --cpu-quota 20000 ubuntu #cpu‑sharesCPU权重多容器争抢CPU时的优先级默认1024数值越大优先级越高 docker run -it --rm --cpu-shares 512 ubuntu9.2 内存资源限制#限制内存200Mswap交换内存同样限制200M docker run -d --name test --memory 200M --memory-swap 200M nginx9.3 磁盘IO读写限速#限制磁盘写速率30MB/s docker run -it --rm --device-write-bps /dev/nvme0n1:30M ubuntu9.4 容器特权控制 capabilities--privileged容器获得几乎宿主机完整root权限生产严禁使用风险极高--cap-add白名单机制只授予容器必要权限。#仅授予网络管理权限 docker run -it --rm --cap-add CAP_NET_ADMIN busybox9.5 LXCFS优化容器资源隔离显示默认容器内部free、top看到宿主机全部硬件资源lxcfs伪装/proc文件容器内部只展示分配给容器的资源限制。#启动lxcfs lxcfs /var/lib/lxcfs #启动容器挂载lxcfs伪proc文件 docker run -it -m 256m \ -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 ubuntu9.6 cgroup版本切换RHEL9默认cgroup‑v2部分工具兼容v1修改内核参数切换cgroup‑v1grubby --update-kernel/boot/vmlinuz-$(uname -r) \ --argssystemd.unified_cgroup_hierarchy0 systemd.legacy_systemd_cgroup_controller reboot10 Docker‑Compose容器编排Docker Compose用于单机多容器项目使用yaml文件定义一组关联服务单命令完成整套应用启停自动管理网络、存储卷。10.1 常用命令命令说明docker compose up -d后台启动整套服务docker compose down停止删除容器、网络不会删除命名数据卷docker compose ps查看服务状态docker compose logs web查看web服务日志docker compose restart重启整套服务docker compose build构建yaml中定义的Dockerfile镜像docker compose exec web /bin/bash进入web服务容器docker compose -f xxx.yml up -d指定yml配置文件10.2 docker‑compose.yml文件结构顶层三大配置段services服务、networks网络、volumes存储卷示例phpmyadminmysqlservices: phpmyadmin: image: phpmyadmin:latest container_name: phpmyadmin ports: - 80:80 environment: PMA_ARBITRARY: 1 mysql: image: mysql:8.0 container_name: mysqldb environment: MYSQL_ROOT_PASSWORD: lee network_mode: service:phpmyadmin depends_on: - phpmyadmin注意depends_on仅控制容器启动顺序不会等待应用程序就绪数据库业务需要自己处理等待逻辑。10.3 compose内部build构建镜像services: web: build: context: ./ dockerfile: ./Dockerfile image: myweb:v1 ports: - 80:8010.4 compose实战 haproxy负载均衡示例services: web1: image: nginx:latest container_name: web1 networks: - lbnet volumes: - webdata1:/usr/share/nginx/html web2: image: nginx:latest container_name: web2 networks: - lbnet volumes: - webdata2:/usr/share/nginx/html haproxy: image: haproxy:2.3 container_name: haproxy networks: - lbnet volumes: - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg ports: - 80:80 networks: lbnet: driver: bridge volumes: webdata1: webdata2: