最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

聽(tīng)說(shuō)很少有人將Docker講懂?我來(lái)試試!

2023-06-26 23:37 作者:你認(rèn)識(shí)張大衛(wèi)嗎  | 我要投稿

本文適用于第一次入門(mén)Docker的新手,如果你開(kāi)始注意到Docker,恭喜你!你將成為一個(gè)幸福的人。因?yàn)樵趯W(xué)完Docker后,相信你會(huì)跟我一樣,感嘆與Docker的相識(shí)簡(jiǎn)直是 相見(jiàn)恨晚!

如果告訴你,可以用 一行命令將nginx運(yùn)行起來(lái),你會(huì)不會(huì)感到驚訝?

如果告訴你,還是 一行命令,不僅將nginx運(yùn)行起來(lái),并且將你的網(wǎng)站運(yùn)行在其中 ,你是否會(huì)感到驚訝?

先不要驚訝。讓我們現(xiàn)在就開(kāi)始動(dòng)手,將上面不可思議的事情變成現(xiàn)實(shí)!

安裝Docker

在開(kāi)始學(xué)習(xí)Docker知識(shí)前,先花幾分鐘的時(shí)間安裝Docker。推薦以Windows作為入門(mén)Docker的平臺(tái),因?yàn)閃indows版的Docker Desktop有很良好的界面,對(duì)于新手而言非常友好。

下載鏈接:www.docker.com/

其他系統(tǒng)的安裝也是非常簡(jiǎn)單、快速的,參考官網(wǎng)的安裝文檔即可。

開(kāi)胃菜:在Docker上跑一個(gè)服務(wù)器

首先,我們?cè)诒镜谼盤(pán)的hello-docker目錄,新建一個(gè)index.html文件,內(nèi)容如下:

html復(fù)制代碼<html lang="en"> <head> ??<meta charset="UTF-8"> ??<title>Hello</title> </head> <body> ? ?Hello, Docker! ? </body> </html>

然后,打開(kāi)控制臺(tái),運(yùn)行一行命令:

bash復(fù)制代碼docker run -d -p 80:80 -v d:/hello-docker:/usr/share/nginx/html nginx:latest

緊接著,我們打開(kāi) http://localhost/ ,奇妙的事情發(fā)生了:

整個(gè)過(guò)程不到1分鐘,我們已經(jīng)將開(kāi)發(fā)的內(nèi)容部署到nginx服務(wù)器上了?。?/p>

是的,這就是Docker。事實(shí)上,使用Docker,你只需要輸入一行命令,就可以將一個(gè)整合了多個(gè)服務(wù)器及各種中間件的龐大系統(tǒng)運(yùn)行起來(lái)。更為美妙的是,當(dāng)你為你的服務(wù)更換主機(jī)時(shí),仍然只需要一行命令,就搞定所有事情。

理解Docker

前面我們通過(guò)一行命令成功把一個(gè)靜態(tài)web網(wǎng)頁(yè)部署到了nginx上,對(duì)于使用者而言會(huì)非常好奇,Docker到底是怎么做到這一切的呢?

事實(shí)上, 你的軟件如何配合運(yùn)行是確定的 ,例如一個(gè)簡(jiǎn)單的博客系統(tǒng),至少由以下三個(gè)部分構(gòu)成:

  • 數(shù)據(jù)庫(kù)(存儲(chǔ)數(shù)據(jù))

  • 應(yīng)用服務(wù)器(提供應(yīng)用接口)

  • web靜態(tài)服務(wù)器(前端應(yīng)用部署)

為了讓你的博客應(yīng)用跑起來(lái),你可能需要這些步驟:

  1. 安裝mysql,設(shè)置用戶名與密碼,并運(yùn)行

  2. 運(yùn)行一個(gè)node服務(wù)器(如express或koa),連接mysql,這個(gè)步驟需要指定主機(jī)名、端口、用戶名、密碼等信息

  3. 運(yùn)行一個(gè)nginx服務(wù)器,將開(kāi)發(fā)的代碼部署在其上,此步驟根據(jù)需要可能需要修改nginx的配置文件

你會(huì)發(fā)現(xiàn),不管你換多少臺(tái)主機(jī)進(jìn)行部署,你總是要重復(fù)上面的步驟,而這些步驟只是在第一次思考它時(shí)具有價(jià)值,后續(xù)的所有勞作都是冗余的、無(wú)意義的。

Docker就是來(lái) 管理這些步驟 的,正因?yàn)橄到y(tǒng)需要哪些配件以及各部分怎么配合運(yùn)行是確定的,因此,可以將這些制作為一個(gè)標(biāo)準(zhǔn)的流程,由Docker去管理。

