序言

想象你是一个外卖小哥,每次送餐都要根据客户口味现场种菜、现宰活鸡、现砌灶台...

这就是开发者的日常噩梦啊😵‍💫!直到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'