1. 程式人生 > >Docker快速入門指引

Docker快速入門指引

docker 是什麼?
Docker是docker.Inc公司開源的一個基於LXC技術之上構建的Container容器引擎,基於Go語言並遵從Apahce2.0協議開源
Docker : 程式碼集裝箱裝卸工
在這裡插入圖片描述
開發者可以搭建他們的應用僅僅一次,就能保證讓這個應用保持一致的跑在任何地方。運營人員可以將他們的伺服器配置一遍,就能跑任何應用。
在這裡插入圖片描述
和傳統虛擬機器的區別
傳統虛擬機器通過硬體虛擬化來創造一整個虛擬系統,每一個虛擬機器內的應用不僅僅包含這個應用的一些類庫程式碼,而且還包含一整個作業系統。
在這裡插入圖片描述
Docker所有的容器分享一個作業系統,他們顯然會比虛擬機器更小一些,使得他們可以存在100多個虛擬的系統在一個主機上(而不像一個嚴格限制數量的虛擬機器)

優點和缺點
1、標準化應用釋出,docker容器包含了執行環境和可執行程式,可以跨平臺和主機使用
2、快速部署和啟動,VM啟動一般是分鐘級,docker容器啟動是秒級,即啟即用
3、方便構建基於SOA架構或微服務架構的系統,通過服務編排,更好的鬆耦合
4、輕量低成本,佔有更少的磁碟空間,一臺主機可以啟動上千個容器
5、方便持續整合,通過與程式碼進行關聯使持續整合非常方便
6、安全隔離的執行環境,每個執行的容器互不影響
7、檔案系統分離,每一個程序容器跑在完全分離的root許可權的檔案系統下
8、資源分離,系統資源(像CPU、記憶體)能被指定的分配給每一個程序容器,使用cgroups
9、網路分離,使用一個虛擬的介面和IP地址,每一個程序容器跑在它自己的網路名稱空間
在這裡插入圖片描述


一些概念和名稱
1、Docker Client 是使用者介面,它支援使用者與Docker Daemon之間通訊
2、Docker Daemon Docker最核心的後臺程序,運行於主機上,處理服務請求
3、Docker Index是中央registry,支援擁有公有與私有訪問許可權的Docker容器映象的備份
4、Docker Containers負責應用程式的執行,包括作業系統、使用者新增的檔案以及元資料
5、Docker Images是一個只讀模板,用來執行Docker容器
6、DockerFile是檔案指令集,用來說明如何自動建立Docker映象

安裝
1、現在已經支援Windows,Mac OS X,以及大多數Linux版本 -> Install Docker Engine
2、DaoCloud的安裝指令碼
3、#Ubuntu
4、curl -sSL

https://get.daocloud.io/docker | sh
5、#CentOS
6、curl -sSL https://get.daocloud.io/docker | sh
7、sudo chkconfig docker on
8、sudo systemctl start docker
在這裡插入圖片描述
倉庫
1、倉庫(Repository)是集中存放映象檔案的場所,倉庫註冊伺服器(Registry)上往往存放著多個倉庫,每個倉庫中又包含了多個映象,每個映象有不同的標籤(tag),和倉庫(Repository)嚴格來講不是同一個概念。
2、倉庫分為公開倉庫(Public)和私有倉庫(Private),官方的 Docker Hub提供大量映象提供下載,但是訪問非常的慢,可以使用國內的公開倉庫 時速雲 、網易雲 、阿里雲 、DaoCloud加速器等
3、使用者也可以在本地網路內建立一個私有倉庫,建立了自己的映象之後就可以使用 push 命令將它上傳到公有或者私有倉庫,其他機器上使用只需要從倉庫上 pull 下來就可以了。

映象
映象就是一堆檔案的集合,並不是像VM那樣的是一個作業系統。映象可以簡單到只有一個程式檔案。如果你寫一個helloworld 靜態編譯後放到一個空的Image中,那麼整個image的大小,就是你編譯後的二進位制檔案的大小。一個ubuntu:14.04的映象,提供了一個基本的ubuntu:14.04的發行版,映象是不包含作業系統Linux核心。
如果在Debian映象中安裝MySQL 5.6,就成了mysql:5.6映象。底層一個Debian作業系統映象,上面疊加一個 MySQL層,就完成了一個MySQL映象的構建。

Dockerfile構建出Docker映象,通過Docker映象執行Docker容器。Docker映象是Docker容器執行的基礎,沒有Docker映象,就不可能有Docker容器,這也是Docker的設計原則之一。

常用命令
1、docker images 顯示本地已有映象
2、docker info 顯示docker系統資訊
3、docker commit -m -a 提交更新後的映象
4、docker build 通過Dockerfile來構建映象
5、docker import 本地匯入映象
6、docker search 查詢倉庫中映象
7、docker push 將映象推送到倉庫
8、docker pull 將倉庫中映象下載到本地
8、docker save -o mysql_5.6.tar mysql:5.6 匯出映象到本地
9、docker load < mysql_5.6.tar 載入映象
10、docker rmi 移除映象
11、docker attach 執行中容器的stdin,進行命令執行的動作
12、docker history 顯示映象的歷史

