NIS 部署
NIS 和 NFS 都是 UNIX 和 Linux 系统之间共享资源的服务。
NIS 主要用于共享网络信息(如用户、组、主机名等),而 NFS 主要用于共享文件和目录。
NIS 和 NFS 通常会一起使用,以便在网络中实现统一的 身份验证 和 资源共享。
NIS(Network Information Service)是一个 分布式数据库 服务,旨在简化管理大型 UNIX 网络中的用户、组、主机名等信息。在 NIS 中,服务器维护一个中央数据库,包含有关网络中所有用户、组、主机名等信息。客户端则通过 NIS 协议从服务器中获取这些信息,以便在本地系统上进行身份验证和授权等操作。
NFS(Network File System)是一个 分布式文件系统 服务,旨在允许多个 UNIX 或 Linux 系统之间共享文件和目录。在 NFS 中,服务器将文件系统的部分或全部内容导出到网络上,并允许客户端通过 NFS 协议挂载这些共享的文件系统。一旦挂载,客户端就可以像访问本地文件系统一样访问文件和目录。
准备文件
/etc/hosts
宿主机的 /etc/hosts 文件应该记录 NIS 服务端和客户端容器的 IP 地址,最好保证服务端和客户端应该在同一个局域网中。
172.17.0.2 nis-server
172.17.0.3 nis-client
启动容器时将其挂载到 /etc/hosts:ro 即可。
/etc/localtime
容器时间应该与宿主机保持一致,将此文件挂载到容器的 /etc/localtime:ro 即可。
network
NISDOMAIN=msnis
YPSERV_ARGS="-p 1011"
OTHER_YPBIND_OPTS="-broadcast"
- NISDOMAIN 是 NIS 域名(不过这里好像没有起作用,还是先写上)
- YPSERV_ARGS 是服务端启动 ypserv 需要的额外参数
- OTHER_YPBIND_OPTS 是客户端启动 ypbind 需要的额外参数
- 不加 broadcast 选项 ypbind 可能连接不上服务器,可能与服务器禁用了 dns 有关(待确定)
启动容器时将其挂载到 /etc/sysconfig/network 即可。
ypserv.conf
服务端配置文件。
dns: no
files: 30
xfr_check_port: yes
* : * : * : none
- dns: NIS 服务器大多使用于内部局域网络,只要有 /etc/hosts 即可,不用 DNS
- files: 默认会有 30 个数据库被读入内存当中,账号多的话,可以调大点
- xfr_check_port: 与 master/slave 有关,将同步更新的数据库比对所使用的端口,放置于 <1024 内
- 设定限制客户端或 slave server 查询的权限
格式:[主机名/IP] : [NIS域名] : [可用数据库名称map] : [安全限制security]
- [主机名/IP]:可以使用 network/netmask 如 192.168.80.0/255.255.255.0
- [NIS域名]:msnis
- [可用数据库名称]:就是由 NIS 制作出来的数据库名称
- [安全限制]:包括没有限制 (none)、仅能使用 <1024 (port) 及拒绝 (deny)
上面写法表示允许任何主机连接到 NIS server。
启动容器时将其挂载到 /etc/ypserv.conf 即可。
yp.conf
客户端配置文件。
domain msnis server nis-server
格式:domain [NIS 域名] server [服务端主机名/域名/IP]
启动容器时将其挂载到 /etc/yp.conf 即可。
nsswitch.conf
设定账号密码与相关信息的查询顺序,默认是先找 /etc/passwd 再找 NIS 数据库。
修改这三项:
passwd: files nis
shadow: files nis
group: files nis
启动容器时将其挂载到 /etc/nsswitch.conf 即可。
systemctl
Docker 容器只提供进程隔离,它不是一个完整的虚拟系统,不能使用 systemctl 等系统管理工具。
docker-systemctl-replacement 一定程度上可以代替传统的 systemctl 用于 Docker 容器中。
wget https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py -O systemctl
chmod a+x systemctl
启动容器时将其挂载到 /bin/systemctl 即可。
Dockerfile
FROM centos:7
RUN yum update -y \
&& yum install -y epel-release \
&& yum install -y wget which nano \
&& yum install -y ypserv ypbind yp-tools \
&& yum install -y policycoreutils-python
wget which nano 都是选装的。
客户端启动 ypbind 服务时需要 setsebool,该命令由 policycoreutils-python 提供。
构建:
docker build . -t brms:1
服务端
测试
docker run -itd --name nis-server \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/hosts:/etc/hosts:ro \
-v $PWD/systemctl:/bin/systemctl \
-v $PWD/network:/etc/sysconfig/network \
-v $PWD/ypserv.conf:/etc/ypserv.conf \
-v $PWD/server.sh:/root/server.sh \
--hostname=nis-server \
--domainname=nis-server \
--privileged=true \
brms:1 /usr/sbin/init && de nis-server
容器内执行:
nisdomainname msnis
systemctl start rpcbind
systemctl start ypserv
systemctl start yppasswdd
chkconfig ypserv on
chkconfig yppasswdd on
# for i in `seq 1 5`; do echo "=====create nisuser$i====="; useradd -u 100$i nisuser$i; echo password | passwd --stdin nisuser$i; done
/usr/lib64/yp/ypinit -m
客户端
测试:
docker run -it --rm \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/hosts:/etc/hosts:ro \
-v $PWD/systemctl:/bin/systemctl \
-v $PWD/yp.conf:/etc/yp.conf \
-v $PWD/nsswitch.conf:/etc/nsswitch.conf \
-v $PWD/network:/etc/sysconfig/network \
--hostname=nis-client \
--domainname=nis-client \
--privileged=true \
brms:1 /usr/sbin/init
容器内执行:
nisdomainname msnis
systemctl start rpcbind
systemctl start ypbind
测试连接:
yptest
评论区