前几天还有小伙伴问我:为啥要用Docker部署网站或者是一些小工具?单纯的因为“简单”呀!

什么是Docker?

​​

Docker是一种容器化技术,将应用与依赖(如库、配置)打包成独立的“容器”,确保环境一致;且具有隔离性,每个容器相互隔离,共享主机系统内核,像是一个跟轻量化的虚拟机。

通常只需改配置文件的访问端口映射路径、环境变量等就可以快速部署,而不需要繁琐的“准备工作”(如:安装nginx、安装php、安装php拓展等)。

更专业、详细的介绍,你可以从搜索引擎获取!

名称解析

  • 镜像(Image):容器的"安装包",打包了程序、依赖和环境,开箱即用。

  • 映射:把容器的访问端口文件"挂钩"到主机,方便访问和持久化数据(通常只改左边的)。

  • 环境变量:给容器传小纸条,配置参数(比如数据库地址),不用改代码就能切换设置。

  • 网络模式:容器如何联网,是共用主机网络(host),还是开独立通道(bridge),或者完全隔离(none),docker run 没写则默认为 bridge 模式。

安装Docker

  1. 主流的面板软件(如:宝塔、1Panel)都可以在面板一键安装Docker。

  2. 如果不想用面板类软件,参考:https://www.xiaoge.org/archives/debian-install-docker (新手不太建议)。

实战

以 EasyImage 简单图床 为例!(bt、1panel的docker 商店也提供了示例,这里主要介绍手动部署方法)

​​

常规安装

如果你要以PHP的形式运行,需要准备的工作是:

Nginx​ + PHP≥7.0​ + linux​,且PHP安装Fileinfo、iconv、zip、mbstring、openssl扩展!

这些有有没没装完,几十分钟要吧?而且还是不能出错的情况下🙂

Docker Run(直接启动)

项目示例:

docker run -itd \
  --name easyimage \ #容器名称
  -p 8080:80 \ #访问端口,改前面的即可,不要和已有的冲突
  -e TZ=Asia/Shanghai \ #环境变量,TZ为时区
  -v /root/data/docker_data/easyimage/config:/app/web/config \ #配置文件路径,按需改动
  -v /root/data/docker_data/easyimage/i:/app/web/i \ #存储路径,按需改动
  ddsderek/easyimage:latest #镜像

修改你要用的端口、路径(这里用了18080端口访问,文件存放在 /opt/easyimage 下面):

docker run -itd \
  --name easyimage \
  -p 18080:80 \
  -e TZ=Asia/Shanghai \
  -v /opt/easyimage/config:/app/web/config \
  -v /opt/easyimage/i:/app/web/i \
  ddsderek/easyimage:latest
  • 运行前建议先在面板搜索和拉取镜像 ddsderek/easyimage:latest ,SSH 里面拉取镜像命令: docker pull ddsderek/easyimage:latest

无法拉取的话,自行配置加速地址。然后使用面板创建,或者是直接SSH里面运行!

宝塔部署

bt-run.png

1Panel 部署

完成后访问 ip:18080

是不是开箱即用🙂~ 当然这样还是觉得不够优雅?那么就用Docker Compose!

Docker Compose(编排模式)

Docker Compose 用一个Yaml文件的形式,同时配置一个或多个容器,轻松搞定依赖关系,同时方便迁移。

上面的简易图床也提供了一个 docker-compose.yaml 示例:

version: '3.3'
services:
  easyimage: #整个编排的名称
    image: ddsderek/easyimage:latest #镜像
    container_name: easyimage #容器名称
    ports:
      - '8080:80' #访问端口,改前面的即可
    environment:
      - TZ=Asia/Shanghai #环境变量,TZ为时区
    volumes:
      - '/root/data/docker_data/easyimage/config:/app/web/config' #配置文件路径
      - '/root/data/docker_data/easyimage/i:/app/web/i' #存储路径
    restart: unless-stopped

如果没有提供yaml,可以自行转换,或者借助工具转换(多部署几次就得心应手了🙂),推荐一个工具:https://www.composerize.com/

我们同样小小修改:

version: '3.3'
services:
  easyimage: #编排的名称
    image: ddsderek/easyimage:latest #镜像
    container_name: easyimage #容器名称
    ports:
      - '18080:80' #访问端口,这里我依旧改成了18080
    environment:
      - TZ=Asia/Shanghai #环境变量,TZ为时区
    volumes:
      - './config:/app/web/config' #配置文件路径,[./]是当前目录的意思
      - './i:/app/web/i' #存储路径,[./]是当前目录的意思
    restart: unless-stopped

编排模式支持当前文件夹的形式,而且为了方便后期迁移、备份,我也更推荐你用这种形式,而不是实际路径!config​、i​ 两个目录会在编排启动后自动创建!

宝塔部署

​​

直接复制、粘贴、启动!就可以 ip:18080​ 进行访问了!😄是不是更快?

​​

从生成的目录,可以看到宝塔的 compose 编排默认路径为:/www/server/panel/data/compose

1Panel 部署

​​

同样如此!一键启动~ 完事😄

​​

1panel 的默认 compose 编排默认路径则为:/opt/1panel/docker/compose

这就是为何我更建议你用 ./​ 的当前文件夹,而不是实际路径,这样是最规范的(除非需要映射已有的文件夹,比如媒体库之类的)。

  • 毕竟每家的docker管理器,默认编排目录会有所不同的!这样也是更方便备份、迁移。

命令行启动

选一个你想存放的路径,例如:/opt/docker/easyimage​,将上面的命令保存成 docker-compose.yaml​ 文件

cd 到当前文件夹

cd /opt/docker/easyimage

启动编排!然后就又弄完了~

docker compose up -d

附几个的常规 compose 命令

  • 启动编排:docker-compose up -d

  • 停止并删除所有容器、网络:docker-compose down (只会停止当前文件夹下的yaml编排)

  • 查看容器编排的运行情况:docker-compose ps

备份与迁移

备份

​​bt-compose2.png

打包或拷贝编排所在的文件夹,例如:/opt/1panel/docker/compose/easyimage​,当然你也可以整个 /opt/1panel/docker/compose​ 都备份🙂。

恢复

​​

创建编排,选择从yaml文件(有的面板是yml格式,如无法识别,可改成yaml后缀)

后言

如果是多个容器,那更是 compose 的拿手好活!一次启动,依赖关系、配置都能直接搞定,这里以wp+mysql为例:

version: '3.8'
services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"  # 主机8080映射到容器80端口
    volumes:
      - /opt/docker/wordpress/html:/var/www/html  # 持久化网站数据
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
      WORDPRESS_DB_NAME: wpdb
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass  # 管理员密码(建议生产环境修改)
      MYSQL_DATABASE: wpdb
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
    volumes:
      - /opt/docker/wordpress/db:/var/lib/mysql  # 持久化数据库
    ports:
      - "3306:3306"  # 可选:暴露MySQL到主机

启动后,直接连数据库都不用手动设置了🙂,直接开箱即用!

当然对于WP,一般不太推荐直接docker启动,原因是官方docker镜像,并没有集成一些常见的PHP拓展~

容器是不是非常简单?而且docker compose 实际也不难!也是目前主流的部署方式。

需要注意的是yaml文件对缩进有比较严格的要求!只能用空格,不能用tab进行缩进!