Docker入門
寫在前面:
最近一年,自動化部署、分散式部署、集群等等概念非常的popular。今天,介紹一種可以實現自動化分散式集群的工具 - docker工具的入門。
一、簡介
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面 。
2013年容器服務提出,docker是基於Google推出的go語言實現的
Docker提出的目標是:通過對應用組件的封裝、分發、部署、運行等生命周期的管理,達到應用級別的一次封裝到處運行。
應用服務可以是:web應用、一套資料庫服務、甚至是一個操作系統編譯器等等。
1.1 相關概念的說明:
- image name -- 鏡像的 名稱,可以通過 docker iamges 指令查看
- iamge id -- 鏡像的 id,可以通過 docker images 指令查看
- container name -- 容器的名稱,可以通過docker ps -a 指令查看
- container id -- 容器的 id , 可以通過docker ps -a 指令查看
1.2 Docker容器的虛擬化優點:
環境隔離:可以運行 同一個應用 的不同版本
更快速的交付部署:保證運行環境的一致性
更高效的資源利用:docker容器中的應用能更快速的啟動
更易遷移擴展:docker容器中的應用應該是無狀態的應用
更簡單的更新管理:使用分層的機制進行更新管理,每次更新只需要更新對應的層級 即可
二、安裝docker:
Install Docker
2.1 查看docker 版本信息
docker version
Client:
Version: 17.06.2-ce
API version: 1.30
Go version: go1.8.3
Git commit: cec0b72
Built: Tue Sep 5 20:12:06 2017
OS/Arch: darwin/amd64
==================================================
Server:
Version: 17.06.2-ce
API version: 1.30 (minimum version 1.12)
Go version: go1.8.3
Git commit: cec0b72
Built: Tue Sep 5 19:59:19 2017
OS/Arch: linux/amd64
Experimental: true
docker是一個cs架構的程序,由 客戶端 負責 接收 服務端 的內容 進行展示
三、創建一個docker用戶組:(虛擬機中)
3.1 創建過程
1> 新建docker組
sudo groupadd docker
2> 將當前用戶添加到該用戶組
sudo usermod -aG docker liuding
3> 退出當前用戶,再次登陸
exit
四、docker中的核心概念
4.1 docker 鏡像
docker鏡像 是一個 只讀 的模版
docker鏡像 是分層管理的,有底層鏡像可以使用,基於底層鏡像修改之後出來的內容就是子鏡像(類似於git的commit)
docker鏡像 可以用來創建docker容器
4.2 docker 容器
docker 容器是由鏡像創建的實例,每一個容器都是相互隔離的(通過linux的cgroup 和 namespace)
當容器啟動時,創建一層 可寫層 作為最上層。
4.3 docker 倉庫
docker 倉庫是集中存放 鏡像文件 的場所,通過倉庫註冊伺服器進行註冊
五、創建一個可以分發的應用:
1> 創建模版文件
操作:在當前路徑下創建一個Dockerfile,用於存放 創建docker容器 相關的配置 和 說明
Dockerfile:# Usee an official Python runtime as a parent imageFROM python:2.7-slimCMD echo hello world
- FROM -- 設定 運行的主環境
2> 利用模版文件創建鏡像
docker build -t="dockertest/friendlyhello"
- -t -- 表示設定 路徑 與 產出目標
3> 上傳鏡像
註冊:
上傳鏡像前需要申請 docker hub 賬號,它用於管理docker鏡像文件,用於遠程創建和分發
命令行登陸:
docker login
上傳:
docker push [docker image name]
4> 下載鏡像
docker pull [origin docker image name]
5> 運行容器
docker run --name [container name] [docker image name]
6> 查看結果
六、docker 鏡像操作
6.1 獲取鏡像
docker pull [域名]/[namespace]/[repo]:[tag]
默認會選擇latest版本
如果在獲取鏡像的時候,沒有添加 域名 namespace等等內容,則默認從docker hub官方下載,例如:docker pull ubuntu
6.2 顯示鏡像列表
docker images
6.3 查看鏡像詳細信息
docker inspect [local docker image id]
查看鏡像詳細信息中的某個欄位的值
docker inspect -f {{.Os}} [local docker image id]
6.4 查找遠程倉庫中是否存在對應的鏡像
docker search [image]
例子:docker search nginx
6.5 為鏡像創建對應的tag
docker tag [image id] [image name]:[tag name]
例子:docker tag 345fg564feds ubuntu:test
6.6 刪除鏡像
docker rmi [image]:[tag]
例子:docker rmi ubuntu:test
注意:
如果有多個tag的情況下,此刪除操作 只 刪除對應的標籤,不會影響鏡像文件
直接刪除鏡像 docker rmi ubuntu:latest
當有鏡像創建的容器時,不能刪除對應的鏡像,需要先刪除容器再刪除鏡像
6.7 創建鏡像文件
6.7.1 基於已有鏡像的容器創建
docker commit -a [author name] -m [message] [container id] [new name]
例子:修改 ubuntu 容器,然後利用 這個容器 創建新的 鏡像
1> 從docker官網拉取ubuntu鏡像
docker pull ubuntu
2> 運行鏡像,創建docker容器,進入ubuntu的bash中
docker run -ti ubuntu bash
- -ti -- 將ubuntu中的 標準輸出 ,綁定到當前的 bash 中,類似於ssh命令的效果,實現 終端 與 容器 的 交互模式
- -t -- 讓docker分配一個偽終端並綁定到容器的標準輸入上
- -i -- 讓容器的標準輸入保持打開
3> 在ubuntu鏡像中,新建一個文件test.txt,並在其中輸入"Hello World"
touch test.txtecho "Hello World" > test.txt
4> 退出鏡像
exit
5> 利用修改的容器創建鏡像:
docker commit -a [author name] -m [message] [container id] [new name]
例子:docker ps -a 查看container id
docker commit -a liuding -m "add a new image" 345fg564feds liuding/test
6> 查看鏡像列表
docker images
6.7.2 基於本地模版的導入
1> 遷出鏡像:
docker save -o [new name].tar [image id]
例子:docker save -o test.tar 345fg564feds
2> 載入鏡像:
docker load --input [image].tar 或者 docker load < [image].tar
例子:docker load input test.tar 或者 docker load < test.tar
3> 基於Dockerfile創建 (常用的創建方法)(見5)
4> 上傳鏡像:
docker push [域名]/[namespace]/[tag]
如果 不寫 域名 和 namespace 的話,默認上傳到 docker hub 官方
七、容器操作
Docker容器是非常輕量級別的
7.1 創建容器
docker create --name [new name] -ti [image name]
例子: docker create --name test_create -ti ubuntu
注意:
創建容器時,並 不 啟動,可以使用docker start 指令啟動它
docker run 等價於 先執行docker create 再執行 docker start命令
docker run 執行的過程:
- 檢查本地是否具有指定的鏡像,不存在則從公有倉庫下載
- 利用本地鏡像 創建 並 啟動 一個容器
- 分配一個文件系統,並在 只讀 的鏡像層外面掛載一層 讀寫層
- 從宿主機配置的網橋介面 橋接 一個虛擬介面 到容器中,通過ipconfig指令查看宿主機網卡信息,網卡信息中docker0項就是docker容器在啟動時,宿主機配置的網橋的虛擬介面
- 從地址池 配置 一個IP地址給容器,一般實現的方式是通過上一步驟中的虛擬介面,動態分配的虛擬ip地址,這個記錄寫在了/etc/hosts文件中
- 執行 用戶 指定的 應用程序
- 執行完畢後容器被終止
注意:
可以通過docker run -d 將容器放在後台執行,常見的有日誌的記錄程序等等
例子:docker run -d ubuntu /bin/sh -c "while true;do echo hello world ; sleep 1 ; done"
可以通過:
docker logs -f [docker NAMES] 查看輸出日誌
7.2 終止容器
docker stop [image id 或者 docker NAMES]
當容器中的應用程序終止時,容器會自動終止
7.3 進入容器
docker exec [options] [container id] [commond]
在 後台執行的 容器中,執行對應的命令
例如:
docker run -d --name test_ti ubuntu /bin/sh -c "while true;do echo hello world ; sleep 1 ; done"
docker exec -i -t test_ti bash
7.4 刪除容器
docker rm
刪除終止狀態下的容器:docker rm [container id] , 如果刪除正在運行的容器,則會報錯
強制刪除容器: docker rm -f [container id]
7.5 導出容器
docker export [container id]
例子:
docker run --name test_export -ti ubuntu bash
docker export test_export > export.tar
7.6 導入容器,生成鏡像
cat export.tar | docker import - liuding/test_export
八、倉庫操作
8.1 建立私有倉庫
8.2 倉庫加速服務
8.3 利用第三方管理平台管理私有倉庫
(下篇)
九、數據管理
9.1 數據卷:容器 和 宿主機共享 的目錄
9.1.1 數據卷是一個可供容器使用的特殊目錄 只會掛在到本地
- 數據卷可以在容器之間共享和重用
- 數據卷修改會立即生效
- 數據卷的更新不會影響鏡像
- 如果有容器使用數據卷,該卷會一直存在
docker run -d --name [container name] -it -v [local path]:[container path] [image name]
例如:docker run -d --name [container name] -it -v ${PWD}/webapp:/root/webapp ubuntu bash
- -v -- 將當前路徑下的webapp路徑作為數據卷,掛在到本地,它對應的容器中的路徑是/root/webapp
9.1.2 默認掛載的數據卷的許可權為 rw(讀寫),如果要求 ro(只讀),則需要加上對應的ro參數:
docker run -d --name [container name] -it -v [local path]:[container path]:ro [image name]
例如:docker run -d --name app1 -it -v ${PWD}/webapp:/root/webapp:ro ubuntu bash
生產中的用途:(重點)
我們可以將實際生產中的mysql數據使用數據卷的方式 與 服務容器進行共享,當我們的服務容器 掛了的時候,可以保證數據不會丟失,只需要重新啟動容器,再將相應的mysql掛載回去即可。
9.2 數據卷容器:容器之間 共享的目錄
數據卷容器 用於用戶在容器間共享一些持續更新的數據,數據卷容器專門提供 數據卷 供 其他容器 掛載使用
1> 創建數據卷容器 db1
docker run -d --name db1 -v /dbdata -ti ubuntu bash
注意:
/dbdata 位於容器中
2> 創建容器db2,與db1共享dbdata數據
docker run -d --name db2 --volumes-from1 db1 -ti ubuntu bash
3> 在兩個容器中其一中修改dbdata數據,查看是否另一個容器是否同步
docker exec -ti db1 bashtouch /dbdata/file.txtexit
docker exec -ti db2 bashcd /dbdatals
查看是否存在
9.3 數據卷容器的刪除
如果刪除了一個掛載的容器,數據卷 並不會 在另一個容器中 被自動刪除
docker rm -f db1docker exec -ti db2 /dbdata
9.4 利用 數據卷 遷移 容器
利用數據卷容器 對 其中的數據卷 進行備份 、 恢復 ,以實現數據的遷移
9.4.1 備份:
docker run --volumes-from dbdata -v ${PWD}:/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
利用 ubuntu 鏡像創建一個worker容器,使用--volumes-from dbdata參數讓worker容器掛載dbdata數據卷
使用${PWD}:backup參數來掛載本地目錄到worker容器的/backup目錄
worker啟動後,使用tar命令將/dbdata下的內容備份到容器內的/backup/backup.tar
9.4.2 執行備份:
docker run -d --name dbdata -v /dbdata -ti ubuntu bashdocker exec -ti dbdata bashtouch filea fileb filecexitdocker run --volumes-from dbdata -v ${PWD}:/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
9.4.3 恢復:
創建一個帶有 數據卷 的容器 dbdata2
docker run -d --name dbdata2 -v /dbdata -ti ubuntu bash
然後創建另一個新的容器,掛載dbdata2的容器,並使用tar命令解壓備份文件到掛載的容器卷中
docker run --volumes-from dbdata2 -v ${PWD}:/backup ubuntu tar xvf /backup/backup.tar
參考鏈接:
Docker最佳實戰視頻教程-大講台-課程學習-百度傳課
推薦閱讀:
※Docker的作用的主要作用是什麼?
※docker在web開發中得使用流程是怎樣的?
※Docker基本操作
※數人云|淺論Prometheus容器監控優缺點,2.0版本哪項改進受關注?