Coolify系列-手把手教學解決區域網區域網中的其他主機訪問虛擬機器以及docker服務

糖~豆豆發表於2023-01-26

背景

我在windows電腦安裝了一個VM,使用VM開啟了Linux伺服器,執行docker,下載服務映象,然後執行服務,然後遇到了主機無法訪問服務的問題。

問題排查

STEP1:首先要開啟防火牆埠,這個我的Coolify系列其他文章有詳細講解,可以參考一下哇~~

STEP2:配置虛擬機器網路,讓主機以及區域網其他網路均可訪問你的虛擬機器(如何讓區域網中的其他主機訪問虛擬機器)

設定網路

接下來詳細介紹 配置虛擬機器網路,讓主機以及區域網其他網路均可訪問你的虛擬機器(如何讓區域網中的其他主機訪問虛擬機器)

當前情況

  • 同一區域網主機1,主機2都為Windows系統,
  • 主機1上安裝了VMware,並新增了一臺虛擬機器,使用CentOS 7系統。
  • 虛擬機器的網路介面卡設定為NAT模式

目標

  • 主機1可登入此虛擬機器
  • 區域網其他主機也可以登入此虛擬機器
  • 區域網所有機器都可以訪問此虛擬機器上面部署的服務

開始動工

檢查虛擬機器設定,確保為NAT模式

檢查虛擬機器所在的主機1的網路ip

進入虛擬機器:虛擬網路編輯器中檢視NAT設定中的閘道器IP

cd  /etc/sysconfig/network-scripts/     //進入到網路介面卡資料夾中,找到你的網路配置檔案
vi  ifcfg-eth0    //我的網路配置檔名是ifcfg-eth0,編輯檔案
或者透過下面命令來進行搜尋
ls | grep 'ifcfg-*'

eth0與ens33的關係:目前的主流網路卡為使用乙太網路協定所開發出來的乙太網卡 (Ethernet),因此我們 Linux 就稱呼這種網路介面為 ethN (N 為數字)。 舉例來說,主機上面有一張乙太網卡,因此主機的網路介面就是 eth0 (第一張為 0 號開始)。新的 CentOS 7 開始對於網路卡的編號有另一套規則,網路卡的介面代號與網路卡的來源有關,網路卡名稱會是這樣分類的:

  • eno1 :代表由主機板 BIOS 內建的網路卡
  • ens1 :代表由主機板 BIOS 內建的 PCI-E 介面的網路卡
  • enp2s0 :代表 PCI-E 介面的獨立網路卡,可能有多個插孔,因此會有 s0, s1... 的編號~
  • eth0 :如果上述的名稱都不適用,就回到原本的預設網路卡編號

所以我們可以透過新建一個網路卡檔案來設定網路配置,重點是這兩行

BOOTPROTO=dhcp
ONBOOT=yes

假如centos7裡沒有ifcfg-eth0只有 ifcfg-ens33(沒有Eth0網路卡)

參考命令:

cd  /etc/sysconfig/network-scripts/     //進入到網路介面卡資料夾中
mv ifcfg-ethXXX ifcfg-eth0     //名字改為ifcfg-eth0
vi  ifcfg-eth0    //編輯檔案

那就新增一個,參考配置如下:

TYPE=Ethernet 
DEFROUTE=yes 
PEERDNS=yes 
PEERROUTES=yes 
IPV4_FAILURE_FATAL=no 
IPV6INIT=yes 
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes 
IPV6_PEERDNS=yes 
IPV6_PEERROUTES=yes 
IPV6_FAILURE_FATAL=no 
NAME=eth0
BOOTPROTO=dhcp 
ONBOOT=yes 
DNS1=8.8.8.8

儲存,然後重啟服務

service network restart  # 重啟網路
ping www.baidu.com  # 測試網路


檢視IP地址

ip addr

