文章目錄
- 一、docker 概覽
- 二、docker 版本與安裝介紹
- Linux Centos7 環境下安裝 docker
- docker 核心基礎之配置阿里云鏡像加速
- 三、docker 核心技術之鏡像
- 鏡像管理
- 四、docker 核心技術之容器
- 容器的生命周期管理
- 容器的檔案復制與掛載
- 五、docker 核心技術之容器與鏡像
一、docker 概覽
docker 是開發,運行和部署應用程式的開放管理平臺,開發人員能利用 docker 開發和運行應用程式,運維人員能利用 docker 部署和管理應用程式,

docker 提供了在一個完全隔離的環境中打包和運行應用程式的能力,這個隔離的環境被稱為容器,由于容器的隔離性和安全性,因此可以在一個主機 (宿主機) 上同時運行多個相互隔離的容器,互不干預,docker 已經提供工具和組件(Docker Client、Docker Daemon等)來管理容器的生命周期:
- 使用容器來開發應用程式及其支持組件,
- 容器成為分發和測驗你的應用程式的單元,
- 準備好后,將您的應用程式部署到生產環境中,作為容器或協調服務,無論您的生產環境是本地資料中心,云提供商還是兩者的混合,這都是一樣的,
為什么要使用 docker?
docker 使您能夠將應用程式與基礎架構分開,以便您可以快速交付軟體,
- 借助 docker,您可以像管理應用程式一樣管理基礎架構,
- 通過利用 docker 的方法快速進行運輸,測驗和部署代碼,您可以顯著縮短撰寫代碼和在生產環境中運行代碼之間的延遲,如:
- 開發人員在本地撰寫代碼,可以使用 docker 同事進行共享,實作協同作業,
- 使用 docker 開發完成程式,可以直接對應用程式執行自動和手動測驗,
- 當開發人員發現錯誤或 BUG 時,可以直接在開發環境中修復后,并迅速將它們重新部署到測驗環境進行測驗和驗證,
- 利用 docker 開發完成后,交付時,直接交付 docker,也就意味著交付完成,后續如果有提供修補程式或更新,需要推送到生成環境運行起來,也是一樣的簡單,
- docker 主要解決的問題:
- 保證程式運行環境的一致性;
- 降低配置開發環境、生產環境的復雜度和成本;
- 實作程式的快速部署和分發,
docker 整體結構了解
Docker Engine 是一個包含以下組件的客戶端 — 服務端(C/S)應用程式,服務端 — 一個長時間運行的守護行程(Docker Daemon),REST API — 一套用于與 Docker Daemon 通信并指示其執行操作的介面,客戶端 — 命令列介面 CLI( Command Line Interface),

CLI 利用 docker 命令通過 REST API 直接操控 Docker Daemon 執行操作,Docker Daemon 負責創建并管理 Docker 的物件(鏡像、容器、網路、資料卷)

