Day 21 Docker 入門教程

2021-07-08 14:38:59 字數 4033 閱讀 8568

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

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 容器映象。它也訪問這裡得到:

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

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

docker 相比起來就非常輕量級了。執行起來就和乙個常規程式差不多。這個容器不僅僅執行快,建立乙個映象和製作檔案系統快照也很快。它可以在 ec2, rackspace vms 那樣的虛擬環境中執行。事實上,在 mac 和 windows 系統上使用 docker 的更好方式是使用 vagrant。docker 的初衷其實是發揮類似 vm 的作用,但它啟動得更快和需要更少的資源。

我遇到的乙個疑問是,我應該用 vagrant 還是 docker 去為我的下乙個專案建立沙箱環境?答案再一次是一樣的。

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

$ vagrant up

$ vagrant ssh

然後安裝 docker fedora 映象:

$ sudo docker pull mattdm/fedora
$ sudo docker images

repository tag image id created size

shekhargulati/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 程式,然後執行它:

$ npm install

上面會在3000埠啟動 nodejs express 程式。

現在開啟另乙個命令列標籤,列出所有的 docker 程序:

$ sudo docker ps

container

idimage

command

created

status

ports

names

4a5715a915e5 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

expresstitle>

rel="stylesheet"

href="/stylesheets/style.css">

head>

welcome to expressp>

body>

html>

現在 commit 映象,然後 push 到 docker 映象登錄檔(registry)。在你做這步之前,你必須通過 account/signup/ 去註冊乙個 docker 登錄檔。

$ sudo docker commit 4a5715a915e5 shekhargulati/node_image_007

$ sudo docker push shekhargulati/node_image_007

請使用你自己的使用者名稱和映象名。

所以,我的第乙個映象已經上傳到 docker 登錄檔上面了: u/shekhargulati/node_image_007/

$ docker pull shekhargulati/node_image_007
這就是今天的內容。保持反饋!

原文:day 21: docker--the missing tutorial

翻譯整理:segmentfault

Docker 入門教程

冗餘步驟多。虛擬機器需要完整的作業系統,一些系統級別的操作步驟,往往無法跳過,比如使用者登入。啟動很慢。啟動作業系統需要多久,啟動虛擬機器就需要多久。可能要等幾分鐘,應用程式才能真正執行。體積小。容器只要包含用到的元件即可,而虛擬機器包含整個作業系統,所以容器檔案比虛擬機器檔案要小很多。啟動快。啟動...

Docker入門教程

mongodb由c 語言編寫,是乙個基於分布式檔案儲存的開源資料庫系統,支援的資料結構為bson格式。我們開始用docker進行部署我們的mongodb。我們從docker的官網找到mongo對應的映象 於是我們進行拉取 我們讓我們的mongodb 跑起來 docker run d p 2017 2...

Docker 一 Docker入門教程

docker client docker 命令列工具,是使用者使用docker的主要方式,docker client與docker daemon通訊並將結果返回給使用者,docker client也可以通過socket或者restful api訪問遠端的docker daemon docker co...