此時我們要做一些測試

  • 虛擬機器1能ping通www.baidu.com(已達成)
  • 虛擬機器所在的主機1能ping通虛擬機器(已達成)
  • 虛擬機器能ping通自己所在的主機(已達成)
  • 虛擬機器所在的主機1能使用linux工具登入虛擬機器(已達成)



安裝一個nginx,部署一個網頁進行測試

cd /var/opt/
wget http://nginx.org/download/nginx-1.22.1.tar.gz
tar -zxvf nginx-1.22.1.tar.gz
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
cd nginx-1.22.1
./configure
make install
# 開啟配置檔案,改為喜歡的埠號
vi /usr/local/nginx/conf/nginx.conf
啟動nginx
./usr/local/nginx/sbin/nginx
檢視nginx是否啟動
ps -ef | grep nginx





使用虛擬機器所在的主機1訪問虛擬機器的網頁,測試成功

接下來我們讓2,3都可以連結虛擬機器

設定VMVare的預設閘道器(相當於我們設定路由器):

編輯->虛擬網路編輯器->更改設定->選中VM8>點選NAT設定,設定預設閘道器(根據本地的ipconfig設定)


埠轉發

選擇“NAT設定”,按照下圖進行埠轉發的設定。將主機的空閒埠指定為8080(可以指定任意的空閒埠),虛擬機器的空閒埠同樣指定為8080。然後,在主機2上用主機1的IP+主機1的埠的方式來訪問虛擬機器1中的網頁,如:192.168.0.128:8080。如果這樣不能訪問成功,請接著做下一步。


配置

回到虛擬機器所在的主機1:控制皮膚\所有控制皮膚項\網路連線,設定主機ip地址,點選VMnet8,設定ip


最後一點哦,配置虛擬機器所在主機的防火牆策略,我直接給它關了,這個不太好,建議小夥伴們去設定一下埠策略哦~~

測試訪問

經過一系列配置以後,使用宿主機進行測試訪問以下三個地址,我們發現


經過反覆測試,確認是偶然性速度快慢問題,速度應該和區域網網路穩定性有關係

接下來我去搞docker

我們建立一個docker測試專案,進行測試

cd /var/opt/
ls
mkdir docker-test-demo
ls
cd docker-test-demo/
touch Dockerfile
vi Dockerfile

寫入以下內容

FROM node:9.2.1-alpine
# Install base packages and set timezone ShangHai
RUN apk update && \
    apk add tzdata && \
    /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
WORKDIR /app
COPY ./app /app
RUN npm install
EXPOSE 8090
CMD [ "node", "server.js" ]

補充.dockerignore

touch .dockerignore

.dockerignore寫入以下內容

node_modules
npm-debug.log

準備一個簡單的nodejs檔案

var http = require('http');

http.createServer(function (request, response) {


    response.writeHead(200, { 'Content-Type': 'text/plain' });


    response.end('Hello World\n');
}).listen(8090);

console.log('Server running at http://127.0.0.1:8090/');

將檔案放到我們的dockerfile旁邊app目錄下

mkdir app
cd app

啟動docker以及設定開機啟動

systemctl start docker
接下來執行
chkconfig docker on
或者
systemctl enable docker.service

下載構建映象

下載映象
docker search node
docker pull docker.io/node:9.2.1-alpine
構建映象,不要忘了後面還有一個點點哦
docker build -t node:v1 .
啟動容器指令碼
docker run -d -p 8090:8090 node:v1



成功啦~~

在虛擬機器使用
curl http://localhost:8090/
在宿主機使用
http://192.168.33.128:8090/
在其他區域網電腦使用
http://192.168.1.6:8090/


今天就寫到這裡啦~

  • 小夥伴們,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我們明天再見啦~~
  • 大家要天天開心哦

歡迎大家指出文章需要改正之處~
學無止境,合作共贏

在這裡插入圖片描述

歡迎路過的小哥哥小姐姐們提出更好的意見哇~~

相關文章