#docker學習
1 容器簡介
1.1什麼是容器
Linux容器是與系統其他部分隔離開的一系列程序,從另一個映象執行,並由該映象提供支援程序所需的全部文 件。容器提供的映象包含了應用的所有依賴項,因而在從開發到測試再到生產的整個過程中,它都具有可移植性和 一致性。
- 更加詳細地來說,請您假定您在開發一個應用。您使用的是一臺膝上型電腦,而且您的開發環境具有特定的配置。其他開發人員身處的環境配置可能稍有不同。您正在開發的應用依賴於您當前的配置,還要依賴於某些特定檔案。與此同時,您的企業還擁有標準化的測試和生產環境,且具有自身的配置和一系列支援檔案。您希望儘可能多在本地模擬這些環境,而不產生重新建立伺服器環境的開銷。
- 因此,您要如何確保應用能夠在這些環境中執行和透過質量檢測,並且在部署過程中不出現令人頭疼的問題,也無需重新編寫程式碼和進行故障修復?答案就是使用容器。容器可以確保您的應用擁有必需的配置和檔案,使得這些應用能夠在從開發到測試、再到生產的整個流程中順利執行,而不出現任何不良問題。這樣可以避免危機,做到皆大歡喜。
雖然這只是簡化的示例,但在需要很高的可移植性、可配置性和隔離的情況下,我們可以利用 Linux 容器透過很多 方式解決難題。無論基礎架構是在企業內部還是在雲端,或者混合使用兩者,容器都能滿足您的需求。
1.2 容器是虛擬化?
容器可以稱之為虛擬化,但也不等同於虛擬化。我們用一種簡單方式來思考一下:
虛擬化使得許多作業系統可同時在單個系統上執行。
容器則可共享同一個作業系統核心,將應用程序與系統其他部分隔離開。
這意味著什麼?首先,讓多個作業系統在單個虛擬機器監控程式上執行以實現虛擬化,並不能達成和使用容器同等的 輕量級效果。事實上,在僅擁有容量有限的有限資源時,您需要能夠可以進行密集部署的輕量級應用。Linux 容器 可從單個作業系統執行,在所有容器中共享該作業系統,因此應用和服務能夠保持輕量級,並行快速執行。
1.3 容器發展簡史
2 什麼是Docker?
是一個開源的應用容器引擎,基於go語言開發並遵循了apache2.0協議開源
-
是在Linux容器裡執行應用的開源工具
-
是一種輕量級的"虛擬機器”
-
Docker的容器技術可以在一臺主機 上輕鬆為任何應用建立一個輕量級的、 可移植的、自給自足的容器。
藉助 Docker ,您可將容器當做重量輕、模組化的虛擬機器使用。同時,您還將獲得高度的靈活性,從而實現對容器 的高效建立、部署及複製,並能將其從一個環境順利遷移至另一個環境。
2.1 Docker如何工作?
Docker 是一種容器化平臺,可以將應用程式和它們的依賴項打包成一個輕量級的、可移植的容器,以便在不同的
計算機環境中執行。Docker 的工作原理如下:
- Docker使用一個稱為Dockerfile的檔案來定義容器的配置。Dockerfile中包含了應用程式和依賴項的安裝、 環境變數設定、檔案系統設定等指令。
- Docker使用Dockerfile來建立一個映象。映象是一個只讀的檔案系統,包含了應用程式和依賴項以及容器運 行所需的所有檔案和設定。每個映象都有一個唯一的識別符號,稱為映象 ID。
- 使用映象來建立容器。容器是映象的執行例項,是一個隔離的、可執行的環境。容器中包含了應用程式和依賴 項以及容器執行所需的所有檔案和設定。容器可以在任何 Docker 支援的計算機上執行,並且可以隨時啟動、 停止或刪除。
- 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 | 指定多個 |