java
目标:
运行docker容器,从容器外访问docker内的应用程序
步骤:
1、安装docker
2、使用docker镜像创建容器:
docker run --name test1 -it --rm -p 127.0.0.1:5010:5011 centos:latest bash
docker run:创建容器
--name test1:容器名称是test1
-it:命令窗口交互。-i 则让容器的标准输入保持打开;-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
JAVA
--rm:容器关闭后就删除容器并删除容器挂载的数据卷
-p 127.0.0.1:5010:5011:把容器的5011端口映射到宿主机的ip和端口127.0.0.1:5010上
centos:latest:创建容器使用的镜像是最新版本的centos(如果本地没有该镜像,docker会自动从仓库拉取)
bash:启动容器后,在容器内启动一个 bash 终端,允许用户进行交互
3、在本地写一个python socket 监听脚本 socket-listen.py:
注意,由于在映射ip的时候并没有指定容器ip,容器中的python应用监听的ip应该是0.0.0.0,而不是127.0.0.1(127.0.0.1 是一个环回地址,并不表示“本机”;0.0.0.0才是真正表示“本网络中的本机” )
#coding=utf-8 import socketimport threading, time# 可以使用telnet ip port 来与此python socket通信(因为telnet是应用层的,而socket是传输层的)print "hello, world"def tcplink(sock, addr):print 'Accept new connection from %s:%s...' % addrsock.send('Welcome!')while True:data = sock.recv(1024)time.sleep(1)if data == 'exit' or not data:breaksock.send('Hello, %s!' % data)sock.close()print 'Connection from %s:%s closed.' % addr#创建一个基于IPv4和TCP协议的Sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#监听端口s.bind(('0.0.0.0', 5011))#调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量s.listen(5)print 'Waiting for connection...'while True:# 接受一个新连接:sock, addr = s.accept()# 创建新线程来处理TCP连接:t = threading.Thread(target=tcplink, args=(sock, addr))t.start()
JAVA
java
4、把socket-listen.py 从宿主机cp到容器中:
docker cp ~/Desktop/socket-listen.py test1:/
~/Desktop/socket-listen.py:宿主机中python文件路径
test1:/:拷贝到名称为test1的容器的/路径下
5、让docker监听容器的5011端口,通过端口映射,也就是监听宿主机的127.0.0.1:5010:
centos自带python,在容器中直接执行python代码:
python socket-listen.py
6、在宿主机使用telnet测试是否能访问容器中的python应用:
telnet 127.0.0.1 5010
在宿主机可以看到:
doing@doings-MacBook-Air:/usr/local/bin$ telnet 127.0.0.1 5010Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.Welcome!
在容器中可以看到:
[root@e6d506e5b5eb /]# python socket-listen.pyhello, worldWaiting for connection...Accept new connection from 127.0.0.1:46804...
领取专属 10元无门槛券
私享最新 技术干货