docker學習

hhhaaa12138發表於2024-08-31

#docker學習

1 容器簡介

1.1什麼是容器

Linux容器是與系統其他部分隔離開的一系列程序,從另一個映象執行,並由該映象提供支援程序所需的全部文 件。容器提供的映象包含了應用的所有依賴項,因而在從開發到測試再到生產的整個過程中,它都具有可移植性和 一致性。

  • 更加詳細地來說,請您假定您在開發一個應用。您使用的是一臺膝上型電腦,而且您的開發環境具有特定的配置。其他開發人員身處的環境配置可能稍有不同。您正在開發的應用依賴於您當前的配置,還要依賴於某些特定檔案。與此同時,您的企業還擁有標準化的測試和生產環境,且具有自身的配置和一系列支援檔案。您希望儘可能多在本地模擬這些環境,而不產生重新建立伺服器環境的開銷。
  • 因此,您要如何確保應用能夠在這些環境中執行和透過質量檢測,並且在部署過程中不出現令人頭疼的問題,也無需重新編寫程式碼和進行故障修復?答案就是使用容器。容器可以確保您的應用擁有必需的配置和檔案,使得這些應用能夠在從開發到測試、再到生產的整個流程中順利執行,而不出現任何不良問題。這樣可以避免危機,做到皆大歡喜。

雖然這只是簡化的示例,但在需要很高的可移植性、可配置性和隔離的情況下,我們可以利用 Linux 容器透過很多 方式解決難題。無論基礎架構是在企業內部還是在雲端,或者混合使用兩者,容器都能滿足您的需求。

1.2 容器是虛擬化?

容器可以稱之為虛擬化,但也不等同於虛擬化。我們用一種簡單方式來思考一下:

虛擬化使得許多作業系統可同時在單個系統上執行。

容器則可共享同一個作業系統核心,將應用程序與系統其他部分隔離開。

這意味著什麼?首先,讓多個作業系統在單個虛擬機器監控程式上執行以實現虛擬化,並不能達成和使用容器同等的 輕量級效果。事實上,在僅擁有容量有限的有限資源時,您需要能夠可以進行密集部署的輕量級應用。Linux 容器 可從單個作業系統執行,在所有容器中共享該作業系統,因此應用和服務能夠保持輕量級,並行快速執行。

1.3 容器發展簡史

2 什麼是Docker?

是一個開源的應用容器引擎,基於go語言開發並遵循了apache2.0協議開源

  • 是在Linux容器裡執行應用的開源工具

  • 是一種輕量級的"虛擬機器”

  • Docker的容器技術可以在一臺主機 上輕鬆為任何應用建立一個輕量級的、 可移植的、自給自足的容器。

藉助 Docker ,您可將容器當做重量輕、模組化的虛擬機器使用。同時,您還將獲得高度的靈活性,從而實現對容器 的高效建立、部署及複製,並能將其從一個環境順利遷移至另一個環境。

2.1 Docker如何工作?

Docker 是一種容器化平臺,可以將應用程式和它們的依賴項打包成一個輕量級的、可移植的容器,以便在不同的
計算機環境中執行。Docker 的工作原理如下:

  1. Docker使用一個稱為Dockerfile的檔案來定義容器的配置。Dockerfile中包含了應用程式和依賴項的安裝、 環境變數設定、檔案系統設定等指令。
  2. Docker使用Dockerfile來建立一個映象。映象是一個只讀的檔案系統,包含了應用程式和依賴項以及容器運 行所需的所有檔案和設定。每個映象都有一個唯一的識別符號,稱為映象 ID。
  3. 使用映象來建立容器。容器是映象的執行例項,是一個隔離的、可執行的環境。容器中包含了應用程式和依賴 項以及容器執行所需的所有檔案和設定。容器可以在任何 Docker 支援的計算機上執行,並且可以隨時啟動、 停止或刪除。
  4. Docker使用一個稱為Docker引擎的守護程式來管理容器。Docker引擎可以建立、啟動、停止和刪除容器, 還可以監視容器的狀態並提供日誌輸出和統計資訊。

2.2 Docker技術是否與傳統的Linux容器相同?

Docker 技術最初是基於 LXC 技術構建(大多數人都會將這一技術與“傳統的” Linux 容器聯絡在一起),但後來它逐漸擺脫了對這種技術的依賴。

