docker_01

拆尼斯、帕丁顿發表於2024-03-12

1.1 Docker簡介

1.1.1 為什麼會有Docker的出現?

一款產品從開發到上線,從作業系統,到執行環境,再到應用配置。作為開發+運維之間的協作我們需要關心很多東西,這也是很多網際網路公司都不得不面對的問題,特別是各種版本的迭代之後,不同版本環境的相容,對運維人員都是考驗
Docker之所以發展如此迅速,也是因為它對此給出了一個標準化的解決方案。
環境配置如此麻煩,換一臺機器,就要重來一次,費力費時。很多人想到,能不能從根本上解決問題。軟體可以帶環境安裝?1. 也就是說,安裝的時候,把原始環境一模一樣地複製過來。開發人員利用 Docker 可以消除協作編碼時“在我的機器上可正常工作”的問題。

1.1.2 Docker理念

Docker是基於Go語言實現的雲開源專案。
Docker的主要目標是“Build,Ship and Run Any App,Anywhere”,也就是通過對應用元件的封裝、分發、部署、執行等生命週期的管理,使使用者的APP(可以是一個WEB應用或資料庫應用等等)及其執行環境能夠做到“一次封裝,到處執行”。
Linux 容器技術的出現就解決了這樣一個問題,而 Docker 就是在它的基礎上發展過來的。將應用執行在 Docker 容器上面,而 Docker 容器在任何作業系統上都是一致的,這就實現了跨平臺、跨伺服器。只需要一次配置好環境,換到別的機子上就可以一鍵部署好,大大簡化了操作。

總而言之:解決了執行環境和配置問題軟體容器,方便做持續整合並有助於整體釋出的容器虛擬化技術。

1.1.3 Docker or 虛擬機器?

虛擬機器(virtual machine)就是帶環境安裝的一種解決方案。
它可以在一種作業系統裡面執行另一種作業系統,比如在Windows 系統裡面執行Linux 系統。應用程式對此毫無感知,因為虛擬機器看上去跟真實系統一模一樣,而對於底層系統來說,虛擬機器就是一個普通檔案,不需要了就刪掉,對其他部分毫無影響。這類虛擬機器完美的執行了另一套系統,能夠使應用程式,作業系統和硬體三者之間的邏輯不變。 
但是虛擬機器有很多缺點:1.資源佔用多2.冗餘步驟多3.啟動慢

由於前面虛擬機器存在這些缺點,Linux 發展出了另一種虛擬化技術:Linux 容器(Linux Containers,縮寫為 LXC)。
Linux 容器不是模擬一個完整的作業系統,而是對程式進行隔離。有了容器,就可以將軟體執行所需的所有資源打包到一個隔離的容器中。容器與虛擬機器不同,不需要捆綁一整套作業系統,只需要軟體工作所需的庫資源和設定。系統因此而變得高效輕量並保證部署在任何環境中的軟體都能始終如一地執行。
 
比較了 Docker 和傳統虛擬化方式的不同之處:

  • 傳統虛擬機器技術是虛擬出一套硬體後,在其上執行一個完整作業系統,在該系統上再執行所需應用程式;
  • 而容器內的應用程式直接執行於宿主的核心,容器內沒有自己的核心,而且也沒有進行硬體虛擬。因此容器要比傳統虛擬機器更為輕便。
  • 每個容器之間互相隔離,每個容器有自己的檔案系統 ,容器之間程式不會相互影響,能區分計算資源。

對於開發和運維來說Docker的特點:

  • 更快速的應用交付和部署:傳統的應用開發完成後,需要提供一堆安裝程式和配置說明文件,安裝部署後需根據配置文件進行繁雜的配置才能正常執行。Docker化之後只需要交付少量容器映象檔案,在正式生產環境載入映象並執行即可,應用安裝配置在映象裡已經內建好,大大節省部署配置和測試驗證時間。
  • 更便捷的升級和擴縮容:隨著微服務架構和Docker的發展,大量的應用會通過微服務方式架構,應用的開發構建將變成搭樂高積木一樣,每個Docker容器將變成一塊“積木”,應用的升級將變得非常容易。當現有的容器不足以支撐業務處理時,可通過映象執行新的容器進行快速擴容,使應用系統的擴容從原先的天級變成分鐘級甚至秒級。
  • 更簡單的系統運維:應用容器化執行後,生產環境執行的應用可與開發、測試環境的應用高度一致,容器會將應用程式相關的環境和狀態完全封裝起來,不會因為底層基礎架構和作業系統的不一致性給應用帶來影響,產生新的BUG。當出現程式異常時,也可以通過測試環境的相同容器進行快速定位和修復。
  • 更高效的計算資源利用: Docker是核心級虛擬化,其不像傳統的虛擬化技術一樣需要額外的Hypervisor支援,所以在一臺物理機上可以執行很多個容器例項,可大大提升物理伺服器的CPU和記憶體的利用率。

2.1 Docker安裝

安裝地址有兩個:

安裝命令:

$ sudo yum install -y yum-utils

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
These repositories are included in the docker.repo file above but are disabled by default. You can enable them alongside the stable repository. The following command enables the nightly repository.

$ sudo yum-config-manager --enable docker-ce-nightly
To enable the test channel, run the following command:

$ sudo yum-config-manager --enable docker-ce-test
You can disable the nightly or test repository by running the yum-config-manager command with the --disable flag. To re-enable it, use the --enable flag. The following command disables the nightly repository.

$ sudo yum-config-manager --disable docker-ce-nightly

具體方法參考官網:https://docs.docker.com/engine/install/centos/

