转载请注明出处:饭饭博客: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

    

  

貌似主要就是这些问题,其余问题还算好解决。

(原创)nginx反向代理上网,使docker可以拉取镜像的更多相关文章

  1. IIS tomcat共用80端口解决一个IP多个域名:使用Nginx反向代理方式使两者兼容

    环境: windows server 2003,IIS6服务器,Tomcat7服务器 域名有几个: 以下是使用IIS的域名: http://www.formuch.com/ http://www.fo ...

  2. (转)IIS tomcat共用80端口解决一个IP多个域名:使用Nginx反向代理方式使两者兼容

    from :http://www.cnblogs.com/wuyou/p/3455619.html 环境: windows server 2003,IIS6服务器,Tomcat7服务器 域名有几个: ...

  3. 怎么解决docker pull拉取镜像速度过慢的问题

    在我们安装了docker之后,在利用docker pull下载镜像的时候,由于国内的源会出现的问题就是速度真的很慢,可以用龟速来形容,最痛苦的是当你耐心的等待几个小时之后,出现unexpected E ...

  4. 【Docker学习之三】Docker查找拉取镜像、启动容器、容器使用

    环境 docker-ce-19.03.1-3.el7.x86_64 CentOS 7 一.查找.拉取镜像.启动容器1.查找镜像-docker search默认查找Docker Hub上的镜像,举例:D ...

  5. [原创]Nginx反向代理及负载均衡

    1.基本命令 # 启动nginx start nginx.exe # windowsnginx -c /usr/local/nginx/conf/nginx.conf # Linux# 优雅的停止ng ...

  6. play-with-docker搭配ffsend完成文件上传及下载(解决从docker hub拉取镜像慢问题)

    由于众所周知的原因,大家有的时候pull docker hub上的镜像是很困难的,下载到99%就这么不动了也是很正常的事情 这个时候以下步骤是100%可以解决问题的: 1.找一台国外的服务器安装doc ...

  7. docker 查看拉取镜像源地址

    命令:  cat /etc/docker/de

  8. 【使用kubectl apply xxx.yaml的方式从docker源拉取镜像】

    只需要修改黄底色部分就可以了 apiVersion: apps/v1 # Kubernetes version 1.8.x should use apps/v1beta2 # Kubernetes v ...

  9. Nginx反向代理配置配置实例

    为了节省支出,公司需要将分布在不同机器的站点都迁移到一台机器,而目前不同机器运行的是不同的web服务,部分是nginx,部分是apache,由于牵涉较多rewrite规则,为了节省修改功夫,打算迁移后 ...

随机推荐

  1. linux之HTTP服务

    1.基本的配置   httpd:俗称Apache (A pachey Server) /etc/httpd/conf/httpd.conf            #配置文件 /etc/httpd/co ...

  2. Centos7下Jewel版本radosgw服务启动

    前言 本篇介绍了centos7下jewel版本的radosgw配置,这里的配置是指将服务能够正常起来,不涉及到S3的配置,以及其他的更多的配置,radosgw后面的gw就是gateway的意思,也就是 ...

  3. Distributing Custom Apps

    Distributing Custom Apps 分配自定义应用程序 November 10, 2020 2020年11月10日 Custom apps let you meet the unique ...

  4. elasticsearch快速安装启动

    准备 docker docker内安装centos容器,模拟服务器环境 centos容器安装 下载centos容器 docker pull centos 启动docker容器 docker run - ...

  5. HTML5大纲算法

    什么是HTML大纲算法? 大纲算法允许用户代理(user agent)从一个web页面生成一个信息结构目录,让用户对页面有一个快速的概览.类似书籍.PDF.帮助文档等,都有一个清晰的目录结构,用户能方 ...

  6. yii2.0 访问控制器下的方法时出现 Object Not Found! 解决办法

    yii2.0  访问控制器下的方法时出现 Object Not Found! 时 可以查看(apache)  入口文件index.php 的同级有没有 .htaccess 文件 没有.htaccess ...

  7. iOS中字符串转float类型失真的解决办法

    最近在做项目的过程中,偶然遇到了一个问题,就是字符串和浮点类型的转换.以往都是通过[NSString stringWithFormat:@"%d",goodcount]这种方式转换 ...

  8. 【mq读书笔记】消息拉取

    疑问:PullRequest何时添加? PullMessageService提供延迟添加与立即添加2种方式 疑问:PullRequest是在什么时候创建的呢? 1.上上图中 PullRequest p ...

  9. 使用@RequestBody注解获取Ajax提交的json数据

    最近在学习有关springMVC的知识,今天学习如何使用@RequestBody注解来获取Ajax提交的json数据内容. Ajax部分代码如下: 1 $(function(){ 2 $(" ...

  10. C++的编程指南

    序言:每天更新C++的内容 一.文件结构 每个C++/C程序通常分为两个文件.一个文件用于保存程序的声明(declaration),称为头文件.另一个文件用于保存程序的实现(implementatio ...