Day 21:Docker 入門教程

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

編者註:我們發現了有趣的系列文章《30天學習30種新技術》,正在翻譯,一天一篇更新,年終禮包。下面是第 21 天的內容。


幾個月以前,紅帽(Red Hat)宣布了在 Docker 技術上和 dotCloud 建立合作關係。在那時候,我並沒有時間去學習關於 Docker 的知識,所以在今天,趁著這個 30 天的挑戰,我決定去學習一下 Docker 究竟是怎樣的。這篇博文並不是說以後怎麼在 OpenShift 上用 Docker 的。請閱讀由 Mike McGrath 撰寫的 "關於 OpenShift 和 Docker 的技術思考"。也可以看看這個 Stackoverflow 的問題,瞭解一下 Docker 和 OpenShift 的差別。

什麼是 Docker?

Docker 提供了一個可以運行你的應用程式的封套(envelope),或者說容器。它原本是 dotCloud 啟動的一個業餘項目,並在前些時候開源了。它吸引了大量的關注和討論,導致 dotCloud 把它重新命名到 Docker Inc。它最初是用 Go 語言編寫的,它就相當於是加在 LXC(LinuX Containers,linux 容器)上的管道,允許開發人員在更高層次的概念上工作。

Docker 擴充了 Linux 容器(Linux Containers),或著說 LXC,通過一個高層次的 API 為進程單獨提供了一個輕量級的虛擬環境。Docker 利用了 LXC, cgroups 和 Linux 自己的核心。和傳統的虛擬機器不同的是,一個 Docker 容器並不包含一個單獨的作業系統,而是基於已有的基礎設施中作業系統提供的功能來啟動並執行。這裡有一個 Stackoverflow 的答案,裡面非常詳細清晰地描述了所有 Docker 不同於純粹的 LXC 的功能特性

Docker 會像一個可移植的容器引擎那樣工作。它把應用程式及所有程式的依賴環境打包到一個虛擬容器中,這個虛擬容器可以運行在任何一種 Linux 伺服器上。這大大地提高了程式啟動並執行靈活性和可移植性,無論需不需要許可、是在公用雲還是私密雲、是不是裸機環境等等。

Docker 由下面這些組成:
1. Docker 伺服器精靈(server daemon),用於管理所有的容器。
2. Docker 命令列用戶端,用於控制伺服器精靈。
3. Docker 鏡像:尋找和瀏覽 docker 容器鏡像。它也訪問這裡得到:https://index.docker.io/

我為什麼要關心這些?

Docker 之所以有用,是因為把代碼從一個機器遷移到另一個機器經常是困難的。它嘗試去使得軟體遷移的過程變得更加可信和自動化。Docker 容器可以移植到所有支援運行 Docker 的作業系統上。

可以看這篇文章瞭解更多:how the Fedora Project is embracing Docker

但是我已經在使用虛擬機器(VMs)了

到現在為止,要把程式可靠地移植的唯一選擇是虛擬機器(Virtual Machines,VMs)。虛擬機器現在已經很常見了,但虛擬機器是非常低級,它提供的是完整的作業系統環境。虛擬機器的問題是,遷移的時候太大了。它們包含了大量類似硬體驅動、虛擬處理器、網路介面等等並不需要的資訊。 虛擬機器也需要比較長時間的啟動,同時也會消耗大量的記憶體、CPU 資源。

Docker 相比起來就非常輕量級了。運行起來就和一個常規程式差不多。這個容器不僅僅運行快,建立一個鏡像和製作檔案系統快照也很快。它可以在 EC2, RackSpace VMs 那樣的虛擬環境中運行。事實上,在 Mac 和 Windows 系統上使用 Docker 的更好方式是使用 Vagrant。Docker 的初衷其實是發揮類似 VM 的作用,但它啟動得更快和需要更少的資源。

它就像 Vagrant 一樣嗎?

我遇到的一個疑問是,我應該用 Vagrant 還是 Docker 去為我的下一個項目建立沙箱環境?答案再一次是一樣的。

Docker 比起 Vagrant 來說,運行起來會更加省資源。Vagrant 提供的環境其實是基於 Virtual Box 提供的虛擬機器。可以閱讀 Stackoverflow 的這個回答瞭解更多。

噢,不是!另一個應用程式打包系統