正如它的名字(Dock:船塢),Docker是一個(gè)碼頭工人,負(fù)責(zé)搬運(yùn)你的貨物(應(yīng)用),將你的工作中最為枯燥、無(wú)意義的一部分徹底接管。

長(zhǎng)話短說(shuō),你可以認(rèn)為:

有了Docker,你再也不需要親力親為去安裝和配置那些復(fù)雜的軟件,軟件供應(yīng)商會(huì)將自己的軟件以及它的運(yùn)行環(huán)境打包好,你只要吩咐Docker將它們搬過(guò)來(lái),然后按一下開(kāi)機(jī)鍵,就可以運(yùn)行了。

理解鏡像與容器的關(guān)系

前面的敘述涉及到Docker最核心的兩個(gè)概念:軟件供應(yīng)商打包好的可運(yùn)行的貨物,稱為 鏡像 ,而你運(yùn)行的,稱為 容器 。(注意,鏡像與容器并不是一對(duì)一的關(guān)系,這里的敘述并不準(zhǔn)確,詳情請(qǐng)繼續(xù)閱讀)

如果你是一個(gè)有面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn)的開(kāi)發(fā)者,理解鏡像與容器的關(guān)系非常簡(jiǎn)單,鏡像就是類,容器就是對(duì)象(或?qū)嵗?/p>

如果你不是,那么你可以簡(jiǎn)單理解這些關(guān)系:

  • 鏡像 = 菜譜。 例如nginx鏡像就如魚(yú)香茄子的菜譜,詳細(xì)說(shuō)明了魚(yú)香茄子的制作過(guò)程(調(diào)料、原料、鍋、火候等);

  • Docker = 廚師。 Docker從碼頭工人搖身一變成為米其林大廚,它負(fù)責(zé)按照菜譜的要求準(zhǔn)備材料并烹飪你的美食;

  • 容器 = 菜。 當(dāng)Docker這個(gè)“大廚”完成烹飪后,你就獲得了一份魚(yú)香茄子。

因此,你可以讓Docker炒5份魚(yú)香茄子(一個(gè)鏡像運(yùn)行多個(gè)容器,構(gòu)造集群環(huán)境),同一份菜,可能有多個(gè)菜譜,可能有的菜譜做出的魚(yú)香茄子會(huì)有一些地方特色,例如廣東的魚(yú)香茄子會(huì)加入沙茶醬(同一類鏡像可能有多個(gè)版本,有一些會(huì)提供一些已有配置或高級(jí)特性,例如nginx的官方鏡像和其他廠商實(shí)現(xiàn)的鏡像)。

同時(shí),不同的菜,菜譜的厚度是不同的,西紅柿炒蛋可能1頁(yè)就夠,可是滿漢全席可能需要一本書(shū)(不同鏡像的大小是不一的,可以簡(jiǎn)單認(rèn)為鏡像要做的事情越多越雜,鏡像就越大)。

如何將一個(gè)容器跑起來(lái)?

還是以菜譜、廚師與菜的關(guān)系來(lái)理解,首先:

第一步:你得有個(gè)廚師(安裝Docker)

第二步:要根據(jù)你的需求,獲取你的菜譜,這個(gè)過(guò)程被稱為拉取鏡像。

例如你想獲得一個(gè)nginx鏡像,只需要使用這個(gè)命令即可:

bash復(fù)制代碼docker pull nginx:latest # 或: # docker image pull nginx:latest

你可以使用 docker image ls 或直接在Docker Desktop中查看剛剛拉取的鏡像:

第三步:吩咐廚師,做菜?。ㄟ\(yùn)行鏡像,容器化/實(shí)例化)

bash復(fù)制代碼docker run -d -p 80:80 nginx:latest

最后,打開(kāi) http://localhost ,就可以食用你的美食了!

制作自己的“菜譜”

前面我們說(shuō)過(guò),鏡像是菜譜,Docker是廚師,容器是菜,那我們能不能讓Docker在做菜的時(shí)候放點(diǎn)其他調(diào)料呢?不能。廚師會(huì)忠實(shí)地按照菜譜做菜,并不會(huì)改造菜譜。那如何做一份定制的魚(yú)香茄子呢?你需要執(zhí)行以下步驟:

  1. 按照魚(yú)香茄子的菜譜,制作一份自己的菜譜(例如在出鍋前放一勺糖);

  2. 吩咐廚師,按照自己的菜譜做菜,做出符合自己口味的魚(yú)香茄子。

這個(gè)制作定制菜譜的過(guò)程就是 鏡像制作 。

