注意:读这篇文章之前最好先看看这个文章
https://blog.csdn.net/czk740960212/article/details/80393825

Docker支持端口映射,即将主机的某一端口映射到容器的端口,这样对主机这一端口的请求就会被转发到容器内,实现外部网络与容器通信的目的。
之前在部署Apache Storm系统的时候,发现web管理页里的supervisor日志无法查看,它的地址是类似storm_supervisor:8000这种形式的,而外部主机根本无法解析这个地址,即使可以解析(10.x.x.x),网络也是不互通的,无法访问。如果采取端口映射方式,一方面需要在外部主机上修改host文件,十分麻烦;另一方面,每一个supervisor都需要映射相同的端口,会造成冲突。所以这种方式无法实现,只能考虑其他方式。

某日,突然想起来自己平时用的fq方式:ssh转socks5。而且,更加完美的是,socks5默认支持远程dns解析,这样连host文件都不用改了。

说干就干,首先要找到一个安装了ssh服务的镜像(一般情况下,镜像都没有这个服务),很可惜,没有找到合适的。那就只能自己做了,也不难,就一条安装命令。

编写Dockerfile

FROM ubuntu
RUN apt update \
&& apt install -y openssh-server
RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
RUN cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ADD bootstrap.sh /etc/bootstrap.sh
CMD ["bash", "/etc/bootstrap.sh"]

push到github上,再通过docker平台build即可。本地构建镜像也是可以的,不过这样跨机就找不到镜像了。

加上启动脚本

bootstrap.sh

#! /bin/bash
/etc/init.d/ssh start
ssh -t -t -D 0.0.0.0:7001 -o StrictHostKeyChecking=no localhost

1、先启动ssh服务

2、连接localhost生成socks5代理,加上StrictHostKeyChecking=no参数直接信任对方的指纹,不然连接不会建立。

启动docker容器

这个镜像我已经做好了,上面的步骤只是作为介绍,不需要再重新走一遍,直接运行下面这条命令即可。
–network需要根据实际情况修改,这个命令可以代理swarm-net网络中的服务

docker service create \
--replicas 1 \
--name proxy_docker \
--network swarm-net \
-p 7001:7001 \
newnius/docker-proxy

尽管一条telnet命令即可测试是否奏效,但我们的目的是为了能在浏览器上访问web服务,那就以这个为例。

浏览器插件安装

参考下面:

方法/步骤

端口写7001,协议是socks5

访问内部服务

在地址栏输入:hadoop-master:8088 应该就能看到熟悉的hdfs UI了。(前提是你部署了hadoop-master(hostname),端口为8088),创建语句可参考:

docker service create \
--name hadoop-master \
--network swarm-net \
--hostname hadoop-master \
--replicas 1 \
--endpoint-mode dnsrr \
newnius/hadoop:2.7.4

本文参考:

https://blog.newnius.com/docker-swarm-web-proxy-without-port-mapping.html
https://jingyan.baidu.com/article/ca2d939d615aebeb6c31cea5.html

注意:读这篇文章之前最好先看看这个文章  https://blog.csdn.net/czk740960212/article/details/80393825背景Docker支持端口映射,即将主机的某一端口映射到容器的端口,这样对主机这一端口的请求就会被转发到容器内,实现外部网络与容器通信的目的。之前在部署Apache Storm系统的时候,发现web管理页里的supervisor日志无法查看,... 下面我来介绍下 docker 通过 端口映射 实现 网络 访问 一、从 外部 访问 容器应用 在启动容器的时候,如果不指定对应参数,在容器 外部 是无法通过 网络 访问 容器内的 网络 应用和 服务 的。 当容器中运行一些 网络 应用,要让 外部 访问 这些应用时,可以通过-P或-p参数指定 端口映射 。 先来说说p和P吧 -p 可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器 -P 它会随机映射一个端口至容器 内部 开放的 网络 端口(范围不详,似乎都上万) 先申明一下,我这边 client ip address 为192.168.0.225
创建/删除 服务 docker network create -d overlay tomcat_net docker service create --replicas 1 --network tomcat_net --name my_tomcat -p 80:8080 tomcat:v1.0 #默认PublishMode为ingress docker service create --network tomcat_net --name my_tomcat --publish mode=host,t
Node IP:Node 节点的 IP 地址,即物理机(虚拟机)的 IP 地址。 Pod IP:Pod 的 IP 地址,即 docker 容器的 IP 地址,此为虚拟 IP 地址。 Cluster IP:Service 的 IP 地址,此为虚拟 IP 地址。 1.2 三种 IP 的理解 No... 目前k8s+ docker 算是运维必修了, docker 能让我们的环境一键迁移,k8s能自动编排还能保证 服务 高可用,两者结合自然是无敌了,当然任何技术的使用,都需要根据具体环境来定,就像你要杀鸡,却非要选牛刀,牛刀是很锋利,但还不够你折腾的 本文重点介绍k8s 集群 外如何 访问 集群 内的 服务 一、hostPort或hostNetwork hostPort和host...
docker run创建并运行容器的时候,可以通过-p指定 端口映射 规则。但是,我们经常会遇到刚开始忘记设置 端口映射 或者设置错了需要修改。当 docker start运行容器后并没有提供一个-p选项或设置,让你修改指定 端口映射 规则。那么这种情况我们该怎么处理呢? 方法一:删除原有容器,重新建新容器 这个解决方案最为简单,把原来的容器删掉,重新建一个。当然这次不要忘记加上 端口映射 。优缺点:优点是...
Docker 搭建开发环境用的非常多,通常开发机器上既有容器形式的应用,又有本机跑着或者调试的程序,它们之间互相依赖,如何让它们之间通信顺畅,有时候是一个挺困难的事情。容器应用和容器外应用互相 访问 分为三种情况: 容器内应用和容器内应用 容器内应用 访问 容器外应用 容器外应用 访问 容器内应用 而根据两个互相通信的容器或应用在不在一台 服务 器上,我们又多出一个维度的情况: 容器或应用在一台 服务