1. 程式人生 > >從 0 開始瞭解 Docker

從 0 開始瞭解 Docker

原文地址:github.com/rccoder/blo…

或許 XX 震驚部應該這樣起名:《瞭解 Docker,看完這篇就行!》

Docker 自開源以來受到了各大公司的廣泛關注,或許現在網際網路公司的運維體系不承載在 Docker(或 Pouch 等)之上都不好意思說自己的網際網路公司。

本文會簡單介紹下 Docker 的基礎概念,入門級使用方式和一些使用 Docker 能大大提升效率的場景。

原理

對 Docker 最簡單並且帶有一定錯誤的認知就是 “Docker 是一種效能非常好的虛擬機器”。

正如上面所說,這是有一定錯誤的說法。Docker 相比於傳統虛擬機器的技術來說先進了不少,具體表現在 Docker 不是在宿主機上虛擬出一套硬體後再虛擬出一個作業系統,而是讓 Docker 容器裡面的程序直接執行在宿主機上(Docker 會做檔案、網路等的隔離),這樣一來 Docker 會 “體積更輕、跑的更快、同宿主機下可建立的個數更多”。

Docker 中有三個核心概念:Image、Container、Repository。

  • Image: 有領“好人卡”傾向的廣大程式猿一定對 映象 的概念不會陌生。但和 windows 的那種 iso 映象相比,Docker 中的映象是分層的,可複用的,而非簡單的一堆檔案迭在一起(類似於一個壓縮包的原始碼和一個 git 倉庫的區別)。

  • Container: 容器的存在離不開映象的支援,他是映象執行時的一個載體(類似於例項和類的關係)。依託 Docker 的虛擬化技術,給容器建立了獨立的埠、程序、檔案等“空間”,Container 就是一個與宿機隔離 “容器”。容器可宿主機之間可以進行 port、volumes、network 等的通訊。

  • Repository: Docker 的倉庫和 git 的倉庫比較相似,擁有倉庫名、tag。在本地構建完映象之後,即可通過倉庫進行映象的分發。常用的 Docker hub 有 https://hub.docker.com/ 、 https://cr.console.aliyun.com/ 等。

相關命令

1. 安裝

Docker 的安裝是非常便捷的,在 macOS、ubuntu 等下面都有一鍵式安裝工具或者指令碼。更多可以參考 Docker 官方教程。

安裝後 Terminal 中敲下docker,有使用說明出來的話大多情況下說明已經安裝成功了。

2. 尋找基礎映象

DockerHub 等網站都提供了眾多映象,一般情況下我們都會從它那找個映象作為基礎映象,然後再進行我們的後續操作。

這裡我們以 ubuntu 基礎映象為例,配置一個 node 環境。

因為 “鏈路太長” 的原因,國內訪問 Docker Hub 可能會比較慢,可以使用國內眾多廠商提供的映象加速器

3. 拉取基礎映象

利用 docker pull 命令即可從相關 hub 網站上拉取映象到本地。同時在拉的過程中就能看到是按照多個 “層” 去拉映象的。

> docker pull ubuntu:18.04 18.04: Pulling from library/ubuntu c448d9b1e62f: Pull complete 0277fe36251d: Pull complete 6591defe1cd9: Pull complete 2c321da2a3ae: Pull complete 08d8a7c0ac3c: Pull complete Digest: sha256:2152a8e6c0d13634c14aef08b6cc74cbc0ad10e4293e53d2118550a52f3064d1 Status: Downloaded newer image for ubuntu:18.04 

執行 docker images 即可看到本地所有的映象

> docker images REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE ubuntu                   18.04               58c12a55082a        44 hours ago        79MB 

4. 建立一個 Docker 容器

docker create 命令通過映象去建立一個容器,同時吐出容器 id。

> docker create --name ubuntuContainer ubuntu:18.04 0da83bc6515ea1df100c32cccaddc070199b72263663437b8fe424aadccf4778 

用 docker start 即可執行改容器。

> docker start ubuntuContainer 

用 docker ps 即可檢視執行中的 container

> docker ps CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 9298a27262da        ubuntu:18.04        "/bin/bash"         4 minutes ago       Up About a minute                       ubuntuContainer 

用 docker exec 即可進入該 container。

> docker exec -it 9298 [email protected]:/# ls bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var [email protected]:/# exit 

用 docker run 可以一步到位建立並執行一個容器,然後進入該容器。

