摘要:后來(lái)真正用的時(shí)候才發(fā)覺(jué),這個(gè)簡(jiǎn)直是個(gè)神器。容器可以被創(chuàng)建啟動(dòng)停止刪除暫停等。項(xiàng)目由編寫(xiě),實(shí)現(xiàn)上調(diào)用了服務(wù)提供的來(lái)對(duì)容器進(jìn)行管理。此命令將會(huì)停止命令所啟動(dòng)的容器,并移除網(wǎng)絡(luò)啟動(dòng)已經(jīng)存在的服務(wù)容器。停止已經(jīng)處于運(yùn)行狀態(tài)的容器,但不刪除它。
剛接觸Docker的時(shí)候,以為只是用來(lái)做運(yùn)維。后來(lái)真正用的時(shí)候才發(fā)覺(jué),這個(gè)Docker簡(jiǎn)直是個(gè)神器。不管什么開(kāi)發(fā)場(chǎng)景都能輕松應(yīng)付。想要什么環(huán)境都能隨意生成,而且靈活性更高,更輕量,完美實(shí)現(xiàn)微服務(wù)的概念。
什么是DockerDocker是一個(gè)開(kāi)源的應(yīng)用容器引擎,基于Go語(yǔ)言 并遵從Apache2.0協(xié)議開(kāi)源。傳統(tǒng)虛擬機(jī)技術(shù)是虛擬出一套硬件后,在其上運(yùn)行一個(gè)完整操作系統(tǒng),在該系統(tǒng)上再運(yùn)行所需應(yīng)用進(jìn)程;而容器內(nèi)的應(yīng)用進(jìn)程直接運(yùn)行于宿主的內(nèi)核,容器內(nèi)沒(méi)有自己的內(nèi)核,而且也沒(méi)有進(jìn)行硬件虛擬。它占用的資源更少,能做到的事更多。
與傳統(tǒng)虛擬機(jī)的對(duì)比特性 | 容器 | 虛擬機(jī) | |
---|---|---|---|
啟動(dòng) | 秒級(jí) | 分鐘級(jí) | |
硬盤(pán)啟動(dòng) | 一般為MB | 一般為GB | |
性能 | 接近原生 | 弱于 | |
系統(tǒng)支持量 | 單機(jī)支持上千個(gè)容器 | 一般幾十個(gè) |
安裝的方法都挺簡(jiǎn)單的,我用的是mac,直接通過(guò)Docker官網(wǎng)下載軟件安裝,全程無(wú)障礙。
Docker概念鏡像(images):Docker鏡像是一個(gè)特殊的文件系統(tǒng),除了提供容器運(yùn)行時(shí)所需的程序、庫(kù)、資源、配置等文件外,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶(hù)等)。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變。(直白點(diǎn)可以理解為系統(tǒng)安裝包)
容器(container):鏡像和容器的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計(jì)中的類(lèi)和實(shí)例一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體。容器可以被創(chuàng)建、啟動(dòng)、停止、刪除、暫停等。(可以理解為安裝好的系統(tǒng))
Docker鏡像使用 一、下載鏡像大概了解了Docker的概念以后,我們就嘗試?yán)lask鏡像使用一下。
查找鏡像可以通過(guò)https://hub.docker.com/網(wǎng)站來(lái)搜索,或者通過(guò)命令搜索。
docker search flask
在這里,我是通過(guò)Docker hub官網(wǎng)挑選出了python3.7 + alpine3.8組合的運(yùn)行環(huán)境,alpine是精簡(jiǎn)版的linux,體積更小、運(yùn)行的資源消耗更少。
# 拉取鏡像 docker pull tiangolo/uwsgi-nginx-flask:python3.7-alpine3.8 # 下載好可查看鏡像列表是否存在 docker images二、運(yùn)行flask鏡像
下載鏡像以后,就開(kāi)始運(yùn)行下試試,感受一下Docker的輕量、快捷。
首先創(chuàng)建個(gè)flask運(yùn)行文件來(lái),在這里,我創(chuàng)建了/docker/flask作為項(xiàng)目文件,然后在根目錄下再創(chuàng)建個(gè)app文件夾來(lái)存放main.py文件,代碼如下:
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World from Flask!" if __name__ == "__main__": # 測(cè)試環(huán)境下才開(kāi)啟debug模式 app.run(host="0.0.0.0", debug=True, port=80)
現(xiàn)在的文件結(jié)構(gòu):
flask └── app └── main.py
運(yùn)行命令
docker run -it --name test -p 8080:80 -v /docker/flask/app:/app -w /app tiangolo/uwsgi-nginx-flask:python3.7-alpine3.8 python main.py
這里說(shuō)明一下命令的參數(shù)含義:
-it 是將-i -t合并起來(lái),作用是可以用指定終端對(duì)容器執(zhí)行命令交互。
--name 對(duì)容器進(jìn)行命名。
-p 將主機(jī)的8080端口映射到容器的80端口。
-v 將主機(jī)的/docker/flask/app文件掛載到容器的/app文件,如果容器內(nèi)沒(méi)有的話(huà)會(huì)自動(dòng)創(chuàng)建。
-w 將/app文件作為工作區(qū),后面的執(zhí)行命令都默認(rèn)在該文件路徑下執(zhí)行。
tiangolo/uwsgi-nginx-flask:python3.7-alpine3.8 鏡像名跟標(biāo)簽。
python main.py 通過(guò)python來(lái)運(yùn)行工作區(qū)的main.py文件。
運(yùn)行結(jié)果:
現(xiàn)在主機(jī)跟容器的鏈接已經(jīng)建立起來(lái)了,主機(jī)通過(guò)8080端口就能訪問(wèn)到容器的網(wǎng)站。
在使用別人定制的鏡像時(shí)總是不能盡善盡美的,如果在自己項(xiàng)目里面,不能每次都是拉取下來(lái)重新配置一下。像上面的鏡像,我可不喜歡這么長(zhǎng)的名字,想想每次要敲這么長(zhǎng)的名字都頭疼(tiangolo/uwsgi-nginx-flask:python3.7-alpine3.8)。
編寫(xiě)Dockerfile文件打開(kāi)我們剛才的/docker/flask路徑,在根目錄下創(chuàng)建Dockerfile文件,內(nèi)容如下。
# 基礎(chǔ)鏡像 FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.8 # 沒(méi)有vim來(lái)查看文件很不習(xí)慣,利用alpine的包管理安裝一個(gè)來(lái) RUN apk add vim # 順便用pip安裝個(gè)redis包,后面用得上 RUN pip3 install redis # 將我們的app文件加入到自定義鏡像里面去 COPY ./app /app
現(xiàn)在我們的文件結(jié)構(gòu)是:
flask ├── app │ └── main.py └── Dockerfile
剩下的就跑一遍就OK啦!記得一定要在Dockerfile文件同級(jí)目錄下執(zhí)行build命令。
docker build -t myflask . Sending build context to Docker daemon 4.608kB Step 1/4 : FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.8 ---> c69984ff0683 Step 2/4 : RUN apk add vim ---> Using cache ---> ebe2947fcf89 Step 3/4 : RUN pip3 install redis ---> Running in aa774ba9030e Collecting redis Downloading https://files.pythonhosted.org/packages/f5/00/5253aff5e747faf10d8ceb35fb5569b848cde2fdc13685d42fcf63118bbc/redis-3.0.1-py2.py3-none-any.whl (61kB) Installing collected packages: redis Successfully installed redis-3.0.1 Removing intermediate container aa774ba9030e ---> 47a0f1ce8ea2 Step 4/4 : COPY ./app /app ---> 50908f081641 Successfully built 50908f081641 Successfully tagged myflask:latest
-t 指定要?jiǎng)?chuàng)建的目標(biāo)路徑。
. 這里有個(gè)點(diǎn)記住啦,表示是當(dāng)前路徑下的Dockerfile文件,可以指定為絕對(duì)路徑。
編譯完后就通過(guò)docker images查看一下,就能看到myflask鏡像了,里面能直接運(yùn)行python main.py來(lái)啟動(dòng)flask,并且內(nèi)置了vim和redis包。
我們的每個(gè)容器都負(fù)責(zé)一個(gè)服務(wù),這樣容器多的時(shí)候一個(gè)個(gè)手動(dòng)啟動(dòng)的話(huà)是不現(xiàn)實(shí)的。在這種情況我們可以通過(guò)Docker Compose來(lái)關(guān)聯(lián)每個(gè)容器,組成一個(gè)完整的項(xiàng)目。
Compose項(xiàng)目由Python編寫(xiě),實(shí)現(xiàn)上調(diào)用了 Docker服務(wù)提供的 API 來(lái)對(duì)容器進(jìn)行管理。
# 安裝docker-compose sudo pip3 install docker-compose實(shí)現(xiàn)能記錄訪問(wèn)次數(shù)的web
在這里,我們通過(guò)docker-compose.yml文件來(lái)啟動(dòng)flask容器和redis容器,并將兩個(gè)不同容器相互關(guān)聯(lián)起來(lái)。
首先在/docker/flask目錄下創(chuàng)建docker-compose.yml文件,內(nèi)容如下:
version: "3" services: flask: image: myflask container_name: myflask ports: - 8080:80 volumes: - /docker/flask/app:/app working_dir: /app # 運(yùn)行后執(zhí)行的命令 command: python main.py redis: # 如果沒(méi)有這個(gè)鏡像的話(huà)會(huì)自動(dòng)下載 image: "redis:latest" container_name: myredis
然后我們把上面的main.py代碼修改一下,連接redis數(shù)據(jù)庫(kù)并記錄網(wǎng)站訪問(wèn)次數(shù)。main.py修改后內(nèi)容如下:
from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host="redis", port=6379) @app.route("/") def hello(): count = redis.incr("visit") return f"Hello World from Flask! 該頁(yè)面已被訪問(wèn){count}次。" if __name__ == "__main__": # Only for debugging while developing app.run(host="0.0.0.0", debug=True, port=80)
目前的文件結(jié)構(gòu)是:
flask ├── app │ └── main.py └── Dockerfile └── docker-compose.yml
這些編排的文件參數(shù)都是取自于Docker,基本都能看懂,其它就沒(méi)啥啦,直接命令行跑起來(lái):
docker-compose up
就辣么簡(jiǎn)單!現(xiàn)在我們?cè)跒g覽器上訪問(wèn)http://localhost:8080/就能看到結(jié)果了,并且每訪問(wèn)一次這頁(yè)面都會(huì)自動(dòng)增加訪問(wèn)次數(shù).
在這里,我們也能通過(guò)docker ps命令查看運(yùn)行中的容器:
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 66133318452d redis:latest "docker-entrypoint.s…" 13 seconds ago Up 12 seconds 6379/tcp myredis 0956529c3c9c myflask "/entrypoint.sh pyth…" 13 seconds ago Up 11 seconds 443/tcp, 0.0.0.0:8080->80/tcp myflask
有了Docker Compose的Docker才是完整的Docker,有了這些以后開(kāi)發(fā)簡(jiǎn)直不要太爽,每個(gè)容器只要維護(hù)自己的服務(wù)環(huán)境就ok了。
Docker的日常操作 鏡像常用操作# 下載鏡像 docker pull name # 列出本地鏡像 docker images # 使用鏡像運(yùn)行生成容器 docker run name:tag # 刪除鏡像 docker rmi id/name容器常用操作
可以通過(guò)容器的id或者容器別名來(lái)啟動(dòng)、停止、重啟。
# 查看運(yùn)行中的容器 docker ps # 查看所有生成的容器 docker ps -a # 開(kāi)始容器 docker start container # 停止容器 docker stop container # 重啟容器 docker restart container # 移除不需要的容器(移除前容器必須要處于停止?fàn)顟B(tài)) docker rm container # 進(jìn)入后臺(tái)運(yùn)行的容器 docker exec -it container /bin/sh # 打印容器內(nèi)部的信息(-f參數(shù)能實(shí)時(shí)觀察內(nèi)部信息) docker logs -f container
通過(guò)-i -t進(jìn)來(lái)容器的,可以先按ctrl + p, 然后按ctrl + q來(lái)退出交互界面組,這樣退出不會(huì)關(guān)閉容器。
docker-compose常用操作# 自動(dòng)完成包括構(gòu)建鏡像,(重新)創(chuàng)建服務(wù),啟動(dòng)服務(wù),并關(guān)聯(lián)服務(wù)相關(guān)容器的一系列操作。 docker-compose up # 此命令將會(huì)停止 up 命令所啟動(dòng)的容器,并移除網(wǎng)絡(luò) docker-compose down # 啟動(dòng)已經(jīng)存在的服務(wù)容器。 docker-compose start # 停止已經(jīng)處于運(yùn)行狀態(tài)的容器,但不刪除它。通過(guò)start可以再次啟動(dòng)這些容器。 docker-compose stop # 重啟項(xiàng)目中的服務(wù) docker-compose restart
默認(rèn)情況,docker-compose up啟動(dòng)的容器都在前臺(tái),控制臺(tái)將會(huì)同時(shí)打印所有容器的輸出信息,可以很方便進(jìn)行調(diào)試。當(dāng)通過(guò)Ctrl-C停止命令時(shí),所有容器將會(huì)停止。
結(jié)語(yǔ)這次接觸Docker的時(shí)間雖然不長(zhǎng),但是這種微服務(wù)細(xì)分的架構(gòu)真的是驚艷到我了。以前玩過(guò)VM虛擬機(jī),那個(gè)使用成本太高,不夠靈活,用過(guò)一段時(shí)間就放棄了,老老實(shí)實(shí)維護(hù)自己的本機(jī)環(huán)境。有了這個(gè)Docker以后,想要什么測(cè)試環(huán)境都行,直接幾行代碼生成就好,一種隨心所欲的自由。
上面寫(xiě)的那些都是日常使用的命令,能應(yīng)付基本的需求了,真要深入的話(huà)建議去找詳細(xì)的文檔,我就不寫(xiě)太累贅了,希望大家都能去接觸一下這個(gè)Docker,怎么都不虧,你們也會(huì)喜歡上這小鯨魚(yú)的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/8091.html
摘要:后來(lái)真正用的時(shí)候才發(fā)覺(jué),這個(gè)簡(jiǎn)直是個(gè)神器。容器可以被創(chuàng)建啟動(dòng)停止刪除暫停等。項(xiàng)目由編寫(xiě),實(shí)現(xiàn)上調(diào)用了服務(wù)提供的來(lái)對(duì)容器進(jìn)行管理。此命令將會(huì)停止命令所啟動(dòng)的容器,并移除網(wǎng)絡(luò)啟動(dòng)已經(jīng)存在的服務(wù)容器。停止已經(jīng)處于運(yùn)行狀態(tài)的容器,但不刪除它。 showImg(https://segmentfault.com/img/remote/1460000017531120?w=1200&h=500); ...
摘要:因此,另一種解決辦法像這樣的工具,則只是將和進(jìn)行了結(jié)合,其功能尤其關(guān)注日志管理,比如格式檢查,日志語(yǔ)法分析,數(shù)據(jù)改進(jìn)地址地理位置信息,元數(shù)據(jù)標(biāo)簽等以及日志路由。 由Rancher社區(qū)維護(hù)的應(yīng)用商店最近迎來(lái)了兩個(gè)明星項(xiàng)目——SPM 和 Logsene,來(lái)自Sematext的監(jiān)控與日志工具。如果你已經(jīng)熟悉Logstash,Kibana,Prometheus,Grafana這些監(jiān)控或日志解決...
閱讀 1056·2023-04-25 17:51
閱讀 2863·2021-11-23 09:51
閱讀 1485·2021-11-08 13:21
閱讀 2459·2021-09-22 15:14
閱讀 1526·2019-08-30 12:48
閱讀 1088·2019-08-29 12:44
閱讀 1146·2019-08-26 12:21
閱讀 1403·2019-08-26 10:47