CoreOS實踐指南(七):Docker容器管理服務

2020-11-23 CSDN技術社區

註:本文首發於CSDN,轉載請標明出處。

【編者按】在「漫步雲端:CoreOS實踐指南」系列的前幾篇文章中,ThoughtWorks的軟體工程師林帆主要介紹了CoreOS及其相關組件和使用。說到CoreOS,不得不提Docker。當Docker還名不見經傳的時候,CoreOS創始人Alex就憑著敏銳直覺,預見了這個項目的價值,將Docker做為了這個系統支持的第一套應用程式隔離方案。本文將主要介紹在具體的場景下,如何在CoreOS中恰當的管理Docker容器。



作者簡介:

林帆,生在80後尾巴的IT攻城獅,ThoughtWorks成都辦公室CloudOps小組成員,平時喜歡在業餘時間研究DevOps相關的應用,目前在備考AWS認證和推廣Docker相關技術。


這次的主角終於輪到了大鯨魚Docker。不曉得有多少人是因為Docker認識了CoreOS的,至少它在社區的知名度事實上高於CoreOS項目本身。這篇文章裡不會對Docker做很深入的講解,而重點放在開始使用Docker所需的基本知識以及在CoreOS中使用Docker託管服務的推薦實踐方法。


結緣

雷教主說,「站在風口上,豬也能飛起來」。Docker正是借著雲計算的風飛上了天。伴隨著Docker和應用容器的興起,拉動了一批PaaS產品的發展,而CoreOS也借了這股勁兒賺足了人氣,進行得風生水起。同時CoreOS的成熟也在回饋Docker社區,為社區帶來了例如Etcd、Deis(私有PaaS雲平臺,目前是基於CoreOS構建的)等許多新的活力。

說起CoreOS與Docker的淵源,確有一段歷史了。故事大致是這樣開始的,2013年2月,美國的dotCloud公司發布了一款新型的Linux容器軟體Docker,並建立了一個網站發布它的首個演示版本( 見Docker第一篇官方博客)。而幾乎同時,2013年3月,美國加州,年輕的帥小夥Alex Polvi正在自己的車庫開始他的 第二次創業。此前,他的首個創業公司Cloudkick賣給了雲計算巨頭Rackspcace(就是OpenStack的東家)。

有了第一桶金的Alex這次準備幹一票大的,他計劃開發一個足以顛覆傳統的伺服器系統的Linux發行版。為了提供能夠從任意作業系統版本穩定無縫地升級到最新版系統的能力,Alex急需解決應用程式與作業系統之間的耦合問題。因此,當時還名不見經傳的Docker容器引起了他的注意,憑著敏銳直覺,Alex預見了這個項目的價值,當仁不讓地將Docker做為了這個系統支持的第一套應用程式隔離方案。不久以後,他們成立了以自己的系統發行版命名的組織:CoreOS。事實證明,採用Docker這個決定,後來很大程度上成就了CoreOS的生態系統。

現在看來,CoreOS已經不是唯一預裝了Docker的作業系統了,但它是第一個,也是目前做得最成功的一個。RedHat和Canonical(Ubuntu的母公司)隨其後也分別推出了自己的預裝Docker的系統發行版,但知悉者寥寥,並沒有做成氣候。其項目發起時間見下圖(出自成都ThoughtWorks技術雷達分享活動),Atomic和Ubuntu Core Snappy分別是RedHat和Canonical公司推出的預裝Docker的作業系統,目標也都是直指伺服器集群和容器化部署。


應用容器

「應用容器」現在對許多人已經並不陌生了。但它在伺服器的系統上還不是那麼普及,至少與你手上的智慧型手機系統相比。至今在伺服器系統上流行的安裝軟體方式依然是編譯原始碼、手工的安裝包或各種包管理工具,雖然包管理工具的出現解決了應用軟體安裝、卸載以及自身依賴等諸多問題,卻無法很好的解決軟體之間的依賴衝突。而早在Docker誕生以前,「沙盒」的概念已經被普遍使用在Android、iOS等主流的手機系統中了。通過沙盒的隔離,應用軟體將自己所有的依賴與應用本身打包在一起,並通過SDK API提供的可控的方式訪問作業系統,軟體與系統的耦合度大大降低。這樣帶來的直接好處是,軟體之間的依賴衝突得到了很好的解決,移除一個應用軟體一般只需要很短的幾秒鐘並且徹底無痕,軟體訪問系統的安全性也更加可控。

