摘要:后來真正用的時候才發覺,這個簡直是個神器。容器可以被創建啟動停止刪除暫停等。項目由編寫,實現上調用了服務提供的來對容器進行管理。此命令將會停止命令所啟動的容器,并移除網絡啟動已經存在的服務容器。停止已經處于運行狀態的容器,但不刪除它。
剛接觸Docker的時候,以為只是用來做運維。后來真正用的時候才發覺,這個Docker簡直是個神器。不管什么開發場景都能輕松應付。想要什么環境都能隨意生成,而且靈活性更高,更輕量,完美實現微服務的概念。
什么是DockerDocker是一個開源的應用容器引擎,基于Go語言 并遵從Apache2.0協議開源。傳統虛擬機技術是虛擬出一套硬件后,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行于宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。它占用的資源更少,能做到的事更多。
與傳統虛擬機的對比特性 | 容器 | 虛擬機 | |
---|---|---|---|
啟動 | 秒級 | 分鐘級 | |
硬盤啟動 | 一般為MB | 一般為GB | |
性能 | 接近原生 | 弱于 | |
系統支持量 | 單機支持上千個容器 | 一般幾十個 |
安裝的方法都挺簡單的,我用的是mac,直接通過Docker官網下載軟件安裝,全程無障礙。
Docker概念鏡像(images):Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。(直白點可以理解為系統安裝包)
容器(container):鏡像和容器的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。(可以理解為安裝好的系統)
Docker鏡像使用 一、下載鏡像大概了解了Docker的概念以后,我們就嘗試拉取flask鏡像使用一下。
查找鏡像可以通過https://hub.docker.com/網站來搜索,或者通過命令搜索。
docker search flask
在這里,我是通過Docker hub官網挑選出了python3.7 + alpine3.8組合的運行環境,alpine是精簡版的linux,體積更小、運行的資源消耗更少。
# 拉取鏡像 docker pull tiangolo/uwsgi-nginx-flask:python3.7-alpine3.8 # 下載好可查看鏡像列表是否存在 docker images二、運行flask鏡像
下載鏡像以后,就開始運行下試試,感受一下Docker的輕量、快捷。
首先創建個flask運行文件來,在這里,我創建了/docker/flask作為項目文件,然后在根目錄下再創建個app文件夾來存放main.py文件,代碼如下:
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World from Flask!" if __name__ == "__main__": # 測試環境下才開啟debug模式 app.run(host="0.0.0.0", debug=True, port=80)
現在的文件結構:
flask └── app └── main.py
運行命令
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
這里說明一下命令的參數含義:
-it 是將-i -t合并起來,作用是可以用指定終端對容器執行命令交互。
--name 對容器進行命名。
-p 將主機的8080端口映射到容器的80端口。
-v 將主機的/docker/flask/app文件掛載到容器的/app文件,如果容器內沒有的話會自動創建。
-w 將/app文件作為工作區,后面的執行命令都默認在該文件路徑下執行。
tiangolo/uwsgi-nginx-flask:python3.7-alpine3.8 鏡像名跟標簽。
python main.py 通過python來運行工作區的main.py文件。
運行結果:
現在主機跟容器的鏈接已經建立起來了,主機通過8080端口就能訪問到容器的網站。
在使用別人定制的鏡像時總是不能盡善盡美的,如果在自己項目里面,不能每次都是拉取下來重新配置一下。像上面的鏡像,我可不喜歡這么長的名字,想想每次要敲這么長的名字都頭疼(tiangolo/uwsgi-nginx-flask:python3.7-alpine3.8)。
編寫Dockerfile文件打開我們剛才的/docker/flask路徑,在根目錄下創建Dockerfile文件,內容如下。
# 基礎鏡像 FROM tiangolo/uwsgi-nginx-flask:python3.7-alpine3.8 # 沒有vim來查看文件很不習慣,利用alpine的包管理安裝一個來 RUN apk add vim # 順便用pip安裝個redis包,后面用得上 RUN pip3 install redis # 將我們的app文件加入到自定義鏡像里面去 COPY ./app /app
現在我們的文件結構是:
flask ├── app │ └── main.py └── Dockerfile
剩下的就跑一遍就OK啦!記得一定要在Dockerfile文件同級目錄下執行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 指定要創建的目標路徑。
. 這里有個點記住啦,表示是當前路徑下的Dockerfile文件,可以指定為絕對路徑。
編譯完后就通過docker images查看一下,就能看到myflask鏡像了,里面能直接運行python main.py來啟動flask,并且內置了vim和redis包。
我們的每個容器都負責一個服務,這樣容器多的時候一個個手動啟動的話是不現實的。在這種情況我們可以通過Docker Compose來關聯每個容器,組成一個完整的項目。
Compose項目由Python編寫,實現上調用了 Docker服務提供的 API 來對容器進行管理。
# 安裝docker-compose sudo pip3 install docker-compose實現能記錄訪問次數的web
在這里,我們通過docker-compose.yml文件來啟動flask容器和redis容器,并將兩個不同容器相互關聯起來。
首先在/docker/flask目錄下創建docker-compose.yml文件,內容如下:
version: "3" services: flask: image: myflask container_name: myflask ports: - 8080:80 volumes: - /docker/flask/app:/app working_dir: /app # 運行后執行的命令 command: python main.py redis: # 如果沒有這個鏡像的話會自動下載 image: "redis:latest" container_name: myredis
然后我們把上面的main.py代碼修改一下,連接redis數據庫并記錄網站訪問次數。main.py修改后內容如下:
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! 該頁面已被訪問{count}次。" if __name__ == "__main__": # Only for debugging while developing app.run(host="0.0.0.0", debug=True, port=80)
目前的文件結構是:
flask ├── app │ └── main.py └── Dockerfile └── docker-compose.yml
這些編排的文件參數都是取自于Docker,基本都能看懂,其它就沒啥啦,直接命令行跑起來:
docker-compose up
就辣么簡單!現在我們在瀏覽器上訪問http://localhost:8080/就能看到結果了,并且每訪問一次這頁面都會自動增加訪問次數.
在這里,我們也能通過docker ps命令查看運行中的容器:
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,有了這些以后開發簡直不要太爽,每個容器只要維護自己的服務環境就ok了。
Docker的日常操作 鏡像常用操作# 下載鏡像 docker pull name # 列出本地鏡像 docker images # 使用鏡像運行生成容器 docker run name:tag # 刪除鏡像 docker rmi id/name容器常用操作
可以通過容器的id或者容器別名來啟動、停止、重啟。
# 查看運行中的容器 docker ps # 查看所有生成的容器 docker ps -a # 開始容器 docker start container # 停止容器 docker stop container # 重啟容器 docker restart container # 移除不需要的容器(移除前容器必須要處于停止狀態) docker rm container # 進入后臺運行的容器 docker exec -it container /bin/sh # 打印容器內部的信息(-f參數能實時觀察內部信息) docker logs -f container
通過-i -t進來容器的,可以先按ctrl + p, 然后按ctrl + q來退出交互界面組,這樣退出不會關閉容器。
docker-compose常用操作# 自動完成包括構建鏡像,(重新)創建服務,啟動服務,并關聯服務相關容器的一系列操作。 docker-compose up # 此命令將會停止 up 命令所啟動的容器,并移除網絡 docker-compose down # 啟動已經存在的服務容器。 docker-compose start # 停止已經處于運行狀態的容器,但不刪除它。通過start可以再次啟動這些容器。 docker-compose stop # 重啟項目中的服務 docker-compose restart
默認情況,docker-compose up啟動的容器都在前臺,控制臺將會同時打印所有容器的輸出信息,可以很方便進行調試。當通過Ctrl-C停止命令時,所有容器將會停止。
結語這次接觸Docker的時間雖然不長,但是這種微服務細分的架構真的是驚艷到我了。以前玩過VM虛擬機,那個使用成本太高,不夠靈活,用過一段時間就放棄了,老老實實維護自己的本機環境。有了這個Docker以后,想要什么測試環境都行,直接幾行代碼生成就好,一種隨心所欲的自由。
上面寫的那些都是日常使用的命令,能應付基本的需求了,真要深入的話建議去找詳細的文檔,我就不寫太累贅了,希望大家都能去接觸一下這個Docker,怎么都不虧,你們也會喜歡上這小鯨魚的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27652.html
摘要:后來真正用的時候才發覺,這個簡直是個神器。容器可以被創建啟動停止刪除暫停等。項目由編寫,實現上調用了服務提供的來對容器進行管理。此命令將會停止命令所啟動的容器,并移除網絡啟動已經存在的服務容器。停止已經處于運行狀態的容器,但不刪除它。 showImg(https://segmentfault.com/img/remote/1460000017531120?w=1200&h=500); ...
摘要:因此,另一種解決辦法像這樣的工具,則只是將和進行了結合,其功能尤其關注日志管理,比如格式檢查,日志語法分析,數據改進地址地理位置信息,元數據標簽等以及日志路由。 由Rancher社區維護的應用商店最近迎來了兩個明星項目——SPM 和 Logsene,來自Sematext的監控與日志工具。如果你已經熟悉Logstash,Kibana,Prometheus,Grafana這些監控或日志解決...
閱讀 3640·2023-04-26 02:07
閱讀 3150·2021-09-22 15:55
閱讀 2534·2021-07-26 23:38
閱讀 3119·2019-08-29 15:16
閱讀 2008·2019-08-29 11:16
閱讀 1746·2019-08-29 11:00
閱讀 3583·2019-08-26 18:36
閱讀 3165·2019-08-26 13:32