序言
想象你是一个外卖小哥,每次送餐都要根据客户口味现场种菜、现宰活鸡、现砌灶台...
这就是开发者的日常噩梦啊😵💫!直到Docker这个小玩意出现~
Docker是软件界的乐高大师
它把你的代码+运行环境+配置文件统统装进"集装箱",就像把整套厨房装进神奇宝贝球。无论是Python小精灵还是Java哥斯拉,都能在“0.1秒”内召唤出完全一致的运行环境
真实の魔法时刻
• 开发小哥说"我电脑能跑啊!"时,运维大叔不再举刀追杀🤡
• 测试小姐姐的电脑不再长出奇怪版本的MySQL蘑菇🤤
• 凌晨三点的服务器上线,不再需要烧香拜佛🎉
比虚拟机更酷的骚操作
传统虚拟机像是扛着整套房子搬家,而Docker就像变形金刚——所有容器共享操作系统内核,启动速度堪比灭霸的响指,资源消耗比喵星人踩键盘还轻。
日常骚操作示范
左手运行Python2.7怀旧服,右手开Python3.10尝鲜版
把祖传屎山代码打包成时光胶囊,百年后还能正常运行
在星巴克用笔记本瞬间部署分布式系统,比点拿铁还快
就像《阿甘正传》说的:"Docker就像一盒巧克力,你永远不知道里面装着什么环境,但每个都完美适配你的应用!"🤣
一、镜像管理命令
1.1 镜像基础操作
# 查看镜像列表(按创建时间排序)
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.CreatedSince}}" | sort -k 4
# 搜索镜像(显示前5个结果)
docker search --limit 5 nginx
# 下载特定架构镜像
docker pull --platform linux/arm64 ubuntu:22.04
# 删除所有悬空镜像
docker image prune -f
# 批量删除镜像(按名称匹配)
docker rmi $(docker images -q "myapp-*")
1.2 镜像构建与分发
# 构建镜像并添加构建参数
docker build -t myapp:v1 --build-arg NODE_ENV=production .
# 导出镜像为压缩包
docker save myapp:v1 | gzip > myapp-v1.tar.gz
# 从压缩包加载镜像
gunzip -c myapp-v1.tar.gz | docker load
# 镜像签名验证
docker trust inspect --pretty myapp:v1
# 推送镜像到私有仓库
docker tag myapp:v1 registry.example.com/project/myapp:v1
docker push registry.example.com/project/myapp:v1
二、容器生命周期管理
2.1 容器基础操作
# 创建并启动容器(带资源限制)
docker run -d --name web \
--memory 2g \
--cpus 1.5 \
--pids-limit 100 \
-p 8080:80 \
nginx:alpine
# 查看容器实时资源使用
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# 批量停止所有运行容器
docker stop $(docker ps -q)
# 强制删除容器(包括运行中的)
docker rm -f $(docker ps -aq)
# 查看容器启动失败日志
docker logs --tail 100 -t web 2>&1 | grep -i error
2.2 容器高级操作
# 容器热更新(不中断服务)
docker exec web nginx -s reload
# 创建临时调试容器(共享网络)
docker run -it --rm --network container:web nicolaka/netshoot
# 容器文件系统检查
docker diff web | grep -v "/var/cache"
# 容器资源限制动态调整
docker update --memory 3g --memory-swap 4g web
# 容器健康状态检查
docker inspect --format='{{json .State.Health}}' web
三、网络管理命令
3.1 网络基础配置
# 创建自定义桥接网络
docker network create \
--driver=bridge \
--subnet=172.28.0.0/16 \
--gateway=172.28.5.1 \
my-network
# 查看网络详细信息
docker network inspect my-network --format '{{json .IPAM.Config}}'
# 容器连接多个网络
docker network connect frontend web
docker network connect backend web
# 端口映射检查
docker port web 80
3.2 网络高级调试
# 容器网络抓包
docker run --rm --net container:web nicolaka/netshoot tcpdump -i eth0 -w capture.pcap
# 网络连通性测试
docker exec -it web curl -I http://database:3306
# 查看容器iptables规则
docker run --rm --privileged web iptables -L -n -v
# 网络带宽限制
docker network create --driver bridge \
--opt "com.docker.network.bridge.enable_icc=true" \
--opt "com.docker.network.bridge.host_binding_ipv4=0.0.0.0" \
--opt "com.docker.network.driver.mtu=1500" \
my-limited-network
四、存储管理命令
4.1 数据卷操作
# 创建命名卷
docker volume create app-data
# 查看卷使用情况
docker system df -v
# 数据卷备份
docker run --rm -v app-data:/source -v $(pwd):/backup \
alpine tar czf /backup/app-data-$(date +%Y%m%d).tar.gz -C /source .
# 跨容器数据迁移
docker run --rm --volumes-from old-container -v $(pwd):/backup \
alpine sh -c "cd /source && tar cf - ." | tar xf - -C /backup
4.2 绑定挂载高级用法
# 只读挂载配置文件
docker run -v /host/config:/etc/app:ro myapp
# 挂载单个文件
docker run -v /host/config.yml:/app/config.yml:rw myapp
# 使用内存文件系统
docker run --tmpfs /run:rw,noexec,nosuid,size=256m myapp
# 共享主机设备
docker run --device /dev/sda:/dev/xvda --privileged storage-app
五、系统管理命令
5.1 Docker 服务管理
# 查看Docker版本信息
docker version --format 'Client: {{.Client.Version}}\nServer: {{.Server.Version}}'
# 清理系统资源
docker system prune -af --volumes
# 查看磁盘使用详情
docker system df --format "table {{.Type}}\t{{.TotalCount}}\t{{.Size}}"
# 查看实时事件流
docker events --filter 'type=container' --format '{{.Time}} {{.Type}} {{.Actor.Attributes.name}}'
5.2 集群管理命令
# 节点管理
docker node ls --format "table {{.ID}}\t{{.Hostname}}\t{{.Status}}\t{{.Availability}}"
# 服务滚动更新
docker service update --image myapp:v2 --update-parallelism 2 --update-delay 10s myapp
# 服务扩缩容
docker service scale myapp=5
# 查看服务日志
docker service logs --tail 100 -f myapp
六、安全相关命令
6.1 容器安全设置
# 以非root用户运行
docker run -u 1000:1000 --userns=host myapp
# 限制容器权限
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE web
# 设置只读文件系统
docker run --read-only -v /tmp:/tmp:rw myapp
# 启用SELinux标签
docker run --security-opt label=type:svirt_lxc_net_t myapp
6.2 镜像安全扫描
# 使用Trivy扫描镜像漏洞
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image --severity CRITICAL myapp:v1
# 检查镜像签名
docker trust inspect --pretty myapp:v1
# 查看镜像构建历史
docker history --no-trunc myapp:v1
七、开发调试命令
7.1 开发环境工具
# 进入容器调试(使用特定shell)
docker exec -it web ash
# 容器文件实时同步(开发模式)
docker run -v $(pwd)/src:/app/src:delegated myapp-dev
# 容器端口转发(SSH隧道)
docker run -p 2222:22 -e SSH_PUBKEY="$(cat ~/.ssh/id_rsa.pub)" debug-container
# 容器环境变量检查
docker exec web env | grep DB_
7.2 性能分析命令
# 容器CPU性能分析
docker exec web top -H -o %CPU
# 内存使用分析
docker run -it --rm --pid=container:web alpine sh -c 'apk add procps && free -m'
# 网络延迟测试
docker exec web ping -c 4 database
# 磁盘IO测试
docker exec web dd if=/dev/zero of=testfile bs=1G count=1 oflag=direct
八、组合命令与快捷操作
8.1 实用命令组合
# 批量清理停止的容器
docker rm $(docker ps -a -f status=exited -q)
# 查看容器IP地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
# 快速重启所有容器
docker restart $(docker ps -q)
# 查看容器启动命令历史
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
nicolaka/netshoot docker history --no-trunc myapp:v1
8.2 常用别名配置
# ~/.bashrc 添加以下别名
alias dps='docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"'
alias dimg='docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedSince}}"'
alias dprune='docker system prune -af --volumes'
alias dlogs='docker logs -f --tail 100'