Docker基礎入門實戰linux
Docker是一個開源的應用容器引擎,基於Go語言並聽從Apache2.0協議開源,源代碼部署在GitHub上。git
Docker是經過內核虛擬技術來提供容器的資源隔離與安全保障,因爲Docker經過操做系統層的虛擬化實現隔離,因此Docker容器在運行時,不須要相似虛擬機(VM)額外的操做系統開銷,從而提升資源的利用率。web
Docker的目標是實現輕量級的操做系統虛擬化解決方案。docker
Docker對於操做者來講是C/S架構,可是Docker後端是一個很是耦合的架構,模塊各司其職,並有機組合,支撐Docker的運行。數據庫
用戶經過使用Docker Client與Docker Daemon創建通訊,併發送請求給後者。vim
CLI(命令行)交互模型後端
RemoteAPI交互模式centos
q 8種應用場景api
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】
快速部署:不須要啓動操做系統,實現秒級部署
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:基礎設施/粘合劑容器
q 容器不一樣於虛擬機
q 容器不如虛擬機來的成熟
q 容器能夠在幾分之一秒內啓動
q 容器已在大規模環境證實了自身的價值(好比在谷歌搜索中)
q IT人員稱容器爲輕量級
q 容器引起安全方面的問題
q Docker已成爲容器的代名詞,但他不是惟一的提供者
q 容器能夠節省IT人力,加快更新
q 容器仍面臨一些沒有解決的問題
q 更快速的交付和部署
q 更高效的虛擬化
q 更輕鬆的遷移和擴展
q 更簡單的管理
類別 |
Docker |
OpenStack |
部署難度 |
極其簡單 |
組件多,部署複雜 |
啓動速度 |
秒級 |
分鐘級 |
執行性能 |
和物理系統幾乎一致 |
Vm會佔用一些資源 |
鏡像體積 |
鏡像是MB級別 |
虛擬機鏡像是GB級別 |
管理效率 |
管理簡單 |
組件相互依賴,管理複雜 |
隔離性 |
隔離性高 |
完全隔離 |
可管理性能 |
單進程、不建議啓動ssh |
完整的系統隔離 |
網絡鏈接 |
比較弱 |
藉助Neutron能夠靈活組件各類網絡結構 |
特別提示:有些場景是不適合用docker的,像前段的web服務,若使用docker則當docker掛掉時,裏面不會像數據庫那樣有數據寫入,這時就須要在從新啓動啓動一個docker
Docker鏡像就是一個只讀的模板,例如一個鏡像能夠包含一個完整的操做系統環境,裏面僅安裝了Apache或用戶須要的其餘應用程序
鏡像能夠用來建立容器,Docker提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,而且用戶甚至能夠直接從其餘人哪裏下載一個已經作好的鏡像來直接使用
Docker利用容器來運行應用,容器是從鏡像建立的運行實例,他能夠啓動、中止、開始、刪除,每一個容器都是相互隔離的,保證平臺的安全
能夠把容器當作一個簡易版的linux系統和運行在其中的應用程序
鏡像是隻讀的,容器在啓動的時候會建立一層可寫層做爲最上層
倉庫就是集中存放鏡像的地方,有時候會把倉庫和倉庫註冊器混成一塊,並不嚴格區分,倉庫註冊器上每每存放着多個倉庫,每一個倉庫又包含了多個鏡像,每一個鏡像又有不一樣的tag
倉庫分爲公開倉庫和私有倉庫兩種,最大的公開倉庫是Docker Hub,提供了數量龐大的鏡像供用戶下載,國內的公開倉庫包括Docker Pool等,能夠提供大陸用戶更穩定、更快的訪問
[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
[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
[root@docker ~]# docker search centos:6
[root@docker ~]# docker pull centos:6
[root@docker ~]# docker images
[root@docker ~]# docker save centos:6 >/opt/centos.tar.gz ==》導出鏡像 [root@docker ~]# docker load </opt/centos.tar.gz ==》導入鏡像
[root@docker ~]# docker rmi $ IMAGE ID/$TAG
[root@docker ~]# docker run -it centos:6 /bin/bash
[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分配一個僞終端並綁定到容器的標準輸入上
[root@docker ~]# docker start $NAMES/$CONTAINER ID [root@docker ~]# docker stop $NAMES/$CONTAINER ID [root@docker ~]# docker ps ==》列出已經啓動的容器 [root@docker ~]# docker ps –a ==》列出全部容器,包括未啓動的
[root@docker ~]# docker rm $CONTAINER ID ==》刪除已經中止的容器 [root@docker ~]# docker rm -f $CONTAINER ID ==》刪除正在運行的容器
[root@docker ~]# docker attach $CONTAINER ID 注意:該命令是系統自帶的,而且啓用attach命令有時候並非特別的方便,當多個窗口同時attach到一個容器的時候,多有的窗口都會同步顯示,當某個窗口因某個命令堵塞時,其餘窗口也就沒法再執行命令了,在退出容器時,該容器會自動中止
[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空間
[root@docker scripts]# vim docker_in.sh #/bin/bash PID=$(docker inspect -f "{{.State.Pid}}" $1) nsenter -t $PID -m -u -i -n -p