> docker run -it --name runUbuntuContainer ubuntu:18.04 /bin/bash [email protected]:/# ls bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var [email protected]:/#  # docker ps 可以查到已經成功運行了 runUbuntuContainer > docker ps CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 57cdd61d4383        ubuntu:18.04        "/bin/bash"         9 seconds ago       Up 8 seconds                            runUbuntuContainer 9298a27262da        ubuntu:18.04        "/bin/bash"         9 minutes ago       Up 6 minutes                            ubuntuContainer 

5. 在容器裡安裝 Node 環境

進入容器之後一切操作和普通環境一致,我們安裝個簡單的 node 環境

> apt-get update > apt-get install wget > wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash # 安裝完之後可能當前 session 讀不到 nvm 命令,可以 exit 之後再進入中終端環境 > nvm install 8.0.0 > node -v 

6. commit 容器,建立新映象

和 Ghost 裝 windows 一樣,很多時候,我們期望能定製自己的映象,在裡面安裝一些基礎環境(比如上文中的 node),然後製作出自己要的基礎映象。這個時候 docker commit 就派上用場了。

> docker commit --author "rccoder" --message "curl+node" 9298 rccoder/myworkspace:v1 sha256:68e83119eefa0bfdc8e523ab4d16c8cf76770dbb08bad1e32af1c872735e6f71  # 通過 docker images 就能看到新制作的 rccoder/myworkspace 就躺在這裡了 >docker images REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE rccoder/myworkspace      v1              e0d73563fae8        20 seconds ago      196MB 

接著,試一下我們新建立的映象?

> docker run -it --name newWorkSpace rccoder/myworkspace:v1 /bin/bash [email protected]:/# node -v 8.0.0 

看起來沒問題。

7. push 映象到 docker hub

映象製作好了,怎麼共享出去讓別人使用呢?這裡以 push 到 docker hub 為例。

第一步是先去 docker hub 註冊一個賬號,然後在終端上登入賬號,進行 push。

> docker login > docker push rccoder/myworkspace:v1 The push refers to repository [docker.io/rccoder/myworkspace] c0913fec0e19: Pushing [=>                                                 ]  2.783MB/116.7MB bb1eed35aacf: Mounted from library/ubuntu 5fc1dce434ba: Mounted from library/ubuntu c4f90a44515b: Mounted from library/ubuntu a792400561d8: Mounted from library/ubuntu 6a4e481d02df: Waiting 

8. 是時候使用 Dockerfile 了

用 Docker 進行持續整合?相比在瞭解 Docker 之前肯定聽過這個事情,那就意外著需要從某個地方拷貝程式碼,然後執行(對,聽上去有點 travis-ci 的那種感覺)。

是時候該 Dockerfile 出場了!

Dockerfile 是一個由一堆命令+引數構成的指令碼,使用 docker build 即可執行指令碼構建映象,自動的去做一些事(同類似於travis-ci 中的.travis.yml)。

Dockerfile 的格式統統為:

# Comment INSTRUCTION arguments 

必須以FROM BASE_IMAGE開頭指定基礎映象。

更詳細的規範與說明請參考 Dockerfile reference。這裡我們以基於上面的 rccoder/myworkspace:v1 作為基礎映象,然後在根目錄建立 a 目錄為例

Dockerfile 如下:

FROM rccoder/myworkspace:v1 RUN mkdir a 

然後執行:

> docker build -t newfiledocker:v1 . Sending build context to Docker daemon  3.584kB Step 1/2 : FROM rccoder/myworkspace:v1  ---> 68e83119eefa Step 2/2 : RUN mkdir a  ---> Running in 1127aff5fbd3 Removing intermediate container 1127aff5fbd3  ---> 25a8a5418af0 Successfully built 25a8a5418af0 Successfully tagged newfiledocker:v1  # 新建基於 newfiledocker 的容器並在終端中開啟,發現裡面已經有 a 檔案夾了。 > docker docker run -it newfiledocker:v1 /bin/bash [email protected]:/# ls a  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var 

藉助 Dockerfile 的能力,Docker 留下了無限的可能。

能做什麼

說了這麼一堆,那實際生產環境中 Docker 能做什麼呢?常用的可能有下面這些(歡迎在評論中補充)

1. 多環境的部署切換

業務開發中往往需要區分開發環境與線上環境,利用 Docker 能原封不動的將開發環境中的 程式碼與環境原封不動無汙染的 遷移到線上環境,配合一定的自動化流程即可實現自動的釋出。

2. 前端雲構建