事實上,Android實現沙盒同樣的基於Linux內核的cgroup和namespace機制用於限制和隔離資源的使用,所使用的技術與Docker如出一轍。這些早在Linux 2.6.x版本就已經加入了的新特性,已經通過了較長時間的檢驗,被證實是可行並且可靠的。

當CoreOS 遇見 Docker

這篇文章裡不會專門介紹Docker的使用,而是關注在具體的場景下,如何在CoreOS中恰當的管理Docker容器。了解過Docker在CoreOS生態系統中的角色後,下面通過在兩個容器中分別運行NodeJS和MongoDB的例子說明如何在CoreOS中通過Systemd管理服務,並在此基礎上快速瀏覽一些基本的Docker命令。

服務鏡像有一些可以是現成的標準服務的鏡像,例如MongoDB服務。另一些則需要經過用戶定製,製作Docker鏡像文件一般可以通過Dockerfile或現有容器實例生成兩種方法。前者是比較推薦的做法,但需學習Dockerfile的寫法,已經超出了這個系列的範圍。後者相對簡單,但不利於後期的鏡像維護管理,這裡僅僅作為演示目的,因此採用這種方法。

一、拉取基礎鏡像

每一個具體的容器實際上是運行在虛擬出來的獨立空間裡面的,它被設計成只能夠訪問到存在於同一個虛擬空間下面的其他文件。因此為了使應用能夠使用基本的運行時依賴,還需要將一些Linux的命令和配置文件也打包放到虛擬空間裡,這種打包好的依賴文件集合就是鏡像。

操作 docker 的方式與 systemctl、etcdctl 類似,需要由一個二級命令共同組成一個完整的命令。通過

docker pull

命令可以指定的網絡地址拉取鏡像到本地(如果指定的是名稱而不是網絡地址,則會在docker官方的鏡像倉庫裡面搜索,比如下面的兩個例子)。

$ docker pull node:latest
...
Status: Downloaded newer image fornode:latest
$ docker pull mongo:latest
...
Status: Downloaded newer image formongo:latest

鏡像是按照「地址/鏡像名:版本標籤」格式命名的,其中鏡像名是必須的,如果地址部分為空則默認為官方倉庫地址。如果版本標籤部分為空,對於較新的Docker版本(大約1.3.x以後),會僅僅下載標籤為latest的版本,而較早版本的Docker則會下載指定鏡像的所有版本,常常會因此意外下載許多不需要的鏡像版本。

在一大段輸出以後,若一切順利(事實是,在國內可能不會太順利),本地的Docker已經可以直接使用這兩個預裝了NodeJS和MongoDB的鏡像了。可以通過 docker images 命令驗證。

$ docker images
REPOSITORY  TAG IMAGE ID  CREATED  VIRTUAL SIZE
node  latest  61afc26cd88e  3 days ago 696.2 MB
mongo   latest 59b3d123f9b8  6 days ago  392.4 MB
...

在國內的一些地區,拉取官方鏡像倉庫的鏡像可能會失敗(或許是大名鼎鼎的某防火牆的功勞)。此時可以採用國內的第三方開源鏡像倉庫,比如DockerPool或Docker.cn提供的鏡像文件。前者需要配置本地的SSL證書,否則會遇到「Error:Invalid registry endpoint」錯誤,略微麻煩。後者可以直接使用:

docker pull docker.cn/docker/node:latest
docker pull docker.cn/docker/mongo:latest

二、製作定製鏡像

MongoDB可以直接使用官方的Docker鏡像。而NodeJs的容器還需要些許定製,將應由部署到容器中然後生成新的鏡像。再次說明,製作鏡像的最佳途徑是寫一個Dockerfile,實現基礎設施可視化。以下通過修改現有鏡像的方法一般只用於演示目的。

接下來我們要分別啟動MongoDB和NodeJs的容器實例,並將MongoDB的埠暴露到NodeJs的容器中。

首先啟動一個MongoDB容器實例,命名為mongo-ins。啟動容器的命令是 docker run,除了運行配置參數如  --name--port 等,這個命令的最後兩個參數分別是實例使用的鏡像名字,和實例本身需要運行的命令。有的容器已經配置好了默認的運行程序,此時後面的一個參數可以省略,比如下面的例子。

參數 -d 表示運行後直接進入後臺,屏幕上回顯的一串輸出是新啟動容器實例的ID。

然後啟動一個NodeJs容器實例,使用官方的node鏡像作為基礎鏡像,並將它與 mongo-ins 實例建立「連接」。這個容器實例命名為node-app