就輕量級虛擬化這一功能來看,LXC 非常有用,但它無法提供出色的開發人員或使用者體驗。除了執行容器之外,Docker 技術還具備其他多項功能,包括簡化用於構建容器、傳輸映象以及控制映象版本的流程。

2.3 Docker的目標

Docker的設計宗旨: Build,Ship and Run Any App, Anywhere, 構建,運輸,處處執行

docker的主要目標是"Build,Ship and Run any App,Angwhere"

構建:做一個docker映象

運輸:docker pull

執行:啟動一個容器

每一個容器,他都有自己的檔案系統rootfs.

即透過對應用元件的封裝、釋出、部署、執行等生命週期的管理,達到應用元件級別的“一次封裝,到處執行"的目 的。

這裡的元件,既可以是一一個應用,也可以是一套服務,甚至是一個完整的作業系統。

傳統的 Linux 容器使用 init 系統來管理多種程序。這意味著,所有應用程式都作為一個整體執行。與此相反, Docker 技術鼓勵應用程式各自獨立執行其程序,並提供相應工具以實現這一功能。這種精細化運作模式自有其優勢。

2.4 容器的特點

容器化越來越受歡迎,因為容器是:

  • 靈活:即使是最複雜的應用也可以集裝箱化。

  • 輕量級:容器利用並共享主機核心。

  • 可互換:可以即時部署更新和升級。

  • 行動式:可以在本地構建,部署到雲,並在任何地方執行。

  • 可擴充套件:可以增加並自動分發容器副本。

  • 可堆疊:可以垂直和即時堆疊服務。

2.5 容器核心技術

docker容器本質就是宿主機的個程序,docker容器是透過namespace實現資源隔離,透過cgroup實現資源限制

透過寫時複製技術(copy-on-write)實現了高效的檔案操作(類似虛擬機器的磁碟比如分配500g並不是實際佔用物理磁 盤500g)

2.6 Docker核心概念

  • 映象

    Docker的映象是建立容器的基礎,類似虛擬機器的快照,可以理解為一個面向Docker容器引擎的只讀模板。 透過映象啟動一個容器,一個映象是一個可執行的包,其中包括執行應用程式所需要的所有內容包含程式碼,執行時 間,庫、環境變數、和配置檔案。 Docker映象也是一個壓縮包,只是這個壓縮包不只是可執行檔案,環境部署指令碼,它還包含了完整的作業系統。 因為大部分的映象都是基於某個作業系統來構建,所以很輕鬆的就可以構建本地和遠端一樣的環境,這也是Docker映象的精髓。

  • 容器

    Docker的容器是從映象建立的執行例項,它可以被啟動、停止和刪除。所建立的每--個容器都是相互隔離、互不可 ⻅,以保證平臺的安全性。 可以把容器看做是一個簡易版的linux環境(包括root使用者許可權、映象空間、使用者空間和網路空間等)和執行在其中的 應用程式。

  • 倉庫

    Docker倉庫是用來集中儲存映象的地方,當建立了自己的映象之後,可以使用push命令將它上傳到公有倉庫 (Public) 或者私有
    倉庫(Private) 。當下次要在另外一臺機器上使用這個映象時,只需從倉庫獲取。

    Docker的映象、容器、日誌等內容全部都預設儲存在/var/lib/docker 目錄下。

    總結

    容器:

    提供在多臺主機上執行應用程式相同的執行環境

    docker:

    是開源的容器引擎,GO語言開發的,是容器裡執行應用的工具,是一個輕量級的虛擬機器 可以利用docker在多臺主機上輕鬆的建立並執行容器 docker容器可以被看作執行在宿主機上的一個程序,容器共享宿主機的核心, 容器間是透過namespace (名稱空間、名稱空間)隔離資源,透過cgroups ( 資源配額)去限制資源

    核心概念

    映象 :執行容器的基礎,包含執行應用程式所需的所有內容.

    容器 :是從映象建立的執行例項

    倉庫 :集中儲存映象的地方(公有倉庫docker hub,私有倉庫harbor )

4 Docker映象相關操作

4.1 搜尋官方倉庫映象

[root@docker01 ~]#  docker search centos

列表說明

引數 說明
NAME 映象名稱
DESCRIPTION 映象說明
STARS 點贊數量
OFFICIAL 是否是官方的
AUTOMATED 是否是自動構建的

4.2 獲取映象

根據映象名稱拉取映象