Docker 客戶端 (Docker Client) :是用戶與 docker 進行互動的最主要方式,當在終端輸入docker 命令時,對應的就會在服務端產生對應的作用,并把結果回傳給客戶端,Docker Client 除了連接本地服務端,通過更改或指定 DOCKER_HOST 連接遠程服務端,
Docker 服務端 (Docker Server) :Docker Daemon 其實就是Docker 的服務端,它負責監聽 Docker API 請求(如 Docker Client) 并管理 docker 物件(Docker Objects),如鏡像、容器、網路、資料卷等,
Docker Registries:俗稱 docker 倉庫,專門用于存盤鏡像的云服務環境,Docker Hub 就是一個公有的存放鏡像的地方,類似 Github 存盤代碼檔案,同樣的也可以類似 Github 那樣搭建私有的倉庫,
Docker 物件(Docker Objects)
- 鏡像:一個 docker 的可執行檔案,其中包括運行應用程式所需的所有代碼內容、依賴庫、環境變數和組態檔等,
- 容器:鏡像被運行起來后的實體,
- 網路:外部或者容器間如何互相訪問的網路方式,如 host 模式、bridge 模式,
- 資料卷:容器與宿主機之間、容器與容器之間共享存盤方式,類似虛擬機與主機之間的共享檔案目錄,
docker 底層技術了解
- docker 使用 Go 語言實作,
- docker 利用 linux 內核的幾個特性來實作功能:
利用 linux 的命名空間(Namespaces)、利用 linux 控制組(Control Groups)、利用 linux 的聯合檔案系統(Union File Systems),這也就意味著 docker 只能在 linux 上運行,在Windows、MacOS上運行 docker,其實本質上是借助了虛擬化技術,然后在 linux 虛擬機上運行的 docker 程式, - 容器格式 (Container Format) Docker Engine 將namespace、cgroups、UnionFS 進行組合后的一個package,就是一個容器格式(Container Format),docker 通過對這個 package 中的 namespace、cgroups、UnionFS 進行管理控制實作容器的創建和生命周期管理,容器格式(Container Format)有多種,其中 docker 目前使用的容器格式被稱為 libcontainer,
- Namespaces(命名空間):為 docker 容器提供作業系統層面的隔離,行程號隔離:每一個容器內運行的第一個行程,行程號總是從1開始起算,網路隔離:容器的網路與宿主機或其他容器的網路是隔離的、分開的,也就是相當于兩個網路,行程間通隔離:容器中的行程與宿主機或其他容器中的行程是互相不可見的,通信需要借助網路,檔案系統掛載隔離:容器擁有自己單獨的作業目錄,內核以及系統版本號隔離:容器查看內核版本號或者系統版本號時,查看的是容器的,而非宿主機的,
- Control Groups (控制組-cgroups):為 docker 容器提供硬體層面的隔離,控制組能控制應用程式所使用的硬體資源,基于該性質,控制組幫助 docker 引擎將硬體資源共享給容器使用,并且加以約束和限制,如控制容器所使用的記憶體大小,
- Union File Systems (聯合檔案系統—UnionFS):利用分層(layer)思想管理鏡像和容器,
二、docker 版本與安裝介紹
Docker-CE 和 Docker-EE
Docker-CE 指 docker 社區版,由社區維護和提供技術支持,為免費版本,適合個人開發人員和小團隊使用,Docker-EE 指 docker 企業版,為收費版本,由售后團隊和技術團隊提供技術支持,專為企業開發和 IT 團隊而設計,相比 Docker-CE,增加一些額外功能,更重要的是提供了更安全的保障,此外,docker 的發布版本分為 Stable 版和 Edge 版,區別在于前者是按季度發布的穩定版(發布慢),后者是按月發布的邊緣版(發布快),通常情況下,Docker-CE 足以滿足我們的需求,后面學習主要針對 Docker-CE 進行學習,
Linux Centos7 環境下安裝 docker
安裝環境:Centos 7
安裝條件:docker 官方要求至少 3.8 以上,建議 3.10 以上

docker 版本:docker EE 企業版本、docker CE 社區版本
關閉防火墻:systemctl stop firewalld.service 和 設定 vi /etc/selinux/config

安裝 Docker Ce 社區版本:
- 安裝 wget 命令: yum install -y wget
- 下載阿里云 docker 社區版 yum 源
cd /etc/yum.repos.d/ wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo - 查看 docker 安裝包:yum list | grep docker
- 安裝 Docker Ce 社區版本:yum install -y docker-ce.x86_64
- 設定開機啟動:systemctl enable docker
- 更新 xfsprogs:yum -y update xfsprogs
- 啟動 docker:systemctl start docker
- 查看版本:docker version
- 查看詳細資訊:docker info
docker 核心基礎之配置阿里云鏡像加速
- 點擊 此處 登錄阿里云,復制當前頁面中的加速器地址,
- 選擇操作檔案中的 CentOS 配置鏡像加速器,操作步驟如下:
sudo mkdir -p /etc/docker vi /etc/docker/daemon.json ? { "registry-mirrors": ["自己的加速器地址"]} sudo systemctl daemon-reload sudo systemctl restart docker
三、docker 核心技術之鏡像
鏡像是一個 docker 的可執行檔案,其中包括運行應用程式所需的所有代碼內容、依賴庫、環境變數和組態檔等,通過鏡像可以創建一個或多個容器,
鏡像管理
- 可以通過命令 docker command --help 更深入的了解指定的 docker 命令使用方法,例如:查看鏡像搜索命令的具體用法:docker search --help
- 搜索鏡像: docker search mysql
- 搜索鏡像并過濾是官方的:docker search --filter “is-official=true” centos
- 搜索鏡像并過濾大于多少顆星星的:docker search --filter stars=10 centos
- 搜索鏡像結果只顯示前 5 條: docker search --filter stars=10 centos --limit 5
- 查看本地鏡像:docker images/docker image ls 例如:docker images ubuntu:latest
- 下載 centos7 鏡像:docker pull centos:7
- 鏡像洗掉:docker rmi/docker image rm,-f/--force 強制洗掉,洗掉本地的 centos7 鏡像:docker rmi centos:7,多個鏡像同時洗掉:docker rmi f643 8652
- 鏡像保存備份 docker save,作用:將本地的一個或多個鏡像打包保存成本地 tar 檔案(輸出到STDOUT),-o, --output string 指定寫入的檔案名和路徑,docker save -o linux_images.tar centos
- 鏡像備份匯入 docker load,作用: 將 save 命令打包的鏡像匯入本地鏡像庫中, docker load -i linux_images.tar
- 鏡像重命名 docker tag,作用:對本地鏡像的 NAME、TAG 進行重命名,并新產生一個命名后鏡像,docker tag centos:7 mycentos:1
- 鏡像詳細資訊 docker image inspect/docker inspect,例如:docker image inspect centos:7、docker image inspect -f “{{json .Id}}” centos:7、docker image inspect -f “{{json .Created}}” centos:7,-f, --format string 利用特定 Go 語言的 format 格式輸出結果
- 鏡像歷史資訊 docker history,作用:查看本地一個鏡像的歷史(歷史分層)資訊,例如:docker history centos:7、 docker history centos:7 -H=False

