前言:
本来打算用VMWare Fusion安装CentOS虚拟机,无奈发现电脑存储空间只剩50G,还是选择使用Docker,相对轻量化一些。
分布式Linux集群,安装4台CentOS,其实一台部署Nginx做反向代理,其他3台安装Tomcat部署应用。
用到的工具
- Docker Desktop For Mac
- Final Shell,做远程连接CentOS工具
步骤
1. 安装Docker Desktop For Mac
安装完成后,修改Docker仓库源,修改成中科大的源:docker.mirrors.ustc.edu.cn/
在Mac终端中,输入docker --version,可以看到docker安装成功。
2. 使用Docker 拉取CentOS镜像
在Mac终端中输入:docker pull centos,就会从Docker中央仓库中拉取centos的最新镜像(也可以拉取指定版本号,直接在中央仓库centos的tag下复制即可)。 使用docker images或者在Docker desktop中就能看到刚刚拉取的centos镜像了。
3. 运行centos容器
使用拉取的centos镜像,运行centos容器。这里首先明确一个概念,在docker中运行的叫容器。
docker run -itd --name centos_ssh centos /bin/bash
docker run,我的理解是创建一个容器,--name 参数是为容器重命名。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
创建并运行容器后,输入docker ps -a可以看到正在运行的容器。当然在Docker desktop中也可以看到。
进入容器:
docker exec -it 'centos容器id' /bin/bash
这样就可以进入centos的终端命令行,敲入ls就可以看到当前centos系统中的文件目录。
这里需要注意一点:centos安装完成后,systemctl命令无法使用。请详见下面遇到的问题。
4. centos配置ssh,用于远程连接(本地电脑连接虚拟机)
配置centos的root用户密码,进入centos容器内,输入命令 passwd -d root 清除root账号的密码,输入命令 passwd root进行修改root密码,然后重复两次输入新密码。
安装ssh-client命令:yum install openssh-clients
安装ssh-server命令:yum install openssh-server
修改ssh配置文件,允许远程访问。
找到了 /etc/ssh/ 目录下的sshd服务配置文件 sshd_config,用Vim编辑器打开vi sshd_config,如果vim命令是无效的,yum install net-tools # 安装后可以使用ifconfig
yum install vim -y #安装后可以使用vim编辑器。
将文件中,关于监听端口、监听地址前的 # 号去除
开启允许远程登录
开启使用用户名密码来作为连接验证
保存文件,退出。
开启ssh服务
- 输入命令
yum list | grep initscripts查看版本 - 输入命令
yum install initscripts -y安装service - 输入命令
service sshd start或systemctl start sshd.service开启ssh服务 - 输入命令
ps -e | grep sshd检查是否开启了ssh服务 - 启动sshd服务命令
systemctl start sshd.service - 重启 sshd服务命令
systemctl restart sshd.service - 设置服务开启自启命令
systemctl enable sshd.service
centos中的ssh的端口号是22
5. 上传配置好root用户密码和ssh的centos镜像
至此,一个配置好ssh的centos容器便已经生成。方便直接运行其他centos容器,否则,每一台centos都要重复上面的ssh配置步骤。这样上传配置好的镜像后,只需要使用docker run这个镜像就能使4台centos都具备ssh远程访问能力了。
上传上面配置好的centos容器镜像:
docker commit '容器id' centos_ssh
类似于git,commit是将容器镜像提交到本地。当然应该也可以提交到中央仓库或者是私库中。
提交之后,我们使用docker images命名或者在Docker Desktop中可以看到上传的镜像:
6. 利用上传好的centos镜像,创建4个centos容器
其中一台作为Nginx服务器,另外3台安装Tomcat部署真实的应用,达到分布式的目的。
在其他一台centos中,输入ifconfig,查看其ip地址。
在Mac终端,使用 ping 'ip地址'或者 telnet 'ip地址',得到的都是超时,说明Mac连接docker容器是无法ping通的。网上有一些解决方案。具体请见最后一节:遇到的问题。
我使用的方法是端口映射,将centos系统(centos容器)的22端口(ssh的端口)映射到本机Mac的某个端口(我这里定义的是50001端口)。如何映射,使用如下命名启动cenots容器:
docker run --privileged -itd -p 50001:22 --name ct_ssh_1 centos_ssh /sbin/init
这样映射一般是提供给外部使用的时候,外部可以通过连接到本机的50001端口来实现对centos容器的访问。本机Mac访问centos虚拟机,其实只需要用 centos容器的ip就可以了。这个问题上面已经描述过。 如此,就可以使用finalSheel来连接centos了:
连接成功的画面:
使用同样的方法,启动其他3台centos容器,端口号分别是50002,50003,50004。
这样就可以愉快的访问4台centos容器啦。
7. 安装Nginx
- 去nginx官网下载稳定版本。
- 上传nginx压缩包到centos中的。利用finalShell直接上传到/home/software中,/software目录不存在可以先 mkdir software。
3. 安装gcc环境:yum install gcc-c++
4. 安装PCRE库,用于解析正则表达式 yum install -y pcre pcre-devel
5. 安装zlib压缩和解压缩依赖 yum install -y zlib zlib-devel
6. SSL 安全的加密的套接字协议层,用于HTTP安全传输,也就是https
7. 解压nginx压缩包 tar -zxvf nginx-1.18.0.tar.gz
8. 创建makefile文件,cd 到nginx解压后的目录中,注意nginx解压后得到的是源码,需要编译才能使用。
9. 直接在命令行中输入:
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
以下是各个参数的说明:
- 编译,输入
make
-bash: make: command not found的解决办法yum -y install gcc automake autoconf libtool make - 安装,输入
make install - 进入 nginx的安装目录
/usr/local/nginx中,进入/sbin目录,输入./nginx启动nginx。 - nginx的一些常用命令,停止:
./nginx -s stop重新加载:./nginx -s reload
第12步启动nginx失败,报错:nginx: [emerg] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)
是因为/var/run 目录会随着centos系统的重启而丢失。导致上面配置的 pid-path失效。
解决方法:
在/usr/local/nginx 目录下,创建 mkdir pid目录。然后在/usr/local/nginx/conf下vi nginx.conf修改配置文件:
8. 访问nginx
至此,在其中一台centos上,nginx就安装完成了,那么如何验证Nginx安装成功了呢?由于上面讲到,不能直接在Mac本机,访问docker容器的ip:80(80是nginx在centos中的端口号)。那么就需要将centos的80端口号(nginx)映射到本机Mac中。如何映射,两种方法:
-
第一种,在启动centos容器的时候,使用docker run 命令进行端口映射: docker run --privileged -itd --name ct_ssh1 -p 50001:22 -p 60001:80 centos /sbin/init。这种方式的问题是,对于已经启动的容器,我们只能删除,重新启动,这样太麻烦了,因为nginx已经安装好了,如果删除还需要重新安装一遍。
-
那么如何给已经启动的容器添加端口映射: www.jianshu.com/p/6aefed2be… 这篇博客已经讲得很好了。修改配置文件之间,首先需要停止容器,修改完成后需要重启docker engine,否则配置修改会被重置,无法生效,如何重启docker engine如下图:
centos容器中nginx启动后,在Mac本机浏览器中,输入localhost:60001便可访问nginx了。
9. 安装Tomcat
在其他3台centos中安装Tomcat,相对简单,略过。 blog.csdn.net/weixin_4271…
10. 访问Tomcat
安装完成后如何访问,通过nginx来做反向代理,需要修改Nginx的配置文件配置 upstream。具体步骤待续。
11. 遇到的问题
- 上面第3步,运行centos容器后,无法使用
systemctl命令 。
在 Linux Docker中无法使用 systemd(systemctl) 相关命令的原因是 1号进程不是 init ,而是其他例如 /bin/bash ,所以导致缺少相关文件无法运行。(System has not been booted with systemd as init system (PID 1). Can't operat)
解决方案:
在上面第3步使用如下命令创建、启动容器:
docker run --privileged -itd --name centos_ssh centos /sbin/init
2)Mac连接docker容器是无法ping通,网上的一些解决方法:
blog.csdn.net/bqt2014/art…
blog.csdn.net/wenjun_xiao…
12. 参考文章
blog.csdn.net/cai45469259…
www.runoob.com/docker/dock…
blog.csdn.net/weixin_4271…
blog.csdn.net/qq_42074075…
blog.csdn.net/chi0830/art…
www.jianshu.com/p/6aefed2be…
blog.csdn.net/moliyiran/a…
blog.csdn.net/bqt2014/art…