目标:
运行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)并绑定到容器的标准输入上
- --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 socket
import threading, time
# 可以使用telnet ip port 来与此python socket通信(因为telnet是应用层的,而socket是传输层的)
print "hello, world"
def tcplink(sock, addr):
print 'Accept new connection from %s:%s...' % addr
sock.send('Welcome!')
while True:
data = sock.recv(1024)
time.sleep(1)
if data == 'exit' or not data:
break
sock.send('Hello, %s!' % data)
sock.close()
print 'Connection from %s:%s closed.' % addr
#创建一个基于IPv4和TCP协议的Socket
s = 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()
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 5010
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Welcome!
在容器中可以看到:
[root@e6d506e5b5eb /]# python socket-listen.py
hello, world
Waiting for connection...
Accept new connection from 127.0.0.1:46804...