Dockerfile
Dockerfile是Docker用來構建映象的文字檔案,包含自定義的指令和格式, 可以通過docker build命令從Dockerfile中構建映象。
在這裡插入圖片描述
FROM
1、FROM [:]
2、設定要製作的映象基於哪個映象,FROM指令必須是整個Dockerfile的第一個指令,如果指定的映象不存在預設會自動從Docker Hub上下載。

MAINTAINER
1、MAINTAINER
2、MAINTAINER指令允許你給將要製作的映象設定作者資訊

RUN
1、RUN #將會呼叫/bin/sh -c
2、RUN [“executable”, “param1”, “param2”] #將會呼叫exec執行,以避免有些時候shell方式執行時的傳遞引數問題,而且有些基礎映象可能不包含/bin/sh
3、RUN指令會在一個新的容器中執行任何命令,然後把執行後的改變提交到當前映象,提交後的映象會被用於Dockerfile中定義的下一步操作,RUN中定義的命令會按順序執行並提交,這正是Docker廉價的提交和可以基於映象的任何一個歷史點建立容器的好處,就像版本控制工具一樣。

CMD
1、CMD [“executable”, “param1”, “param2”] #將會呼叫exec執行,首選方式
2、CMD [“param1”, “param2”] #當使用ENTRYPOINT指令時,為該指令傳遞預設引數
3、CMD [ | ] #將會呼叫/bin/sh -c執行
4、CMD指令中指定的命令會在映象執行時執行,在Dockerfile中只能存在一個,如果使用了多個CMD指令,則只有最後一個CMD指令有效。
5、當出現ENTRYPOINT指令時,CMD中定義的內容會作為ENTRYPOINT指令的預設引數,也就是說可以使用CMD指令給ENTRYPOINT傳遞引數。
6、RUN和CMD都是執行命令,他們的差異在於RUN中定義的命令會在執行docker build命令建立映象時執行,而CMD中定義的命令會在執行docker run命令執行映象時執行,另外使用第一種語法也就是呼叫exec執行時,命令必須為絕對路徑。

EXPOSE
1、EXPOSE [ …]
2、EXPOSE指令用來告訴Docker這個容器在執行時會監聽哪些埠,Docker在連線不同的容器(使用–link引數)時使用這些資訊

ENV
1、ENV
2、ENV指令用於設定環境變數,在Dockerfile中這些設定的環境變數也會影響到RUN指令,當執行生成的映象時這些環境變數依然有效,如果需要在執行時更改這些環境變數可以在執行docker run時新增–env =引數來修改。
3、最好不要定義那些可能和系統預定義的環境變數衝突的名字,否則可能會產生意想不到的結果。

VOLUME
1、VOLUME [“samepath”]
2、VOLUME指令用來設定一個掛載點,可以用來讓其他容器掛載以實現資料共享或對容器資料的備份、恢復或遷移。

UEER
1、USER [username|uid]
2、USER指令用於設定使用者或uid來執行生成的映象和執行RUN指令。

容器
容器 = 映象 + 可讀層
Docker容器就像是一個資料夾,它包含了一個應用程式執行所需要的所有內容。每個容器都是基於Docker映象構建。我們可以執行、開始、停止、遷移或者是刪除Docker容器。每個容器均是一個隔離的、安全的應用平臺。Docker容器是Docker的執行元件。

常用命令
docker run 新建並啟動容器
1、-d 容器執行在後臺,此時不能使用–rm選項
2、-i -t 和容器進行互動式操作
3、–name 命名容器,沒有該引數Docker deamon會生產UUID來標識
4、–cidfile 將容器ID輸入到指定檔案中
5、–add-host 新增一行到/etc/hosts
6、–mac-address 設定MAC地址
7、–dns 覆蓋容器DNS設定
8、–rm 退出容器時自動清除資料
9、-m 調整容器的記憶體使用
10、-c 調整容器的CPU優先順序
11、-e 設定環境變數
12、–expose 執行時暴露埠,不建立和宿主機的對映
13、-p 建立對映規則,將一個或者一組埠從容器裡繫結到宿主機上,可多次使用
14、 ip:hostPort:containerPort
15、 ip::containerPort
16、 hostPort:containerPort
17、 containerPort
18、-P 將Dockfile中暴露的埠對映動態對映到宿主機
19、–link 容器互聯 --link name:alias
20、-v 建立資料卷掛載到容器,一次run中可多次使用
21、可覆蓋Dockfile引數
22、 CMD
23 、ENTRYPOINT
24、 EXPOSE
25、 ENV
26、 VOLUME
27、 USER
28、 WORKDIR