鏡像制作需要的核心元素就是 Dockerfile,相信你曾經(jīng)不止一次看到過(guò)它,它就是“菜譜”,用來(lái)描述你定制的這道菜的制作過(guò)程。讓我們來(lái)看一個(gè)簡(jiǎn)單的例子:

docker復(fù)制代碼FROM nginx:latest ?COPY . /usr/share/nginx/html

  • FROM nginx:latest 基于nginx鏡像制作新的鏡像,好比基于魚(yú)香茄子的菜譜制作自己的魚(yú)香茄子菜譜

  • COPY . /usr/share/nginx/html 將目錄內(nèi)容拷貝到nginx的入口目錄,這樣未來(lái)運(yùn)行nginx時(shí),就能跑起自己的項(xiàng)目了

接下來(lái),你需要開(kāi)始制作鏡像:

erlang復(fù)制代碼docker build -t mynginx:latest .

不如?現(xiàn)在就來(lái)運(yùn)行一個(gè)博客?

首先,我們需要運(yùn)行一個(gè)數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)我們博客的數(shù)據(jù),不如就mysql吧。打開(kāi)命令行運(yùn)行命令:

bash復(fù)制代碼docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=blog mysql:latest

命令詳解:

  • -d 后臺(tái)運(yùn)行

  • -p 3306:3306 暴露端口,將內(nèi)部3306端口映射到本機(jī)3306端口(如果本機(jī)存在mysql并已運(yùn)行,則會(huì)發(fā)生端口占用報(bào)錯(cuò))

  • -e MYSQL_ROOT_PASSWORD=root 設(shè)置mysql的root用戶密碼為 root

  • -e MYSQL_DATABASE=blog 設(shè)置mysql默認(rèn)數(shù)據(jù)庫(kù),這里設(shè)置為blog,會(huì)自動(dòng)創(chuàng)建

  • mysql:latest 使用mysql的latest版本作為鏡像

mysql容器運(yùn)行后,你可以通過(guò)例如Navicat等數(shù)據(jù)庫(kù)客戶端連接,因?yàn)樗亩丝谝呀?jīng)暴露到了本機(jī)。

接下來(lái),我們來(lái)運(yùn)行一個(gè)node服務(wù)器并連接mysql。

我們選擇koa作為框架,首先,安裝依賴:

bash復(fù)制代碼pnpm i koa mysql2 # yarn add koa mysql2 # npm i koa mysql2

db.js

js復(fù)制代碼const mysql = require('mysql2') const { MYSQL_HOST } = require('./config') ?let pool ?exports.createPool = function() { ??pool = mysql.createPool({ ?? ?host: MYSQL_HOST, ?? ?port: '3306', ?? ?user: 'root', ?? ?password: 'xpzheng', ?? ?database: 'hello', ?? ?charset: 'utf8mb4', ??}) ? ??return pool } ?exports.init = function() { ??return new Promise((resolve, reject) => { ?? ?pool.getConnection((err, conn) => { ?? ? ?if (err) return console.error(err) ?? ? ?conn.execute('drop table if exists t_blog;', (err) => { ?? ? ? ?if (err) return reject(err) ?? ? ? ?conn.execute(`create table t_blog ( ?? ? ? ? ?title varchar(255), ?? ? ? ? ?text text ?? ? ? ?);`, (err2) => { ?? ? ? ? ?if (err2) return reject(err2) ?? ? ? ? ?resolve() ?? ? ? ?}) ?? ? ?}) ?? ?}) ??}) } ?

index.js

js復(fù)制代碼const Koa = require('koa') const cors = require('@koa/cors') const Router = require('@koa/router') const { createPool, init } = require('./db') ?const app = new Koa() const router = new Router() let db ?function query(sql) { ??return new Promise((resolve, reject) => { ?? ?db.query(sql, (err, results) => { ?? ? ?if (err) return reject(err) ?? ? ?resolve(results) ?? ?}) ??}) } ?function execute(sql) { ??return new Promise((resolve, reject) => { ?? ?db.getConnection((err, conn) => { ?? ? ?if (err) return reject(err) ?? ? ?conn.execute(sql, err2 => { ?? ? ? ?if (err2) return reject(err2) ?? ? ? ?resolve() ?? ? ?}) ?? ?}) ??}) } ?router.get('/', ctx => { ??ctx.redirect('hello') }) ?router.get('/hello', ctx => { ??ctx.body = 'Hello, Koa!' }) ?router.get('/blog/add', async(ctx) => { ??if (!ctx.query.title || !ctx.query.text) { ?? ?ctx.body = '請(qǐng)傳入標(biāo)題與內(nèi)容' ?? ?return ??} ??await execute(` ?? ?insert into t_blog (title, text) values ('${ctx.query.title}', '${ctx.query.text}') ??`) ??ctx.body = true }) ?router.get('/blog/list', async(ctx) => { ??const result = await query(`select * from t_blog`) ??ctx.body = result }) ?app ??.use(cors()) ??.use(router.routes()) ??.use(router.allowedMethods()) ??.use(async(ctx, next) => { ?? ?next() ??}) ?;(async function() { ??try { ?? ?db = createPool() ?? ?await init(); ??} catch (err) { ?? ?console.error(err) ??} ??app.listen(3000) })() ?

