18.一个完整的例子
- 例子主要完成自己镜像的制作,端口映射,Dockerfile文件编写,镜像上传DockerHub完成镜像的分享。
首先选择一个合适的目录:
/root/docker/hello - 首先创建Dockerfile:里面定义了我们构建镜像的指令步骤。具体定义如下:
#一个基础的python运行环境 FROM python #设置工作目录 WORKDIR /app #将当前系统文件夹内容复制到容器的app目录 ADD . /app #安装必要的依赖包 RUN pip install -r softwares.txt #开放端口,供容器外访问 EXPOSE 80 #定义环境变量 ENV NAME Hello_docker #运行命令 CMD ["python","app.py"]
在Dockerfile中定义了我们要在容器中运行pip install命令安装软件,软件定义在softwares.txt中,要使用python命
令运行app.py文件,因此这两个文件需要我们定义
softwares.txt文件定义内容
Flask
Redis
app.py文件内容
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
3.使用docker buil构建镜像
docker build -t hello .
运行完成之后
使用docker images查看
查看/app目录有Dockerfile、app.py、softwares.txt三个文件
使用-p映射宿主机端口9876,启动容器hello
docker run -p 9876:80 hello
网页访问,这里配置了hosts文件,hadoop2对应的机器ip如下:
由于没有启动redis,很明显app.py文件中抛出了不能够连接到redis中。这个地方出来使用浏览器验证,也可以使用
curl http://hadoop2:9876
来验证
这个地方我们没有配置redis,那我们就来配置下redis吧
首先使用``docker search redis``
国内网速较慢,选择红框中的镜像,下载要快些。
启动docker
启动redis容器
`docker run --name redis -d redis`
使用`sudo docker inspect -f "{{.State.Pid}}" `找到redis容器对应的进程id
使用`nsenter --target 23348 --mount --uts --ipc --net --pid` or `nsenter --target 23348`进入这个守护进程
在根目录下有run.sh脚本
chmod 700 run.sh赋予运行权限
执行./run.sh
redis启动起来了
我们再启动一个容器,运行我们的hello镜像
docker run -d --name hello --link redis:redis -p 9876:80 hello
通过nsenter工具进入这个容器中,修改app目录下的app.py文件。将
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)改为:
redis = Redis(host="redis", db=0, socket_connect_timeout=2,
socket_timeout=2,password='QOiTIvQ4ST2NVZHiT97wXme2OrV2xmka')
保存退出容器,重启docker restart hello容器
现在浏览器中访问:hadoop2:9876
刷新浏览器可以看到redis中记录的访问数在增加了。
实际结果不乐观,redis没有办法使用,实际上找不到run.sh脚本,可能是redis实际上没有成功开启的原因,不再排查
因为步数redis不是我的主要任务,我的主要任务是部署hadoop和spark集群。