记一次利用Docker容器隔离宝塔和Gitlab的经验分享

在开始之前,我先说明几点,本博文不是教程,只是经验分享,并且仅是根据我自己的需求而定的,可能并不适用于所有场景,但过程可以参考,至于能参考多少,看大家问题跟我的需求重合度有多少!

003.png

我的需求

由于宝塔面板有很强的控制性(如:安装要求纯净系统),并且对系统有一定的侵入性(可以直接该防火墙之类的),虽然这不是坏事,当然我都不觉得是坏事;但也正是由于这个很强的控制性,低配服务器还好(如:1H2G),反正上一个宝塔搞几个站还无所谓;但凡配置稍微高点能“顺带”带一下其他业务的(如:gitlab),宝塔的强控制就成了弊端的(非常实际的例子:gitlab自带nginx,很显然宝塔必然也带nginx/apache,而且两个相当于直接装到机器上的,我说绝对没冲突,你信吗?),当然这里不要跟我说宝塔应用商店自带gitlab,我知道,真弄过宝塔商店自带gitlab自然知道 nginx-web 这个梗;而且我也只是单纯的举例再跑个gitlab,如果我跑的不是gitlab呢?是另外一个呢?当然,这时候又有机智大宝贝说了,你不会用gitea吗?不会搞反向代理吗?不会修改配置文件吗?诚然,你说得对,我要有着雅兴折腾这个;我不如连宝塔都不要了,纯ssh登录服务器,自己装环境自己配证书不好吗?怕了怕了,键盘侠见多了;职业病犯了;

初始条件

  • 腾讯云的服务器
  • 装的镜像是:CentOS7.6-Docker20 (图1)
  • Docker版本为:Docker version 20.10.5, build 55c4c88(图2)
  • 系统版本为:CentOS Linux release 7.6.1810 (Core)(图2)

图1

001.png

图2

002.png

操作详解

首页,因为我的诉求是 gitlab+宝塔,并且使用docker隔离,现在docker已经满足条件了;那么接下来就是gitlab和宝塔了,gitlab其实好弄,docker有现成的包,基本上闭着眼睛拉一下然后建个容器就完事,一点坑都没有(就字面意思,一点坑没有),主要是坑的位置在宝塔,主要是被国内某蓝色狗爪搜索引擎坑得不轻,最后还是在“巨硬”的搜索引擎上找到个真实的解决方案!下面我吧几个坑爹的方案都罗列出来,避免大家踩坑!

坑B方案

1、自己拉个centos镜像,然后进镜像自己装宝塔,看上去似乎天衣无缝完美无暇,但你试试重启下服务器(宿主机),你就会发现,哎嘿!容器重启了,容器内的服务(宝塔面板)没重启,哎嘿!宝塔服务器没起也就算了,Web环境也一个没起,这TM合着意思就是我服务器100%不重启,只要重启,我就要手动重启宝塔和web环境,当然也不是没有解决办法,就是在宿主机写个脚本,开启自动执行,重点是,大哥,我装docker的目的就是为了隔离,容器内的数据我留着可以,但我根本没必要再宿主机硬维护容器内的服务啊,我与其这样维护我不如直接装宿主机,不更简单粗暴?

2、拉某个已经万年不更新的docker包,装了之后,文不对题,简称:辣鸡!还不如第1个方案,虽然傻逼,但最起码能用,只是说有点脱裤子放屁的意思!

正确方案

去拉取 cyberbolt/baota 这个包!docker主页:https://registry.hub.docker.com/r/cyberbolt/baota/,拉取代码如下:

docker pull cyberbolt/baota

004.png

然后接下来是二选一,如果你想简单粗暴点,彻底隔离文件(就是完全不让容器内文件跟宿主机关联),那么就直接执行如下语句即可!

docker run -itd --net=host --restart=always --name baota cyberbolt/baota -port 8888 -username admin123 -password 123456

注意!这里有一个非常大的坑,估计作者也没注意到,就是如果你想要自定义用户名,不能使用 admin,否则容器会100%无限重启!(就是用不了)

