Docker 实战:从安装到用 Compose 部署网站与数据库一次讲清


一、Docker 到底是什么,能解决什么问题

先理解三个概念:

  1. 镜像(Image):打包好的应用模板,包含代码、运行环境、依赖,只读;
  2. 容器(Container):镜像跑起来的实例,相互隔离,可随时创建和销毁;
  3. 仓库(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 部署,安全上注意几点:

  1. 尽量只用官方镜像或长期维护的可信镜像,别从不明来源拉镜像;
  2. 线上环境避免用 latest 标签,固定到具体版本号,避免更新后行为不一致;
  3. 只暴露必要的端口,数据库端口不要映射到公网;
  4. 使用非 root 用户运行容器(docker-compose.yml 里指定 user);
  5. 定期更新镜像,可以用 watchtower 实现自动更新:
docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower

八、结语

Docker 的价值在于把环境问题一次性解决:镜像打包环境、Compose 编排服务、数据卷保住数据,换服务器、迁移站点都变得非常轻松。把上面几步走完,一个稳定、可备份、可迁移的 Docker 建站环境就搭好了。

如果你在配置过程中遇到镜像拉取失败、Compose 语法报错、端口起不来之类的问题,欢迎在评论区留言,看到都会回复。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

VPS 线路怎么选?CN2 GIA、CN2 GT、BGP 三网直连区别与实测判断一次讲清

WordPress 打开慢怎么优化?对象缓存、数据库与图片压缩一次讲清

评 论