前几天还有小伙伴问我:为啥要用Docker部署网站或者是一些小工具?单纯的因为“简单”呀!
什么是Docker?
Docker是一种容器化技术,将应用与依赖(如库、配置)打包成独立的“容器”,确保环境一致;且具有隔离性,每个容器相互隔离,共享主机系统内核,像是一个跟轻量化的虚拟机。
通常只需改配置文件的访问端口、映射路径、环境变量等就可以快速部署,而不需要繁琐的“准备工作”(如:安装nginx、安装php、安装php拓展等)。
更专业、详细的介绍,你可以从搜索引擎获取!
名称解析
镜像(Image):容器的"安装包",打包了程序、依赖和环境,开箱即用。
映射:把容器的访问端口、文件"挂钩"到主机,方便访问和持久化数据(通常只改左边的)。
环境变量:给容器传小纸条,配置参数(比如数据库地址),不用改代码就能切换设置。
网络模式:容器如何联网,是共用主机网络(host),还是开独立通道(bridge),或者完全隔离(none),docker run 没写则默认为 bridge 模式。
安装Docker
主流的面板软件(如:宝塔、1Panel)都可以在面板一键安装Docker。
如果不想用面板类软件,参考:
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里面运行!
宝塔部署
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
备份与迁移
备份
打包或拷贝编排所在的文件夹,例如:/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进行缩进!
评论