Docker
簡介
Docker是一個由GO語言寫的程序運行的“容器”; 目前云服務(wù)的基石是操作系統(tǒng)級別的隔離惭每,在同一臺物理服務(wù)器上虛擬出多個主機慨灭。Docker則實現(xiàn)了一種應(yīng)用程序級別的隔離; 它改變我們基本的開發(fā)、操作單元合愈,由直接操作虛擬主機(VM),轉(zhuǎn)換到操作程序運行的“容器”上來叮贩。 Docker是2013年Docker 是 PaaS提供商 dotCloud 開源的一個基于 LXC 的高級容器引擎,源代碼托管在 Github上, 基于go語言并遵從Apache2.0協(xié)議開源佛析,是dotCloud公司的絕處逢生之作益老,目前該公司以Docker為名。 從2013年3月20日寸莫,第一個版本的Docker正式發(fā)布到 2014年6月Docker 1.0 正式發(fā)布捺萌,經(jīng)歷了15個月。 雖然發(fā)展歷程很短膘茎,但Docker正在有越來越流行的趨勢桃纯。
Docker 是一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的容器中披坏,然后發(fā)布到任何流行的機器上态坦,也可以實現(xiàn)虛擬化。通俗解釋Docker是什么棒拂,有個著名的隱喻:集裝箱伞梯。在集裝箱之前,貨物運輸沒有統(tǒng)一的標準方式進行搬運帚屉,于是鐵路谜诫、公路、海洋等各種運輸之間攻旦,需要大量的人力作為貨物中轉(zhuǎn)喻旷,效率極低,而且成本很高牢屋。集裝箱出現(xiàn)之后掰邢,世界上絕大多數(shù)的貨物運輸都可以放到這個神奇的箱子里,然后在公路伟阔、鐵路辣之、海洋等所有運輸場景下,這個箱子都可以不用變化形態(tài)直接可以承運皱炉,而且中間的中轉(zhuǎn)工作怀估,都可以通過大型機械搞定,效率大大提升。
背景
現(xiàn)代軟件開發(fā)和計算機技術(shù)的快速發(fā)展造成了大量異構(gòu)系統(tǒng)的出現(xiàn)多搀,這給應(yīng)用開發(fā)歧蕉,測試和部署都帶來了巨大的復(fù)雜度,如何有效的管理這種復(fù)雜度同時保持開發(fā)和運維的效率是急待解決的問題康铭。 容器化技術(shù)在主機時代已經(jīng)被證明是非常有效的應(yīng)用隔離技術(shù)惯退,可以幫助企業(yè)有效的利用計算資源,同時提供很好的敏捷特性从藤。隨著Linux在企業(yè)級系統(tǒng)中應(yīng)用的增多催跪,虛擬化的廣泛使用和云計算的興起,Docker這種圍繞容器技術(shù)構(gòu)建的工具/生態(tài)系統(tǒng)被廣泛接受夷野,成為解決異構(gòu)系統(tǒng)上應(yīng)用開發(fā)和運維問題的最佳選擇懊蒸,同時也為企業(yè)構(gòu)建混合云數(shù)據(jù)中心提供了更好的選擇和可能性。
安裝Docker
Docker有兩個版本悯搔,一個是Docker-CE(社區(qū)版),一個是Docker-EE(企業(yè)版)骑丸,這里安裝社區(qū)版就夠了, Docker可在windows妒貌,mac通危,centos,ubuntu等平臺使用灌曙。其它安裝方式請參考官方文檔
卸載舊版本
sudo apt-get remove docker docker-engine docker.io
更新apt包索引:
sudo apt-get update
安裝包允許apt通過https使用存儲庫
sudo apt-get install
apt-transport-https
ca-certificates
curl
software-properties-common
添加Docker的官方GPG密鑰
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
設(shè)置docker穩(wěn)定版存儲庫
sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable"
更新一次docker源索引
sudo apt-get update
安裝docker-ce
sudo apt-get install docker-ce
Docker 主要組件
Docker 鏡像(Docker images)
Docker 倉庫(Docker registeries)
Docker 容器(Docker containers)
容器(container)
Docker 容器和文件夾很類似黄鳍,一個Docker容器包含了所有的某個應(yīng)用運行所需要的環(huán)境。每一個Docker容器都是從Docker鏡像創(chuàng)建的平匈。Docker容器可以運行框沟、開始、停止增炭、移動和刪除忍燥。每一個 Docker 容器都是獨立和安全的應(yīng)用平臺,Docker 容器是Docker的運行部分隙姿。
Docker 常用基本命令
常用命令 描述
docker build 從Dockerfile構(gòu)建鏡像
docker cp 在容器和本地文件系統(tǒng)之間復(fù)制文件/文件夾
docker images 列出本地鏡像
docker ps 列出容器
docker restart 重啟一個或多個容器
docker rm 刪除一個或多個容器
docker rmi 刪除一個或多個鏡像
docker run 在新容器中運行命令
docker save 將一個或多個鏡像保存到tar存檔
docker search 在Docker Hub(倉庫)中搜索鏡像
docker start 啟動一個或多個已停止的容器
docker stop 停止一個或多個正在運行的容器
docker tag 設(shè)置鏡像標簽
docker pull 從注冊表中提取鏡像或存儲庫
docker load 導(dǎo)入鏡像到docker
docker exec 在正在運行的容器中運行命令
更多更詳細命令說明請查看官方文檔
常用命令使用實例及說明
docker ps 實例
語法
選項
docker ps [OPTIONS]
常用OPTIONS說明:
--all , -a : 顯示所有容器(默認顯示剛剛運行)
--quiet , -q : 僅顯示數(shù)字ID
--size , -s : 顯示總文件大小
列出當前運行的容器
docker ps
列出如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
700dc6a26247 nginx:1.0 "/usr/sbin/nginx" 9 minutes ago Up 9 minutes 0.0.0.0:8484->80/tcp nginx
各個選項說明:
CONTAINER ID:表示容器的ID
IMAGE:鏡像名稱及版本(表示該容器使用的是哪個鏡像)
COMMAND:容器啟動后執(zhí)行的命令
CREATED:容器創(chuàng)建時間
STATUS:容器狀態(tài)
PORTS:容器端口
NAMES:容器的名稱
docker images實例
語法
選項 鏡像名:版本
docker images [OPTIONS] [REPOSITORY[:TAG]]
列出所有鏡像
docker images
列出如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.0 2980b0d17875 3 hours ago 170MB
各個選項說明:
REPOSITORY:表示鏡像的倉庫源
TAG:鏡像的標簽
IMAGE ID:鏡像ID
CREATED:鏡像創(chuàng)建時間
SIZE:鏡像大小
docker load 實例
語法
選項
docker load [OPTIONS]
加載鏡像到docker
docker load < /位置/nginx.tar
docker run 實例
docker run :創(chuàng)建一個新的容器并運行一個命令
語法
選項 鏡像名:版本 執(zhí)行的命令 環(huán)境變量
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用OPTIONS說明:
-d: 后臺運行容器梅垄,并返回容器ID;
-i: 以交互模式運行容器输玷,通常與 -t 同時使用队丝;
-p: 端口映射,格式為:主機(宿主)端口:容器端口
-t: 為容器重新分配一個偽輸入終端欲鹏,通常與 -i 同時使用机久;
--name: 為容器指定一個名稱;
--volume , -v 目錄掛載,表示宿主機文件/文件夾掛載到容器內(nèi)(宿主機文件或目錄:容器內(nèi)文件或目錄)
docker run -d -p 8080:80 --name nginx -v /home/conf:/etc/ nginx:1.0
更多Docker Run命令請查看官方文檔
docker exec 實例
語法
選項 容器ID或容器名 執(zhí)行的命令 環(huán)境變量
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
進入容器
docker exec -it nginx bash
常用OPTIONS說明:
-i:以交互模式運行容器赔嚎,通常與 -t 同時使用
-t:為容器重新分配一個偽輸入終端膘盖,通常與 -i 同時使用
docker cp 實例
語法
選項 容器ID或容器名:容器內(nèi)路徑 宿主機本地文件/文件夾路徑
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
選項 宿主機本地文件/文件夾路徑 容器ID或容器名:容器內(nèi)路徑
docker cp [OPTIONS] SRC_PATH| CONTAINER:DEST_PATH
將宿主機index.php文件拷貝到容器96f7f14e99ab的/usr目錄下
docker cp /home/index.php 96f7f14e99ab:/usr/
將容器96f7f14e99ab的/usr目錄拷貝到宿主機的/home目錄中
docker cp 96f7f14e99ab:/usr /home/
docker build 實例
語法
選項 dockerfile路徑 構(gòu)建內(nèi)容路徑
docker build [OPTIONS] PATH | URL
在當前目錄的Dockerfile構(gòu)建鏡像胧弛,名為nginx,版本1.0侠畔,點表示當前结缚,這里使用點需要注意,如果使用點软棺,默認尋找Dockerfile名稱的红竭,不帶任何后綴
docker build -t nginx:1.0 .
使用-f指定Dockerfile文件位置構(gòu)建鏡像
docker build -t nginx:1.0 -f /home/Dockerfile .
常用OPTIONS說明:
-t : 指定以“name:tag”格式命名
-f : 指定Dockerfile路徑
docker tag 實例
語法
源鏡像名:版本 更改后的鏡像名:版本
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
給鏡像添加一個新的標簽
docker tag 860c279d2fec zxd/nginx:1.2
如何使用已有鏡像快速啟動一個容器(實踐)
- 需要資源
準備一個本地nginx鏡像(已經(jīng)打包好的鏡像,例如鏡像名為nginx.tar)或者是Docker倉庫公開的鏡像
- 實踐步驟
加載鏡像到docker中
docker load < /位置/nginx.tar
查看是否鏡像加載成功 如果存在,那么就已經(jīng)加載進到docker
docker images
通過剛剛加載的鏡像喘落,啟動一個容器 語法
選項 容器ID或容器名稱 執(zhí)行的命令 環(huán)境變量
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -d -p 8484:80 --name nginx nginx:1.0
上面后臺啟動(-d表示后臺啟動)一個名為nginx的容器(container)并且映射出的端口是8484茵宪,它的鏡像(image)來源與nginx:1.0
此容器開放80端口,但此容器只能通過內(nèi)部IP進行訪問揖盘,需要外部可以訪問眉厨,那么需要做端口映射: -p 8484:80 將內(nèi)部端口映射到8484端口
執(zhí)行以上命令后:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6748f39cf68a nginx:1.0 "/usr/sbin/init" About an hour ago Up About an hour 0.0.0.0:8484->80/tcp nginx
ps:請注意 0.0.0.0 這一串數(shù)字,必須有此映射端口,我們才能通過宿主機的IP地址來訪問容器的端口
例如:宿主機的IP地址是192.168.0.129,在瀏覽器上輸入http://192.168.0.129:8484就可以訪問
鏡像(image)
Docker 鏡像是 Docker 容器運行時的只讀模板锌奴,每一個鏡像由一系列的層 (layers) 組成兽狭。 當你改變了一個 Docker 鏡像,比如升級到某個程序到新的版本鹿蜀,一個新的層會被創(chuàng)建箕慧。因此,不用替換整個原先的鏡像或者重新建立(在使用虛擬機的時候你可能會這么做)茴恰,只是一個新 的層被添加或升級了〉呓梗現(xiàn)在你不用重新發(fā)布整個鏡像,只需要升級往枣,層使得分發(fā) Docker 鏡像變得簡單和快速。可以理解鏡像為系統(tǒng)的iso文件哈恰。
在構(gòu)建鏡像前偎血,需要先準備Dockerfile文件
Dockerfile是什么
Dockerfile 是一個文本格式的配置文件,用戶可以使用Dockerfile 快速創(chuàng)建自定義的鏡像雕沉。
Dockerfile 基本結(jié)構(gòu)
Dockerfile 由一行行命令語句組成集乔,# 開頭的注釋行。一般而言坡椒,Dockerfile 的內(nèi)容分為四個部分:
基礎(chǔ)鏡像信息
維護者信息
鏡像操作指令
容器啟動時執(zhí)行指令扰路。
Dockerfile 基本選項
指令不區(qū)分大小寫。但是倔叼,命名約定為全部大寫汗唱。
常用選項 說明
FROM <image name> 指定基礎(chǔ)鏡像
MAINTAINER <author name> 設(shè)置維護者信息
RUN 《command》 在shell或者exec的環(huán)境下執(zhí)行的命令,RUN指令會在新創(chuàng)建的鏡像上添加新的層面.
ADD 《src》 《destination》 復(fù)制文件指令丈攒。它有兩個參數(shù)<source>和<destination>渡嚣。destination是容器內(nèi)的路徑。source可以是URL或者是啟動配置上下文中的一個文件。
COPY 《src》 《destination》 基本和ADD類似识椰,不過COPY的<src>不能為URL
CMD ["param1","param2"] 提供了容器默認的執(zhí)行命令绝葡。 Dockerfile只允許使用一次CMD指令。 使用多個CMD會抵消之前所有的指令腹鹉,只有最后一個指令生效藏畅。
EXPOSE <port> 指定容器在運行時監(jiān)聽的端口
ENTRYPOINT ["executable", "param1","param2"] 允許您配置容器,運行執(zhí)行的可執(zhí)行文件
VOLUME ["/data"] 指令創(chuàng)建具有指定名稱的安裝點功咒,并將其標記為從本機主機或其他容器保存外部安裝的卷愉阎。
ENV <key>=<value> ... 指令將環(huán)境變量<key>設(shè)置為值<value>
VOLUME 與 -v 的區(qū)別
docker run命令的-v標識創(chuàng)建的掛載點只能對創(chuàng)建的容器有效。
通過Dockerfile的 VOLUME 指令可以在鏡像中創(chuàng)建掛載點力奋,這樣只要通過該鏡像創(chuàng)建的容器都有了掛載點榜旦。
通過 VOLUME 指令創(chuàng)建的掛載點,無法指定主機上對應(yīng)的目錄景殷,是自動生成的溅呢。
更詳細指令說明請查看官方文檔
Dockerfile 文本內(nèi)容實例
指定基礎(chǔ)鏡像
FROM ubuntu
設(shè)置維護者信息
MAINTAINER zhengxidong xxx@163.com
更新軟件列表及安裝nginx
RUN apt-get update && apt-get install -y nginx
配置nginx.conf文件
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
COPY /home/docker /
容器啟動時執(zhí)行指令
CMD ["/usr/sbin/nginx"]
構(gòu)建nginx鏡像并啟動容器(實踐)
編寫Dockerfile
指定基礎(chǔ)鏡像
FROM ubuntu
設(shè)置維護者信息
MAINTAINER zhengxidong xxx@163.com
更新軟件列表及安裝nginx
RUN apt-get update && apt-get install -y nginx
配置nginx.conf文件
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
COPY /home/docker /
VOLUME ["/test/upload"]
容器啟動時執(zhí)行指令
CMD ["/usr/sbin/nginx"]
執(zhí)行構(gòu)建
docker build -t nginx:1.0 .
-t:以“name:tag”格式命名,name表示名稱猿挚,tag表示標簽咐旧,點表示當前目錄
以上命令表示:構(gòu)建一個名為nginx,1.0版本的鏡像绩蜻,點表示從當前目錄找到默認Dockerfile铣墨,并從當前目錄構(gòu)建上下文內(nèi)容
使用已經(jīng)構(gòu)建好的鏡像啟動容器(container)
docker run -d -p 8484:80 --name nginx nginx:1.0