四、docker 核心技術之容器
什么是容器? 容器 (Container):容器是一種輕量級、可移植、并將應用程式進行打包的技術,使應用程式可以在幾乎任何地方以相同的方式運行,docker 將鏡像檔案運行起來后,產生的物件就是容器,容器相當于是鏡像運行起來的一個實體,容器具備一定的生命周期,另外,可以借助 docker ps 命令查看運行的容器,如同在 linux 上利用 ps 命令查看運行著的行程那樣,
容器與虛擬機相同點:
- 容器和虛擬機一樣,都會對物理硬體資源進行共享使用,
- 容器和虛擬機的生命周期比較相似(創建、運行、暫停、關閉等等),
- 容器中或虛擬機中都可以安裝各種應用,如 redis、mysql、nginx 等,也就是說,在容器中的操作,如同在一個虛擬機(作業系統) 中操作一樣,
- 同虛擬機一樣,容器創建后,會存盤在宿主機上:linux 上位于 /var/lib/docker/containers 下
容器與虛擬機不同點:
- 虛擬機的創建、啟動和關閉都是基于一個完整的作業系統,一個虛擬機就是一個完整的作業系統,而容器直接運行在宿主機的內核上,其本質上以一系列行程的結合,
- 容器是輕量級的,虛擬機是重量級的,首先容器不需要額外的資源來管理(不需要 Hypervisor、Guest OS),虛擬機額外更多的性能消耗;其次創建、啟動或關閉容器,如同創建、啟動或者關閉行程那么輕松,而創建、啟動、關閉一個作業系統就沒那么方便了,也因此,意味著在給定的硬體上能運行更多數量的容器,甚至可以直接把 docker 運行在虛擬機上,

注意:容器并不是虛擬機,但它們有很多相似的地方
虛擬機的生命周期:

容器的生命周期:

容器的生命周期管理
(1) 查看本地所有的容器:docker ps -a
(2) 查看本地正在運行的容器:docker ps
(3) 容器創建 docker create:作用:利用鏡像創建出一個 Created 狀態的待啟動容器,命令格式:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
命令引數(OPTIONS):查看更多
-t, --tty 分配一個偽TTY,也就是分配虛擬終端
-i, --interactive 即使沒有連接,也要保持STDIN打開
--name 為容器起名,如果沒有指定將會隨機產生一個名稱
命令引數 (COMMAND\ARG):COMMAND 表示容器啟動后,需要在容器中執行的命令,如 ps、ls 等命令
ARG 表示執行 COMMAND 時需要提供的一些引數,如 ps 命令的 aux、ls 命令的 -a 等等,
命令演示:

(4) 容器洗掉 docker rm CONTAINER_ID/ CONTAINER_NAME,洗掉一個或多個容器
-f, --force 強行洗掉容器(會使用 SIGKILL信號)
-v, --volumes 同時洗掉系結在容器上的資料卷
命令演示:

(5) 容器啟動 docker start,作用:將一個或多個處于創建狀態或關閉狀態的容器啟動起來,命令格式:
docker start [OPTIONS] CONTAINER [CONTAINER...]
命令引數(OPTIONS):
-a, --attach 將當前 shell 的 STDOUT/STDERR 連接到容器上
-i, --interactive 將當前 shell 的 STDIN 連接到容器上
命令演示1:

命令演示2:

(6) 容器創建并啟動 docker run,作用:利用鏡像創建并啟動一個容器,命令格式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 命令引數(OPTIONS):查看更多
-t, --tty:分配一個偽TTY,也就是分配虛擬終端
-i, --interactive:即使沒有連接,也要保持 STDIN 打開
--name:為容器起名,如果沒有指定將會隨機產生一個名稱
-d, --detach:在后臺運行容器并列印出容器 ID
--rm:當容器退出運行后,自動洗掉容器
命令引數 (COMMAND\ARG):
COMMAND 表示容器啟動后,需要在容器中執行的命令,如 ps、ls 等命令
ARG 表示執行 COMMAND 時需要提供的一些引數,如 ps 命令的 aux、ls 命令的 -a 等等
命令演示:

