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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容