1. 程式人生 > 實用技巧 >Docker學習筆記

Docker學習筆記

1、Docker簡介

Docker核心是隔離。各個專案之間獨立執行,不會交叉感染。

將專案和環境打包成映象放到倉庫。

容器化技術不是模擬一個完整的作業系統。

比較Docker和虛擬機器技術的不同:
1、傳統虛擬機器,虛擬出—套硬體,執行一個完整的作業系統,然後在這個系統上安裝和執行軟體,docker有著比虛擬機器更少的抽象層
2、容器內的應用直接執行在宿主機的內容,容器是沒有自己的核心的,也沒有虛擬我們的硬體,所以就輕便了
3、每個容器間是互相隔離的,每個容器內都有一個屬於自己的檔案系統,互不影響。

Docker相當於一個輕量化的虛擬機器。輕巧,高效。

DevOps(開發、運維)
應用更快速的交付和部署


傳統:—堆幫助文件,安裝程式
Docker:打包映象釋出測試,—鍵執行
更便捷的升級和擴縮容
使用了Docker之後,部署應用就和搭積木一樣
專案打包為一個映象,負載均衡,擴充套件伺服器A、伺服器B
更簡單的系統運維
在容器化之後,開發,測試環境都是高度一致的。
更高效的計算資源利用
Docker是核心級別的虛擬化,可以在一個物理機上可以執行很多的容器例項

2、Docker安裝

2.1、組成

映象(image ) :
通過這個映象可以建立多個容器(最終服務執行或者專案執行就是在容器中的)。
容器(container ) :
Docker利用容器技術,獨立執行一個或者一個組應用,通過映象來建立的。

啟動,停止,刪除,基本命令!
目前就可以把這個容器理解為就是一個簡易的linux系統
倉庫(repository ) :
倉庫就是存放映象的地方!
倉庫分為公有倉庫和私有倉庫!
Docker Hub(預設是國外的)
阿里雲.....都有容器伺服器(配置映象加速!)
docker映象就好比是一個模板,可以通過這個模板來建立容器服務,tomcat映象==>run ==> tomcat01容器(提供伺服器),

檢視linux核心和系統的版本號:要求大於3.10

2.2、安裝過程

直接去官網的文件中檢視安裝詳細過程和命令操作

https://docs.docker.com/engine/install/ubuntu/

使用儲存庫安裝

1、更新apt軟體包索引並安裝軟體包以允許apt通過HTTPS使用儲存庫:

$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

2、新增Docker的官方GPG金鑰:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

驗證金鑰 :

$ sudo apt-key fingerprint 0EBFCD88

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <[email protected]>
sub   rsa4096 2017-02-22 [S]

3、設定儲存庫:

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

4、安裝docker引擎和容器:

 $ sudo apt-get update
 $ sudo apt-get install docker-ce docker-ce-cli containerd.io

5、驗證是否安裝Docker Engine成功:

$ sudo docker run hello-world

2.3、解除安裝Docker

1、解除安裝Docker Engine,CLI和Containerd軟體包:

$ sudo apt-get purge docker-ce docker-ce-cli containerd.io

2、刪除映象容器:

$ sudo rm -rf /var/lib/docker

2.4、阿里雲映象加速

登入阿里雲成功後選擇映象加速器,執行以下命令即可:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://c9xycdhd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2.5、run的執行流程

3、Docker命令

3.1、映象命令

1、docker images 顯示主機上的映象, -a顯示所有映象,-q只顯示映象ID

2、docker search mysql 從倉庫搜尋映象

3、docker pull mysql 從倉庫拉取映象,就是下載

預設是下載最新版的mysql,也可指定版本,如 docker pull mysql:5.7

4、docker rmi 刪除映象

docker rmi -f0d64f46acfd1 根據映象的ID刪除映象

docker rmi -f $(docker images -aq) 刪除所有的映象

3.2、容器命令

1、docker run [OPTIONS] image根據映象新建並啟動容器。image是映象ID或映象名稱

常見選項:

-d: 後臺執行容器,並返回容器ID

注意:後臺啟動後若無前臺程序則自動停止

-i:以互動模式執行容器,通常與 -t 同時使用

-t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用

-P:隨機埠對映,容器內部埠隨機對映到主機的埠

-p:指定埠對映

