一、Docker 到底是什么,能解决什么问题
先理解三个概念:
- 镜像(Image):打包好的应用模板,包含代码、运行环境、依赖,只读;
- 容器(Container):镜像跑起来的实例,相互隔离,可随时创建和销毁;
- 仓库(Repository):存放镜像的地方,官方是 Docker Hub,国内常用加速源。
传统部署方式下,换一台服务器就要重新装 PHP、装 MySQL、配 Nginx,版本还经常对不上。用 Docker 之后,环境跟着镜像走:开发环境装一遍,生产环境拉同一个镜像,出来的结果一模一样。
二、安装 Docker 并配置国内镜像加速
最省事的安装方式是用官方脚本(需要 root 权限):
curl -fsSL https://get.docker.com | bash
不想用脚本的话,Debian / Ubuntu 也可以直接装:
apt update apt install -y docker.io
装完启动并设为开机自启:
systemctl enable --now docker
国内服务器拉镜像经常超时,建议先配置镜像加速。编辑 /etc/docker/daemon.json:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com"
]
}
改完重启 Docker:
systemctl daemon-reload systemctl restart docker
用下面两条命令验证是否装好:
docker version docker run --rm hello-world
能打印出客户端和服务端版本信息、hello-world 正常跑完,说明安装成功。
三、跑起第一个容器
先跑一个 Nginx 试试,把容器里的 80 端口映射到服务器的 8080:
docker run -d --name web-demo -p 8080:80 nginx
-d 表示后台运行,--name 给容器起名,-p 8080:80 把宿主机 8080 端口映射到容器 80 端口。执行完后打开 http://服务器IP:8080 就能看到 Nginx 欢迎页。
常用命令顺手记一下:
docker ps # 查看运行中的容器 docker ps -a # 查看所有容器 docker logs web-demo # 查看容器日志 docker exec -it web-demo bash # 进入容器 docker stop web-demo # 停止容器 docker rm web-demo # 删除容器
四、用 Docker Compose 一键部署网站和数据库
单容器适合测试,真正建站推荐用 Docker Compose:用一个 YAML 文件把网站、数据库、中间件定义好,一条命令全部拉起,以后再换服务器也只用复制这个文件。
以最常见的 WordPress 为例,新建一个目录:
mkdir -p /opt/wordpress && cd /opt/wordpress
创建 docker-compose.yml:
services:
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: root123456
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass123
volumes:
- db_data:/var/lib/mysql
web:
image: wordpress:latest
restart: always
depends_on:
- db
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass123
volumes:
- wp_data:/var/www/html
volumes:
db_data:
wp_data:
在目录里执行:
docker compose up -d
等待镜像拉取完成,访问 http://服务器IP:8080 就能进入 WordPress 安装界面。以后想停掉整套环境,一条 docker compose down 即可;想重建,再 up -d 就行,数据因为挂载在数据卷里,不会丢。
五、数据持久化与备份:别让数据跟着容器一起消失
容器是可以随手删的,但数据不能跟着没。上面配置里的 volumes 就是把容器的目录映射到宿主机,容器删了,数据卷里的文件还在。
查看数据卷:
docker volume ls docker volume inspect wp_data
备份 MySQL 数据库,直接通过容器执行 mysqldump:
docker exec 数据库容器名 sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" wordpress' > /opt/backup/wp_$(date +%F).sql
注意:以上命令需要在 docker-compose.yml 所在目录执行,并把「数据库容器名」替换成实际容器名,可用 docker ps 查看。
再配合定时任务,实现每天自动备份:
crontab -e
添加一行(每天凌晨 3 点执行备份脚本):
0 3 * * * /opt/backup/backup.sh
备份和恢复是运维的底线,建议除了本机备份,定期把备份文件同步到对象存储或另一台机器。
六、日志与磁盘清理:容器多了磁盘会悄悄占满
跑一段时间后会发现磁盘空间莫名变少,通常是日志和用不到的镜像在占地方。先看空间占用:
docker system df
日志默认不限制大小,跑得久的容器日志能到几个 G。在 /etc/docker/daemon.json 里给日志加上上限:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
改完同样需要重启 Docker 生效。清理不再使用的镜像、容器和缓存:
docker system prune -a
docker system prune -a 会删掉所有未被使用的镜像和构建缓存,执行前先确认没有依赖这些镜像的运行中容器。
七、镜像安全与自动更新
用 Docker 部署,安全上注意几点:
- 尽量只用官方镜像或长期维护的可信镜像,别从不明来源拉镜像;
- 线上环境避免用 latest 标签,固定到具体版本号,避免更新后行为不一致;
- 只暴露必要的端口,数据库端口不要映射到公网;
- 使用非 root 用户运行容器(docker-compose.yml 里指定 user);
- 定期更新镜像,可以用 watchtower 实现自动更新:
docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
八、结语
Docker 的价值在于把环境问题一次性解决:镜像打包环境、Compose 编排服务、数据卷保住数据,换服务器、迁移站点都变得非常轻松。把上面几步走完,一个稳定、可备份、可迁移的 Docker 建站环境就搭好了。
如果你在配置过程中遇到镜像拉取失败、Compose 语法报错、端口起不来之类的问题,欢迎在评论区留言,看到都会回复。