(原創)nginx反向代理上網,使docker可以拉取鏡像


轉載請注明出處:飯飯博客:https://www.cnblogs.com/zzf0305/p/9602107.html

摘語:參考了N多大俠的資料,終於將自己的環境配置起來了。站在眾多巨人的肩膀進行總結。

 

背景:公司的服務器為了安全,基本都是在內網中,只有有需要時才會開通一台外網機器。

 

目的:本文章將講述,在開通一台外網機器的情況下,利用nginx做反向代理,使內網中的五台機器都可以上網,並將doker鏡像下載下來。

 附錄:內網機器的安裝配置腳本。寫的比較簡單粗暴。

#!/bin/bash

nei_addres=外網機器上可以連接內網機器的ip
nei_port=需要監聽的端口號

echo "------------------------------------開始修改profile文件-------------------------"

sed -i "/# will prevent the need for merging in future updates/a\ " /etc/profile
sed -i "/# will prevent the need for merging in future updates/a\export HTTP_PROXY HTTPS_PROXY http_proxy https_proxy" /etc/profile
sed -i "/# will prevent the need for merging in future updates/a\https_proxy=https://${nei_addres}:${nei_port}" /etc/profile
#sed -i "/# will prevent the need for merging in future updates/a\HTTPS_PROXY=https://${nei_addres}:${nei_port}" /etc/profile
#sed -i "/# will prevent the need for merging in future updates/a\HTTP_PROXY=http://${nei_addres}:${nei_port}" /etc/profile
sed -i "/# will prevent the need for merging in future updates/a\http_proxy=http://${nei_addres}:${nei_port}" /etc/profile
sed -i "/# will prevent the need for merging in future updates/a\ " /etc/profile

#更新配置文件
source /etc/profile
cat /etc/profile

yum -y install wget

#--------注意:這里你可以填寫自己的阿里雲加速器或者是官方的加速器,由於都是個人注冊的,所以我這里就刪掉了。各位直接將自己的粘貼上來就行

#測試
echo "-----------------------------測試連接百度--------------------------------"
wget https://www.baidu.com

#配置docker
echo "-----------------------------------開始配置docker--------------------------------------"
mkdir -p /etc/systemd/system/docker.service.d
echo "[Service] 
Environment=\"http_proxy=http://${nei_addres}:${nei_port}\"" > /etc/systemd/system/docker.service.d/http-proxy.conf

echo "[Service] 
Environment=\"https_proxy=https://${nei_addres}:${nei_port}\"" > /etc/systemd/system/docker.service.d/https-proxy.conf

echo "-----------------------------------更新docker狀態------------------------------------"
systemctl stop docker
systemctl daemon-reload
systemctl start docker 
systemctl status docker

echo "------------------------------------嘗試拉取鏡像----------------------------"
echo "-------------------------------執行 完畢---------------------------------"
內網機器配置腳本

硬件情況:

(1)外網機器(簡稱:A),這台機器雖然是一台虛擬機,但是配置了兩塊網卡,一塊是只能連接內網的網卡(網卡簡稱:A內),另一塊是只能連接外網的網卡(網卡簡稱:A外);

(2)內網機器(簡稱:B),因為內網中的機器情況都一樣,所以就以一台機器為例。雖然內網中的機器網卡數量不一樣多,但是有一個共同的特性,就是都是只能在內網中聯通。

注意:內網中的每一台機器都不要去配置DNS,否則后面docker請求鏡像的下載時,會先用本機的DNS進行解析。但因為是內網機器,肯定解析不開。

   碰見最多的情況:在配置成功之后,還是拉取不下來鏡像,nginx中的日志也正常,經排查主要是網速的問題,嘗試更改網關,或者換個時間進行拉取鏡像。

軟件情況:

nginx:1.15

docker:18.06

centos 7.5

 

一、nginx的環境配置(外網機器上安裝)

備注:因為nginx是我們技術大牛幫我安裝的,據說專門編譯了https的模塊,但是我在后面的docker下載那兒沒有使用到該模塊。假如你在使用阿里雲進行在線安裝docker的話,可能會出現解析不到。如果出現此問題,請聯系本人,發你模糊安裝教程。哈哈

 

nginx只需要裝在外網的這一台機器就行了,內網中的機器不需要進行安裝。

nginx的安裝請參考本人的這篇文章:

https://www.cnblogs.com/zzf0305/p/9320022.html

 

主要是nginx的配置:

  補充:如果只是需要docker上網,在/etc/profile的配置文件中不需要添加下面腳本里的配置,否則會使你的其他軟件出現問題,使用http或者https時,會將請求發送到你代理的地方。

如果你是編譯安裝的,可以新建一個配置文件

[root@localhost home]# vi /usr/local/nginx/conf/proxy.conf

