Docker是基於go語言實現的開源容器項目,誕生於2013年年初,最初發起者是,dotCloud公司。node
Docker 項目已加入Linux基金會,並遵循Apache2.0協議,所有代碼再github上維護。python
Docker的構想是要實現Build Ship and Run Any app anywhere
即經過對應用的封裝,分發,佈署,運行生命週期進行管理,達到應用組件一次封裝,處處運行的目的。git
這裏的應用組件不侷限於web應用,能夠是一個編譯環境,能夠是一個數據庫平臺服務,甚至能夠是操做系統和集羣。github
Docker的發展創建在Linux容器技術之上。web
在雲時代,應用程序能夠脫離底層物理硬件的限制,在任什麼時候間任何地點便可獲取。這樣子能夠作到快速的分發和部署。經過Docker來打包應用,解耦應用和運行平臺。下降開發成本和部署風險。docker
Docker優勢數據庫
鏡像: 只讀模板,包含一個基本的操做系統 容器: 一個輕量級的沙箱,容器是從鏡像建立的,應用的運行實例。能夠啓動開始中止刪除,容器彼此間相互隔離。 倉庫: 相似於代碼倉庫,是集中存放鏡像文件的場所。ubuntu
Docker運行容器前須要本地存在對應的鏡像,若是鏡像沒保存在本地,Docker會嘗試先從默認鏡像倉庫下載。 使用docker pull
命令能夠直接從Docker Hub鏡像源來下載鏡像。安全
docker pull NAME[:TAG]
NAME: 鏡像的名稱
TAG: 鏡像的版本
複製代碼
eg: 綜上,一個鏡像須要的信息就是名稱
+標籤
bash
docker pull ubuntu:14.04
14.04: Pulling from library/ubuntu
bae382666908: Pull complete
29ede3c02ff2: Pull complete
da4e69f33106: Pull complete
8d43e5f5d27f: Pull complete
b0de1abb17d6: Pull complete
Digest: sha256:6e3e3f3c5c36a91ba17ea002f63e5607ed6a8c8e5fbbddb31ad3e15638b51ebc
Status: Downloaded newer image for ubuntu:14.04
複製代碼
若是不顯示的指定TAG
,默認會選擇latest
標籤。會下載最新版的鏡像。
下載到本地後,能夠利用該鏡像建立一個容器
docker run -it ubuntu:14.04 bash
/*
-i
-t
*/
root@4a9c106836e1:/#
複製代碼
執行完成會進入bash界面,能夠執行一些基本操做
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
calculatorapp latest 1dec489fae9a 12 hours ago 955MB
<none> <none> 2dab0d648733 6 days ago 755MB
node 6.11.1 1ffbfd4a58ec 2 months ago 656MB
參數
docker iamges
-a 列出因此鏡像
複製代碼
docker tag ubuntu:lastest myubuntu:lastest
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu lastest dea1945146b9 2 weeks ago 188MB
ubuntu 14.04 dea1945146b9 2 weeks ago 188MB
複製代碼
實際上看到IMAGE ID是同樣的,因此上實際指向同一個鏡像文件。
1.經過標籤刪除
docker rmi IMAGE[IMAGE...]
複製代碼
eg:
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu lastest dea1945146b9 2 weeks ago 188MB
docker rmi myubuntu:latest
複製代碼
2.經過ID刪除
docker rmi ID
複製代碼
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu lastest dea1945146b9 2 weeks ago 188MB
docker rmi dea1945146b9
複製代碼
注意
在刪除時,若是沒有容器使用這個鏡像,那麼會直接刪除該鏡像及包含的全部層。 可是若是有容器使用了該鏡像,會獲得該提示
docker rmi myubuntu:lastest
Error response from daemon: conflict: unable to remove repository reference "myubuntu:lastest" (must force) - container 4a9c106836e1 is using its referenced image dea1945146b9
複製代碼
有兩種方式能夠解決:
-f
參數強制刪除(不推薦)三種方式建立鏡像:
容器是鏡像的一個運行實例。
使用docker create
建立完畢的容器處於中止狀態,可使用docker start命令來啓動
docker create
-d 是否在後臺運行
複製代碼
eg:
docker create -it ubuntu:latest
bb821ea158758312d0832d2c971aab1665cce73541f04f22ca292f979c871e2e
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb821ea15875 ubuntu:latest "/bin/bash" 3seconds ago Created adoring_archimedes
複製代碼
使用docker start
命令來啓動一個已經建立的容器
docker start [container_name/container_id]
複製代碼
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb821ea15875 ubuntu:latest "/bin/bash" 3seconds ago Created adoring_archimedes
docker start bb821ea15875
or
docker start adoring_archimedes
複製代碼
使用docker ps
命令來查看正在運行的容器
docker ps
-a 查看全部的容器
複製代碼
docker run
= docker create
+ docker start
docker run
-i 讓容器的標準輸入保持打開
-t 讓docker分配一個僞終端(pseudo-tty),並綁定到容器的標準輸入上
複製代碼
eg:
docker run -it ubuntu:14.04 /bin/bash
在ubuntu14.04上啓動一個bash終端,並容許用戶交互
可使用exit或者ctrl+d來退出容器
複製代碼
docker run -d ubuntu:14.04 /bin/bash
-d 後臺運行並輸出 container ID
複製代碼
注意
若是是之後臺運行的,可使用docker logs [container_name/container_id]
的方式來獲取容器的輸出信息
docker stop [container_name/container_id]
複製代碼
在使用-d
參數時,容器啓動會進入後臺。用戶沒法看到容器中的信息,也沒法進行操做
三種方式解決:
attach
命令(不推薦使用)exec
命令(推薦使用)docker exec -it [container_name/container_id] /bin/bash
-i 打開標準輸入接受用戶的輸入
-t 讓docker分配一個僞終端(pseudo-tty),並綁定到容器的標準輸入上
-u 執行命令的用戶
複製代碼
docker rm [container_name/container_id]
-f 強制終止並刪除一個正在運行的容器
複製代碼
倉庫:
docker hub:docker官方的公共鏡像倉庫
容器管理數據有兩種方式:
什麼是數據卷? 可供容器使用的特殊目錄,它將主機操做系統目錄直接映射進容器
優點:
三種方式:
在容器內建立一個數據卷使用-v
參數,本質上就是容器內部建立了一個文件夾
docker run -it -v /webapp ubuntu
//在容器內部建立一個文件夾
-v Bind mount a volume
複製代碼
eg:
docker run -it ubuntu
root@f22d574bb63f:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
docker run -it -v /webapp ubuntu
root@c3acf065e9c2:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var webapp
//多了一個webapp文件夾
複製代碼
也是使用-v
參數,
docker run -it -v /src/webapp:/opt/webapp ubuntu
//將本地的/src/webapp目錄掛載到容器內部的/opt/webapp
複製代碼
本地目錄路徑必須是絕對路徑
,若是目標目錄不存在,docker會自動建立。可是若是目標存在,???
Docker 掛載的數據卷默認權限是讀寫(rw),也能夠更改
建立一個數據卷容器能夠在多個容器之間共享一個持續更新的數據。
如何建立?
docker run -it --name dbdata -v /dbdata ubuntu
//建立一個dbdata的文件夾做爲共享數據卷
--name 給容器起一個名字
複製代碼
其餘容器如何使用這個共享的數據卷?
docker run -it --volumes-from dbdata --name db1 ubuntu
//將一個container名字爲dbdata的數據卷也掛載到當前的容器中
--volumes-from Mount volumes from the specified container(s) 從指定的container來掛載卷
複製代碼
利用容器捲來作數據備份 1.備份
$ docker run --volumes-from dbdatasrc -v $(pws):/backup --name worker ubuntu tar cvf /back/backup.tar /dbdata
//將容器dbdatasrc內部的數據卷(/dbdata)掛載到新的ubuntu的容器上(起名爲worker容器),此時worker容器內部會有/dbdata的數據卷.
//同時將/dbdata內部的全部數據壓縮打包到worker容器下的/back目錄下。 實現數據備份。
複製代碼
在啓動容器的時候,若是不指定對應的參數,在容器外部是沒法經過網絡來訪問容器內的網絡應用和服務的。
如何讓外部的訪問容器? 1.經過-P
大寫P 使用-P標記時,Docker會隨機映射一個49000~49900的端口到容器開放的網絡端口:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ad0d233c126 training/webapp "python app.py" 46 seconds ago Up 44 seconds 0.0.0.0:32768->5000/tcp dazzling_kirch
複製代碼
2.經過-p
小寫p 能夠指定要映射的端口 支持的格式
HostPort:Container | Ip:HostPort:Container | Ip::ContainerPort
複製代碼
第一種HostPort:Container
, 將本地的端口映射到容器的指定端口 映射全部接口地址
docker run --name test1 -p 5000:5000 training/webapp python app.py
//將本地的5000端口映射到容器的5000端口
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7f8a05e63a9 training/webapp "python app.py" 3 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp ecstatic_einstein
docker run -p 5000:5000 -p 3000:80 ubuntu
複製代碼
這時綁定的是全部IP段的5000端口
到容器的5000
端口
第二種IP:HostPort:ContainerPort
, 將本地的指定IP的端口映射到容器的指定端口 映射到指定地址的指定端口
docker run --name test2 -p 127.0.0.1:5000:5000 training/webapp python app.py
//將本地的ip僅爲127.0.0.1的5000映射到容器的5000
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd4e352c3b48 training/webapp "python app.py" 2 minutes ago Up 2 minutes 127.0.0.1:5000->5000/tcp test1
複製代碼
第三種Ip::ContainerPort
, 映射到指定地址的任意端口
docker run --name test3 -p 127.0.0.1::5000 training/webapp python app.py
//綁定127.0.0.1的任意端口到容器的5000端口,本地主機會隨機分配一個端口
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b804acc891df training/webapp "python app.py" 5 seconds ago Up 3 seconds 127.0.0.1:32768->5000/tcp test3
複製代碼
docker port [container_name/container_id]
eg:
docker port b804acc891df
5000/tcp -> 127.0.0.1:32768
//表示容器的5000映射在本地主機的127.0.0.1:32768
or:
docker port b804acc891df 5000
127.0.0.1:32768
複製代碼
容器互連是一種讓多個容器中的應用進行快速交互的方式。它會在源和接收容器之間建立鏈接關係,接收容器能夠經過容器名
快速的訪問到源容器,而不用指定IP地址。
自定義容器命名,在建立容器的時候,使用--name
參數,不然系統會隨機生成一個名字。
使用--link
參數可讓容器之間安全的進行交互。 eg:
1.建立一個新的數據庫容器
$ docker run -d --name db-container training/postgres
2.建立一個新的web容器能夠訪問這個數據庫容器
$ docker run -d -P --name web --link db-container:db training/webapp python app.py
// --link name:alias
//name: 要鏈接的容器名稱
//alias: 鏈接的別名 (這個是啥意思?有什麼用?)
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c5797ccc4f95 training/webapp "python app.py" 2 hours ago Up 2 hours 0.0.0.0:32769->5000/tcp web
cdd159304af3 training/postgres "su postgres -c '/..." 2 hours ago Up 2 hours 5432/tcp db-container
複製代碼
Docker 至關於在兩個互連的容器之間建立了一個虛擬通道,並且不用映射他們的端口到宿主主機上。
docker經過兩種方式爲容器公開鏈接信息:
個人理解:若是兩個容器互連,那麼他們之間確定須要經過一些方式去聯通。此處的db-container 至關於父容器。 它的hosts信息以下: db-container
的/etc/hosts
:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 cdd159304af3 <= 本身的容器的ID
複製代碼
那與之相連的web
容器就不太同樣了 web
的/etc/hosts
:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 db db-container cdd159304af3 <= --link 的參數db-container:db
172.17.0.3 c5797ccc4f95 <= 本身的容器的ID
複製代碼
書籍:《Docker 技術入門與實戰》