Docker

  • Docker簡介
    • 1 什么是Docker
    • 2 為什么使用Docker
    • 3 Docker的安裝與啟動及常用命令
    • 4 Docker國內鏡像配置
    • 5 Docker 網絡配置
    • DockerHub配置
    • 驗證本地倉庫,上傳、下載、搜索鏡像
    • 參考文檔

Docker簡介

1 什么是Docker

Docker最初是dotCloud公司創始人Solomon Hykes在法國期間發起的一個公司內部項目,它是基于dotCloud公司多年云服務技術的一次革新,并與2013年3月以Apache 2.0授權協議開源,主要項目代碼在Github上進行維護。Docker項目后來還加入了Linux基金會,并成立推動開放容器聯盟。

Docker自開源后收到廣泛的關注和討論,至今其Github項目已經超過3萬6千個星標和一萬多個fork。甚至由于Docker項目的火爆,在2013年底,dotCloud公司決定改名為Docker。Docker最初是在Ubuntu12.04上開發實現的;Red Hat則從RHEL6.5開始對Docker進行支持;Google也在其Paas產品中廣泛應用Docker。

Docker使用Google公司推出的Go語言進行開發實現,基于Linux內核的cgroup,namespace,以及AUFS類的UnionFS等技術,對進程進行封裝隔離,屬于操作系統層面的虛擬化技術。由于隔離的進程獨立于宿主和其它的隔離的進程,因此也稱其為容器。最初實現是基于LXC,從0.7以后開始去除LXC,轉而使用自行開發的libcontainer,從1.11開始,則進一步演進為使用runC和containerd。

Docker在容器的基礎上,進行了進一步封裝,從文件系統、網絡互連到進程隔離等等,極大的簡化了容器的創建和維護。使得Docker技術比虛擬化技術更為輕便、快捷。

下面的圖片比較了Docker和傳統虛擬化方式的不同之處。傳統虛擬化技術是虛擬出一套硬件后,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行于宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便。

2 為什么使用Docker

  • 為什么使用Docker?

作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。

  • 更高效的利用系統資源

由于容器不需要進行硬件虛擬以及運行完整操作系統等額外開銷,Docker 對系統資源的利用率更高。無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳統虛擬機技術更高效。因此,相比虛擬機技術,一個相同配置的主機,往往可以運行更多數量的應用。

  • 更快速的啟動時間

傳統的虛擬機技術啟動應用服務往往需要數分鐘,而 Docker 容器應用,由于直接運行于宿主內核,無需啟動完整的操作系統,因此可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。

  • 一致的運行環境

開發過程中一個常見的問題是環境一致性問題。由于開發環境、測試環境、生產環境不一致,導致有些 bug 并未在開發過程中被發現。而 Docker 的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 “這段代碼在我機器上沒問題啊” 這類問題。

  • 持續交付和部署

對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。

使用 Docker 可以通過定制應用鏡像來實現持續集成、持續交付、部署。開發人員可以通過 Dockerfile 來進行鏡像構建,并結合 持續集成(Continuous Integration) 系統進行集成測試,而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署。

而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。

  • 更輕松的遷移

由于 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運行結果是一致的。因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一個平臺上,而不用擔心運行環境的變化導致應用無法正常運行的情況。

  • 更輕松的維護和擴展

Docker 使用的分層存儲以及鏡像的技術,使得應用重復部分的復用更為容易,也使得應用的維護更新更加簡單,基于基礎鏡像進一步擴展鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高質量的官方鏡像,既可以直接在生產環境使用,又可以作為基礎進一步定制,大大的降低了應用服務的鏡像制作成本。

  • 對比傳統虛擬機總結
特性 容器 虛擬機
啟動 秒級 分鐘級
硬盤使用 一般為MB 一般為GB
性能 接近原生 弱于
系統支持量 單機支持上千個容器 一般幾十個

3 Docker的安裝與啟動及常用命令

$ sudo apt-get install epel-release -y
$ sudo apt-get install docker-io  #安裝docker
$ sudo service docker start

#基本信息查看
$ sudo docker version #查看docker的版本號,包括客戶端、服務端、依賴的Go等.
$ sudo docker info  #查看系統(docker)層面信息,包括管理的images,containers數等.
$ sudo docker search ubuntu
$ sudo docker pull ubuntu #獲取ubuntu官方鏡像
$ sudo docker run -i -t ubuntu:14.04 /bin/bash # running an interactive shell
$ sudo docker ps #查看當前運行的容器,ps -a 列出當前系統所有的容器

4 Docker國內鏡像配置

由于防火墻的原因,Docker國外鏡像速度太慢,所以選擇國內的Docker鏡像比較合適,國內的選擇,有這個

  • 網易163 docker鏡像
  • ustc的鏡像
  • daocloud鏡像
  • alicloud 也就是阿里云docker加速器

我第一個使用的是ustc的docker鏡像,這個鏡像的優勢之一是,不需要注冊,公共服務(這才是我熟悉的ustc嘛)。

下面是使用說明:
新版的Docker使用/etc/docker/daemon.json(Linux)或者%programdata%docker\config\daemon.json(Wondows)來配置Daemon
請在該配置文件中加入(沒有該文件的話,請先建一個):

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

5 Docker 網絡配置

