Docker系列一之基礎快速入門企業實戰
第1章Docker快速入門
此篇文章來自老男孩高級架構師趙班長講解,以及參考馬亮博文分享整理而來。
筆者QQ:572891887
Linux架構交流群:471443208
1.1什么是LXC
LXC 為 Linux Container 的簡寫。 Linux Container 容器是一種內核虛擬化技術,可以提供輕量級的虛擬化,以便隔離進程和資源,而且不需要提供指令解釋機制以及全虛擬化的其他復雜性。相當于 C++ 中的 NameSpace 。容器有效地將由單個操作系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有沖突的資源使用需求。與傳統虛擬化技術相比,它的優勢在于:
與宿主機使用同一個內核,性能損耗小;
不需要指令級模擬;
不需要即時 (Just-in-time) 編譯;
容器可以在 CPU 核心的本地運行指令,不需要任何專門的解釋機制;
避免了準虛擬化和系統調用替換中的復雜性;
輕量級隔離,在隔離的同時還提供共享機制,以實現容器與宿主機的資源共享。
總結:Linux Container是一種輕量級的虛擬化的手段。
1.2什么是Docker
Docker 是 Docker.inc 公司開源的一個基于 LXC 技術之上構建的 Container 容器引擎,源代碼托管在 GitHub 上,基于 Go 語言并遵從 Apache2.0 協議開源(可以商業)。
Docker 項目的目標是實現輕量級的操作系統虛擬化解決方案。
Docker 是通過內核虛擬化技術( namespaces 及 cgroups 等)來提供容器的資源隔離與安全保障等。由于 Docker 通過操作系統層的虛擬化實現隔離,所以 Docker 容器在運行時,不需要類似虛擬機 VM 額外的操作系統開銷,提高資源利用率。
下面圖比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在操作系統層面上實現虛擬化,直接復制本地主機的操作系統,而傳統方式則是在硬件層面實現。
虛擬化與 docker 對比圖
1.3Docker的工作模式
學習 Docker 的源碼并不是一個枯燥的過程,反而可以從中理解 Docker 架構的設計原理。
Docker 對使用者來講是一個 C/S 模式的架構,而 Docker 的后端是一個非常松耦合的架構,模塊各司其職,并有機組合,支撐 Docker 的運行。
用戶是使用 Docker Client 與 Docker Daemon 建立通信,并發送請求給后者。
而 Docker Daemon 作為 Docker 架構中的主體部分,首先提供 Server 的功能使其可以接受 Docker Client 的請求;而后 Engine 執行 Docker 內部的一系列工作,每一項工作都是以一個 Job 的形式的存在。
Job 的運行過程中,當需要容器鏡像時,則從 Docker Registry 中下載鏡像,并通過鏡像管理驅動 graphdriver 將下載鏡像以 Graph 的形式存儲;當需要為 Docker 創建網絡環境時,通過網絡管理驅動 networkdriver 創建并配置 Docker 容器網絡環境;當需要限制 Docker 容器運行資源或執行用戶指令等操作時,則通過 execdriver 來完成。而 libcontainer 是一項獨立的容器管理包, networkdriver 以及 execdriver 都是通過 libcontainer 來實現具體對容器進行的操作。當執行完運行容器的命令后,一個實際的 Docker 容器就處于運行狀態,該容器擁有獨立的文件系統,獨立并且安全的運行環境等。
CLI 交互模型
Docker 的 C/S 模式
RemoteAPI 交互模型
Docker 的 C/S 模式 -RemoteAPI
1.4Docker八中應用場景
Dcoerk 八中應用場景
1 、簡化配置 , 統一配置 , 通過鏡像快速啟動 (Simplifying)
2 、代碼流水線管理 , 開發環境 -> 測試環境 -> 預生產環境 -> 灰度發布 -> 正式發布, docker 在這里實現了快速遷移 (Code Oioeline Management)
3 、開發效率 , 對開發人員 , 有了鏡像 , 直接啟動容器即可 (Developer Productivity)
4 、應用隔離 , 相對于虛擬機的完全隔離會占用資源 ,docker 會比較節約資源 (Applsolation)
5 、服務器整合 , 一臺服務器跑多個 docker 容器 , 提高服務器的利用率 (Server Consolidation)
6 、調試能力 ,debug 調試 (Debugging Capabilties)
7 、多租戶 , 一個租戶多個用戶 , 類似于阿里公有云的一個 project 下多個用戶 (Multi-tenancy)
8 、快速部署 , 不需要啟動操作系統 , 實現秒級部署 (Rapid Deplovment)
1.5Docker八中開發模式
1. 共享基礎容器
2. 共享卷開發容器
3. 開發工具容器
4. 不同環境下測試容器
5. 構建容器
6. 安裝容器
7. 盒子中默認服務容器
8. 基礎設施 / 粘合劑容器
1.6Docker九個基本事實
1. 容器不同于虛擬機
2. 容器不如虛擬機來得成熟
3. 容器可以在幾分之一秒內啟動
4. 容器已在大規模環境證明了自身的價值
5.IT 人員稱容器為輕量級
6. 容器引發了安全問題
7.Docker 已成為容器的代名詞,但它不是唯一的提供者
8. 容器能節省 IT 人力,加快更新
9. 容器仍面臨一些沒有解決的問題
1.7使用Docker理由
作為一種新興的虛擬化方式, Docker 跟傳統的虛擬化方式具有眾多的優勢。
首先, Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機方式要快得多。其次, Docker 對系統資源的利用率很低,一臺主機上可以同時運行數千個 Docker 容器。
至于為什么要使用 Docker :
1、 技術儲備
相對大公司這個非常重要 , 如果你們都在用 , 他們不用就落后了 , 等到完全成熟以后就跟不上了。
2、 無技術棧和技術債
沒有任何 Openstack 或者 saltstack, 服務 down 了就 down 了 , 所有的服務都是松耦合。
3、跟上潮流(提升自我,裝逼)
面試的時候大家都會 Docker, 你不會是不是落后了。
4、符合當前業務
雖然 Docker 很優秀 , 但是,大多數處在第二種狀態 , 很少有符合自己的業務
1.8Docker改變了什么
q 面向產品:產品交付
q 面向開發:簡化環境配置
q 面向測試:多版本測試
q 面向運維:環境一致性
q 面向架構:自動化擴容 ( 微服務 )
1.8.1Docker更快速的交付和部署
對于開發和人員來說,最希望的就是一次創建和配置,可以在任意地方正常運行。
開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之后,運維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創建容器,快速迭代應用程序,并讓整個過程全稱可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量第節約開發、測試、部署的時間。
1.8.2Docker更高效的虛擬化
Docker 容器的運行不需要額外的 Hypervisor 支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。
1.8.3Docker更輕松的遷移和擴展
Docker 容器幾乎可以字啊任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。這種兼容性可以讓用戶把一個應用程序從一個平臺直接遷移到另外一個。
1.8.4Docker更簡單的管理
使用 Docker ,只需要小小的修改,就可以替代往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化并且高效的管理。
1.9Docker與虛擬化
類別 |
Docker |
OpenStack |
結論 |
部署 難 度 |
非常 簡單 |
組件多,部署復雜 |
因 為 平臺是 對 已 有的線上生產環境進行改造,必須選擇侵入性較小的容器化技術 |
啟 動 速度 |
秒 級 |
分 鐘級 |
面 對 流量峰 值 , 速度就是一切 |
執 行性能 |
和物理系 統 幾乎一致 |
VM 會占用一些 資 源 |
微博核心 業務對 服 務 SLA 要求非常苛刻 |
鏡 像體 積 |
鏡 像是 MB 級別 |
虛 擬 機 鏡 像是 GB 級別 |
當集群大 規 模部署 時 ,體 積 小就代表更大的并 發調度量 |
管理效率 |
管理 簡單 |
組件相互依賴,管理復雜 |
生 產 系 統 集群可控性是核心 競 爭力 |
隔離性 |
隔離性高 |
徹 底隔離 |
|
可管理性能 |
單進程、不建議啟動 SSH |
完整的系 統 管理 |
|
網 絡連 接 |
比 較 弱 |
借助 Neutron 可以靈活 組 建各 類 網 絡 架構 |
1.10Docker三大核心概念
1.10.1Docker鏡像(image)
Docker 鏡像就是一個只讀的模板。
例如:一個鏡像可以包含一個完整的 CentOS 操作系統環境,里面僅安裝了 Apache 或用戶需要的其他應用程序。
鏡像可以用來創建 Docker 容器。
Docker 提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那里下載一個已經做好的鏡像來直接使用。
1.10.2Docker容器(container)
Docker 利用容器來運行應用。
容器是從鏡像創建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的,保證安全的平臺。
可以把容器看做是一個簡易版的 Linux 環境(包括 root 用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
注意:鏡像是只讀的,容器在啟動的時候創建一層可寫層作為最上層。
1.10.3Docker倉庫(repository)
倉庫是集中存放鏡像文件的場所。有時候把倉庫和倉庫注冊服務器( Registry )混為一談,并不嚴格區分。實際上,倉庫注冊服務器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽 (tag) 。
倉庫分為公開倉庫 (Public) 和私有倉庫 (Private) 兩種形式。
最大的公開倉庫是 Docker Hub ,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括 Docker Pool 等,可以提供大陸用戶更穩定快讀的訪問。
當用戶創建了自己的鏡像之后就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下載在另外一臺機器上使用這個鏡像時候,只需需要從倉庫上 pull 下來就可以了。
注意: Docker 倉庫的概念跟 Git 類似,注冊服務器可以理解為 GitHub 這樣的托管服務。
1.11Docker企業實戰
筆者QQ:572891887
Linux架構交流群:471443208
系統環境
[root@docker~]# cat /etc/redhat-release # 查看版本號
CentOS Linux release 7.1.1503 (Core)
[root@docker ~]# uname -r # 查看 Linux 內核
c3.10.0-229.el7.x86_64
[root@docker ~]# yum install -y docker # 安裝 docker(CentOS7 系統 CentOS-Extras 庫中已帶 Docker)
[root@docker ~]# systemctl start docker # 啟動 docker
[root@docker ~]# systemctl enable docker # 加入開機自啟動
[root@docker ~]# docker version # 查看 docker 版本信息
Client: #docker 客戶端版本信息
Version:1.8.2-el7.centos
API version:1.20
Package Version: docker-1.8.2-10.el7.centos.x86_64
Go version:go1.4.2
Git commit:a01dc02/1.8.2
Built: OS/Arch:linux/amd64
Server: #docker 服務端版本信息
Version:1.8.2-el7.centos
API version:1.20
Package Version:
Go version:go1.4.2
Git commit:a01dc02/1.8.2
Built: OS/Arch:linux/amd64
1.12Docker基礎命令
[root@docker ~]# docker –help
Usage:
docker [OPTIONS] COMMAND [arg…]
docker daemon [ –help | … ]
docker [ –help | -v | –version ]
A
self-sufficient runtime for containers.
Options:
–config=~/.docker Location of client config files # 客戶端配置文件的位置
-D, –debug=false Enable debug mode # 啟用 Debug 調試模式
-H, –host=[] Daemon socket(s) to connect to # 守護進程的套接字( Socket )連接
-h, –help=false Print usage # 打印使用
-l, –log-level=info Set the logging level # 設置日志級別
–tls=false Use TLS; implied by–tlsverify #
–tlscacert=~/.docker/ca.pem Trust certs signed only by this CA # 信任證書簽名 CA
–tlscert=~/.docker/cert.pem Path to TLS certificate file #TLS 證書文件路徑
–tlskey=~/.docker/key.pem Path to TLS key file #TLS 密鑰文件路徑
–tlsverify=false Use TLS and verify the remote # 使用 TLS 驗證遠程
-v, –version=false Print version information and quit # 打印版本信息并退出
Commands:
attach Attach to a running container # 當前 shell 下 attach 連接指定運行鏡像
build Build an image from a Dockerfile # 通過 Dockerfile 定制鏡像
commit Create a new image from a container’s changes # 提交當前容器為新的鏡像
cp Copy files/folders from a container to a HOSTDIR or to STDOUT # 從容器中拷貝指定文件或者目錄到宿主機中
create Create a new container # 創建一個新的容器,同 run 但不啟動容器
diff Inspect changes on a container’s filesystem # 查看 docker 容器變化
events Get real time events from the server # 從 docker 服務獲取容器實時事件
exec Run a command in a running container # 在已存在的容器上運行命令
export Export a container’s filesystem as a tar archive # 導出容器的內容流作為一個 tar 歸檔文件 ( 對應 import)
history Show the history of an image # 展示一個鏡像形成歷史
images List images # 列出系統當前鏡像
import Import the contents from a tarball to create a filesystem image # 從 tar 包中的內容創建一個新的文件系統映像 ( 對應 export)
info Display system-wide information # 顯示系統相關信息
inspect Return low-level information on a container or image # 查看容器詳細信息
kill Kill a running container #kill 指定 docker 容器
load Load an image from a tar archive or STDIN # 從一個 tar 包中加載一個鏡像 ( 對應 save)
login Register or log in to a Docker registry # 注冊或者登陸一個 docker 源服務器
logout Log out from a Docker registry # 從當前 Docker registry 退出
logs Fetch the logs of a container # 輸出當前容器日志信息
pause Pause all processes within a container # 暫停容器
port List port mappings or a specific mapping for the CONTAINER # 查看映射端口對應的容器內部源端口
ps List containers # 列出容器列表
pull Pull an image or a repository from a registry # 從 docker 鏡像源服務器拉取指定鏡像或者庫鏡像
push Push an image or a repository to a registry # 推送指定鏡像或者庫鏡像至 docker 源服務器
rename Rename a container # 重命名容器
restart Restart a running container # 重啟運行的容器
rm Remove one or more containers # 移除一個或者多個容器
rmi Remove one or more images # 移除一個或多個鏡像 ( 無容器使用該鏡像才可以刪除,否則需要刪除相關容器才可以繼續或者 -f 強制刪除 )
run Run a command in a new container # 創建一個新的容器并運行一個命令
save Save an image(s) to a tar archive # 保存一個鏡像為一個 tar 包 ( 對應 load)
docker
hub
中搜索鏡像start Start one or more stopped containers # 啟動容器
stats Display a live stream of container(s) resource usage statistics # 統計容器使用資源
stop Stop a running container # 停止容器
tag Tag an image into a repository # 給源中鏡像打標簽
top Display the running processes of a container # 查看容器中運行的進程信息
unpause Unpause all processes within a container # 取消暫停容器
version Show the Docker version information # 查看容器版本號
wait Block until a container stops, then print its exit code # 截取容器停止時的退出狀態值
Run ‘docker COMMAND –help’ for more information on a command. # 運行 docker 命令在幫助可以獲取更多信息
</div>
1.13Docker鏡像管理
1.13.1搜索Docker鏡像
[root@docker ~]# docker search centos # 搜索所有 centos 的 docker 鏡像
INDEX NAME ( 名稱 ) DESCRIPTION ( 描述 ) STARS ( 下載次數 ) OFFICIAL ( 官方 ) AUTOMATED ( 自動化 )
docker.io docker.io/centos The official build of CentOS. 1781 [OK]
docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.7 x86_64 / 14 [OK]
……
1.13.2獲取Docker鏡像
可以使用 docker pull 命令來從倉庫獲取所需要的鏡像。下面的例子將從 Docker Hub 倉庫下載一個 Centos 操作系統的鏡像。
[root@docker ~]# docker pull centos # 獲取 centos 鏡像
[root@docker ~]# docker run -it centos /bin/bash # 完成后可以使用該鏡像創建一個容器
[root@5284d42eeb3a /]#
1.13.3查看docker鏡像
鏡像的 ID 唯一標識了鏡像,如果 ID 相同 , 說明是同一鏡像。
TAG 信息來區分不同發行版本,如果不指定具體標記 , 默認使用 latest 標記信息。
[root@docker ~]# docker images # 查看 docker 鏡像
REPOSITORY ( 來自那個倉庫 ) TAG ( 標簽 ) IMAGE ID ( 唯一 ID) CREATED ( 創建時間 ) VIRTUAL SIZE ( 大小 )
docker.io/centos latest 60e65a8e4030 5
days ago 196.6 MB
docker.io/nginx latest 813e3731b203 13
days ago 133.8 MB
1.13.4刪除Docker鏡像
如果要移除本地的鏡像 , 可以使用 docker rmi 命令 ( 在刪除鏡像之前先用 docker rm 刪除依賴于這個鏡像的所有容器 ) 。注意 docker rm 命令是移除容器。
[root@docker ~]# docker rmi imageID # 刪除 docker 鏡像
1.13.5導出Docker鏡像
如果要導出鏡像到本地文件 , 可以使用 docker save 命令。
[root@docker ~]# docker save centos > /opt/centos.tar.gz # 導出 docker 鏡像至本地
[root@docker ~]# ll /opt/
-rw-r–r–.1 root root 204205056 12 月 30 09:53 centos.tar.gz
1.13.61.6.6導入Docker鏡像
可以使用 docker load 從本地文件中導入到本地 docker 鏡像庫
[root@docker ~]# docker load < /opt/centos.tar.gz # 導入本地鏡像到 docker 鏡像庫
[root@docker~]# docker images # 查看鏡像導入情況
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/centos latest 60e65a8e4030 5 days ago 196.6 MB
1.14Docker容器管理
1.14.1啟動Docker容器
啟動容器有兩種方式,一種是基于鏡像新建一個容器并啟動,另外一個是將在終止狀態 (stopped) 的容器重新啟動。
因為 Docker 的容器實在太輕量級了,很多時候用戶都是隨時刪除和新創建容器。
1.14.1.1新建容器并啟動
所需要的命令主要為 docker run
例如 , 下面的命令輸出一個 hehe, 之后終止容器。
[root@docker ~]# docker run centos /bin/echo “hehe” # 這跟在本地直接執行 /bin/echo’hehe’
hehe
[root@docker ~]# docker run –name mydocker -it centos /bin/bash # 啟動一個 bash 終端 , 允許用戶進行交互。
[root@1c6c3f38ea07 /]# pwd
/
[root@1c6c3f38ea07 /]# ls
anaconda-post.log bindev etc homelib lib64 lost+foundmedia mnt optproc root runsbin srv systmp usr var
–name: 給容器定義一個名稱
-i: 則讓容器的標準輸入保持打開。
-t: 讓 Docker 分配一個偽終端 , 并綁定到容器的標準輸入上
/bin/bash: 執行一個命令
當利用 docker run 來創建容器時, Docker 在后臺運行的標準操作包括:
q 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
q 利用鏡像創建并啟動一個容器
q 分配一個文件系統,并在只讀的鏡像層外面掛在一層可讀寫層
q 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
q 從地址池配置一個 ip 地址給容器
q 執行用戶指定的應用程序
q 執行完畢后容器被終止
1.14.1.2啟動已終止容器
可以利用 docker start 命令,直接將一個已經終止的容器啟動運行。
容器的核心為所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,并沒有其他的資源。可以在偽終端中利用 ps 和 top 來查看進程信息。
[root@docker ~]# docker start 1c6c3f38ea07 # 啟動一個終止的容器
1c6c3f38ea07
[root@docker ~]# docker ps -a # 查看是否啟動
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c6c3f38ea07 centos “/bin/bash” 8 minutes ago Up 1 seconds mycentos
1.14.1.3守護進程運行
更多的時候,需要讓 Docker 容器在后臺以守護形式運行。此時可以通過添加 -d 參數來實現。
例如下面的命令會在后臺運行容器。
[root@docker ~]# docker run -d centos /bin/bash -c “while true; do echo hehe; sleep 1;done”
961fd1162c2f6a8d04e4d8ab6ccacf4cb01a90af8ab553d5e2c5063ac483ffd8
[root@docker ~]# docker ps # 查看正在運行的 docker 容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
961fd1162c2f centos “/bin/bash -c ‘while
” 18 minutes ago Up 18 minutes agitated_raman
[root@docker ~]# docker logs 961fd1162c2f # 獲取容器輸出信息 , 通過 dockerlogs 命令
hehe
hehe
…
1.14.2停止容器
可以使用 docker stop 來終止一個運行中的容器。
此外,當 Docker 容器中指定的應用終結時,容器也自動終止。例如啟動一個終端的容器,用戶通過 exit 命令或者 ctrl+d 來退出終端時,所創建的容器立刻終止。
終止狀態的容器可以用 docker ps -a 命令看到 , 也可以通過 docker start ID 命令來啟動容器。
[root@docker ~]# docker ps -a # 查看所有容器的情況
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
961fd1162c2f centos “/bin/bash -c ‘while
” 30 minutes ago Up 30 minutes agitated_raman
[root@docker ~]# docker stop 961fd1162c2f # 停止容器
961fd1162c2f
[root@docker ~]# docker ps -a
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
961fd1162c2f centos “/bin/bash -c ‘while” 31 minutes ago Exited (137) 27 seconds ago agitated_raman
極端方式停止容器(不推薦)
[root@867e6627a194 ~]# docker ps -a -q # 列出所有啟動容器的 ID
867e6627a194
[root@867e6627a194 ~]# docker kill $(docker ps -a -q) # 批量殺掉啟動的容器
./in.sh: 行 4: 20078 已殺死 nsenter -t $PID -u -i -n -p
1.14.3刪除容器
[root@867e6627a194 ~]# docker ps -a # 查看所有容器當前狀態
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194 centos “/bin/bash” 16 minutes ago Up 5 minutes mydocker
c599b569f387 centos “/bin/echo hehe” 19 minutes ago Exited (0) 19 minutes ago fervent_torvalds
302f39c202c9 nginx “/bin/bash” 2 hours ago Up 2 hours 80/tcp, 443/tcp mynginx
[root@867e6627a194 ~]#
[root@867e6627a194 ~]# docker rm c599b569f387 # 刪除已經停止的容器
c599b569f387
[root@867e6627a194 ~]# docker rm -f 302f39c202c9 # 刪除正在運行的容器
302f39c202c9
1.14.4進入容器
使用 -d 參數時,容器啟動后會進入后臺。某些時候需要進入容器進行操作 , 有很多種方法,包括使用 docker attach 命令或 nsenter 工具等。
1.14.4.1attach命令
docker attach 是 Docker 自帶的命令。下面示例如何使用該命令。
[root@docker ~]# docker ps -a
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194 centos “/bin/bash” 10 minutes ago Exited (127) 47 seconds ago mydocker
[root@docker ~]# docker start 867e6627a194 # 啟動已經停止的容器
867e6627a194
[root@docker ~]# docker attach 867e6627a194 # 通過 docker attach 進入
[root@867e6627a194 /]#
但是使用 attach 命令有時候并不方便。當多個窗口同時 attach 到同一個容器的時候,所有的窗口都會同步顯示 , 當某個窗口因命令阻塞時 , 其他窗口也無法執行操作了。
1.14.4.2nsenter命令
nsenter 可以訪問另一個進程的名字空間。 nsenter 需要有 root 權限。
[root@docker ~]# yum install -y util-linux # 安裝包中有需要用到的 nsenter
[root@docker ~]# docker ps -a
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194 centos “/bin/bash” 10 minutes ago Exited (127) 47 seconds ago mydocker
[root@docker ~]# docker start 867e6627a194 # 啟動已經關閉的容器
867e6627a194
[root@docker ~]# docker inspect –format “{{.State.Pid}}” 867e6627a194 # 找到容器的第一個進程 PID
20012
[root@docker ~]# nsenter -t 20012 -u -i -n -p # 通過這個 PID 連接到容器
[root@867e6627a194 ~]# exit
[root@docker ~]# docker ps
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194 centos “/bin/bash” 13 minutes ago Up 2 minutes mydocker
[root@docker ~]# cat in.sh # 編寫成腳本快速進入容器空間
#!/bin/sh
PID=$(docker inspect –format “{{.State.Pid}}” $1)
nsenter -t $PID -u -i -n -p
[root@docker ~]# docker ps
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194 centos “/bin/bash” 15 minutes ago Up 4 minutes mydocker
[root@docker ~]# ./in.sh 867e6627a194 # 執行腳本跟上容器 ID 快速進入
[root@867e6627a194 ~]
筆者QQ:572891887
Linux架構交流群:471443208
后續會陸續更新: Docker 網絡、 Docker 數據管理、 Docker 鏡像制作、 Docker 私有倉庫構建、 Docker 生產注意事項、等等
更多 Docker 高級相關知識請關注 http://www.xuliangwei.com