--name="nginx01":為容器指定一個名稱

-h "heheda":指定容器的hostname;

-e username="wangyi":設定環境變數;

-m :設定容器使用記憶體最大值;

2、docker ps 列出所有執行的容器,-a則包括歷史容器

3、退出容器

exit:直接將容器停止並退出

ctrl + P + Q 容器不停止退出

4、刪除容器

docker rm 容器id :刪除容器,不能刪除正在執行的容器,得加-f

docker rm -f $(docker ps -aq) :刪除所有容器

5、啟動和停止容器的操作

docker start 容器id :啟動容器

docker restart 容器id :重啟容器

docker stop 容器id :停止容器

docker kill 容器id :強制停止容器

3.3、其他常用命令

1、檢視日誌

docker logs 選項 容器id

-f:跟蹤日誌輸出

-t:顯示時間戳

--tail N:顯示最新的N條容器日誌

--since="2020-02-02":顯示某個開始時間的所有日誌

2、檢視容器程序資訊

docker top cid

3、檢視映象的源資料

docker inspect 容器id

4、進去當前正在執行的容器

docker exec -it 容器id bash : 進入容器後開啟一個新的終端,可以在裡面操作

docker attach 容器id :進入容器正在執行的終端,不會啟動新的程序。

5、拷貝容器檔案到主機

docker cp Cid:檔案目錄 主機目錄

4、Docker映象目錄

/var/lib/docker/image/overlay2:儲存映象管理資料的目錄,以使用的儲存驅動命名,在我的ubuntu系統上,使用的驅動為overlay2。

repositories.json中記錄了和本地image相關的repository資訊,主要是name和image id的對應關係,當
image從registry上被pull下來後,就會更新該檔案。

在imagedb/content/sha256裡,都是各個映象的配置檔案:

檔名稱就是檔案內容的sha256碼,它的前12位對應的是docker images中的IMAGE ID:

檢視其中的nginx映象配置檔案:

拉到最下方:

在bootfs之上的rootfs層,可以看到這個nginx的image包含了5個layer,從上到下依次是從最底層到最高層。

映象層的元資料都儲存在layerdb中:

注意:

1、映象其實就是一個微型的作業系統,而作業系統由核心空間bootfs和使用者空間rootfs(根檔案系統)組成。映象使用的是宿主機的核心,而rootfs使用者空間就是各種layers層的堆疊。

2、Docker 在 Linux 上支援很多儲存引擎(Snapshotter),如AUFS、Overlay2、Device Mapper、Btrfs 以及 ZFS。顧名思義,每種儲存引擎都基於 Linux 中對應的檔案系統或者塊裝置技術,每個儲存引擎都有自己的映象分層、映象層共享以及寫時複製(CoW)技術的具體實現。

3、映象的各映象層都是隻讀的(read-only layer),而容器層是一個可寫層。在容器中新增資料或者修改現有資料的所有讀寫操作都會儲存在此可寫層中。刪除容器後,可寫層也會被刪除,而基礎映象則保持不變。

4、統一檔案系統(union file system)技術能夠將不同的層整合成一個檔案系統,為這些層提供了一個統一的視角,這樣就隱藏了多層的存在,在使用者的角度看來,只存在一個檔案系統。我們可以在圖片的右邊看到這個視角的形式。

5、docker run是docker create和docker start兩個命令的組合。

問題:

1、到底是docker引擎本身依賴於作業系統核心還是docker映象依賴於作業系統核心?怎麼理解docker映象跨平臺這句話?

5、練習

5.1、部署Nginx

docker search Nginx   搜尋nginx

docker pull Nginx   下載nginx映象

docker run -d --name nginx01 -p 3000:80 nginx   啟動容器,配置主機-容器間的埠對映

在阿里雲的安全組中開放3000埠,訪問:伺服器:3000

5.2、部署Tomcat

docker pull tomcat   下載映象

docker run -d --name tomcat01 -p 3001:8080 tomcat   執行容器

docker exec -it tomcat01 /bin/bash    進入容器

發現webapps裡面是空的,這是因為阿里雲下載的是最小的映象,保證最小可執行環境,剔除了其他的東西。這時外網去訪問的話就啥都看不到,把webapps.dist裡面的資料拷貝到webapps中就可以看見貓了。