docker_note_5__完整的例子

18.一個完整的例子

  1. 例子主要完成自己鏡像的製作,端口映射,Dockerfile文件編寫,鏡像上傳DockerHub完成鏡像的分享。
    首先選擇一個合適的目錄:
    /root/docker/hello
  2. 首先創建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集羣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章