3.1 Docker基本使用

3.1.1 什麼是映象?

映象是一種輕量級、可執行的獨立軟體包,用來打包軟體執行環境和基於執行環境開發的軟體,它包含執行某個軟體所需的所有內容,包括程式碼、執行時、庫、環境變數和配置檔案。
在Docker打包一個映象的時候會使用一個叫UnionFS(聯合檔案系統)的檔案系統:UnionFS(聯合檔案系統):Union檔案系統(UnionFS)是一種分層、輕量級並且高效能的檔案系統,它支援對檔案系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬檔案系統下(unite several directories into a single virtual filesystem)。Union 檔案系統是 Docker 映象的基礎。映象可以通過分層來進行繼承,基於基礎映象(沒有父映象),可以製作各種具體的應用映象。
特性:一次同時載入多個檔案系統,但從外面看起來,只能看到一個檔案系統,聯合載入會把各層檔案系統疊加起來,這樣最終的檔案系統會包含所有底層的檔案和目錄。

3.1.2 Docker映象載入原理

Docker映象載入原理:
docker的映象實際上由一層一層的檔案系統組成,這種層級的檔案系統UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導載入kernel, Linux剛啟動時會載入bootfs檔案系統,在Docker映象的最底層是bootfs。這一層與我們典型的Linux/Unix系統是一樣的,包含boot載入器和核心。當boot載入完成之後整個核心就都在記憶體中了,此時記憶體的使用權已由bootfs轉交給核心,此時系統也會解除安裝bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和檔案。rootfs就是各種不同的作業系統發行版,比如Ubuntu,Centos等等。

平時我們安裝進虛擬機器的CentOS都是好幾個G,為什麼docker這裡才200M??
對於一個精簡的OS,rootfs可以很小,只需要包括最基本的命令、工具和程式庫就可以了,因為底層直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可見對於不同的linux發行版, bootfs基本是一致的, rootfs會有差別, 因此不同的發行版可以公用bootfs。

分層的映象:以我們的pull為例,在下載的過程中我們可以看到docker的映象好像是在一層一層的在下載.

為什麼 Docker 映象要採用這種分層結構呢?
最大的一個好處就是 - 共享資源
 
比如:有多個映象都從相同的 base 映象構建而來,那麼宿主機只需在磁碟上儲存一份base映象,
同時記憶體中也只需載入一份 base 映象,就可以為所有容器服務了。而且映象的每一層都可以被共享。

3.1.3 常用命令

1.幫助命令:

  • docker version
  • docker info
  • docker --help

2.映象命令:

  • docker images OPTIONS說明:-a :列出本地所有的映象(含中間映像層)-q :只顯示映象ID --digests :顯示映象的摘要資訊 --no-trunc :顯示完整的映象資訊。

  • docker search 某個XXX映象名字 OPTIONS說明:--no-trunc : 顯示完整的映象描述 -s : 列出收藏數不小於指定值的映象 --automated : 只列出 automated build型別的映象;

  • docker pull 某個XXX映象名字

  • docker rmi 某個XXX映象名字ID 刪除映象
    3.容器命令:

  • 新建並啟動容器:
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    OPTIONS說明(常用):有些是一個減號,有些是兩個減號
     
    --name="容器新名字": 為容器指定一個名稱;
    -d: 後臺執行容器,並返回容器ID,也即啟動守護式容器;
    -i:以互動模式執行容器,通常與 -t 同時使用;
    -t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
    -P: 隨機埠對映;
    -p: 指定埠對映,有以下四種格式
          ip:hostPort:containerPort
          ip::containerPort
          hostPort:containerPort
          containerPort

  • 列出當前所有正在執行的容器
    docker ps [OPTIONS]
    OPTIONS說明(常用):
     
    -a :列出當前所有正在執行的容器+歷史上執行過的
    -l :顯示最近建立的容器。
    -n:顯示最近n個建立的容器。
    -q :靜默模式,只顯示容器編號。
    --no-trunc :不截斷輸出。

  • 退出容器
    exit:容器停止退出。 ctrl+P+Q:容器不停止退出

  • 啟動容器
    docker start 容器ID或者容器名

  • 重啟容器
    docker restart 容器ID或者容器名

  • 停止容器
    docker stop 容器ID或者容器名

  • 強制停止容器
    docker kill 容器ID或者容器名

  • 刪除已停止的容器
    docker rm 容器ID(一次性刪除多個容器:1.docker rm -f $(docker ps -a -q)2.docker ps -a -q | xargs docker rm)

4.1 重要知識點

1.關於docker ps -a命令它不會列出你後臺啟動的程式也就是說你用守護程式方式啟動容器的話:docker run -d 容器名是不會被ps出來的。
這個是docker的機制問題,比如你的web容器,我們以nginx為例,正常情況下,我們配置啟動服務只需要啟動響應的service即可。例如service nginx start但是,這樣做,nginx為後臺程式模式執行,就導致docker前臺沒有執行的應用,這樣的容器後臺啟動後,會立即自殺因為他覺得他沒事可做了.所以,最佳的解決方案是,將你要執行的程式以前臺程式的形式執行。
2.如何重新進入已經啟動的容器
有兩個法子:

  • docker exec -it 容器ID bashShell
  • docker attach 容器ID

上述兩個區別:

  • attach 直接進入容器啟動命令的終端,不會啟動新的程式
  • exec 是在容器中開啟新的終端,並且可以啟動新的程式
    3.從容器內拷貝檔案到主機上
    docker cp 容器ID:容器內路徑 目的主機路徑。

相關文章