因為node_modules的蛋疼問題,同一個倉庫下不同人開發往往會遇到不同的人使用不同的 包版本 且自己根本不知道與別人不一樣,最終導致釋出之後產生線上問題。利用 Docker 可以在雲端新建容器,遠端 無汙染、低成本 構建程式碼,實現 不同人用的一定是同一個版本

題外:為什麼我不使用 shrinkwrap(lock)

3. 複雜環境一鍵配置

某些場景下可能會配一些超級複雜的環境(比如:大一同學配 Java 環境),這個時候可以利用 Docker 對環境配置做封裝,直接生成映象,讓大家低成本使用。

4. 持續整合單元測試

類似於 travis-ci 這種

5. 同應用多版本隔離、檔案隔離

比如這個專案依賴 node6,那個專案依賴 node 8(只是舉例子,硬碟夠大的話還是建議通過 nodeinstall 解決);同一臺伺服器上跑了 100 個 wordpress 程式(可以用 Docker 建立隔離開,防止互相汙染)。

4. 省錢

嗯,低成本安全超售(大霧)

參考連結

  • Use the Docker command line

  • Dockerfile reference

  • Best practices for writing Dockerfiles

原文地址:github.com/rccoder/blo…

歡迎大家加入Java架構開發:579581654

本群提供免費的學習指導 架構資料 以及免費的解答

不懂得問題都可以在本群提出來 之後還會有職業生涯規劃以及面試指導

進群修改群備註:開發年限-地區-經驗

方便架構師解答問題

相關推薦

0 開始瞭解 Docker

原文地址:github.com/rccoder/blo…或許 XX 震驚部應該這樣起名:《瞭解 Docker,看完這篇就行!》序Docker 自開源以來受到了各大公司的廣泛關注,或許現在網際網路公司的運維體系不承載在 Docker(或 Pouch 等)之上都不好意思說自己的網

在CentOS7下0開始搭建docker併發布tomcat專案

一切從0開始,我也是個小白: 1.檢查你的系統是不是高於3.8的核心,如果沒有請升級CentOS7或者Ubuntu 14 #uname -a 2.CentOS7下安裝docker #yum -y in

如何0開始瞭解一個數據引擎

根據本人淺薄的經驗,瞭解一個數據引擎可能涉及以下問題: 目錄 1. 概念 2. 架構 3. 部署 4. 元資料 階段總結 1. 概念         先粗略看看是否適合自己的需求,從官網/社群/技術部落格,初步瞭解這個KV適合

0 開始的微服務架構:(五)代碼給你,看如何用Docker支撐微服務

這一 復用 微軟 .com 擴展 版本發布 生產 通信 ibm 很好的一篇文章,全面、系統。 雖然已經紅了很久,但是“微服務架構”正變得越來越重要,也將繼續火下去。各個公司與技術人員都在分享微服務架構的相關知識與實踐經驗,但我們發現,目前網上的這些相關文章中,要麽上來就

0開始Ubuntu slam cmake....

大致 sys com 可能 ubun blank 折騰 列表 虛擬機 工作XX年了,對於LINUX是小白。。。無需噴,我早已無地自容。 最近工作需要應用研發slam,不得不承認這一前沿技術仍舊多數在老外手裏。目前了解到的有orb-slam 、rtab map sla

Re:0開始的微服務架構:(一)重識微服務架構--轉

相關 推廣 模塊劃分 ati 滿足 face jar 點擊放大 積累 原文地址:http://www.infoq.com/cn/articles/micro-service-architecture-from-zero?utm_source=infoq&utm_me

Kotlin開發基礎0開始(一)

code ... 多說 lang 學習 function ria lis lac 為什麽學習kotlin kotlin在今年的Google IO 上正式被確認為Android的官方開發語言,想必原因大家也能猜到一二,一是Google與oracle關於Java相關的版權相關的

0開始搭建SQL Server AlwaysOn 第一篇(配置域控)

說明 div rep 工具 標識符 軟件定義 而不是 this 必須 AlwaysOn是SQL Server2012推出的最新的高可用技術,用以取代原有的SQL Serve鏡像 網上的 AlwaysOn可以說是非常的多,也可以說是非常的千篇一律,而且很多都是搭建非常順利

Mysql存儲過程0開始(上)

mysql存儲過程1、首先你要明白,mysql也是一種語言,他也可以編寫程序,也是支持邏輯判斷,if,elseif,else,switch,while等等的判斷2、mysql賦值一個變量的值操作:set @a = 1; 查看這個變量為select @a;3、當你創建存儲過程的時候你要先選擇Mysql的數據庫,

