Docker
簡介
Docker是一個由GO語言寫的程序運行的“容器”; 目前云服務的基石是操作系統級別的隔離,在同一臺物理服務器上虛擬出多個主機。Docker則實現了一種應用程序級別的隔離; 它改變我們基本的開發、操作單元,由直接操作虛擬主機(VM),轉換到操作程序運行的“容器”上來。 Docker是2013年Docker 是 PaaS提供商 dotCloud 開源的一個基于 LXC 的高級容器引擎,源代碼托管在 Github上, 基于go語言并遵從Apache2.0協議開源,是dotCloud公司的絕處逢生之作,目前該公司以Docker為名。 從2013年3月20日,第一個版本的Docker正式發布到 2014年6月Docker 1.0 正式發布,經歷了15個月。 雖然發展歷程很短,但Docker正在有越來越流行的趨勢。
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的機器上,也可以實現虛擬化。通俗解釋Docker是什么,有個著名的隱喻:集裝箱。在集裝箱之前,貨物運輸沒有統一的標準方式進行搬運,于是鐵路、公路、海洋等各種運輸之間,需要大量的人力作為貨物中轉,效率極低,而且成本很高。集裝箱出現之后,世界上絕大多數的貨物運輸都可以放到這個神奇的箱子里,然后在公路、鐵路、海洋等所有運輸場景下,這個箱子都可以不用變化形態直接可以承運,而且中間的中轉工作,都可以通過大型機械搞定,效率大大提升。
背景
現代軟件開發和計算機技術的快速發展造成了大量異構系統的出現,這給應用開發,測試和部署都帶來了巨大的復雜度,如何有效的管理這種復雜度同時保持開發和運維的效率是急待解決的問題。 容器化技術在主機時代已經被證明是非常有效的應用隔離技術,可以幫助企業有效的利用計算資源,同時提供很好的敏捷特性。隨著Linux在企業級系統中應用的增多,虛擬化的廣泛使用和云計算的興起,Docker這種圍繞容器技術構建的工具/生態系統被廣泛接受,成為解決異構系統上應用開發和運維問題的最佳選擇,同時也為企業構建混合云數據中心提供了更好的選擇和可能性。
安裝Docker
Docker有兩個版本,一個是Docker-CE(社區版),一個是Docker-EE(企業版),這里安裝社區版就夠了, 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 -
設置docker穩定版存儲庫
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容器包含了所有的某個應用運行所需要的環境。每一個Docker容器都是從Docker鏡像創建的。Docker容器可以運行、開始、停止、移動和刪除。每一個 Docker 容器都是獨立和安全的應用平臺,Docker 容器是Docker的運行部分。
Docker 常用基本命令
常用命令 描述
docker build 從Dockerfile構建鏡像
docker cp 在容器和本地文件系統之間復制文件/文件夾
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 設置鏡像標簽
docker pull 從注冊表中提取鏡像或存儲庫
docker load 導入鏡像到docker
docker exec 在正在運行的容器中運行命令
更多更詳細命令說明請查看官方文檔
常用命令使用實例及說明
docker ps 實例
語法
選項
docker ps [OPTIONS]
常用OPTIONS說明:
--all , -a : 顯示所有容器(默認顯示剛剛運行)
--quiet , -q : 僅顯示數字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:容器啟動后執行的命令
CREATED:容器創建時間
STATUS:容器狀態
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:鏡像創建時間
SIZE:鏡像大小
docker load 實例
語法
選項
docker load [OPTIONS]
加載鏡像到docker
docker load < /位置/nginx.tar
docker run 實例
docker run :創建一個新的容器并運行一個命令
語法
選項 鏡像名:版本 執行的命令 環境變量
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用OPTIONS說明:
-d: 后臺運行容器,并返回容器ID;
-i: 以交互模式運行容器,通常與 -t 同時使用;
-p: 端口映射,格式為:主機(宿主)端口:容器端口
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
--name: 為容器指定一個名稱;
--volume , -v 目錄掛載,表示宿主機文件/文件夾掛載到容器內(宿主機文件或目錄:容器內文件或目錄)
docker run -d -p 8080:80 --name nginx -v /home/conf:/etc/ nginx:1.0
更多Docker Run命令請查看官方文檔
docker exec 實例
語法
選項 容器ID或容器名 執行的命令 環境變量
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
進入容器
docker exec -it nginx bash
常用OPTIONS說明:
-i:以交互模式運行容器,通常與 -t 同時使用
-t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用
docker cp 實例
語法
選項 容器ID或容器名:容器內路徑 宿主機本地文件/文件夾路徑
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
選項 宿主機本地文件/文件夾路徑 容器ID或容器名:容器內路徑
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路徑 構建內容路徑
docker build [OPTIONS] PATH | URL
在當前目錄的Dockerfile構建鏡像,名為nginx,版本1.0,點表示當前,這里使用點需要注意,如果使用點,默認尋找Dockerfile名稱的,不帶任何后綴
docker build -t nginx:1.0 .
使用-f指定Dockerfile文件位置構建鏡像
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鏡像(已經打包好的鏡像,例如鏡像名為nginx.tar)或者是Docker倉庫公開的鏡像
- 實踐步驟
加載鏡像到docker中
docker load < /位置/nginx.tar
查看是否鏡像加載成功 如果存在,那么就已經加載進到docker
docker images
通過剛剛加載的鏡像,啟動一個容器 語法
選項 容器ID或容器名稱 執行的命令 環境變量
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端口,但此容器只能通過內部IP進行訪問,需要外部可以訪問,那么需要做端口映射: -p 8484:80 將內部端口映射到8484端口
執行以上命令后:
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 這一串數字,必須有此映射端口,我們才能通過宿主機的IP地址來訪問容器的端口
例如:宿主機的IP地址是192.168.0.129,在瀏覽器上輸入http://192.168.0.129:8484就可以訪問
鏡像(image)
Docker 鏡像是 Docker 容器運行時的只讀模板,每一個鏡像由一系列的層 (layers) 組成。 當你改變了一個 Docker 鏡像,比如升級到某個程序到新的版本,一個新的層會被創建。因此,不用替換整個原先的鏡像或者重新建立(在使用虛擬機的時候你可能會這么做),只是一個新 的層被添加或升級了。現在你不用重新發布整個鏡像,只需要升級,層使得分發 Docker 鏡像變得簡單和快速。可以理解鏡像為系統的iso文件。
在構建鏡像前,需要先準備Dockerfile文件
Dockerfile是什么
Dockerfile 是一個文本格式的配置文件,用戶可以使用Dockerfile 快速創建自定義的鏡像。
Dockerfile 基本結構
Dockerfile 由一行行命令語句組成,# 開頭的注釋行。一般而言,Dockerfile 的內容分為四個部分:
基礎鏡像信息
維護者信息
鏡像操作指令
容器啟動時執行指令。
Dockerfile 基本選項
指令不區分大小寫。但是,命名約定為全部大寫。
常用選項 說明
FROM <image name> 指定基礎鏡像
MAINTAINER <author name> 設置維護者信息
RUN 《command》 在shell或者exec的環境下執行的命令,RUN指令會在新創建的鏡像上添加新的層面.
ADD 《src》 《destination》 復制文件指令。它有兩個參數<source>和<destination>。destination是容器內的路徑。source可以是URL或者是啟動配置上下文中的一個文件。
COPY 《src》 《destination》 基本和ADD類似,不過COPY的<src>不能為URL
CMD ["param1","param2"] 提供了容器默認的執行命令。 Dockerfile只允許使用一次CMD指令。 使用多個CMD會抵消之前所有的指令,只有最后一個指令生效。
EXPOSE <port> 指定容器在運行時監聽的端口
ENTRYPOINT ["executable", "param1","param2"] 允許您配置容器,運行執行的可執行文件
VOLUME ["/data"] 指令創建具有指定名稱的安裝點,并將其標記為從本機主機或其他容器保存外部安裝的卷。
ENV <key>=<value> ... 指令將環境變量<key>設置為值<value>
VOLUME 與 -v 的區別
docker run命令的-v標識創建的掛載點只能對創建的容器有效。
通過Dockerfile的 VOLUME 指令可以在鏡像中創建掛載點,這樣只要通過該鏡像創建的容器都有了掛載點。
通過 VOLUME 指令創建的掛載點,無法指定主機上對應的目錄,是自動生成的。
更詳細指令說明請查看官方文檔
Dockerfile 文本內容實例
指定基礎鏡像
FROM ubuntu
設置維護者信息
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 /
容器啟動時執行指令
CMD ["/usr/sbin/nginx"]
構建nginx鏡像并啟動容器(實踐)
編寫Dockerfile
指定基礎鏡像
FROM ubuntu
設置維護者信息
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"]
容器啟動時執行指令
CMD ["/usr/sbin/nginx"]
執行構建
docker build -t nginx:1.0 .
-t:以“name:tag”格式命名,name表示名稱,tag表示標簽,點表示當前目錄
以上命令表示:構建一個名為nginx,1.0版本的鏡像,點表示從當前目錄找到默認Dockerfile,并從當前目錄構建上下文內容
使用已經構建好的鏡像啟動容器(container)
docker run -d -p 8484:80 --name nginx nginx:1.0