文章目录
导读
由于实验室并不完全是做的开源项目,也有一些需要签订保密协议的项目。所以,实验室的内网GitLab
相当有必要了。
如果是一直在关注我的读者应该注意到了,之前也发过在Windows10
系统中使用Docker
搭建GitLab
的文章:点击这里传送,但是Server
版本的Windows
有着更严格的文件系统、用户系统、远程协作等等内容,比起一般的配置来说真的要复杂很多。
于是,噩梦开始了。
需求文档说,要有域名。
开幕雷击。
有多少人一看到这个小标题就蒙圈了?
先说好,哪怕你用的是Windows20H2
专业工作站版,也是不能设置域名的。因为,工作站是工作站,是不能当服务器用的啊!
如果你稍微有一点点小公司工作经验,你应该知道有群晖的NAS
这玩意。但是,基本款就是
¥
2700
¥2700
¥2700以上,虽然实验室可以报销,但是对于学生群体来说,第一眼看到这个数字还是会心理强烈抗拒。
最终,本着白嫖至上的原则,我还是选择了自己在内网建立DNS
服务器,通过正向查找来绑定一个临时的域名。
既然这样那为什么还要使用域名而不是IP
?那当然是因为域名可以是更容易记忆的,而IP
就像朋友家的WIFI
密码一样奇葩。
当然,这是开卷考试,所以我直接百度了。
第一次尝试
一开始我发现了Bind9
,有很多人用这个搭建内网的DNS
。但是,这一大堆的named.conf
、named.rev
啥的,这都是什么鬼啊,莫名其妙的IP
、省略步骤的配置,让我这个小白相当难受。
更让我崩溃的是,明明最新的更新是 2021.3 2021.3 2021.3,教程中提到的界面却相当的古老,使用之后也总是失败。所以,放弃了。
第二次尝试
既然Bind9
用不了,Linux Server
总该可以吧?我虽然Windows
不太行,Linux
可是刚刚的啊!别小看我啊!
于是我选择了Centos8-Everything
,把所有的东西全都给装上去!
为了保证不失败,我还使用YUMI
多启动U盘制作器再写进了一个ubuntu-server
。看起来万无一失了!进BIOS
更改启动顺序!
You need to start kernel first.
好嘛,主板不支持Linux
。欲哭无泪。
第三次尝试
所以,我还是换回了Windows Server
,使用这里面的DNS
配置。直到这个时候,我才意识到:
DNS
需要一个静态IP
,而学校的校园网只能使用动态IP
,否则无法上网。并且,由于和学校签的协议,学校不允许私自牵网线。为了达到目的,也只能在IP
每变动一次就人工处理一次了。
没有办法也是唯一的办法。
总之接下来的思路就是:使用Windows Server
的服务管理器创建一个DNS
,然后使用正向查找,让其他主机在访问内网DNS
的时候发现对照表中这个域名,并自动转到对应的IP
地址。这些大学计算机网络的内容我就不再多说了。下面开始详细说明。
DNS配置
在Windows Server
中,DNS
是需要有一个域的。而域的搭建就需要一个AD DS
,也就是Active Dierctory
域服务器。
对于刚刚安装好的Windows Server
来说,需要添加一些功能。由于我已经装过了,无法复现,所以在这里给出我认为相当完备的教程:点击这里传送
虽然这篇文章是Windows Server 2012R
,但是说实话,从
2012
R
2012R
2012R一直到
2019
2019
2019的所有版本全都是一样的,就连UI
界面都神似。
另外,这篇教程并不需要完全照做,因为我们的目的只是搭建域而已,所以我们就一直看到第四项AD
搭建完毕为止就好了。
一定要优先设置域!
不然的话,在其他服务器进程已经启动之后的话AD DS
将无法再启动。如果你想简单点那就直接重装吧,但如果不想重装直接修复,那就只能使用命令行一点点把冲突的内容删除掉,等AD DS
启动之后再装回去。我虽然找到了教程,但是现在已经找不到了,所以没能贴上来。遇到了的读者可以在评论区补充,但我还是希望各位不要遇到这个问题。
哪怕你是管理员也不准改的文件!
下面这张图片摘自【CSDN用户Ivan_fay】的文章《Windows server 2012 R2 双AD域搭建(AD+DHCP+DNS)》
如果你曾经因为一些原因不得不重装,但是刚刚好这些缓存路径又刚刚好在独立于系统盘的磁盘上,你就想利用一下。
但是,曾经的这些文件是不会让你修改的!因为这些文件都是上一个系统的管理员才有的权限,你现在的管理员管不着。所以,如果继续沿用这些路径将会安装失败!
绑定域名
有了内网DNS
之后,一切就好说了。在配置好了DNS
之后,所有的电脑就能够先在实验室里的这台Windows Server
中查找IP
和域名的对应关系,然后通过内网域名访问内网服务器中的所有内容。
那就来嘛。
首先我们点进去看看Windows Server
里的DNS
。从这里进去:
点击之后就会跳到下面这个界面:
点开之后便能看见下面这个界面:
接下来就开始操作:
弹出了新的界面:
填入名称和IP
就好了。
在这里,我的名称设置为server
,那么服务器就能够使用server.322lab.kust.cn
进行访问。
IP
地址就写服务器的IP
,因为是域名解析,所以需要把访问服务器的域名和访问服务器的IP
对应起来。
于是就有了:
别看这里虽然写的是静态,实际上只是因为你输入的IP
是静态的,校园网那边还是会定时动态分配。
到这里就快结束了。等等,为什么我要说快结束而不是就结束?
测试访问
万众期待的测试环节开始了。生死有命,富贵在天。如果你是Windows
操作系统,那就win+R
呼出运行窗口,输入cmd
回车,打开命令行;
同样的,如果你是Linux
操作系统,使用Ctrl+Alt+T
呼出终端;
然后就开始测试:
ping server.322lab.kust.cn
其中
10.42.1.87
10.42.1.87
10.42.1.87是服务器的IP
地址。
然后,你就会发现:
Winodws
下提示请求找不到主机,Ubuntu
下显示Temporary failure in name resolution。
心态炸了?
配置DNS
虽然说服务器和所有想连上服务器的电脑都在校园网这个局域网下,但是DNS
默认是直接奔着校园网DNS
去的,而不是我们刚刚搭建的内网DNS
服务器,所以我们不能在校园网的域名解析中找到我们想要的server.322lab.kust.cn
。
于是我们现在的目标就相当明确了:将本机的DNS
指向实验室服务器。
Windows所有版本通用的方法
最后:
再次尝试:
ping server.322lab.kust.cn
得到了新的结果:
正在 Ping server.322lab.kust.cn [10.42.0.87] 具有 32 字节的数据:
来自 10.42.0.87 的回复: 字节=32 时间<1ms TTL=128
来自 10.42.0.87 的回复: 字节=32 时间<1ms TTL=128
来自 10.42.0.87 的回复: 字节=32 时间<1ms TTL=128
来自 10.42.0.87 的回复: 字节=32 时间<1ms TTL=128
10.42.0.87 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
相信你到了这一步你应该会高兴地跳起来跑到厕所里打一套军体拳。
Ubuntu的方法
在网上看到了很多的教程,比如修改/etc/network/interfaces
等等各种奇奇怪怪的配置文件,不是不能修改就是干脆就没这个文件。
这里给出一条众多教程中唯一适用于Ubuntu20.10
版本的配置方法。
首先安装resolvconf
:
sudo apt-get install resolvconf -y
安装成功后,会出现/etc/resolvconf
文件夹,不出意外的话,你应该能够找到这样一个文件:/etc/resolvconf/resolv.conf.d/base
。
我们来修改这个文件:
nameserver 10.42.0.87
nameserver 222.197.198.33
按下:x
或者:wq
保存。至于使用/etc/init.d/resolvconf restart
什么的,都是假的,没有用。真正有用的是:reboot
命令,也就是重启。
最后,我们就成功了!
sakebow@mikufans:~$ ping server.322lab.kust.cn
PING server.322lab.kust.cn (10.42.0.87) 56(84) bytes of data.
64 bytes from 10.42.0.87 (10.42.0.87): icmp_seq=1 ttl=127 time=2.59 ms
64 bytes from 10.42.0.87 (10.42.0.87): icmp_seq=2 ttl=127 time=2.50 ms
64 bytes from 10.42.0.87 (10.42.0.87): icmp_seq=3 ttl=127 time=2.53 ms
64 bytes from 10.42.0.87 (10.42.0.87): icmp_seq=4 ttl=127 time=2.49 ms
64 bytes from 10.42.0.87 (10.42.0.87): icmp_seq=5 ttl=127 time=67.6 ms
64 bytes from 10.42.0.87 (10.42.0.87): icmp_seq=6 ttl=127 time=2.50 ms
64 bytes from 10.42.0.87 (10.42.0.87): icmp_seq=7 ttl=127 time=14.5 ms
^C
--- server.322lab.kust.cn ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6009ms
rtt min/avg/max/mdev = 2.492/13.526/67.589/22.453 ms
到这里,最基础的服务就全部搭建完成了。
图片服务器搭建
说到图片服务器,你们想到的应该就是nginx
,如果再有些能够传输数据的接口的话应该就是fastdfs
了吧?其实也没问题。但是,Windows Server
其实是提供了服务的,也就是IIS
。如果有需要的话,也可以使用IIS
搭建一个ASP
或者是WinForm
网站给外面的人看看,虽然你可能看不上这些老掉牙的技术,但国企到现在还是很喜欢这种便宜、快速而且适用于Windows
的平台。
由于nginx
在配置分布式、动静结合和域名映射的时候相当有优势,所以这里显得有点派不上用场,就不说了。更何况,nginx
对Windows
的支持其实不太友好,配置起来比较烦;而nginx
有专门的/etc/nginx/conf.d
文件夹进行拓展,相当方便。
所以,在Windows Server
中最好还是使用IIS
,更何况IIS
能够使用更丰富的UI
进行配置,也不算什么反人类应用。
当然,配置也很简单。还是一样的服务管理器,选择添加角色和功能,一直到服务器角色这一栏,勾选这些内容:
然后一路确认就好了。
等功能成功启动之后,会默认在C:\inetpub
文件夹下创建资源文件夹:
为了设置路径,我们要找到IIS
管理器,然后进行如下设置:
然后使用我们的域名和里面的测试文件进行测试:
于是就这样成功了。
往后需要添加什么图像、视频之类的静态资源可以直接放进去。当然,到目前并没有一个上传入口,所以只能远程复制粘贴,或者亲自到这台电脑上复制粘贴。
如果以后还是需要使用dotNet
以外的手段实施应用软件的话,那就得要使用nginx
以实现更精细的要求了,比如动静结合、负载均衡等等。
Docker
终于,到了今天的主角了。由于之前已经说过如何在普通的Windows系统中使用Docker配置GitLab,这里也就不再赘述。重点讲解在搭建的时候遇到的坑。
不得不说,在这方面遇到的坑实在是太多了。现在,我将一一说明我所遇到的坑。
坑一:文件映射
Windows Server
有着更为严格的权限系统,无论是以什么角色登录、登录到本机还是登录到刚刚创建的域,如果使用的是GitLab
,都完全没有办法进行文件共享。
虽然GitLab
官方给出了解决办法:
docker exec -it ${gitlab-container-id} update-permissions
但尴尬的是:你尽管用,能开通文件共享算我输。
于是我一点办法都没有,只能放弃了文件共享。
如果你想看着稍微好过点,那就使用docker
创建一两个虚拟文件夹:
docker volume create gitlab-data
然后在映射的时候就可以:
# docker-compose.yml文件中
volumes:
- gitlab-data:/var/opt/gitlab
# shell命令硬刚
-v gitlab-data:/var/opt/gitlab
至于gitlab-data
具体跑到了物理机器的哪里呢?大概只有上帝知道。你可能听过inspect
命令查看docker
创建的volume
,但好像并不能尽如人意:
$ docker volume inspect gitlab-data
[
{
"CreatedAt": "2021-04-14T06:30:38Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/gitlab-data/_data",
"Name": "gitlab-data",
"Options": {},
"Scope": "local"
}
]
看起来并没什么卵用。
坑二:文件共享
如果你在创建容器的时候使用了文件映射,那么Windows Server
便会在左下角弹出通知,让你选择是否允许容器创建文件映射。一般都是创建了之后立马点击确认,然后就可以愉快使用了。
但,并不是所有人都会按照说明书进行操作。
你可能在使用docker pull
拉取镜像之前就直接docker-compose
,然后就陷入了漫长的下载等待。于是,你玩了一把在线多人协作游戏。很快四十分钟过去了,然后你回过头来看早就已经下好的镜像,和一大堆错误输出,其中的核心就是:
Filesharing has been canceled
由于我当时遇到这个问题的时候服务器的Docker
刚刚好直接卡死了,就只能重启了。
坑三:Docker无法启动
一开始我还以为是Docker
崩了,可是等我重装系统之后我才发现:是源失效导致的Docker
无法启动。
唯一指定安全可用的源:网易。
也就是说,在registry-mirrors
里面设置http://hub-mirror.c.163.com
。
中科大的源不知道为什么粘进去直接崩掉了,也可能是只有我有这个问题。如果你也遇到了这样的奇葩问题,可以考虑换一下源看能不能启动。
坑四:404
因为Windows Server
是默认开启了防火墙的,所以对于其他设备并不能随意地通过端口进行HTTP
或者HTTPS
访问。
如果你希望简单粗暴一点,那就直接关掉防火墙。虽然听起来安全性很差,实际上有还不如没有。
如果你希望认真负责一点,那就在防火墙的入站规则中添加相应的端口。如果端口相当多的话,工作量也会相当大。
坑五:提交代码
由于平常在GitHub
提交代码已经养成习惯了,所以就随手用上了SSH
提交。
但是,不知道为什么,无论如何都没办法对上GitLab
库,所以最后还是改成了HTTP
提交。唯一的区别就是HTTP
提交需要输入账号和密码,而SSH
提交只需要设置一次本机生成的密钥就好了。
对于那些修改了hostname
的同学们,你们可能更悲催。因为连着IP
和域名一起被屏蔽成了hostname
。比如我的容器叫gitlab
,其中有个playground
项目,在网页上显示的地址就是git@gitlab/playground.git
。如果你不知道你在什么群组、在哪个IP
或者域名,那你永远别想进去。
最后补充说明
这几天的长时间运转之后,发现电脑性能也很影响服务器的效率。目前实验室里很陈旧的设备在不关机连续运行了一周之后出现了没有办法解决的闪退、卡顿甚至卡死等现象。所以,如果各位需要创建服务器的话尽量使用更好的设备以满足更高的要求和更长时间的续航。