Mac下Docker安装Linux集群全纪录

1,340 阅读7分钟

前言:

本来打算用VMWare Fusion安装CentOS虚拟机,无奈发现电脑存储空间只剩50G,还是选择使用Docker,相对轻量化一些。
分布式Linux集群,安装4台CentOS,其实一台部署Nginx做反向代理,其他3台安装Tomcat部署应用。

用到的工具

  1. Docker Desktop For Mac
  2. Final Shell,做远程连接CentOS工具

步骤

1. 安装Docker Desktop For Mac

安装完成后,修改Docker仓库源,修改成中科大的源:docker.mirrors.ustc.edu.cn/

image.png

在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编辑器。
将文件中,关于监听端口、监听地址前的 # 号去除

image.png 开启允许远程登录

image.png

开启使用用户名密码来作为连接验证

image.png

保存文件,退出。

开启ssh服务

  • 输入命令 yum list | grep initscripts 查看版本
  • 输入命令 yum install initscripts -y 安装service
  • 输入命令 service sshd startsystemctl 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中可以看到上传的镜像:

image.png

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了:

image.png 连接成功的画面:

image.png

使用同样的方法,启动其他3台centos容器,端口号分别是50002,50003,50004。
这样就可以愉快的访问4台centos容器啦。

7. 安装Nginx

  1. 去nginx官网下载稳定版本。
  2. 上传nginx压缩包到centos中的。利用finalShell直接上传到/home/software中,/software目录不存在可以先 mkdir software。

image.png 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

以下是各个参数的说明:

image.png

  1. 编译,输入 make

    -bash: make: command not found的解决办法 yum -y install gcc automake autoconf libtool make
  2. 安装,输入 make install
  3. 进入 nginx的安装目录 /usr/local/nginx中,进入/sbin目录,输入./nginx启动nginx。
  4. 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修改配置文件:

image.png

8. 访问nginx

至此,在其中一台centos上,nginx就安装完成了,那么如何验证Nginx安装成功了呢?由于上面讲到,不能直接在Mac本机,访问docker容器的ip:80(80是nginx在centos中的端口号)。那么就需要将centos的80端口号(nginx)映射到本机Mac中。如何映射,两种方法:

  1. 第一种,在启动centos容器的时候,使用docker run 命令进行端口映射: docker run --privileged -itd --name ct_ssh1 -p 50001:22 -p 60001:80 centos /sbin/init。这种方式的问题是,对于已经启动的容器,我们只能删除,重新启动,这样太麻烦了,因为nginx已经安装好了,如果删除还需要重新安装一遍。

  2. 那么如何给已经启动的容器添加端口映射: www.jianshu.com/p/6aefed2be… 这篇博客已经讲得很好了。修改配置文件之间,首先需要停止容器,修改完成后需要重启docker engine,否则配置修改会被重置,无法生效,如何重启docker engine如下图:

image.png

centos容器中nginx启动后,在Mac本机浏览器中,输入localhost:60001便可访问nginx了。

9. 安装Tomcat

在其他3台centos中安装Tomcat,相对简单,略过。 blog.csdn.net/weixin_4271…

10. 访问Tomcat

安装完成后如何访问,通过nginx来做反向代理,需要修改Nginx的配置文件配置 upstream。具体步骤待续。

11. 遇到的问题

  1. 上面第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…