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集羣。