轉載請注明出處:飯飯博客: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
貌似主要就是這些問題,其余問題還算好解決。