前言
上一篇文章,我们已经在本地虚拟机中把Portainer部署好了,并且已经可以对远程服务器进行管理了,这次我准备全程通过Portainer来搭建一个载满了80
、90
后童年记忆的游戏网站。
就冲着有仙剑这一点,我也要把它部署起来。在部署的过程中,我想起了那天夕阳下的奔跑,那是我逝去的青春!
1. 前期准备
该游戏网站主要是基于以下两个项目搭建:
- chinese-dos-games-web:该项目用于搭建一个承载游戏的网站;
- chinese-dos-games:该项目用于下载游戏文件。
不过遗憾的是,原作者并没有提供Docker的部署方式,而另一位大佬提供的镜像oldiy/dosgame-web-docker
也已经很久没有更新了。然而,这些都不是最重要的,最重要的是,项目源码中直接通过CDN
方式引用了bootstrap
,而stackpath.bootstrapcdn.com
貌似已经访问不了,所以打开页面会很卡,布局也扭曲了。
因此,我准备下载源码,编写Dockerfile
和docker-compose.yml
文件,自己构建镜像部署。修改后的目录结构如下:
其中,我做了如下优化,
- 将
bootstrap
相关文件下载到了本地,并修改了源码的引用方式; - 两个项目合二为一,将
chinese-dos-games
项目下的img
、download_data.py
和games.json
复制到了chinese-dos-games-web
项目的static/games
目录下; - 编写
Dockerfile
和docker-compose.yml
文件,用于构建镜像和部署,镜像中不预装游戏,减小体积; - 将上述文件夹打包成
tar
包,以便于Portainer安装。
如有需要该tar
包,关注公众号【老朱独立开发】,回复【dosgame】获取,然后按接下来的步骤执行即可。
2. 安装部署
接下来就可以通过Portainer来部署我们的游戏网站了。
2.1 构建镜像
- 打开Portainer管理界面,点击Home页,选择希望部署的节点。
- 选择Images,点击Build a new image按钮创建新镜像。
- 填写镜像名称,选择Upload方式,上传
tar
文件(zip
不支持),然后点击Build the image按钮,等待构建即可。
如果超时失败了,就重新再来一次,安装成功后,镜像列表中会出现如下两个镜像:
该步骤相当于执行了docker build -t chinese-dos-games-web .
命令。
2.2 启动容器
我们知道,通过脚本启动容器有两种方式:docker run
和docker compose up
。它们在Portainer中分别对应的是Containers和Stacks,Containers方式需要先创建数据卷,网络等,然后再创建容器,并作出相应的配置,和Stacks相比,步骤和参数都会多一些,我这里直接采用Stacks方式,因为Stacks方式只需要配置docker-compose.yml
文件即可,具体步骤如下:
- 选择Stacks,点击Add stack按钮。
- 填写Name,选择Upload,上传
docker-compose.yml
文件,点击Deploy the stack即可完成部署。
该步骤需要注意的是,docker-compose.yml
中的镜像名要与上面构建镜像时填写的镜像名一致。 - 到Containers中,就可以看到启动后的容器了。
该步骤相当于执行了docker compose up -d
命令。
3. 配置反向代理
由于我们没有在docker-compose.yml
中配置主机端口映射,因此必须通过Nginx Proxy Manager进行反向代理后,才能正常访问网站。SSL
证书也需要配置上,如下图所示:
接下来,就可以通过 https://game.ilaozhu.com/ 来访问我们的游戏网站了。
4. 下载游戏
我知道你很着急,但是请先别急,现在的游戏网站还只是虚有其表,因为缺少游戏文件,所以接下来,我们还需要下载游戏文件到数据卷中,具体步骤如下:
- 点击如下图所示的图标,连接容器。
- 选择
/bin/sh
,然后点击Connect按钮。 - 执行
python3 ./static/games/download_data.py
命令,下载游戏文件。
这里有些需要说明的是:
- 为了保证镜像体积更小,构建更快,因此镜像中没有预装游戏,需要部署完成后手动下载;
- 游戏一共有
1898
个,近40G
,你可以修改games.json
文件,只保留你想要的,然后再通过download_data.py
下载; - 你也可以在宿主机执行该脚本,路径是
/var/lib/docker/volumes/dos-games/_data
,我在容器中执行的原因是我不想在宿主机上安装python
环境; /var/lib/docker/volumes
是数据卷的默认位置,虽然我们可以直接挂载目录到宿主机的任意位置,但是官方更推荐数据卷,详见:Volumes,更重要的是,数据卷可以根据容器中内容初始本地目录,而挂载目录则会以主机为准。
其实你可以在任何地方下载,只要最后拷贝到服务器上的/var/lib/docker/volumes/dos-games/_data/bin
目录下,并修改对应的games.json
文件就可以了。至此,我们的游戏网站才算真的部署完成了。接下来,打开 https://game.ilaozhu.com ,找找看,有没有你的童年记忆吧?
结语
Portainer作为一个可视化工具,其本质就是对各种Docker命令进行了可视化包装,让使用者可以不用记忆一大堆的命令,就能直观的管理并监控我们的容器。但是,这并不意味着以后就不用写脚本了。别的不说,单就部署而言,显然还是脚本更方便,也更不容易出错,毕竟脚本是实现全面自动化的基础,只要写一次就能永绝后患,这是可视化操作永远无法替代的优势。
好了,先不说了,我要去仙灵岛找我的灵儿了。
评论0
暂时没有评论