docker run 相當于 docker create + docker start -a 前臺模式
docker run -d 相當于 docker create + docker start 后臺模式
(7) 容器關閉 docker stop,作用:關閉一個或多個處于暫停狀態或者運行狀態的容器,命令格式:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
命令引數(OPTIONS):
-t, --time int 關閉前,等待的時間,單位秒(默認10s)
命令演示:

一次性停止所有容器:docker stop $(docker ps -a -q)
(8) 容器終止 docker kill,作用:強制并立即關閉一個或多個處于暫停狀態或者運行狀態的容器,命令格式:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
命令引數(OPTIONS):
-s, --signal string 指定發送給容器的關閉信號 (默認 KILL 信號)
命令演示:

前提知識點:Linux 其中兩種終止行程的信號是:SIGTERM 和 SIGKILL,SIGKILL信號:無條件終止行程信號,行程接收到該信號會立即終止,不進行清理和暫存作業,該信號不能被忽略、處理和阻塞,它向系統管理員提供了可以殺死任何行程的方法,SIGTERM信號:程式終結信號,可以由 kill 命令產生,與 SIGKILL 不同的是,SIGTERM 信號可以被阻塞和終止,以便程式在退出前可以保存作業或清理臨時檔案等,docker stop 和 docker kill 的區別:
- docker stop 會先發出 SIGTERM 信號給行程,告訴行程即將會被關閉,在 -t 指定的等待時間過了之后,將會立即發出 SIGKILL 信號,直接關閉容器,
- docker kill 直接發出 SIGKILL 信號關閉容器,但也可以通過 -s 引數修改發出的信號,
因此會發現在 docker stop 的等待程序中,如果終止 docker stop 的執行,容器最終沒有被關閉,而 docker kill 幾乎是立刻發生,無法撤銷,此外還有些例外原因也會導致容器被關閉,比如 docker daemon 重啟、容器內部行程運行發生錯誤等等例外原因,
(9) 容器暫停 docker pause,作用:暫停一個或多個處于運行狀態的容器;容器取消暫停 docker unpause,作用:取消一個或多個處于暫停狀態的容器,恢復運行,命令演示如下:

(10) 容器重啟 docker restart,作用:重啟一個或多個處于運行狀態、暫停狀態、關閉狀態或者新建狀態的容器,該命令相當于 stop 和 start 命令的結合,
(11) 查看容器詳細資訊:docker inspect CONTAINER_ID / CONTAINER_NAME
(12) 查看容器的日志資訊:docker logs,容器日志中記錄的是容器主行程的輸出 STDOUT\STDERR
(13) 修改容器的名稱:docker rename CONTAINER NEW_NAME
(14) 容器連接 docker attach,作用:將當前終端的 STDIN、STDOUT、STDERR 系結到正在運行的容器的主行程上實作連接,

(15) 容器中執行新命令 docker exec 進入容器:docker exec -it 0ad5d7b2c3a4 /bin/bash

容器的檔案復制與掛載
- 從宿主機復制到容器:docker cp 宿主機本地路徑 容器名字/ID:容器路徑 docker cp /root/123.txt kind_cerf:/home/
- 從容器復制到宿主機:docker cp 容器名字/ID:容器路徑 宿主機本地路徑 docker cp kind_cerf:/home/456.txt /root
- 宿主機檔案夾掛載到容器里:docker run -itd -v 宿主機路徑:容器路徑 鏡像ID docker run -itd -v /root/xdclass/:/home centos:7
五、docker 核心技術之容器與鏡像
docker 容器與鏡像的關系:

(1) 容器提交 docker commit,作用:根據容器生成一個新的鏡像,命令格式:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
命令引數(OPTIONS):
-a, --author string 作者
-c, --change list 為創建的鏡像加入 Dockerfile 命令
-m, --message string 提交資訊,類似 git commit -m
-p, --pause 提交時暫停容器 (default true)
命令演示如下:
docker ps -a
docker run -dti centos:7 bash
docker exec 629b yum install -y net-tools
docker exec 629b ifconfig
docker ps -a
docker commit -m "install net-tools" 629b centos-net:v1.0
docker images
docker run -dti 6ea0 bash
docker exec be8b ifconfig
(2) 容器匯出 docker export,作用:將容器當前的檔案系統匯出成一個 tar 檔案,docker export [OPTIONS] CONTAINER

-o, --output string 指定寫入的檔案,默認是 STDOUT
(3) 容器打包的匯入 docker import,從一個 tar 檔案中匯入內容創建一個鏡像,docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]],命令演示:

-c, --change list 為創建的鏡像加入 Dockerfile 命令
-m, --message string 匯入時,添加提交資訊
(4) 鏡像的 Layer

鏡像的視角:

(5) 容器的 Layer


容器的視角:

容器與鏡像的底層關系:

容器的運行:


總結:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254520.html
標籤:其他