當第一次讀到 Docker 打包應用程式時,我困惑了。我們為什麼需要再多一個應用打包系統(packaging system)?我早已經把我的 Java 程式打包成 JAR 或 WAR 了。在花了些時間閱讀了關於 Docker 的資料後,我明白了 Docker 應用程式套件(application package)的含義。Docker 就是虛擬機器和你的像 WAR 或 JAR 那樣的應用程式套件之間的橋樑。一方面來說,虛擬機器是非常重量級的(耗資源),因為移植時要附帶些不需要的東西。另一方面來說,應用程式碼封裝(the application code packages)是非常的輕量的,並沒有附帶足夠可靠地運行起來的資訊。Docker 很好地平衡了這兩方面。

在 Docker 中,應用程式套件組合(application package)意味著一個包含了應用程式代碼和所需部署環境的包。例如,在 Java 中我們一般把我們的 Web 應用程式打包在一個 WAR 檔案中。這個 WAR 檔案是一個非常簡約的軟體包,它僅僅包含了應用程式的代碼。但應用程式需要特定部署的環境去高效地運行起來。有時候部署的環境和開發時的環境是不同的。例如開發人員使用 Java 7 開發程式,但部署時的環境是在 OpenJDK Java 6 中;又或者是在 Mac 上開發的,但在 RHEL 上部署。情況也有可能是:有一些系統庫(system libraries)在開發環境和類比環境(staging environment)中,在不同的應用程式上有不同的效果。Docker 通過不僅僅打包應用程式,也打包應用程式的依賴環境來解決這個問題。

開始使用 Docker

在 Fedora 機器上使用這篇博文中的指令安裝 Docker

$ vagrant up$ vagrant ssh

然後安裝 Docker Fedora 鏡像:

$ sudo docker pull mattdm/fedora

上面的命令會從 https://index.docker.io/ 上下載 Docker Fedora 鏡像。
安裝了 Docker Fedora 鏡像後,我們可以使用下面命令列出所有的鏡像:

$ sudo docker imagesREPOSITORY                     TAG                 IMAGE ID            CREATED             SIZEshekhargulati/node_image_007   latest              e12b3054d981        50 minutes ago      470.3 MB (virtual 601.8 MB)mattdm/fedora                         12.04               8dbd9e392a96        7 months ago        131.5 MB (virtual 131.5 MB)

上面列表中第一個鏡像就是我以前建立的。它打包了 NodeJS 及 Express Fremework。第二個鏡像就是儲存的 Docker Fedora 鏡像了。

現在,我們在 Docker 容器內運行一個指令碼:

$ sudo docker run -t -i -p 3000 mattdm/fedora /bin/bash

在運行完上面的命令後,我們就在 Docker 的容器裡面了。我們可以通過 ls 命令列出所有的命令。

現在我們建立下面的目錄結構 /home/shekhar/dev

$ mkdir -p home/shekhar/dev$ cd home/shekhar/dev

現在,我會安裝 NodeJS。運行下面的命令去在 Fedora Docker 鏡像上安裝 Node:

$ sudo yum install npm

接著,我們安裝 Express 架構:

$ npm install express -g

Express 架構安裝後,我們建立一個新的 Express 程式,然後運行它:

$ express myapp$ cd myapp$ npm install$ node app.js

上面會在 3000 連接埠啟動 NodeJS Express 程式。

現在開啟另一個命令列標籤,列出所有的 Docker 進程:

$ sudo docker psCONTAINER ID        IMAGE                                 COMMAND             CREATED             STATUS              PORTS                     NAMES4a5715a915e5        mattdm/fedora   /bin/bash           5 minutes ago       Up 5 minutes        0.0.0.0:49157->3000/tcp   red_duck

你會注意到,3000 連接埠和本機上的 49157 綁定了。你可以通過下面所示的 curl 命令測試 Express 應用:

$ curl 0.0.0.0:49157<!DOCTYPE html><html><head><title>Express</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Express</h1><p>Welcome to Express</p></body></html>

現在 commit 鏡像,然後 push 到 Docker 鏡像註冊表(registry)。在你做這步之前,你必須通過 https://index.docker.io/account/signup/ 去註冊一個 Docker 註冊表。

$ sudo docker commit 4a5715a915e5 shekhargulati/node_image_007$ sudo docker push shekhargulati/node_image_007

請使用你自己的使用者名稱和鏡像名。

所以,我的第一個鏡像已經上傳到 Docker 註冊表上面了: https://index.docker.io/u/shekhargulati/node_image_007/

你可以使用 pull 命令下載這個鏡像:

$ docker pull shekhargulati/node_image_007

這就是今天的內容。保持反饋!

原文:Day 21: Docker--The Missing Tutorial
翻譯整理:Segmentfault

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.