開發者的利器 Docker 理解與使用

2021-09-08 01:30:37 字數 4505 閱讀 4816

困擾

寫**的機器難免會被我們安裝上各種各樣的開發工具、語言執行環境和引用庫等一大堆的東西,長久以來不僅機器亂七八糟,而且有些相同的軟體還有可能會安裝不同的版本,這樣又會導致乙個專案正常執行了,卻不小心破壞了另乙個專案的執行環境。

雖然可以安裝虛擬機器,但是虛擬機器不僅又大又笨重,時間久了上面的問題難免還是會遇到,有誰會在自己機器裡安裝上十幾二十幾個的虛擬機器呢,就算真安裝這麼多,時間久了又怎麼記得住哪個是哪個呢?

在機器上執行著三五個專案的情況下,問一下,您敢隨隨便便換一台開發機麼?

除了這個問題,還有另乙個問題就是部署到其他機器。

在本地開發機上正常執行的專案,**放到另一台機器或者是部署到其他伺服器上這可真是乙個讓人頭大的挑戰:首先作業系統可能不一樣(比如開發機是 mac,伺服器卻是 linux),而且就算是同樣的作業系統,不僅需要照著開發環境乙個乙個地安裝一堆的引用模組,而且模組的版本號還一定要保持一致,否則有可能會出現版本不同而**無法執行的情況。除此之外還有可能會出現各種各樣的問題,這可是一件比修bug還要讓人頭疼的事情!

什麼是 docker?

乍一看還是很暈是不是?不怕,接下來慢慢理解。

docker 裡還有乙個概念是 container,本意是貨櫃的意思,一般翻譯成容器,不過我覺得理解成貨櫃,對我來說更容易理解。

container,即貨櫃,它裡面裝了執行某個專案所需要的所有東西:**、語言執行環境、工具和引用庫。

您想想,有了這個貨櫃裝著某個專案的開發環境,您把它從乙個地方搬到另乙個地方,只要裡頭的東西在運輸過程中不被破壞,那裡頭的東西肯定還是一模一樣,在另乙個地方編譯執行當然還是能夠正常執行啦!

快速掌握 docker

安裝步驟請按照官方的

安裝說明 進行,windows、mac 和 linux 都分別有對應的詳細的安裝步驟。

本文假設您已經在機器上安裝好 docker。

使用以下命令檢查您是否安裝成功及版本資訊:

docker -v
從 docker hub 伺服器拉取 image (映象)需要用什麼就取什麼,比如 ubuntu,或者是nodejs、python,命令很簡單:

docker pull ubuntu

docker pull node

開啟 container

docker run
這行命令就可以開啟乙個container,image 引數就是指定在這個container裡執行哪個映象。例如

docker run ubuntu /bin/echo '

hello world

'

此命令開啟乙個容器,並執行 ubuntu 映象(ubuntu 映象沒有會自動從 docker hub 伺服器拉取),然後在容器裡執行 /bin/echo 'hello world』命令。

-p 引數

-p 8080:80 指的是將容器的80埠和主機的8080對應。例如

docker run -it -p 8080:80 tutum/hello-world
此命令開啟乙個 hello world 的 tutum 服務,開啟主機的 localhost:8080 即可訪問執行在 container 裡的**了。

檢視 container 列表

當您開啟了乙個 container 後,執行 docker ps 命令可以檢視 container 列表(ps 後指定-a 引數包含非執行中的container):

停止乙個 container

docker stop
刪除乙個 container

docker rm
- -name 引數- -name 引數為 container 指定名字,例如剛剛的命令多加乙個 —name web1 引數即可開啟乙個名字為 web1 的 容器:

docker run - -name web1 ubuntu /bin/echo '

hello world

'

可以同時開啟並執行多個 container,同時執行的多個 container 也可以同時執行同乙個映象。

建立乙個自己的 docker 映象並將**同步到另一台伺服器

首先我們需要準備乙個docker hub賬號、乙個github賬號、乙個簡單的nodejs專案和一台已安裝 docker 的伺服器。

這個nodejs專案只包含乙個main.html檔案和乙個server.js檔案,

server.js **:

var connect = require('connect');

var servestatic = require('serve-static');

connect().use(servestatic(__dirname)).listen(8080, function

());

這個服務很簡單,使用 node server.js 命令即可開啟乙個在8080埠監聽的**服務,訪問localhost:8080/main.html即可訪問main.html頁面。

不過執行它需要2個模組,connect 和 serve-static。

如果像平常一樣,輸入npm install connect serve-static 即可。

不過這次我們要將這兩個模組安裝到貨櫃(container 容器)裡。

首先開啟乙個 container

docker run -t -t node /bin/bash
這條命令開啟了乙個容器,/bin/bash是乙個在容器裡執行的命令,它會在容器裡啟動乙個 bash shell。

然後在容器中執行安裝模組的命令

npm install connect serve-static
安裝完成後,按 ctrl+d 退出此容器

現在您已經有了乙個被修改過的 container,記下這個 container 的 id,現在您可以使用 docker commit 命令將此 container 的副本提交到乙個映象裡:

docker commit -m "

added connect and serve-static

" -a "

backslash112

" 0b2616b0e5a8 backslash112/node:v1

將映象推送到 docker hub使用 docker push 命令可以將乙個映象推送到 docker hub 伺服器的您的帳號下(類似 github)。

docker push backslash112/node:v1
此時您可以拿來和別人共享或者設定為私有倉庫。

利用 docker 在另一台機器上快速部署

通過 github 將 nodejs 專案同步到伺服器,然後在伺服器中執行以下命令

雖然 nodejs 專案執行需要 connect 和 serve-static 兩個模組,但是現在您可以在不需要安裝它們的情況下直接執行您的 nodejs 專案,因為 backslash112/node:v1 映象裡已經包含了這兩個模組了,是不是很方便?

結束語

利用 docker 技術,不僅可以讓你很方便得在不同的機器之間執行專案、在伺服器部署專案,還能讓你在學習探索新技術的過程中更加高效和簡便。 

參考資料

本文中用到的檔案

github - backslash112/sample-server

:本例中使用的 nodejs 專案源**。

docker hub - backslash112/node:v1

: 本例中修改後的 nodejs 映象。

docker 官方技術文件

:從各個平台的安裝到簡單實用和深入了解都很詳細。

docker:帶給現代開發人員的福利

:ibm技術主題文件庫。

docker tutorials

資深開發者與初級開發者的差別

如果你認為使用 優秀 和 差 來區分開發者不妥的話,也可以將這些看作是初級開發者和資深開發者之間的區別。但無論如何,多看看其他的優秀開發者 或資深開發者 是如何做的,對於自身技能 工作方式的提公升有很大的幫助。優秀的開發者是乙個藝術家,乙個享受創作過程的工匠。差的開發者只將自己當作負責產生 的碼農。...

優秀的開發者與平庸的開發者的區別

如果你認為使用 優秀 和 差 來區分開發者不妥的話,也可以將這些看作是初級開發者和資深開發者之間的區別。但無論如何,多看看其他的優秀開發者 或資深開發者 是如何做的,對於自身技能 工作方式的提公升有很大的幫助。文章內容如下 優秀的開發者是乙個藝術家,乙個享受創作過程的工匠。差的開發者只將自己當作負責...

Docker 開發者常用操作命令

下面可能是我用得最多的命令 docker ps 檢視當前 docker 服務列表 docker restart name 重啟指定 docker 服務 docker logs name t f 檢視指定服務執行時日誌 docker inspect name 檢視指定服務 docker 資訊建立 do...