Docker通過使用Linux橋接提供容器之間的通信,docker0橋接接口的目的就是方便Docker管理。當Docker daemon啟動時需要做以下操作:

  • creates the docker0 bridge if not present (如果 docker0 不存在則創建)
  • searches for an IP address range which doesn’t overlap with an existing route (搜索一個與當前路由不沖突的 ip 段)
  • picks an IP in the selected range(在確定的范圍中選擇 ip)
  • assigns this IP to the docker0 bridge (綁定 ip 到 docker0)

Docker 四種網絡模式

docker run 創建Docker容器時,可以用--net選項指定容器的網絡模式,Docker有以下四種網絡模式:

  • host模式,使用 --net=host指定

如果啟動容器的時候使用host模式,那么這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機公用一個Network Namespace.容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口.例如,我們在10.10.101.105/24的機器上用host模式啟動一個含有web應用的Docker容器,監聽tcp 80端口,當我們在容器中執行任何類似ifconfig命令查看網絡環境時,看到的都是宿主機上的信息。而外界訪問容器中的應用,則直接使用10.10.101.105:80即可,不用任何NAT轉換,就如直接跑在宿主機中一樣.但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。

  • container模式,使用--net=container:NAMEorID指定

這個模式指定新創建的容器和已經存在的一個容器共享一個Netwrok Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍等.同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。

  • none模式,使用--net=none指定

這個模式和前兩個不同,在這種模式下,docker容器擁有自己的Network Namespace,但是,并不為docker容器進行任何網絡配置。也就是說,這個docker容器沒有網卡、IP、路由等信息。需要我們自己為容器添加網卡、配置IP等.

  • bridge模式, 使用--net=bridge指定,默認設置

bridge模式是docker默認的網絡配置,此模式會為每一個容器分配Network Namespace、設置IP等,并將一個主機上的docker容器連接到一個虛擬網橋上。當docker server啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機上啟動的Docker容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上所有容器就通過交換機連在了一個二層網絡中。接下來就要為容器分配IP了,Docker會從RFC1918所定義的私有IP網段中,選擇一個和宿主機不同的IP地址和子網分配給docker0,連接到docker0的容器就從這個子網中選擇一個未占用的IP使用。如一般Docker會使用172.17.0.0/16這個網段,并將172.17.42.1/16分配給docker0網橋(在主機上使用ifconfig命令是可以看到docker0的,可以認為它是網橋的管理接口,在宿主機上作為一塊虛擬網卡使用)

列出當前主機網橋

sudo brctl show  #brctl 工具依賴 bridge-utils 軟件包

查看當前 docker0 ip

sudo ifconfig docker0

在容器運行時,每個容器都會分配一個特定的虛擬機口并橋接到docker0,每個容器都會配置同docker0 ip相同網段的專用ip地址,docker0的IP地址被用于所有容器的默認網關.

不同主機間容器通信

$ git clone https://github.com/jpetazzo/pipework.git
$ sudo cp -rp pipework/pipework /usr/local/bin/
##安裝相應依賴軟件
$ sudo apt-get install iputils-arping bridge-utils -y

可以刪除docker0,直接把docker的橋接指定為br0.也可以保留使用默認的配置,這樣單主機容器之間的通信可以通過docker0,而跨主機不同容器之間通過pipework新建docker容器的網卡橋接到br0,這樣跨主機容器之間就可以通信了.

#ubuntu

$ sudo service docker stop
$ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0
$ echo 'DOCKER_OPTS="-b=br0"' >> /etc/default/docker
$ sudo service docker start

#Centos7/RHEL 7

$ sudo systemctl stop docker
$ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0
$ cat /etc/sysconfig/docker | grep 'OPTIONS='OPTIONS=--selinux-enabled -b=br0 -H fd://
$ sudo systemctl start docker

pipework 網絡架構

不同容器之間的通信可以借助于 pipework 這個工具給 docker 容器新建虛擬網卡并綁定 IP 橋接到 br0

#啟動Docker容器
$ docker run -itd --net=none ubuntu:14.04 /bin/bash
$ sudo pipework br0 -i eth0 a46657528059 192.168.115.10/24@192.168.115.2

#將主機eth0橋接到br0上,并把eth0的IP配置在br0上
$ sudo ip addr add 192.168.115.35/24 dev br0
$ sudo ip addr del 192.168.115.35/24 dev eth0
$ sudo brctl addif br0 eth0
$ sudo route del default
$ sudo route add default gw 192.168.115.2 dev br0

參考文檔

[1] http://blog.csdn.net/zjin_hua/article/details/52041757
[2] http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-practice
[3] http://www.docker.org.cn/book/install/install-docker-trusty-14.04-26.html
[4] http://blog.csdn.net/fgf00/article/details/51893771
[5] http://blog.csdn.net/qq_22841811/article/details/53447588

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容

  • 轉載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,520評論 0 120
  • 五、Docker 端口映射 無論如何,這些 ip 是基于本地系統的并且容器的端口非本地主機是訪問不到的。此外,除了...
    R_X閱讀 1,772評論 0 7
  • 一、Docker 簡介 Docker 兩個主要部件:Docker: 開源的容器虛擬化平臺Docker Hub: 用...
    R_X閱讀 4,401評論 0 27
  • Docker — 云時代的程序分發方式 要說最近一年云計算業界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,562評論 15 147
  • 九月 一直以來就是開學的季節 新生滿懷著夢想與希望踏入自己理想的大學 憧憬著自己的未來 規劃著自己的人生 而我 也...
    竹寺i閱讀 194評論 0 0