0開始搭建自動部署環境

集成 地址 path password data tar.gz emctl ice 通過 從0開始搭建自動部署環境 前言 從Docker改變使用動態庫後,DooD不再可行,而Dind依然可行。針對此改變,重新整理並記錄自動部署環境配置步驟。 此環境是實現微服務自動部署的基礎

0開始搭建SQL Server 2012 AlwaysOn 第一篇(AD域與DNS)

ont 2012 r2 說明 put 安裝 tor 設置 hab 轉移 隨著業務發展,公司需要提高數據安全與性能需求,所以需要對新技術預研(先采坑),做技術積累: 了解相關AlwaysOn 故障轉移集群(熱備),數據路由(ICX),Moebius(莫比斯數據路由) 決定測試

0開始做互聯網推薦-以58轉轉為例

過濾 美顏 年齡段 review 算法 意願 讀取 缺點 都沒有 從0開始做互聯網推薦【產品+算法+實現】 一、58轉轉簡介 58旗下真實個人閑置物品交易平臺 二、從0開始設計推薦產品框架 (1)首頁推薦:提取用戶畫像,根據線下提取出的用戶年齡、性別、品類偏好等在首

0開始做垂直O2O個性化推薦-以58到家美甲為例

mda amp 算法 彩繪 .com web 不同的 會有 tro 從0開始做垂直O2O個性化推薦 上次以58轉轉為例,介紹了如何從0開始如何做互聯網推薦產品(回復“推薦”閱讀),58轉轉的寶貝為閑置物品,品類多種多樣,要做統一的寶貝畫像比較難,而分類別做寶貝畫像成本又

0開始的微服務架構:(一)重識微服務架構

拆分 dock try 快速入門 比較 資源 貼吧 升級維護 頁面 導語 雖然已經紅了很久,但是“微服務架構”正變得越來越重要,也將繼續火下去。 各個公司與技術人員都在分享微服務架構的相關知識與實踐經驗,但我們發現,目前網上的這些相關文章中,要麽上來就是很有借鑒意義的幹貨,

0開始的微服務架構:(二)如何快速體驗微服務架構?

常常 原來 人員 google tty 打包 第三方 江湖 ces 雖然已經紅了很久,但是“微服務架構”正變得越來越重要,也將繼續火下去。各個公司與技術人員都在分享微服務架構的相關知識與實踐經驗,但我們發現,目前網上的這些相關文章中,要麽上來就是很有借鑒意義的幹貨,要麽就是

0 開始的微服務架構:(四)如何保障微服務架構下的數據一致性

網上 行數 解決方案 open 了解 傳播 發的 目的 cati 雖然已經紅了很久,但是“微服務架構”正變得越來越重要,也將繼續火下去。各個公司與技術人員都在分享微服務架構的相關知識與實踐經驗,但我們發現,目前網上的這些相關文章中,要麽上來就是很有借鑒意義的幹貨,要麽就是以

[JAVA][0開始的JAVA隨筆]靜態(static)屬性的使用方法及註意事項

所有 輸出 str out test post java 無法 set 除了內部類之外,類一般不能具有靜態屬性。 如下定義了一個外部類Static_test和一個內部靜態類Static_class: class Static_test{ Static_t

炸金花的JS實現0開始之 -------現在什麽都不會(1)

nds 朋友 div rand art iam src blog js實現 新年結束了。回想起來唯一留下樂趣的就是在家和朋友玩玩炸金花。 遂有此文。 對不起,我這時候還沒有思路。 讓我捋一捋。 。。。 。。。 捋一捋啊。。。 。。。 好了。今天先這樣吧: (1)先整理出所有

0開始學大數據-Java基礎-三元運算符/鍵盤錄入(4)

大數據;Java;我們從零開始學習大數據技術,從java基礎,到Linux技術涉獵,再深入到大數據技術的Hadoop、Spark、Storm技術,最後到大數據企業平臺的搭建,層層遞進,由點到面!希望技術大牛能過來指導學習。上一節了解Java運算符,其中三元運算符沒有做講解,本節我們開始學習Java基礎-三元運

0開始Tornado建站】0.9版本號python站點代碼開源--持續更新中

分享 body clas .com tis https -m SM 。。 ? ? ? ? 從5月份開始【從0開始Tornado建站】這個專欄,開始一點一點把這個分類