[root@docker01 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

檢視當前主機映象列表

[root@docker01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              080ed0ed8312        39 hours ago        142MB
centos              latest              5d0da3dc9764        18 months ago       231MB

拉第三方映象方法

 [root@docker01 ~]# docker pull index.tenxcloud.com/tenxcloud/httpd

4.3 映象匯出和匯入

#映象匯出
[root@docker01 ~]# docker save centos > docker-centos.tar.gz
#引數說明
save #儲存映象
centos #映象名稱
#映象匯入
[root@docker01 ~]# docker load -i docker-centos.tar.gz
#引數說明
load #映象匯入
-i #從tar存檔檔案讀取

4.4 刪除映象

[root@docker01 ~]# docker  rmi centos:latest
#引數說明
rmi #刪除映象
centos #映象名稱
latest #映象版本號

4.5 檢視映象的詳細資訊

[root@docker01 ~]# docker inspect centos

5 容器的日常管理

5.1 容器啟動和停止

執行一個最簡單的容器

[root@docker01 ~]# docker run nginx

建立容器兩步走(不常用)

[root@docker01 ~]# docker create centos:latest  /bin/bash
bb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204
[root@docker01 ~]# docker start stupefied_nobel
stupefied_nobel

快速啟動容器方法

[root@docker01 ~]# docker run  centos:latest  /usr/bin/sleep 20;

容器內的第一個程序必須一直處於執行的狀態,否則這個容器,就會處於退出狀態!

檢視正在執行容器

[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
94de8f61a48e        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp   nice_mirzakhani
[root@docker01 ~]# docker container  ls  #不常用可忽略

檢視正在執行容器詳細資訊(包括IP地址)

[root@docker01 ~]# docker inspect docker_name/docker_id
#引數說明
inspect  #檢視容器詳細資訊
docker_name #容器名稱
docker_id  #容器id

檢視所有容器(執行中及未執行)

[root@docker01 ~]# docker ps -a

停止容器

[root@docker01 ~]# docker stop docker_name/docker_id
[root@docker01 ~]# docker container kill docker_name/docker_id #不常用可忽略
#引數說明
stop  #停止容器
docker_name #容器名稱
docker_id  #容器id

5.2 進入容器方法

啟動時進入容器

[root@docker01 ~]# docker run -it 
#引數說明
-it 可互動終端 
[root@docker01 ~]# docker run -it nginx:latest /bin/bash 
root@79241093859e:/#

啟動後進入容器

#啟動一個docker並進入容器(不推薦使用)
[root@docker01 ~]# docker run -it centos:latest
[root@1bf0f43c4d2f /]# ps -ef
UID root root
PID   PPID  C STIME TTY          TIME CMD
  10015:47 pts/000:00:00 /bin/bash
 131015:47 pts/000:00:00 ps -ef
#exec進入容器方法(推薦使用)
[root@docker01 ~]# docker exec -it lucid_williamson /bin/bash
[root@b8bbb2299397 /]# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 14:20 pts/0    00:00:00 /bin/bash
root          14       0  0 14:21 pts/1    00:00:00 /bin/bash
root          27      14  0 14:21 pts/1    00:00:00 ps -ef

退出/離開容器

[root@b8bbb2299397 /]# exit
exit

5.3 刪除一個或多個容器

#刪除一個停止後的容器
[root@docker01 ~]# docker rm docker_name/docker_id
#刪除一個執行中的容器
[root@docker01 ~]# docker rm -f docker_name/docker_id
#引數說明
rm #刪除容器
-f  #強制刪除容器
docker_name #容器名稱
docker_id  #容器id
#刪除多個容器(所有)!!!謹慎操作
[root@docker01 ~]# docker rm -f `docker ps -a -q` 
[root@docker01 ~]# docker ps -qa | xargs docker rm -f

5.4 啟動時進行埠對映

[root@docker01 ~]# docker run -d -p 8888:80  nginx:latest
287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a9
引數:
run #執行
-d  #放入後臺執行
-p #埠對映 
8888 #容器外部埠
80   #容器內部埠

不同指定對映方法

引數 說明
-p hostPort:containerPort 埠對映 -p 8080:80
-p ip:hostPort:containerPort 配置監聽地址 -p 10.0.0.100:8080:80
-p ip::containerPort 隨機分配埠 -p 10.0.0.100::80
-p hostPort:containerPort:udp 指定協議 -p 8080:80:tcp
-p 81:80 –p 443:443 指定多個

相關文章