Docker从零搭建分布式服务器群

目标场景:

1、有2台服务器A和B,系统为centos7
2、有一个分布式的服务端需要部署在A和B上,其中A为主服务,B负责子服务
3、A和B需要在一个网络环境下能互相连接通信
4、A需要暴露2001和4001端口给外网客户端进行连接
5、2台机器都提供一个账户名为"my"的账号用于给对方ssh登录用
6、实现将镜像上传到docker-hub并在别的服务器上下载使用

Step1 - 安装docker

参考 https://www.runoob.com/docker/docker-tutorial.html

Step2 - 获取centos7镜像

docker pull centos:centos7
# 参数说明:
# centos:centos7 : 镜像一般命名规则为 包名:版本号,如果不写:版本号则默认拉取最新的,这里拉取了centos的centos7版本

# 等待下载完毕后,查看本地的拉取的镜像列表
docker images
# REPOSITORY   TAG         IMAGE ID       CREATED             SIZE
# centos       centos7     8652b9f0cb4c   7 months ago        204MB

Step3 - 创建A服务器

docker run -itd --name serverA --privileged  centos:centos7  /usr/sbin/init
# 参数说明:
# -itd:让程序启动在后台自动运行,一般【固定搭配】
# --name serverA:命名这个容器名称为 serverA
# centos:centos7:使用刚才我们下载的镜像来创建容器
# --privileged:为了让我们可以用systemctl命令控制centos内服务【固定搭配】
# /usr/sbin/init:目的同上,我们需要用 systemctl  【固定搭配】

# 创建完毕后,我们检查下当前容器情况
docker ps
# CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS      NAMES
# 98cd8b0c4341   myos:1          "/usr/sbin/init"         24 minutes ago   Up 24 minutes              serverA
# 从上面输出结果显示serveA已经在运行了
# 还可以通过 docker ps -a 查看暂停中的容器

Step4 - 进入A服务器

我们使用docker run来创建容器并运行,此时容器在后台运行
我们使用docker exec来进入容器内的服务器

docker exec -it serverA /bin/bash
# 参数说明:
# -it:代表启动后分配一个终端命令行【固定搭配】
# serverA:需要登录的容器名称
# /bin/bash:登录后启动shell终端 【固定搭配】


# [root@98cd8b0c4341 /]# 
# 成功进入后默认是root用户登录

Step5 - 在A服务器上安装基础服务和相关配置

此时我们的已经登录进了A服务器,接下来在A服务器上我们进行服务安装通用的基础配置,目的是以后将A服务器作为镜像快速搭建B\C\D\E服务器

以下命令全部是在A服务器上进行

  • 安装ifconfig命令用来检查本地网络 【可选】
# 搜索包含ifconfig的工具包
 yum search ifconfig 
# ======================================================================================================================== Matched: ifconfig =========================================================================================================================
# net-tools.x86_64 : Basic networking tools
# 上面输出结果发现 net-tools.x86_64这个工具包包含了ifconfig

# 接下来安装这个工具包
yum -y install net-tools.x86_64

# 安装完毕后就可以使用ifconfig了
  • 创建my账号用来供服务ssh时使用
useradd my # 创建my
passwd my # 设置my账号的密码
su -l my # 切换账号到my
# su -l 可以切换回root账号
# cat /etc/passwd 可以查看所有账户列表
  • 安装sshd服务,用来开启ssh服务

查看cd /etc/ssh目录如果没有则需要执行下面安装:

# sshd服务端
yum install openssh-server
# ssh客户端
yum -y install openssh-clients

# 安装完毕后在 `cd /etc/ssh/`下存在`sshd_config`这个文件用来配置当前机器被别人登录时的一些要求

配置vi /etc/ssh/sshd_config,将以下几项打开

Port 22
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys 
# 这里AuthorizedKeysFile默认是 ~/.ssh一定要改成.ssh 

配置完毕后我们启动sshd服务

systemctl enable sshd
systemctl start sshd
systemctl enable sshd.service
# 最后一条命令目的是让系统启动后自动启动sshd服务

然后检查sshd启动情况

# 方法一
ps -e | grep sshd 
89 ?        00:00:00 sshd

# 方法二
netstat -an | grep 22 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN   

  • 配置免密登录 - 让服务器使用my账户免密登录
su -l my # 切换到my账号
sshkey-gen # 生成一个证书
cd ~/.ssh # 进入证书目录,这里进入的其实是 /home/my/.ssh/目录
cat id_rsa.pub >> authorized_keys # 将id_rsa.pub的内容写入到authorized_keys内
# authorized_keys是一个存储所有允许免密登录pub证书的地方 

# 设置文件夹和文件权限,不然远程登录时会因为没权限拿不到authorized_keys
chmod 700  ~/.ssh 
chmod 600  ~/.ssh/authorized_keys