$ docker run --name node-app -p 3000 --linkmongo-ins:mongo -it node /bin/bash
root@e73e7d7836a6:/#  <—已經進入容器中的Bash>

-it 實際上是 -i -t 的簡便寫法,表示啟用交互式模式和啟用顯示終端,這樣我們可以進入容器中做一些手工操作。而參數 --link 用來將兩個容器進行關聯,關於Docker Link的用法可以參考Docker的相關文檔。簡單來說,Link的參數 mongo-ins:mongo表示將容器mongo-ins 引入到正在建立的容器鏡像中,並將其稱為 mongo。這樣做的結果是,在新建的node-app 容器實例中,能夠訪問到兩個全局環境變量: $MONGO_PORT_27017_TCP_ADDR 和 $MONGO_PORT_27017_TCP_PORT,分別是用來訪問 MongoDB 的 IP 地址和埠。

作為演示,我們將在容器中部署一個從Github獲取的簡單示例。

$ git clonehttps://github.com/ijason/NodeJS-Sample-App.git
$ cd /NodeJS-Sample-App/EmployeeDB
$ sed -i -e"s/27017/process.env.MONGO_PORT_27017_TCP_PORT/" -e"s/'localhost'/process.env.MONGO_PORT_27017_TCP_ADDR/" app.js
$ exit

上面的第三條命令將原本容器中指定的 MongoDB 位置改成了從另一個容器中暴露的IP位址和埠。至此這個node-app容器已經部署好了一個名為 Employees 的示例應用,接下來將它生成鏡像並放到集群的每個節點上。

三、生成並提交鏡像

為了在集群裡對容器中的服務提供橫向擴展能力,需要將定製好的容器在集群的所有節點共享。

首先需要一個存放共享鏡像的地方,在企業環境可以使用私有的鏡像倉庫,但為了演示簡便起見,我們直接使用Docker的公共倉庫。首先需要在Docker Hub註冊一個用戶,然後使用 docker login 命令登陸到倉庫伺服器。

$ docker login
Username: linfan
Password:
Email: linfan@******.com
Login Succeeded

然後我們需要將本地修改過的容器使用 docker commit 命令生成一個本地的鏡像。注意,由於之後需要將鏡像提交至Docker Hub,這裡鏡像的名字必須以自己的Docker Hub用戶名作為前綴,否則在後面的 push 時候會遇到 403 「Access Denied: Not allowed tocreate Repo at given location」 錯誤。例如名為 linfan/employees。

$ docker commit node-app linfan/employees
a4281aa8baf9aee1173509b30b26b17fd1bb2de62d4d90fa31b86779dd15109b
$ docker images
REPOSITORY TAG  IMAGE ID  CREATED VIRTUAL SIZE
linfan/employees  latest a4281aa8baf9  14 seconds ago  696.2 MB

最後,使用 dockerpush 命令將這個準備好的鏡像提交到DockerHub倉庫中。

