這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Docker - 小李飛刀般的虛擬化解決方案
Docker 介紹
Docker 是一個可以讓開發人員、系統管理員建立、分發並最終運行應用程式的開放平台。它使用 Google 的 Go 語言開發,並在 Github 上開源。作為輕量級的作業系統虛擬化解決方案,Docker 現在受到了越來越多的關注和使用,特別是RedHat,Ubuntu以及Google 都宣布官方支援 Docker,更讓 Docker 走上了快車道,吸引了非常多的開發人員。
Docker 和 傳統的虛擬機器解決方案相比有哪些優勢呢,可以看看官網的一張:
Docker 是基於 LXC 的,使用作業系統上的容器,所以提高了作業系統的複用程度,甚至可以在一台物理機上部署成百上千個 Docker 容器。當然,由於運行依賴於作業系統,Docker 本身也受當前作業系統的限制。具體可以看看 知乎的一個討論。
Docker 基本概念
Docker 鏡像(Image)
Docker 鏡像是用來建立 Docker 容器的唯讀模板。Docker 官方倉庫提供了非常多從 作業系統 到 各種程式設計語言環境 的官方鏡像,我們可以基於這些鏡像建立我們自己的鏡像,也可以使用 “docker build” 命令配合 dockerfile 產生新的鏡像。Docker 鏡像發行就緒到公用倉庫(比如 Docker 官方維護的 Docker Hub),也可以存放在自己的私人倉庫。通過建立 Docker 鏡像可以非常方便地分享和部署應用。
Docker 容器(Container)
Docker 容器是基於 Docker 鏡像建立的 Docker 運行執行個體。同一系統之上的容器相互隔離,互不影響,各自有獨立的進程空間和網路空間。在一個容器退出後,我們可以基於該容器建立新的 Docker 鏡像。
Docker 倉庫(Repository)
Docker 倉庫是存放各種 Docker 鏡像的庫。比如 Ubuntu 系統的倉庫提供了不同版本的 Docker 鏡像。
安裝 Docker
Docker 支援 Mac OS 和很多主流的 Linux 作業系統,官方文檔介紹得很詳細,這裡只提一下在 Ubuntu14.04 64bit上的安裝:
curl -sSL https://get.docker.com/ubuntu/ | sudo sh
如果安裝完成後使用 docker 時出現下面的錯誤:
Cannot connect to the Docker daemon. Is ‘docker -d’ running on this host?
那麼參考這裡的內容,我們需要執行下面的命令來安裝 apparmor:
sudo apt-get install apparmor
Docker 基本操作
查看本地 Docker 鏡像
sudo docker images
擷取 Docker 鏡像
sudo docker pull ubuntu:14.04
上面的命令從 Docker 官方倉庫註冊伺服器下載 Ubuntu 1404,這條命令等價於:
sudo docker pull registry.hub.docker.com/ubuntu:14.04
可以更清楚得看到下載地址是 Docker Hub 的 registry 下 ubuntu 倉庫中 tag 為 14.04 的鏡像。
建立鏡像
前面提到過我們可以通過修改現有鏡像來建立新鏡像,也可以通過建立命令和設定檔來從頭建立新鏡像,下面分別介紹。
# 基於 tag 為 14.04 的 ubuntu 鏡像建立一個容器,並在容器中運行 /bin/bash# -t 表示在容器中開啟一個偽終端# -i 表示串連到容器的標準輸入rwang@ubuntu140464:~$ sudo docker run -i -t ubuntu:14.04 /bin/bash# 更新軟體源root@cd2107af89ae:/# apt-get update# 安裝 python 開發環境root@cd2107af89ae:/# apt-get install -y build-essential python-dev libevent-dev python-pip liblzma-dev# 退出容器root@cd2107af89ae:/# exit# 查看當前鏡像資訊rwang@ubuntu140464:~$ sudo docker images# 基於剛才的容器建立新鏡像rwang@ubuntu140464:~$ sudo docker commit -m "Ubuntu1404 Python2.7 Env" -a "xhrwang@gmail.com" cd2107af89ae ubuntu-python27:v1# 再次查看本地鏡像資訊,會發現多了一條下面的資訊:# REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE# ubuntu-python27 v1 a6c20de08034 7 minutes ago 392.7 MB# 基於新建立的鏡像建立容器rwang@ubuntu140464:~$ sudo docker run -it ubuntu-python27:v1 /bin/bash# python 開發環境已就緒root@ef66d647855b:/# python# Python 2.7.6 (default, Mar 22 2014, 22:59:56) # [GCC 4.8.2] on linux2# Type "help", "copyright", "credits" or "license" for more information.# >>>
Docker 鏡像設定檔內容執行個體如下:
# 注釋的形式是這樣的。# This is a comment# Docker 建立鏡像的時候基於哪一個鏡像FROM ubuntu:14.04# 鏡像維護者的資訊MAINTAINER Docker Newbee <newbee@docker.com># 建立過程中執行的命令,每條 RUN 命令就是鏡像的一個 layer RUN apt-get -qq updateRUN apt-get -qqy install ruby ruby-devRUN gem install sinatra
使用下面的命令進行 build
rwang@ubuntu140464:~$ sudo docker build -t="IMAGENAME:IMAGETAG" DockerfilePath
結束後我們就可以通過 “Docker images” 來查看本地鏡像列表。
匯出和載入鏡像
使用 “docker save” 可以把本地鏡像到處為一個tarball,使用方法如下:
$ sudo docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu 14.04 c4ff7513909d 5 weeks ago 225.4 MB...$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
使用 “docker load” 可以將之前置出的tarball匯入到本地鏡像庫,使用方法如下:
$ sudo docker load --input ubuntu_14.04.tar
或者:
$ sudo docker load < ubuntu_14.04.tar
移除鏡像
刪除一個鏡像之前,需要先使用下面的命令刪除基於這個鏡像的所有容器
$ sudo docker rm ubuntu:14.04
使用 “docker rmi” 可以將從本地鏡像庫中刪除一個鏡像,使用方法如下:
$ sudo docker rmi ubuntu:14.04
容器
建立一個容器並啟動
在不需要和容器進行互動,只執行某個操作的時候,使用下面的命令基於一個鏡像建立並啟動一個容器:
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
如果需要和容器進行互動,可以讓 Docker 給容器分配一個偽終端,並將當前 shell 和容器的標準輸入進行綁定,我們之前使用過類似的用法:
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
然後就可以在容器的環境中進行操作了。
使用 “docker run” 時,發生了下面這些事情:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
- 利用鏡像建立並啟動一個容器
- 分配一個檔案系統,並在唯讀鏡像層外面掛載一層可讀寫層
- 從宿主主機配置的橋接器介面中橋接一個虛擬介面到容器中去
- 從位址集區配置一個 ip 地址給容器
- 執行使用者指定的應用程式
- 執行完畢後容器被終止
啟動一個已經終止的容器
$ sudo docker start CONTAINERID
重新啟動一個正在啟動並執行容器,對於後面馬上說到的 daemon 方式啟動並執行容器很有用
$ sudo docker restart CONTAINERID
後台運行容器
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
使用 “docker ps” 可以看到正在啟動並執行容器資訊
如果需要關注後台容器的運行狀態,可以使用 “docker logs” 來查看作業記錄
終止容器運行
如果 shell 串連到容器的標準輸入,可以使用 exit 命令或者 Ctrl + D 來終止容器運行。對於後台啟動並執行容器,可以使用 “docker stop” 命令來做同樣的事情。
串連容器
對於開啟了偽終端的後台容器來說,可以通過下面的命令建立並運行:
$ sudo docker -idt ubuntu:14.04
然後,可以通過下面的命令串連到這個容器:
$ sudo docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia$sudo docker attach nostalgic_hypatiaroot@243c32535da7:/#
匯出和載入容器
$ sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test$ sudo docker export 7691a814370e > ubuntu.tar
$ cat ubuntu.tar | sudo docker import - test/buntu:v1.0$ sudo docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEtest/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
匯出的容器只是容器目前狀態的快照,不包含該容器之前的記錄和中繼資料資訊。
倉庫
我們可以把允許公開的鏡像上傳到 Docker 官方維護的 Docker Hub 來共用,也可以下載安裝 docker-registry 建立私人倉庫來儲存自己的鏡像,具體的文檔可以參考這裡
Docker 資源
-- EOF --
- Android 下載列表執行個體→
- ← 爬樓梯和斐波拉契數列
聲明: 本文採用 BY-NC-SA 協議進行授權. 轉載請註明轉自: Docker - 小李飛刀般的虛擬化解決方案