目标场景:
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账号
- 注册账号(假设我们账号叫
fanta
)-->邮箱验证(验证时需要保证在国外网络哦😁) - 验证完毕后你的docker站点下就会出现
create a repository
step2 - 创建仓库
点击 create a repository
创建一个仓库,仓库名称假设叫:myOS
,并且将仓库设置为私有仓库
step3 - 在docker内登录你的docker账号
docker login
- 根据提示输入账号和密码,如果没有出现而是直接登录成功了,可能因为你本地安装了docker桌面端并登录过了,所以就免登了
step4 - 制作上传的镜像
如果我们需要将上面制作的镜像 mycentos:latest
上传到docker-hub上刚才注册的fanta账号下的myOS仓库下,并且tag版本命名为v1:
docker tag mycentos:latest fanta/myOS:v1
step5 - 上传镜像
使用docker push fanta/myOS:v1
完成上传
step6 - 在另一个服务器上下载镜像使用
-
docker login
登录刚才的fanta账号 -
docker pull fanta/myOS:v1
直接拉取fanta账号下myOS:v1这个镜像即可
遇到的问题
-
Failed to get D-Bus connection: Operation not permitted
需要用 --privileged 参数启动镜像:docker run -itd --privileged...
Nginx的安装
yum list | grep nginx
查看是否有nginx包如果没有则
yum install epel-release
安装一个源yum install -y nginx
安装nginxyum -y install nginx-all-modules.noarch
安装所有模块systemctl start nginx
启动nginx默认安装到了/etc/nginx 目录下
wget安装
yum install wget