第一章
- docker得益于現(xiàn)代Linux內(nèi)核特性,如控件組(control group),命名空間技術(namespace)技術。讓容器和宿主機之間的隔離更加徹底,容器有獨立的網(wǎng)絡和存儲棧,還擁有自己的資源管理能力,使得同一臺宿主機中的多個容器可以友好地共存。
- docker依賴于寫時復制模型,使修改應用程序也非常迅速。
- docker鼓勵面向服務的架構(gòu)和為服務架構(gòu)。docker推薦單個容器只允許一個應用程序或進程,這樣就形成了一個分布式的應用程序模型。
docker的核心組件有:
- docker客戶端和服務器。
- docker鏡像。
- registry。
- docker容器。
1:docker是cs架構(gòu)的程序,docker客戶端向docker服務器(通過網(wǎng)絡連接)或守護進程(通過unix套接字連接)發(fā)出請求,docker服務器管理容器。
2:鏡像是容器的源代碼,一個容器是由這些源代碼構(gòu)建出來的,體積很?。ň鸵粋€文本文件)。
3:regisry是用來保存鏡像的倉庫,可以使用公共的也可以自己搭建私有的。
4:容器是基于鏡像啟動的,是一個鏡像格式,一系列的標準的操作或者一個執(zhí)行環(huán)境。
利用docker,可以消除本地開發(fā)環(huán)境,測試環(huán)境和生產(chǎn)環(huán)境之間的部署障礙。
linux通過namespace,可以實現(xiàn)文件系統(tǒng),進程,網(wǎng)絡隔離,使用cgroups,可以讓cpu和內(nèi)存之類的資源獨立分配給每個docker容器。
第二章
這本書第二章是講怎么安裝docker的。書上的內(nèi)容可能比較老了,就去按照docker的官方文檔安裝的。
在wsl2的Ubuntu20.04系統(tǒng)中安裝docker
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
gpg是一種加密工具,這個語句的作用其實是將公鑰添加到apt信任中。這樣才能連接到docker的apt倉庫里。
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
service docker start
service docker status
這里如果看到Docker is running就說明docker服務已經(jīng)啟動啦~
sudo docker run hello-world
運行的時候他會先在本地查找一下有沒有鏡像,沒有的話會去遠程倉庫拉取。
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete Digest: sha256:8c5aeeb6a5f3ba4883347d3747a7249f491766ca1caa47e5da5dfcf6b9b717c0
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
運行輸出。
第三章 docker入門
docker info顯示docker信息。
docker run
docker run提供了docker容器的創(chuàng)建到啟動的功能。
參數(shù)
-i 保證容器中的stdin是開啟的。
-t告訴docker要為創(chuàng)建的容器分配一個偽tty的終端。
這樣,-i -t就能為新創(chuàng)建的容器提供一個交互式的shell。
docker run -i -t ubuntu /bin/bash
通過這樣就能生成一個鏡像并運行。

這個命令會先檢查本地是否存在Ubuntu鏡像,沒有的話會去官方的registry下載,下載完畢之后利用這個鏡像創(chuàng)建一個新容器。最后告訴鏡像要執(zhí)行什么命令,在這個例子中,我們執(zhí)行了/bin/bash命令,啟動了一個Bash shell。
然后你就可以對這個鏡像做任何自己想做的事情。比如你可以安裝軟件,當所有工作都結(jié)束時,輸入exit,就退出鏡像。
當你退出鏡像時,就會發(fā)現(xiàn)這個鏡像已經(jīng)被關閉了。

而此時你重新
執(zhí)行docker run -i -t ubuntu /bin/bash,那會重新啟動一個鏡像,就會發(fā)現(xiàn)你之前執(zhí)行的命令,安裝的軟件全部沒有了。
--name可以為容器命名,利用命名可以更好地區(qū)分我們的鏡像。
-ddocker會把容器放到后臺運行。
可以利用這個創(chuàng)建一個守護容器。
docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
root@DESKTOP-3JK8RKR:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
60e7fecca197 ubuntu "/bin/sh -c 'while t…" 52 seconds ago Up 52 seconds daemon_dave
可以看到有個容器正在后臺運行。
--restart在容器退出時是否重啟容器。
--restart=always總是重啟容器,不管退出代碼是什么。
--restart=on-failure:5只有退出代碼非0時,才重啟容器,最多重啟5次。
docker start
可以用來啟動一個容器。

然后光啟動這個容器,是沒有進去它的操作界面的。還需要附著到容器上。利用docker attact

可以看到進去了之前的鏡像,安裝的vim命令還在。
docker log
想看容器打印了什么,我們可以通過docker logs來獲取容器的日志。如果用-f參數(shù),還能監(jiān)控docker的日志。加上-t參數(shù),會打印時間戳。

docker top
想看容器的進程。

docker exec
在容器內(nèi)部執(zhí)行命令。
docker exec -d daemon_dave touch /etc/new_config_file
然后我們進去也用exec進去容器里面。
docker exec -t -i daemon_dave /bin/bash

可以看到文件確實被創(chuàng)建了。
docker stop
用stop停止守護進程。

可以看出容器已經(jīng)被停止了。
docker stop是向容器發(fā)送sigterm信號,是比較溫和的關閉方法,如果想快速關閉,可以用docker kill。
docker inspect
可以獲得容器的詳細信息,通過-f可以只看某部分的信息。
docker rm
可以刪除容器,但是需要注意的是,運行中的容器是無法刪除的。