$ docker push linfan/employees
The push refers to a repository[linfan/employees] (len: 1)
Sending image list
...
Pushing tag for rev [5577d6743652] on{https://cdn-registry-1.docker.io/v1/repositories/linfan/employees/tags/latest}

提交完成後,在其他節點就可以使用 docker pull 命令獲取到這個鏡像了。

注意:嚴格來說,將資料庫服務容器通過Docker Link暴露給應用服務容器的方法並不符合分布式應用的12條準則,因為通過Docker Link連接的兩個容器必須運行在同一個物理主機上,數據與應用不能在集群中分別獨立的部署或橫向擴展。

一、編寫 Unit 文件

有了相應的服務容器後,在CoreOS中正確啟動服務的方法應該是通過Fleet來管理。通過合理使用 Unit 的 X-Fleet 配置,能夠很好的解決容器直接相互依賴的問題。

vagrant ssh 進入一個 CoreOS 的 Shell 中,創建以下兩個服務 Unit 文件。

首先是mongo.service

[Unit]
Description=General MongoDB Service
After=docker.service
[Service]
TimeoutStartSec=0
ExecStart=/opt/bin/docker-run.sh --namemongo-ins -d mongo
ExecStop=/usr/bin/docker stop mongo-ins

然後是employees.service,請注意它的 Unit 和 X-Fleet 段的內容。在Unit段指定了這個服務啟動前必須首先啟動 mongo.service 服務,而在 X-Fleet 段指定了自己需要運行在與 mongo.service 相同的服務節點上。

[Unit]
Description=Employee Information ManagementService
After=docker.service
After=mongo.service
[Service]
TimeoutStartSec=0
ExecStart=/opt/bin/docker-run.sh -p3000:3000 --link mongo-ins:mongo -d --name node-app node-app node/NodeJS-Sample-App/EmployeeDB/app.js
ExecStop=/usr/bin/docker stop mongo-ins
[X-Fleet]
X-ConditionMachineOf=mongo.service

上面的兩個 Unit 文件都使用到了一個 /opt/bin/docker-run.sh 腳本,用於替代 docker run 命令。這個腳本需要額外創建並放置到 /opt/bin 目錄下面,其作用是檢測是否已經有一個同名的容器在運行了,如果沒有則執行相應的 docker run 命令,否則直接使用 docker start 命令啟動已經存在的容器。其內容如下:

#!/bin/bash
PARA="${*}"
NAME=$(echo "${PARA}" | grep'\-\-name' | sed 's/.*--name \([^ ]*\).*/\1/g')
if [ "${NAME}" == "" ];then
 echo "[ERROR] Must specify a name to the container!";
 exit -1;
fi
EXIST=$(sudo docker ps -a | grep"${NAME}[ ]*$")
if [ "${EXIST}" == ""]; then
   sudo docker run ${PARA}
else
 sudo docker start ${NAME}
fi

二、啟動服務

通過 fleetctl 命令啟動服務,具體的用法在系列前面的內容裡面已經介紹過了。

fleetctl start ./mongo.service
fleetctl start ./employees.service

這裡為了簡便直接用了fleetctl start 命令,更推薦的啟動服務方法請參考系列中關於Fleet的一篇。

到這一步,這個部署在容器中的服務已經可以使用了。從外部訪問伺服器的 3000 埠即可打開下面這個頁面,並向MongoDB服務中的資料庫中添加員工信息了。


最後,再來看一些用於檢測容器運行狀態和日常管理的Docker命令。

一、查看運行日誌

容器通過-d參數進入後臺運行之後,其中服務輸出的日誌內容可以通過 dockerlogs 命令查看到。

$ docker logs mongo-ins
MongoDB starting : pid=1 port=27017dbpath=/data/db 64-bit host=d9bba1bfc8be
...

二、容器實例列表

命令 docker ps 能夠列出所有當前正在運行的容器的基本信息。

$ docker ps
CONTAINER ID  IMAGE COMMAND  CREATED   STATUS PORTS  NAMES
d9bba1bfc8be  mongo:2 "/entrypoint.sh"  4minutes ago  Up 4 minutes  27017/tcp mongo-ins
22de21d77174  node:0 "/bin/bash"  3minutes ago  Up 5 minutes  node-app
...

三、容器實例詳情

使用 dockerinspect 命令能夠查看到指定一個容器的詳細運行信息。

$ docker inspect mongo-ins
{ ... }

四、備份和還原容器

簡單的提一下,用來將現有的本地鏡像打包備份和還原的命令是 docker savedocker load。也可以直接將容器實例打包,相關命令是 docker exportdocker import,注意 import 之後會將備份的數據恢復成一個新的本地鏡像,而不是容器實例。

這兩個命令的使用可以參考文檔。只額外說明一個問題,既然兩種還原都會將備份的內容還原為容器,為什麼需要兩種還原命令呢?原因在於使用 save 和 export 生成的打包效果是不太一樣的,簡單說就是 export 生成的備份會丟棄所有的鏡像分層結構,而 save 生成的備份不會。鏡像分層結構有利於減少相似鏡像本地存儲所需的空間,細節可參考這篇文章。

以上介紹的這些命令僅僅是Docker強大功能的冰山一角,網絡上已經有許多十分優秀的Docker使用教程,作為學習Docker和應用容器都是極好的途徑。這裡推薦一個Dockerone翻譯的Docker系列文章。

後話

事實上,隨著CoreOS的獨立容器項目 Rocket 的發起,Docker 在未來將不再是 CoreOS 和其他Linux作業系統設計容器方案的唯一選擇。但作為 CoreOS 乃至整個 Linux 生態圈的應用容器服務佼佼者,Docker的王者地位還會持續很長的時間,而CoreOS始終會保持對Docker容器的一流支持(見CoreOS關於Rocket博客中的F&Q)。

正值提筆寫這篇文章的那天,Bing的首頁內容是泰國的曼谷港,這幅畫面與Docker的Logo頗有幾分神似。如此的巧合,使人不由的聯想,這艘萬噸貨輪底下是否也正藏著一隻蓄勢待發的藍鯨呢。


在這一篇內容中,將重點放在了使用Docker容器管理服務的介紹,正如文章中已經指出的,例子中的有些實踐(使用docker commit創建鏡像,以及fleet start直接啟動服務等)並不適合在實際的項目中使用。從下下篇的文章起,我們將講解幾個完整的,符合產品應用的例子。在進入正式的綜合實例前,在下一篇中,會對 Systemd 和 Fleet 使用的 Unit 文件做一個更深入的探索。(作者/林帆 責編/周小璐)

系列連結:

漫步雲端:CoreOS實踐指南(一)

CoreOS實踐指南(二):架設CoreOS集群

CoreOS實踐指南(三):系統服務管家Systemd

CoreOS實踐指南(四):集群的指揮所Fleet

CoreOS實踐指南(五):分布式數據存儲Etcd(上) 

CoreOS實踐指南(六):分布式數據存儲Etcd(下)


如需要了解更多Docker相關的資訊或是技術文檔可訪問Docker技術社區;如有更多的疑問請在Dcoker技術論壇提出,我們會邀請專家回答。CSDN Docker技術交流QQ群:303806405。 

相關焦點

  • 雲計算核心技術Docker教程: Docker 容器連接
    容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 -P 或 -p 參數來指定埠映射。下面我們來實現通過埠連接到一個 docker 容器。我們創建了一個 python 應用的容器。
  • Docker 容器 9 類 48 個常見故障的處理和使用規範 | 周末送資料
    Docker是一種相對使用較簡單的容器,我們可以通過以下幾種方式獲取信息:1、通過docker run執行命令,或許返回信息2、通過docker logs 去獲取日誌,做有針對性的篩選3、通過systemctl status docker查看docker服務狀態4、通過journalctl -u docker.service
  • Docker v1.13.0 正式版發布,應用容器引擎
    重要信息:在 Docker 1.13 中,與在 Docker 1.12 中引入的實驗版本相比,管理插件 api 發生了變化。在升級到 Docker 1.13 之前,必須卸載使用 Docker 1.12 安裝的插件。可通過 docker plugin rm 命令卸載插件。
  • 【最新版】Docker實戰總結
    簡單的理解,docker就是一個軟體貨櫃化平臺,就像船隻、火車、卡車運輸貨櫃而不論其內部的貨物一樣,軟體容器充當軟體部署的標準單元,其中可以包含不同的代碼和依賴項。 按照這種方式容器化軟體,開發人員和 IT 專業人員只需進行極少修改或不修改,即可將其部署到不同的環境,如果出現的故障,也可以通過鏡像,快速恢復服務。
  • Docker 引擎概述
    Docker Engine 是一個開源的容器技術,被用來對你的應用進行容器化構建。Docker Engine 實際上是一個客戶端伺服器(client-server)應用:一個在伺服器上長期運行的被稱為 dockerd 的進程。一個指定結構的 APIs,這個 API 被用來與 Docker 守護進程進行通信。
  • 將Docker與pipeline一起使用
    雖然本節將介紹從a到Docker的使用基礎知識 Jenkinsfile,但不會涵蓋Docker的基礎知識,可以在Docker入門指南中進行閱讀 。定製執行環境Pipeline旨在輕鬆地將 Docker 映像用作單個Stage 或整個Pipeline 的執行環境 。這意味著用戶可以定義其管道所需的工具,而無需手動配置代理。
  • 使用Jenkins、Docker 構建部署 Serverless 應用
    和 docker 命令掛載到容器中,啟動 jenkins 命令如下: 注意:由於容器內 Jenkins 服務是由 jenkins 用戶啟動的,它無法訪問 /var/run/docker.sock,因此我們需要更改這個文件的權限。
  • Docker是什麼?有什麼用途?及理論知識詳細說明
    就是實現了應用的封裝、部署、運行的生命周期管理只要在glibc的環境下,都可以運行。運維生成環境中:docker化。 發布服務不用擔心伺服器的運行環境,所有的伺服器都是自動分配docker,自動部署,自動安裝,自動運行 再不用擔心其他服務引擎的磁碟問題,cpu問題,系統問題了 資源利用更出色 自動遷移,可以製作鏡像,遷移使用自定義的鏡像即可遷移,不會出現什麼問題 管理更加方便了 為什麼docker越來越受歡迎 容器化越來越受歡迎
  • 基於容器雲的微服務架構實踐
    【編者按】微服務架構的誕生和容器技術的流行,幾乎是同時發生的,這並非偶然,而是網際網路時代倒逼傳統技術和架構而產生的變革,而以Docker為代表的容器技術則為微服務理念提供了匹配的實現機制,本文作者從什麼是微服務切入,詳細的介紹了微服務架構的優勢,最後從自身實踐出發,給出了微服務架構的雲端實踐。
  • 雲計算核心技術Docker教程:Docker Compose的restart和rm命令詳解
    Docker-Compose restart命令可以重新啟動所有已停止並正在運行的服務,Docker-Compose rm命令可以刪除已經停止的容器,如果服務在運行,需要先docker-compose stop 停止容器。
  • Docker邁入雲(DockerHub)+端(Docker引擎)時代
    Docker深受網際網路巨頭髮PaaS創業公司青睞,國內的百度在大規模實踐Docker,Google 的 Compute Engine 也支持 docker 在其之上運行,Redhat也積極地在RHEL中集成對Docker的支持。
  • 微服務部署到docker中
    可以看到項目根目錄下新增一個名為Dockerfile的文件6.通過Xftp將項目從Windows下的磁碟位置拷貝到Linux的root目錄下二、Linux下通過Docker構建應用1.通過Xshell連接上Linux虛擬機,進入到項目目錄下,然後通過docker
  • 雲計算核心技術Docker教程:Compose使用
    通過 Compose,您可以使用 YML 文件來配置應用程式需要的所有服務。然後,使用一個命令,就可以從 YML 文件配置中創建並啟動所有服務。Compose 使用的三個步驟:1.使用 Dockerfile 定義應用程式的環境。2.使用 docker-compose.yml 定義構成應用程式的服務,這樣它們可以在隔離環境中一起運行。
  • 資料庫到底要不要上Docker
    如果容器有異常或 MySQL 服務異常,自動啟動一個全新的容器。另外,建議不要把數據存放到宿主機裡,宿主機和容器共享卷組,對宿主機損壞的影響比較大。 (2)跑輕量級或分布式資料庫 Docker 裡部署輕量級或分布式資料庫,Docker 本身就推薦服務掛掉,自動啟動新容器,而不是繼續重啟容器服務。
  • Docker & Singularity
    sudo service docker start假如想以非 root 用戶的身份使用 docker , 把用戶添加到 docker 用戶組即可。#非 root 用戶使用 dockersudo usermod -aG docker your-user直接在命令行下敲 docker就會有docker的各種命令以及幫助。docker運行需要鏡像,可以自己做也可以在docker hub上拉一個。一些簡單的命令網上很多就不囉嗦了。說下自己需要用的一個鏡像AnnotSV。
  • 基於TensorFlow 、OpenCV 和 Docker 的實時視頻目標檢測
    難點在於將網絡攝像頭流發送到 docker 容器並恢復輸出流以使用 X11 伺服器顯示它。將視頻流發送到容器Linux 系統可以在/ dev /目錄中找到攝像頭設備,並可以將其作為文件進行操作。通常筆記本電腦攝像頭是「0」設備。
  • 雲計算核心技術Docker教程:利用Dockerfile來創建鏡像
    在docker使用過程中,我們可以從已經創建的容器中更新鏡像,並且commit提交這個鏡像來創建新的鏡像,使用docker commit 來擴展一個鏡像比較簡單,但是不方便在一個團隊中分享此時我們可以使用 Dockerfile 指令來創建一個新的鏡像。
  • Docker 創建你自己的橋接網絡
    下面的例子顯示了如何創建一個橋接網絡: $ docker network create -d bridge my_bridge 參數 -d 用於告訴 Docker 在新的網絡中使用 橋接(bridge) 驅動。
  • Docker不再是唯一的選擇
    它嘗試去涵蓋所有的功能,通常這並不是最佳實踐。大多數情況下,我們都是只選擇一種專門的工具,它只做一件事,並且做得非常好,非常精。如果害怕切換到不同的工具集是因為將不得不學習使用不同的CLI、API或者說不同的概念,那麼這不會是一個問題。
  • 大白話讓你更懂Docker
    換句話來說,就是我部署一個服務運行好後,我再想移植到另外一個地方, 「不用再安裝一套作業系統和依賴環境。」 基於hypervisor(虛擬機管理系統)的虛擬化方式可以最大程度上提供虛擬化管理的靈活性。各種不同作業系統的虛擬機都能通過 hypervisor 來衍生、運行、銷毀。 然而,隨著時間推移,人們發現hypervisor這種方式麻煩越來越多。為什麼?