su -l # 切换回root
cp -rf /home/my/.ssh/* ~/.ssh/ # 将刚才my配置的证书复制一份到root账户下,方便客户端用root去登录
# 但是要注意root/.ssh/authorized_keys把你不希望可以免密登录的pub删除

# 接下来重启sshd服务
systemctl stop sshd
systemctl start sshd

以上我们配置了my账户的免密登录列表,如果要配置root账户需要切换到root账户,并定位到root账户~/.ssh/目录进行配置

A服务器的配置基本完成了,现在我们退出A服务器
在我们主机上进行下面的操作

Step6 - 创建一个网络组myNet

由于我们接下来需要将A、B服务器放在一个网络环境下,这里我们先创建一个网络,命名为myNet

docker network create -d bridge myNet 
# 创建成功会输出一串编码
# 109aa7b9bb883fc7ca2c32d3275a787097b60111e4c1d6a5ef9b5562380ab4d6

# 检查下创建的结果
docker network ls
# 输出列表内能找到我们创建的myNet
# NETWORK ID     NAME      DRIVER    SCOPE
# 0d0f061b808b   myNet     bridge    local

Step7 - 将A服务器制作成镜像以便B服务器可以快速部署

  • 第一步 -- 先把serverA做成镜像
docker ps # 查看所有运行的容器

# CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS         PORTS      NAMES
# 27afbbb8aae9   centos:7          "/usr/sbin/init"         7 minutes ago   Up 7 minutes              serverA

# 刚才我们创建的serverA镜像的容器ID为 27afbbb8aae9

docker commit -p 27afbbb8aae9 mycentos # 以serverA容器创建镜像 mycentos
# sha256:25e0d0b653a6552fc32b485b5088246785adf98bbf08928e1e1046545c26519 创建成功提示

docker images # 查看现在我们的镜像列表
# REPOSITORY   TAG         IMAGE ID       CREATED          SIZE
# mycentos     latest      25e0d0b653a6   5 seconds ago    457MB 
# mycentos已经出现

Step8 - 最后

用我们制作的镜像重新创建一次服务器A和B,并且让他们加入我们之前创建的网络myNet内,并实现A服务器暴露2001和4001端口给外网也就是docker外的机器访问

  • 重新创建A\B服务器
# 我们先删除之前创建的A服务器
docker rm -f serverA 

# 重新创建服务器A 
docker run -itd --name serverA --network myNet -p 2002:2001 -p 4002:4001 --privileged  mycentos  /usr/sbin/init
# 参数说明
# --network myNet:加入myNet网络组
# -p 2002:2001: 将服务器A内部的2001端口暴露给外部2002端口访问
## 此时docker外的这台机器上请求2002端口时就转发到了服务器A上2001端口上的服务器了
# -p 4002:4001: 将服务器A内部的4001端口暴露给外部4002端口访问

# 创建服务器B
docker run -itd --name serverB --network myNet --privileged  mycentos  /usr/sbin/init

  • 测试A\B服务器连接

现在我们已经创建好了A和B服务器,由于他们在myNet网络下,互相可以通过容器名来访问,不需要通过IP了,我们尝试从B服务器去ssh A服务器并且用my账号

# 先进入B服务器
docker exec -it serverB /bin/bash
# 然后用ssh 登录serverA,并且使用my账户登录
ssh my@serverA

完成

现在我们A和B服务器就像在局域网一样,不用关心对方IP使用别名即可连接了,并且A对外暴露了端口2001和4001供外部连接

将制作好的镜像上传到docker-hub

step1 - 登录并注册docker hub账号

docker hub官方网站

  1. 注册账号(假设我们账号叫fanta)-->邮箱验证(验证时需要保证在国外网络哦😁)
  2. 验证完毕后你的docker站点下就会出现 create a repository

step2 - 创建仓库

点击 create a repository创建一个仓库,仓库名称假设叫:myOS,并且将仓库设置为私有仓库

step3 - 在docker内登录你的docker账号

  1. docker login
  2. 根据提示输入账号和密码,如果没有出现而是直接登录成功了,可能因为你本地安装了docker桌面端并登录过了,所以就免登了

step4 - 制作上传的镜像

如果我们需要将上面制作的镜像 mycentos:latest 上传到docker-hub上刚才注册的fanta账号下的myOS仓库下,并且tag版本命名为v1:
docker tag mycentos:latest fanta/myOS:v1

step5 - 上传镜像

使用docker push fanta/myOS:v1完成上传

step6 - 在另一个服务器上下载镜像使用

  1. docker login 登录刚才的fanta账号
  2. docker pull fanta/myOS:v1 直接拉取fanta账号下myOS:v1这个镜像即可

遇到的问题

  • Failed to get D-Bus connection: Operation not permitted
    需要用 --privileged 参数启动镜像:docker run -itd --privileged...

Nginx的安装

  1. yum list | grep nginx查看是否有nginx包

  2. 如果没有则yum install epel-release安装一个源

  3. yum install -y nginx安装nginx

  4. yum -y install nginx-all-modules.noarch安装所有模块

  5. systemctl start nginx启动nginx

  6. 默认安装到了/etc/nginx 目录下

wget安装

yum install wget

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容