成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

被忽略的后臺(tái)開(kāi)發(fā)神器 — Docker

CollinPeng / 3710人閱讀

摘要:后來(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ù)的概念。

什么是Docker

Docker是一個(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è)
安裝Docker

安裝的方法都挺簡(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包。

Docker Compose讓多容器成為一個(gè)整體

我們的每個(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 ComposeDocker才是完整的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

相關(guān)文章

  • 忽略后臺(tái)開(kāi)發(fā)神器Docker

    摘要:后來(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); ...

    warnerwu 評(píng)論0 收藏0
  • Docker監(jiān)控及日志采集神器

    摘要:因此,另一種解決辦法像這樣的工具,則只是將和進(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)控或日志解決...

    PAMPANG 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<