- 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