db.js 中,我們連接了msyql并創(chuàng)建了 t_blog 表。index.js 文件中,我們提供了一個(gè)添加文章與查詢文章列表的接口。

接下來(lái),我們?cè)賱?chuàng)建一個(gè)vite項(xiàng)目,訪問(wèn)這個(gè)node服務(wù),添加或獲取文章數(shù)據(jù)。

最后,將該項(xiàng)目部署在nginx中,訪問(wèn)效果如下:

至此,我們將整個(gè)博客應(yīng)用搭建并部署成功了!

具體代碼請(qǐng)參考:github.com/shoppingzh/…

Docker學(xué)習(xí)路線

以下推薦了一個(gè)較為合理的Docker學(xué)習(xí)路線,不管你選擇的路線是什么,還是推薦從官方文檔入手。

  • 安裝Docker

  • 理解鏡像與容器的關(guān)系

  • 使用官方鏡像,在Docker上跑一個(gè)服務(wù)器

  • 自己制作一個(gè)鏡像

  • 常用Docker命令

  • 制作自己的鏡像,跑一個(gè)簡(jiǎn)單的應(yīng)用

  • 進(jìn)一步學(xué)習(xí):認(rèn)識(shí)網(wǎng)絡(luò)與卷

  • 多容器部署面臨的困境

  • 認(rèn)識(shí)Docker Compose

  • Docker知識(shí)體系

  • 分布式部署

  • 未完待續(xù)...

常用命令

鏡像

列出所有鏡像

bash復(fù)制代碼docker image ls

刪除鏡像

bash復(fù)制代碼docker image rm nginx:latest

制作鏡像

bash復(fù)制代碼docker build -t myimage:1.0 . -f /xxx/yyy/Dockerfile

容器

運(yùn)行容器

bash復(fù)制代碼docker run -d -p 80:80 --mount source=nginx,target=/usr/share/nginx/html nginx:latest

  • -d 后臺(tái)運(yùn)行

  • -p 暴露端口

  • --mount 掛載卷

停止運(yùn)行容器

bash復(fù)制代碼docker stop 5f79d10d97

5f79d10d97 表示容器運(yùn)行的唯一標(biāo)識(shí)。

列出正在運(yùn)行的鏡像

bash復(fù)制代碼docker container ls

刪除容器

bash復(fù)制代碼docker container rm 5f79d10d97

創(chuàng)建卷

bash復(fù)制代碼docker volume create nginx

列出所有卷

bash復(fù)制代碼docker volume ls

運(yùn)行時(shí)綁定卷

方法1:指定卷名(需要先創(chuàng)建卷,如果沒(méi)創(chuàng)建,docker會(huì)自動(dòng)創(chuàng)建)

bash復(fù)制代碼docker run -d -p 80:80 --mount source=my-volume,target=/usr/share/nginx/html nginx:latest

方法2:自行指定目錄(更靈活)

bash復(fù)制代碼docker run -d -p 80:80 --mount type=bind,src=d:/nginx,target=/usr/share/nginx/html nginx:latest

刪除指定卷

bash復(fù)制代碼docker volumn rm nginx

網(wǎng)絡(luò)

列出所有網(wǎng)絡(luò)

bash復(fù)制代碼docker network ls

聽(tīng)說(shuō)很少有人將Docker講懂?我來(lái)試試!的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
沐川县| 达日县| 若尔盖县| 铜川市| 东宁县| 饶阳县| 海晏县| 南平市| 皮山县| 乌拉特后旗| 溆浦县| 灯塔市| 二手房| 会泽县| 星座| 攀枝花市| 望都县| 中卫市| 元朗区| 太谷县| 陕西省| 海安县| 闽侯县| 西峡县| 咸丰县| 桐柏县| 潜江市| 衡东县| 郴州市| 修水县| 阜南县| 大洼县| 砀山县| 淮北市| 孙吴县| 广灵县| 宜阳县| 泰来县| 清水河县| 饶平县| 龙岩市|