日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

15-多容器复杂应用的部署

發(fā)布時(shí)間:2025/3/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 15-多容器复杂应用的部署 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

15-多容器復(fù)雜應(yīng)用的部署

此節(jié)主要是通過部署一個(gè)復(fù)雜的應(yīng)用場景,進(jìn)而練習(xí)容器的網(wǎng)絡(luò)相關(guān)知識(shí)。

創(chuàng)建一個(gè)flask-web應(yīng)用

  • 創(chuàng)建一個(gè) flask-web 文件夾

    mkdir flask-web

    在此文件夾內(nèi)創(chuàng)建 app.py 文件

    cd flask-web touch app.py
  • 編寫一個(gè)簡單的 web 程序

    import os import socket import redis from flask import Flaskapp = Flask(__name__) redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)@app.route('/') def hello():redis.incr('hits')return 'hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'), socket.gethostname())if __name__ == '__main__':app.run(host="0.0.0.0", port=5000, debug=True)
  • 創(chuàng)建一個(gè) redis 數(shù)據(jù)庫容器

  • 創(chuàng)建容器

    docker run -d --name redis redis

    這里為什么沒有增加端口呢,是因?yàn)槲覀兿雰?nèi)部自己訪問,不想暴露給外面,這樣也比較安全。

  • 查看運(yùn)行情況

    [vagrant@10 flask-web]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d9916db96279 redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 6379/tcp redis
  • 部署

  • 創(chuàng)建自定義的 web 程序鏡像

    首先編寫Dockerfile

    FROM python:2.7 LABEL maintaner="vincent <jeffmanword@gmail.com>" COPY ./app.py /app/ WORKDIR /app RUN pip install flask redis EXPOSE 5000 CMD ["python", "app.py"]

    構(gòu)建鏡像

    docker build -t vincent/flask-redis .
  • 創(chuàng)建 flask-redis 的容器

    docker run -d --link redis --name flask-redis -e REDIS_HOST=redis vincent/flask-redis

    -d 是后臺(tái)執(zhí)行
    –link 是連接redis容器,使 flask-redis 容器可以訪問 redis 容器
    -e 設(shè)定容器的環(huán)境變量,下面講

  • 問題解決

    上一步構(gòu)建完成后,查看容器運(yùn)行情況

    docker ps

    發(fā)現(xiàn)剛剛創(chuàng)建的flask-redis容器并沒有運(yùn)行,而是停止了,說明工作不正常,那么我怎么辦?

    首先我們查看運(yùn)行日志

    [vagrant@10 flask-web]$ docker logs flask-redis Traceback (most recent call last):File "app.py", line 7, in <module>redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379) NameError: name 'Redis' is not defined

    發(fā)現(xiàn)這里有一個(gè)錯(cuò)誤,這是使用redis錯(cuò)誤導(dǎo)致的,app.py 修改如下

    import os import socket import redis from flask import Flaskapp = Flask(__name__) redis = redis.Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)@app.route('/') def hello():redis.incr('hits')return 'hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'), socket.gethostname())if __name__ == '__main__':app.run(host="0.0.0.0", port=5000, debug=True)

    重新構(gòu)建鏡像

    docker rm flask-redis && docker rmi vincent/flask-redis

    重新創(chuàng)建容器

    docker run -d --link redis --name flask-redis -e REDIS_HOST=redis vincent/flask-redis
  • 進(jìn)入 flask-redis 容器

    docker exec -it flask-redis /bin/bash

    查看 env

    root@99a298edd5da:/app# env

    我們能在返回的內(nèi)容中找到這樣一條環(huán)境變量

    REDIS_HOST=redis

    說明剛剛創(chuàng)建容器的時(shí)候參數(shù) -e的作用就在此。

  • 測試網(wǎng)絡(luò)

    測試ping redis 查看是否連通

    root@99a298edd5da:/app# ping redis PING redis (172.17.0.4) 56(84) bytes of data. 64 bytes from redis (172.17.0.4): icmp_seq=1 ttl=64 time=0.079 ms 64 bytes from redis (172.17.0.4): icmp_seq=2 ttl=64 time=0.068 ms

    ping redis 是通的。這是因?yàn)?/p> redis = redis.Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)

    在這里的 REDIS_HOST 被替換成了我們設(shè)定的名字,其實(shí)這段代碼在訪問的時(shí)候其實(shí)是直接訪問的 redis,因?yàn)樵O(shè)定了 --link 參數(shù),那么是可以訪問的,而不需要ip。到這里有的人會(huì)有疑問,為什么不直接在代碼中寫 redis 呢?原因是方便我們后續(xù)更改名稱,我們只需要在創(chuàng)建容器的時(shí)候指定名稱即可,你可以叫 redis1,redis2 都可以。

    我們在這個(gè)容器內(nèi)訪問 web 服務(wù)

    root@99a298edd5da:/app# curl 127.0.0.1:5000 hello Container World! I have been seen 1 times and my hostname is 99a298edd5da.

    這個(gè)web程序運(yùn)行是正常的。

  • 設(shè)定端口

    退出容器,測試訪問本地 5000 端口

    [vagrant@10 flask-web]$ curl 127.0.0.1:5000 curl: (7) Failed connect to 127.0.0.1:5000; 拒絕連接

    我們無法訪問,這是因?yàn)槲覀冎皇潜┞读?容器的 5000端口,但是并沒有和本地端口進(jìn)行綁定。

    那我們重新創(chuàng)建容器

    docker stop flask-redis && docker rm flask-redis docker run -d -p 5000:5000 --link redis --name flask-redis -e REDIS_HOST=redis vincent/flask-redis

    再次測試訪問本地 5000 端口

    [vagrant@10 flask-web]$ curl 127.0.0.1:5000 hello Container World! I have been seen 2 times and my hostname is e2ecfc2256f7.
  • 總結(jié)

    我們通過這個(gè)例子我們創(chuàng)建了兩個(gè)容器,并且相互之間有訪問設(shè)定,這很符合我們前后端開發(fā)的一個(gè)模式,一般 web程序 和 數(shù)據(jù)是分離的,這也是我們把 redis 單獨(dú)封裝在一個(gè)容器的原因。

    這里我們在創(chuàng)建容器的時(shí)候使用了 -e 參數(shù),我們詳細(xì)介紹一下。

    創(chuàng)建一個(gè)帶-e參數(shù)的test4 容器

    docker run -d -e PENG=vincent --name test4 busybox /bin/sh -c "while true; do sleep 3600; done"

    進(jìn)入容器

    docker exec -it test4 /bin/sh

    這里說明一下何時(shí)加 -it 參數(shù)當(dāng)我們使用 exec 的時(shí)候需要加,這時(shí)我們想進(jìn)入一個(gè)容器,如果我們在創(chuàng)建一個(gè)容器的時(shí)候,也就是run命令,那么是否加-it取決于,這個(gè)容器內(nèi)的啟動(dòng)命令配置,例如: 如果使用 ENTRYPOINT [“l(fā)s”] 那么我們不需要加 -it,如果什么都沒有設(shè)置,那么就需要加,一般這樣使用docker run -it test1 /bin/sh ls

    執(zhí)行 env

    / # env HOSTNAME=51801dc17c67 SHLVL=1 HOME=/root TERM=xterm PENG=vincent PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/

    我們可以看到 PENG=vincent 已經(jīng)被設(shè)置在容器內(nèi)了。這有什么用呢,有的時(shí)候有些程序需要讀取環(huán)境變量才能工作,這就很有用了。

    最后我們再回顧一下這節(jié)部署的程序網(wǎng)絡(luò)模型圖

    我們部署的兩個(gè)容器是在同一臺(tái)linux主機(jī)內(nèi)的,他們可以訪問是很簡單的,那么如果是兩臺(tái)linux呢?

    我們假設(shè)這兩臺(tái)linux主機(jī)是可以通信的,現(xiàn)在我們想把 redis 部署在一臺(tái)linux主機(jī)上,flask-web 部署在另一臺(tái)linux主機(jī)上,他們?nèi)绾瓮ㄐ?#xff1f;如何配置? 大家思考一下。

    答案將在下一節(jié)我們講解。

    總結(jié)

    以上是生活随笔為你收集整理的15-多容器复杂应用的部署的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。