然后你就拥有一个完全隔离的宝塔面板了,其宝塔面板端口号为:8888,初始账号为:admin123,密码:123456

当然到这一步,其实你就已经实现了面板隔离了,当然很显然,肯定大多数人希望这个站点数据和面板数据可以隔离,这个原作者在发布页面也提供了方案,简单来说其实是建立个“替死鬼”,生成最初的目录结构,然后把目录结构拷贝出来,删除这个替死鬼,然后新建一个容器,将这个容器的宝塔目录映射到刚才拷贝出来的目录结构就行了,这一步必须是这么做,不能直接生成,否则会无限制重启,具体这个操作如下:

以下内容来自原作者镜像发布页面

生产环境中,为了避免极小概率的数据丢失,我们将容器内的宝塔文件映射到宿主机的目录中(您之后安装的 Nginx、MySQL 等服务均会挂载到宿主机目录)。该方法是 Docker 部署宝塔面板的最优方案,可以在生产环境中运行。

首先按最简方案创建一个测试容器(为保存宝塔文件到宿主机目录中)

输入命令创建测试容器(这里仅为测试容器,为避免出错,后面几步请原封不动地复制粘贴)

docker run -itd --net=host \
--name baota-test cyberbolt/baota \
-port 26756 -username cyberbolt -password abc123456

将 Docker 容器中的 /www 目录 拷贝至宿主机的 /www

docker cp baota-test:/www /www

拷贝完成后删除创建的测试容器

docker stop baota-test && docker rm baota-test

创建宝塔面板容器,并将宿主机目录映射至容器中(自行输入面板的 端口号、用户名 和 密码 后即可完成部署)

docker run -itd -v /www:/www --net=host --restart=always \
--name baota cyberbolt/baota \
-port 端口号 -username 用户名 -password 密码

示例如

docker run -itd -v /www:/www --net=host --restart=always \
--name baota cyberbolt/baota \
-port 8888 -username cyberbolt -password abc123456

--net=host : 容器和主机使用同一网络

--restart=always: 守护进程,容器挂掉将自动重启

-port : 填写宝塔面板运行的端口号

-username: 填写宝塔面板的用户名

-password : 填写宝塔面板的密码

该方法的登录方式:

登陆地址: http://{{服务器的ip地址}}:{{您输入的端口号}}

账号: 您填写的用户名

密码: 您填写的密码

部署成功!

继续容器部署gitlab

相比较于部署宝塔面板到容器里,部署gitlab要容易的不是一个档次,你只需要拉取gitlab-ce或者gitlab-ee的镜像,然后创建一个容器即可!

拉取镜像

docker pull gitlab/gitlab-ce

创建镜像

docker run -itd --hostname 0.0.0.0 --publish 801:80 --publish 4431:443 --publish 221:22 --name gitlab-ce gitlab/gitlab-ce

以上方式是跟前文一样,简单粗暴的办法,即镜像和宿主完全隔离,即:删除镜像就啥也没了,如果需要保留东西,可以使用 --volume 映射宿主机路径及容器系统内的路径,这个就不展开,网上一搜教程一堆;不过有几个点需要特别强调下!

--hostname 0.0.0.0

这个意思是表示允许所有IP访问,如果你只希望特定IP访问,可以单独设置为IP,但我不建议这么做

--publish xxx:xxx

这个表示映射宿主机的端口到容器的端口,比如在上方的例子中,我就把宿主的801映射到了80,4431映射到了443...,这样做的目的是避免端口冲突,因为本身宝塔面板100%是监听80和443端口的(HTTP和HTTPS),并且宝塔面板内部集成了终端,终端默认端口是22,因此这里我还单独把容器的22的映射到了宿主机的221,这样可以避免出现和宿主机公用网络环境的宝塔面板无法使用终端的问题;

额外小技巧

因为我本身有一个域名是单独给自建代码托管服务用的,也就是我不需要通过 IP+端口 方式访问,这个时候只需要我在宝塔面板里面+个域名,然后做一下反向代理即可;配图如下:

006.png