Docker基礎入門實戰(一)
第1章 docker簡介
1.1 what is Docker
Docker是一個開源的應用容器引擎,基於Go語言並遵從Apache2.0協議開源,源代碼部署在GitHub上。
Docker是通過內核虛擬技術來提供容器的資源隔離與安全保障,由於Docker通過操作系統層的虛擬化實現隔離,所以Docker容器在運行時,不需要類似虛擬機(VM)額外的操作系統開銷,從而提高資源的利用率。
Docker的目標是實現輕量級的操作系統虛擬化解決方案。
1.2 Docker的工作模式
Docker對於操作者來說是C/S架構,但是Docker後端是一個非常耦合的架構,模塊各司其職,並有機組合,支撐
用戶通過使用Docker Client與Docker Daemon建立通信,並發送請求給後者。
CLI(命令行)交互模型
RemoteAPI交互模式
1.3 Docker可以幹些什麽
q 8種應用場景
q 【Simplifying Configuration】
簡化配置:統一配置、通過鏡像快速啟動
q 【Code Pipeline Management】
代碼流水線管理:
開發環境->測試環境->預生產環境->灰度發布->正式發布,docker在這裏可以快速實現遷移
q 【Developer Productivity】
提高開發效率:對開發人員來說,有了鏡像,直接啟動容器即可
q 【App Isolation】
隔離應用:相對於虛擬機的完全隔離會占用資源,docker會比較節約資源
q 【Server Consolidation】
服務器整合:同一臺服務器可以跑多個docker容器,提高服務器的利用率
q 【Debugging Capablities】
調試能力:Docker提供了很多的工具,提供了很多的功能,這些可以幫助調試bug
q 【Multi-tenancy】
多租戶:一個租戶多個用戶,類似於阿裏雲的一個projiect下多個用戶
q 【Rapid Deplovment】
快速部署:不需要啟動操作系統,實現秒級部署
1.4 Docker的8大開發模式
q The Shared Base Container(s):共享基礎容器
q The Shared Volume Dev Container:共享卷開發容器
q The Dev Tools Container:開發工具容器
q The Test In A Different Environment containers:不同環境下測試容器
q The Build Container:構建容器
q The Installation Container:安裝容器
q The Default-Service-In-A-Box Containes:盒子中默認服務器容器
q The Infrastructure/Glue Containers:基礎設施/粘合劑容器
1.1 Docker的9個基本事實
q 容器不同於虛擬機
q 容器不如虛擬機來的成熟
q 容器可以在幾分之一秒內啟動
q 容器已在大規模環境證明了自身的價值(比如在谷歌搜索中)
q IT人員稱容器為輕量級
q 容器引發安全方面的問題
q Docker已成為容器的代名詞,但他不是唯一的提供者
q 容器可以節省IT人力,加快更新
q 容器仍面臨一些沒有解決的問題
1.2 Why use Docker
q 更快速的交付和部署
q 更高效的虛擬化
q 更輕松的遷移和擴展
q 更簡單的管理
1.1 Docker與OpenStack的對比
類別 | Docker | OpenStack |
部署難度 | 極其簡單 | 組件多,部署復雜 |
啟動速度 | 秒級 | 分鐘級 |
執行性能 | 和物理系統幾乎一致 | Vm會占用一些資源 |
鏡像體積 | 鏡像是MB級別 | 虛擬機鏡像是GB級別 |
管理效率 | 管理簡單 | 組件相互依賴,管理復雜 |
隔離性 | 隔離性高 | 徹底隔離 |
可管理性能 | 單進程、不建議啟動ssh | 完整的系統隔離 |
網絡連接 | 比較弱 | 借助Neutron可以靈活組件各種網絡結構 |
特別提示:有些場景是不適合用docker的,像前段的web服務,若使用docker則當docker掛掉時,裏面不會像數據庫那樣有數據寫入,這時就需要在重新啟動啟動一個docker
1.1 Docker的3大核心概念
1.1.1 鏡像(image)
Docker鏡像就是一個只讀的模板,例如一個鏡像可以包含一個完整的操作系統環境,裏面僅安裝了Apache或用戶需要的其他應用程序
鏡像可以用來創建容器,Docker提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,並且用戶甚至可以直接從其他人哪裏下載一個已經做好的鏡像來直接使用
1.1.2 容器(container)
Docker利用容器來運行應用,容器是從鏡像創建的運行實例,他可以啟動、停止、開始、刪除,每個容器都是相互隔離的,保證平臺的安全
可以把容器看成一個簡易版的linux系統和運行在其中的應用程序
鏡像是只讀的,容器在啟動的時候會創建一層可寫層作為最上層
1.1.3 倉庫(repository)
倉庫就是集中存放鏡像的地方,有時候會把倉庫和倉庫註冊器混成一塊,並不嚴格區分,倉庫註冊器上往往存放著多個倉庫,每個倉庫又包含了多個鏡像,每個鏡像又有不同的tag
倉庫分為公開倉庫和私有倉庫兩種,最大的公開倉庫是Docker Hub,提供了數量龐大的鏡像供用戶下載,國內的公開倉庫包括Docker Pool等,可以提供大陸用戶更穩定、更快的訪問
第2章 Docker入門實戰
2.1 系統環境
[root@docker ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@docker ~]# uname -r 3.10.0-693.11.6.el7.x86_64
2.2 安裝及啟動
[root@docker ~]# yum install -y docker ==》安裝 [root@docker ~]# systemctl start docker ==》啟動 [root@docker ~]# systemctl status docket ==》查看狀態信息 [root@docker ~]# systemctl enable docker ==》加入開機自啟動 [root@docker ~]# docker --version ==》簡略版本信息 Docker version 1.13.1, build dded712/1.13.1 [root@docker ~]# docker version ==》詳細版本信息 Client: ==》客戶端信息 Version: 1.13.1 API version: 1.26 Package version: docker-1.13.1-68.gitdded712.el7.centos.x86_64 Go version: go1.9.4 Git commit: dded712/1.13.1 Built: Tue Jul 17 18:34:48 2018 OS/Arch: linux/amd64 Server: ==》服務端信息 Version: 1.13.1 API version: 1.26 (minimum version 1.12) Package version: docker-1.13.1-68.gitdded712.el7.centos.x86_64 Go version: go1.9.4 Git commit: dded712/1.13.1 Built: Tue Jul 17 18:34:48 2018 OS/Arch: linux/amd64 Experimental: false
2.3 docker鏡像管理
2.3.1 search鏡像
[root@docker ~]# docker search centos:6
2.3.2 push鏡像
[root@docker ~]# docker pull centos:6
2.3.3 查看鏡像
[root@docker ~]# docker images
2.3.4 導入/導出鏡像
[root@docker ~]# docker save centos:6 >/opt/centos.tar.gz ==》導出鏡像 [root@docker ~]# docker load </opt/centos.tar.gz ==》導入鏡像
2.3.5 刪除鏡像
[root@docker ~]# docker rmi $ IMAGE ID/$TAG
2.3.6 利用鏡像創建容器
[root@docker ~]# docker run -it centos:6 /bin/bash
2.4 容器管理
2.4.1 新建容器
[root@docker ~]# docker run centos:6 /bin/echo "hehe" =》與在本地執行/bin/echo "hehe"一樣 [root@docker ~]# docker run --name mydocker -it centos:6 /bin/bash =》啟動一個bash終端,允許用戶進行交互 --name:給容器定義名稱 -i:讓容器的標準輸入保持打開 -t:Docker分配一個偽終端並綁定到容器的標準輸入上
2.4.2 啟動/停止容器
[root@docker ~]# docker start $NAMES/$CONTAINER ID [root@docker ~]# docker stop $NAMES/$CONTAINER ID [root@docker ~]# docker ps ==》列出已經啟動的容器 [root@docker ~]# docker ps –a ==》列出所有容器,包括未啟動的
2.4.3 刪除容器
[root@docker ~]# docker rm $CONTAINER ID ==》刪除已經停止的容器 [root@docker ~]# docker rm -f $CONTAINER ID ==》刪除正在運行的容器
2.4.4 進入容器
2.4.4.1 attach命令進入
[root@docker ~]# docker attach $CONTAINER ID 註意:該命令是系統自帶的,並且啟用attach命令有時候並不是特別的方便,當多個窗口同時attach到一個容器的時候,多有的窗口都會同步顯示,當某個窗口因某個命令堵塞時,其他窗口也就無法再執行命令了,在退出容器時,該容器會自動停止
2.4.4.2 nsenter命令進入
[root@docker ~]# yum install -y util-linux ==》安裝nsenter [root@docker ~]# docker inspect --format "{{.State.Pid}}" test ==》找到容器進程ID [root@docker ~]# nsenter -t 19245 -u -i -m –p ==》進入容器 -t, --target <pid> target process to get namespaces from 指定容器的進程ID -m, --mount[=<file>] enter mount namespace 進入到mount namespace空間中 -u, --uts[=<file>] enter UTS namespace (hostname etc) 進入到UTS namespace空間中 -i, --ipc[=<file>] enter System V IPC namespace 進入到System V IPC namespace空間中 -n, --net[=<file>] enter network namespace 進入到network namespace空間中 -p, --pid[=<file>] enter pid namespace 進入到pid namespace空間
2.4.4.3 編寫腳本快速進入容器
[root@docker scripts]# vim docker_in.sh #/bin/bash PID=$(docker inspect -f "{{.State.Pid}}" $1) nsenter -t $PID -m -u -i -n -p
Docker基礎入門實戰(一)