server {

     listen       8081;      #這里是配置的監聽本機的8081端口,可隨意更改

     # dns resolver used by forward proxying
     resolver          8.8.8.8;        #這里的dns是最重要的,我這里配置的是和我本機的外網的dns相同

     sendfile   on;
     charset utf-8;
     keepalive_timeout  65;
     # forward proxy for CONNECT request
     proxy_connect;
     proxy_connect_allow            443 563;
     proxy_connect_connect_timeout  10s;
     proxy_connect_read_timeout     100s;
     proxy_connect_send_timeout     100s;

     # forward proxy for non-CONNECT request
     location / {

         proxy_pass http://$host;                   #這里是固定格式,不要進行更改
         proxy_set_header Host $host;       #這里也是固定格式,不要進行更改

        #fan bu chong
        proxy_redirect off;
        #proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size 10m;
        client_body_buffer_size 128k;
        proxy_connect_timeout 65;
        proxy_send_timeout 65;
        proxy_read_timeout 65;
        proxy_buffer_size 4k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;

     }
 }

  

注意:上面配置文件中,除了注釋的,其余的都是參考配置,可配置也可不配置

 

編譯安裝的需要在nginx的主配置文件中添加這個一句話:

[root@localhost home]# vi /usr/local/nginx/conf/nginx.conf

  因為我的此配置文件是默認的,就加了這么一個配置文件的語句,所以這里就不全部貼出了,只貼出修改過的部分:

前面部分省略

http {

    include       mime.types;
    include     proxy.conf;         #一般此位置位於nginx.conf配置文件中第一個出現的http中,意思是將剛剛上面編寫的proxy.conf配置文件包含進來。

后面部分省略

  

配置文件編寫完成,然后你啟動nginx就可以了。

 

二、在講docker的環境配置之前,先將一下如何可以在內網中使用yum命令進行在線下載

  yum命令的在線下載,更加方便了我們接下來安裝docker

  因為上面已經做了nginx的反向代理,所以我們只需要將內網中機器的請求轉到外網機器即可。

[root@localhost home]# vi /etc/profile

在此配置文件中添加如下環境變量
http_proxy=http://A內的ip地址:上面nginx監聽的地址(這里是8081)
#HTTP_PROXY=$http_proxy
#HTTPS_PROXY=https://A內的ip地址:上面nginx監聽的地址(這里是8081)
https_proxy=https://A內的ip地址:上面nginx監聽的地址(這里是8081)
export HTTP_PROXY HTTPS_PROXY http_proxy https_proxy

  記得更新環境變量

[root@localhost home]# source /etc/profile 

  測試一下httpd是否可以安裝

[root@localhost home]# yum install httpd

  

三、docker的環境配置(內網中的5台機器都是一樣的配置)

docker的安裝請參考本人的這篇文章:

  https://www.cnblogs.com/zzf0305/p/9607699.html

 

安裝完docker之后,需要做如下的配置(這是docker官方的解決方案,我這里是選取了適合 我的)

docker解析的是這兒的配置文件,而不是剛剛/etc/profile所配置的環境變量

mkdir /etc/systemd/system/docker.service.d

  

vi /etc/systemd/system/docker.service.d/http-proxy.conf

  [Service]

  Environment="http_proxy=http://A內的ip地址:上面nginx監聽的地址(這里是8081)"

  備注:在腳本里,我還添加了https-proxy.conf的配置,可以借各位參考一下。我這里只要配置了這個就可以了。

重啟docker即可

試試拉取鏡像,你就會開心的發現可以使用了

 

四、總結

  1、理清楚整個流程。

  2、排查錯誤時:可以同時打開docker的日志和nginx的日志。

    如果只是在docker中產生日志,說明並沒有映射到nginx上,需要在內網機器中本身找錯誤;

    如果docker和nginx中同時產生日志,但是還是不能拉取鏡像,說明還是內網機器本機有問題。本人就碰見此現象,這時nginx中產生的日志還是16進制的,只能看懂最后的400數字。而在docker里面的報錯是這樣的:

      Error response from daemon: Get https://registry-1.docker.io/v2/: proxyconnect tcp: tls: oversized record received with length 20527

      兩種猜測:(1)經排查是內網機器中配了DNS,將請求解析成16進制了,導致nginx代理不出去。報的返回的數據條數過多。

            (2)上面/etc/profile配置文件中采用的變量名,我一開始采用的大寫的HTTP_PROXY這種模式,也有可能是大寫的代理出錯。

            (3)老規矩,偷個懶,留給各位去做情景重現。

  3、不要慌,晚上做就行,晚上腦袋清醒。哈哈。

 

五、此過程中解決的錯誤

  只記錄了部分。根據以上教程,這些問題都將得到解決。

     下面這個報錯基本就是網絡的問題,可以嘗試這樣解決:    

      (1)給docker配置加速,阿里雲加速、daodocker加速都可以

      (2)網關的問題。我遇見的就是網關的問題,早上10點以前只有偶爾的幾次可以拉取成功,到了十點之后,成功率基本達到百分之90,嘗試過的網關有8.8.8.8;8.8.4.4,機房管理員告訴的聯通機房網關,成功率在我測試后都不高,最后采用了114.114.114.114這個網關。目前速度還可以。

  [root@localhost completions]# docker pull busybox

  Using default tag: latest

  Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on [::1]:53: read udp [::1]:36261->[::1]:53: read: connection refused

     

  

 

貌似主要就是這些問題,其余問題還算好解決。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM