在开始Docker实战之前,我们需要确保基础环境符合要求。我通常会先做以下检查:
bash复制# 检查Docker版本
docker --version
# 查看系统内核版本
uname -r
这里有几个关键点需要注意:
提示:在生产环境中,建议使用LTS版本的Linux发行版,如Ubuntu 22.04 LTS或CentOS Stream 8,这些系统对Docker的支持更稳定。
国内用户经常会遇到拉取镜像速度慢的问题,我推荐使用以下方法配置镜像加速:
bash复制# 创建或修改daemon.json配置文件
sudo vim /etc/docker/daemon.json
添加以下内容(以DaoCloud镜像为例):
json复制{
"registry-mirrors": ["https://docker.m.daocloud.io"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
配置完成后需要重启服务:
bash复制# 重新加载配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证配置是否生效
docker info | grep -A 5 "Registry Mirrors"
我在实际使用中发现几个常见问题:
推荐几个稳定的国内镜像源:
Docker的网络模型是理解端口映射的关键。默认情况下,Docker会为每个容器创建:
这就像给每个容器分配了一个独立的网络环境,与宿主机和其他容器隔离。
让我们通过DVWA靶场的部署来理解端口映射:
bash复制# 搜索并拉取DVWA镜像
docker search citizenstig/dvwa
docker pull citizenstig/dvwa
常见错误做法:
bash复制# 错误示范:没有映射端口
docker run -d --name web1 citizenstig/dvwa
这样启动后,虽然容器内的服务正常运行(可以通过docker logs查看),但外部无法访问,因为:
正确的做法是:
bash复制# 先清理错误的容器
docker stop web1 && docker rm web1
# 正确启动:映射宿主机8080到容器80端口
docker run -d -p 8080:80 --name web1 citizenstig/dvwa
验证方法:
在实际工作中,我还经常使用这些网络相关参数:
bash复制# 指定特定IP地址映射
docker run -d -p 192.168.1.100:8080:80 --name web2 citizenstig/dvwa
# 映射多个端口
docker run -d -p 8080:80 -p 8443:443 --name web3 citizenstig/dvwa
# 使用主机网络模式(慎用)
docker run -d --network host --name web4 citizenstig/dvwa
注意:使用host网络模式会降低隔离性,但可以提高网络性能,适合特定场景。
Docker的数据持久化主要有三种方式:
我推荐在生产环境中使用Volume方式:
bash复制# 创建数据卷
docker volume create web_data
# 查看数据卷详情
docker volume inspect web_data
让我们通过一个完整的例子来理解数据持久化:
bash复制# 启动容器并挂载数据卷
docker run -d \
--name web2 \
-p 8081:80 \
-v web_data:/var/www/html \
webforpent/webforpent
在容器内创建测试文件:
bash复制docker exec -it web2 bash
echo "重要数据" > /var/www/html/data.txt
exit
现在模拟容器崩溃:
bash复制# 强制删除容器
docker rm -f web2
# 新建容器挂载同一个数据卷
docker run -d \
--name web3 \
-p 8082:80 \
-v web_data:/var/www/html \
webforpent/webforpent
# 验证数据是否还在
docker exec -it web3 cat /var/www/html/data.txt
在实际运维中,我总结了几种数据备份方法:
bash复制# 查找数据卷实际存储位置
docker volume inspect web_data | grep "Mountpoint"
# 备份数据
sudo tar -czvf web_data_backup.tar.gz /var/lib/docker/volumes/web_data/_data
bash复制# 创建备份容器
docker run --rm --volumes-from web3 -v $(pwd):/backup busybox \
tar -czvf /backup/web_data_backup.tar.gz /var/www/html
Docker虽然提供了隔离机制,但默认配置下仍存在安全风险。我通常会做以下加固:
bash复制docker run -d --user 1000:1000 --name secure_container nginx
bash复制docker run -d --cap-drop ALL --cap-add NET_BIND_SERVICE --name limited_container nginx
bash复制docker run -d --memory="512m" --cpus="1.5" --name limited_container nginx
在进行安全测试时,网络隔离尤为重要:
bash复制# 完全禁用网络
docker run -d --network none --name isolated_container alpine
# 自定义网络
docker network create test_network
docker run -d --network test_network --name container1 nginx
docker run -d --network test_network --name container2 nginx
我经常使用以下组合来提高安全性:
定期扫描镜像中的漏洞也很重要:
bash复制# 使用docker自带的扫描功能(需要Docker Desktop或启用实验特性)
docker scan citizenstig/dvwa
# 使用第三方工具如Trivy
docker run --rm aquasec/trivy image citizenstig/dvwa
在实际工作中,我建议:
Portainer是常用的Docker管理UI,部署方法如下:
bash复制# 拉取最新版Portainer
docker pull portainer/portainer-ce
# 启动Portainer容器
docker run -d \
--name portainer \
--restart=always \
-p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce
访问http://localhost:9000后,首次使用需要:
通过Portainer可以方便地:
我特别推荐使用Portainer的"Stacks"功能来管理docker-compose应用。
除了Portainer,还可以使用以下工具监控Docker:
bash复制docker run -d \
--name=cadvisor \
--restart=always \
-p 8080:8080 \
-v /:/rootfs:ro \
-v /var/run:/var/run:ro \
-v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
google/cadvisor
Prometheus + Grafana:构建完整的监控系统
使用Docker内置的统计命令:
bash复制docker stats
docker events
当容器启动失败时,我通常按照以下步骤排查:
bash复制docker logs [容器名/ID]
bash复制docker inspect [容器名/ID]
bash复制docker run -it --rm [镜像] sh
常见问题包括:
网络问题排查流程:
bash复制docker network inspect [网络名]
bash复制docker exec -it [容器] ping [目标]
docker exec -it [容器] curl -v http://目标:端口
bash复制sudo iptables -L -n -v --line-numbers
遇到性能问题时,我会检查:
bash复制docker stats
bash复制top
htop
free -m
bash复制docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" | sort -k3 -h
优化建议:
使用Docker快速搭建漏洞测试环境:
bash复制# 拉取Metasploitable2镜像
docker pull tleemcjr/metasploitable2
# 启动漏洞环境
docker run -d -p 80:80 -p 21:21 --name metasploitable tleemcjr/metasploitable2
安全注意事项:
在CI/CD中使用Docker的示例:
bash复制# 构建阶段
docker build -t myapp:${BUILD_NUMBER} .
# 测试阶段
docker run -d --name test myapp:${BUILD_NUMBER}
docker exec test run_tests.sh
# 部署阶段
docker tag myapp:${BUILD_NUMBER} myapp:latest
docker push myapp:latest
使用docker-compose编排微服务:
yaml复制version: '3'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
depends_on:
- app
app:
image: myapp:latest
environment:
- DB_HOST=db
db:
image: postgres:13
volumes:
- db_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=secret
volumes:
db_data:
启动命令:
bash复制docker-compose up -d