一、前言
公司采购了一台群晖NAS服务器(型号:1821+),本想使用套件中心的VM虚拟机搭建开发测试环境,实际搭建后,发现虚拟机依赖服务器硬件配置,导致服务器CPU、内存占用很高,已经影响了服务器其他软件的运行,且对服务器的压力很大,于是放弃了使用虚拟机搭建测试环境的方式。
随即想到采用Docker容器搭建linux系统,因为docker容器的资源占用极低,且不依赖硬件资源。动手搭建了几套centos系统,发现由于容器机制,很多linux系统命令无法执行,不能通过xshell连接操作,这是肯定无法接受的。查阅相关资料一大堆,头都大了。经过多次试验,终于成功搞定,下面给大家推荐一下安装步骤。
二、安装步骤
1、下载镜像
推荐镜像下载地址:Docker Hubhttps://registry.hub.docker.com/r/jdeathe/centos-ssh/ 该镜像带有ssh远程连接所需服务,容器安装后即可通过xshell等工具远程连接,不需要手动安装ssh服务。默认ssh登录方式为证书登录。
这是我选择安装的版本↓
该版本为CentOS Linux release 7.9
2、群晖Docker启动容器
由于我是使用的群晖自带的Docker容器套件,所以可以很方便的配置启动参数。
注:非群晖服务器安装只需要添加相应的启动参数即可,在DockerHub镜像页面有详细的说明文档,此处省略。
首先配置端口映射(图中2201端口是ssh远程连接端口):
再配置启动参数:
启动参数只需要配置SSH_AUTHORIZED_KEYS和SSH_USER就可以,SSH_AUTHORIZED_KEYS是SSH远程登录需要提供证书的公钥,SSH_USER是远程登录用户。
如果启动时不指定登录证书公钥,也可以在容器启动后,宿主机通过docker exec命令进入容器,手动将证书公钥添加到/root/.ssh/authorized_keys,添加后就可以使用ssh工具远程登录。
ssh连接:
上图中主机ip指的是宿主机IP地址,端口号为容器22端口映射到宿主机的端口
注:至此,群晖安装的容器可以远程连接使用了。但是!!!!
使用中你会发现一个坑爹的问题:Failed to get D-Bus connection: Operation not permitted
使用systemctl命令时,会提示这个错误,如果你需要使用涉及linux内核的命令(比如: systemctl),那么继续往下看,手动启动容器。
3、手动启动容器(非群晖)
接第1步,下载镜像后,使用docker run命令启动容器
docker run -tdi -p 2205:22 --privileged --name centos-05 \
--env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
--env SSH_AUTHORIZED_KEYS="ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwbBENS79kN633p72vzpVShwBcTdTG34ybXDCycqIEUda+LMxB54qHaHXbeVEiZ9350MIRbrbKnEWD63XMvS74mFt5I9ELN66SHXA45oPXIeTR1FQFtFXj/O2yFgxBKdqNnrkhWAg8X/7mOrrwa3S8rSvFchvRupIxTGE5LaEwaFgM1bc7V+PoAICPrIRfCggP6CKkZlEB3P2BVwvmrCoJzWoradP9ccqx2h6SgyOsigPak5Cx1jFpF4xCbZfHAZkqIu8cz5LIf6kudbIsabGsrGs8hKFOBVsMEMpKiCHbtHYvlYwYxLgUXOl7tBXWEsNbeVuVmrozCILugJlVvdBEw== OpenSSH-rsa-import-081621" \
--env SSH_USER=root \
--env SSH_AUTOSTART_SSHD=true \
--env SSH_AUTOSTART_SSHD_BOOTSTRAP=true \
--env SSH_AUTOSTART_SUPERVISOR_STDOUT=true \
--env SSH_CHROOT_DIRECTORY=%h \
--env SSH_INHERIT_ENVIRONMENT=false \
--env SSH_PASSWORD_AUTHENTICATION=false \
--env SSH_SUDO="ALL=(ALL) ALL" \
--env SSH_TIMEZONE=UTC \
--env SSH_USER_FORCE_SFTP=false \
--env SSH_USER_HOME=/home/%u \
--env SSH_USER_SHELL=/bin/bash \
jdeathe/centos-ssh:centos-7-2.5.1 /usr/sbin/init
可以看到,容器成功启动,打印出了容器ID。
解决Failed to get D-Bus connection: Operation not permitted错误的关键,就在于使用特权参数 --privileged来启动,这样创建出来的容器中,就可以执行systemctl命令了。
这时还不能使用ssh工具远程连接,接下来使用 docker exec 命令进入容器。
docker exec -it -u root a91cacdcdb7f /bin/bash
进入容器后执行如下命令
/usr/bin/supervisord --configuration=/etc/supervisord.conf
命令执行中会反复出现如下错误,提示端口被占用,直接ctrl + c结束命令即可
最后一步,重启sshd服务
systemctl restart sshd
到这里就可以使用ssh工具远程连接了。
4、更换yum源
如果通过上面的步骤,您已经可以连接到容器内的系统,那么你很快就会发现,无法通过yum命令安装软件,往下照着做~
更新yum
yum update
报错:Cannot find a valid baseurl for repo: ius/x86_64
不慌,找到yum源配置文件
cd /etc/yum.repos.d/
移除以下配置文件
mv ius-dev.repo ius-dev.repo.bak
mv ius.repo ius.repo.bak
mv ius-archive.repo ius-archive.repo.bak
mv ius-testing.repo ius-testing.repo.bak
增加华为云yum源配置信息
sed -i "s/#baseurl/baseurl/g" /etc/yum.repos.d/CentOS-Base.repo
sed -i "s/mirrorlist=http/#mirrorlist=http/g" /etc/yum.repos.d/CentOS-Base.repo
sed -i "s@http://mirror.centos.org@https://repo.huaweicloud.com@g" /etc/yum.repos.d/CentOS-Base.repo
依次执行
yum clean all
yum makecache
yum update
如果yum update命令报错,修改dns,在/etc/resolv.conf中增加:nameserver 8.8.8.8
vi /etc/resolv.conf
然后你就可以使用yum命令随意安装软件了,至此,这个docker容器搭建的linux系统可以满足使用需求了,尽情的蹂躏它吧~