Docker奪命連環15問,你能堅持第幾問?

wddwr7307914發表於2022-07-02


## ⛳️ 1.什麼是Docker?

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/d1d64446b6c24272af450ba6ad20ee87.png)


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

? Docker 是在Linux 容器裡執行應用的開源工具,是一種輕量級的“虛擬機器”

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

也可以這樣形象的比喻:

<font color="#DC143C" size="3" font-weight:bold>Docker 的Logo設計為藍色鯨魚,拖著許多集裝箱,鯨魚可以看作為宿主機,集裝箱可以理解為相互隔離的容器,每個集裝箱中都包含自己的應用程式。 </font> 


## ⛳️ 2.Docker的應用場景有哪些?

>Web 應用的自動化打包和釋出。

自動化測試和持續整合、釋出。

在服務型環境中部署和調整資料庫或其他的後臺應用。

從頭編譯或者擴充套件現有的 OpenShift 或 Cloud Foundry 平臺來搭建自己的 PaaS 環境。


??? 在這裡我重點介紹下Docker作為內部開發環境的場景

>在容器技術出現之前,公司往往是透過為每個開發人員提供一臺或者多臺虛擬機器來充當開發測試環境。

開發測試環境一般負載較低,大量的系統資源都被浪費在虛擬機器本身的程式上了。

Docker容器沒有任何CPU和記憶體上的額外開銷,很適合用來提供公司內部的開發測試環境。

而且由於docker映象可以很方便的在公司內部分享,這對開發環境的規範性也有極大的幫助。

如果要把容器作為開發機使用,需要解決的是遠端登入容器和容器內程式管理問題。

雖然docker的初衷是為“微服務”架構設計的,但根據我們的實際使用經驗,

在docker內執行多個程式,甚至sshd或者upstart也是可行的。


## ⛳️ 3.Docker的優點有哪些?

容器化越來越受歡迎,Docker的容器有點總結如下:

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

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

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

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

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

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


![在這裡插入圖片描述](https://img-blog.csdnimg.cn/b694f003ed8149a19c1c5b1f7ca94b84.png)


>Docker 是一個用於開發,交付和執行應用程式的開放平臺。Docker 使您能夠將應用程式與基礎架構分開,從而可以快速交付軟體。藉助 Docker,您可以與管理應用程式相同的方式來管理基礎架構。透過利用 Docker 的方法來快速交付,測試和部署程式碼,您可以大大減少編寫程式碼和在生產環境中執行程式碼之間的延遲。



## ⛳️ 4.Docker與虛擬機器的區別是什麼?


>虛擬機器透過新增Hypervisor層(虛擬化中間層),虛擬出網路卡、記憶體、CPU等虛擬硬體,再在其上建立虛擬機器,每個虛擬機器都有自己的系統核心。而Docker容器則是透過隔離(namesapce)的方式,將檔案系統、程式、裝置、網路等資源進行隔離,再對許可權、CPU資源等進行控制(cgroup),最終讓容器之間互不影響,容器無法影響宿主機。

>與虛擬機器相比,容器資源損耗要少。同樣的宿主機下,能夠建立容器的數量要比虛擬機器多

但是,虛擬機器的安全性要比容器稍好,<font color="#DC143C" size="3" font-weight:bold>而docker容器與宿主機共享核心、檔案系統等資源,更有可能對其他容器、宿主機產生影響。 </font> 


![在這裡插入圖片描述](https://img-blog.csdnimg.cn/a773db41129944ecab4f43b045311410.png)

## ⛳️ 5.Docker的三大核心是什麼?


??? 映象

>Docker的映象是建立容器的基礎,類似虛擬機器的快照,可以理解為一個面向Docker容器引擎的只讀模板。

透過映象啟動一個容器,一個映象是一個可執行的包,其中包括執行應用程式所需要的所有內容包含程式碼,執行時間,庫、環境變數、和配置檔案。

Docker映象也是一個壓縮包,只是這個壓縮包不只是可執行檔案,環境部署指令碼,它還包含了完整的作業系統。因為大部分的映象都是基於某個作業系統來構建,所以很輕鬆的就可以構建本地和遠端一樣的環境,這也是Docker映象的精髓。


??? 容器

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


??? 倉庫

>倉庫註冊伺服器上往往存放著多個倉庫,每個倉庫中包含了多個映象,每個映象有不同標籤(tag)。

倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。

最大的公開倉庫是 Docker Hub:,存放了數量龐大的映象供使用者下載。

國內的公開倉庫包括阿里雲 、網易雲等。


## ⛳️ 6.如何快速安裝Docker?

>執行以下安裝命令去安裝依賴包

yum install -y yum-utils device-mapper-persistent-data lvm2

sudo yum-config-manager \

--add-repo \

[root@centos7 ~] yum -y install docker-ce docker-ce-cli containerd.io

[root@centos7 ~]# docker ps  --檢視docker


![在這裡插入圖片描述](https://img-blog.csdnimg.cn/6a2b5382e1a44ed2b39b49c57d7a840d.png)


>[root@centos7 ~]# systemctl enable docker

[root@centos7 ~]# systemctl start docker

[root@centos7 ~]# systemctl status docker

[root@centos7 ~]# docker ps   --檢視容器

[root@centos7 ~]# docker version  --檢視版本

[root@centos7 ~]# docker info  --檢視版本



## ⛳️ 7.如何修改Docker的儲存位置?

>預設情況下 Docker的存放位置為:/var/lib/docker

可以透過命令檢視具體位置:docker info | grep "Docker Root Dir"


??? 修改到其它目錄

>首先停掉 Docker 服務:

systemctl stop docker

然後移動整個/var/lib/docker 目錄到目的路徑

mkdir -p /root/data/docker

mv /var/lib/docker /root/data/docker

ln -s /root/data/docker /var/lib/docker   --快捷方式



## ⛳️ 8.Docker映象常用管理有哪些?


>??? 快速檢索映象

>格式: docker search 關鍵字

>??? 獲取映象

>格式: docker   pull   倉庫名稱[:標籤]

如果下載映象時不指定標籤,則預設會下載倉庫中最新版本的映象,即選擇標籤為 latest 標籤

??? 檢視映象資訊

映象下載後預設存放在 /var/lib/docker

? REPOSITORY: 映象所屬倉庫

? TAG: 映象的標籤資訊,標記同一個倉庫中的不同映象

? IMAGE ID :映象的唯一ID號,唯一標識一個映象

? CREATED:  映象建立時間

? SIZE: 映象大小


![在這裡插入圖片描述](https://img-blog.csdnimg.cn/eda87841fa714aa2997cc9a2a64fff0e.png)

>??? 獲取映象的詳細資訊

格式: docker   inspect   映象ID號

映象ID 號可以不用打全。


![在這裡插入圖片描述](https://img-blog.csdnimg.cn/1ac1a933ede74038a05e341f6d6c7fe7.png)

>???為本地映象新增新的標籤

>格式: docker   tag  名稱:[ 標籤]

??? 刪除映象

格式1: docker   rmi   倉庫名稱:標籤

當一個映象有多個標籤時,只是刪除其中指定的標籤

格式2: docker   rmi  映象ID  [-f]

<font color="#DC143C" size="3" font-weight:bold>如果該映象已經被容器使用,正確的做法是先刪除依賴該映象的所有容器,再去刪除映象 </font> 

??? 將映象儲存為本地檔案

格式: docker   save   -o  儲存檔名   儲存的映象

[root@localhost ~]# docker save -o  /opt/nginx.tar nginx:latest

#將本地映象傳給另一臺主機

[root@localhost ~]# scp /opt/nginx.tar 192.168.1.54:/opt



## ⛳️ 9.如何建立Docker容器?


```bash

#docker images   --映象

docker run -d --name centos7.8 -h centos7.8 \

-p 220:22 -p 3387:3389 \

--privileged=true \

centos:7.8.2003 /usr/sbin/init


#我想擁有一個 linux 8.2 的環境

docker run -d --name centos8.2 -h centos8.2 \

-p 230:22 -p 3386:3389 \

--privileged=true \

daocloud.io/library/centos:8.2.2004 init


# 進入容器

docker exec -it centos7.8bash

docker exec -it centos8.2 bash

cat /etc/redhat-release    --檢視系統版本


```


## ⛳️ 10.Docker在後臺的標準執行過程是什麼?

>當利用 docker run 來建立容器時, Docker 在後臺的標準執行過程是:

? 檢查本地是否存在指定的映象。當映象不存在時,會從公有倉庫下載;

? 利用映象建立並啟動一個容器;

? 分配一個檔案系統給容器,在只讀的映象層外面掛載一層可讀寫層;

? 從宿主主機配置的網橋介面中橋接一個虛擬機器介面到容器中;

? 分配一個地址池中的 IP 地址給容器;

? 執行使用者指定的應用程式,執行完畢後容器被終止執行。



## ⛳️ 11.Docker網路模式有哪些?

??? host模式

>host 模式 : 使用 --net=host 指定

相當於VMware 中的橋接模式,與宿主機在同一個網路中,但是沒有獨立IP地址

Docker 使用了Linux 的Namespace 技術來進行資源隔離,如PID Namespace隔離程式,Mount Namespace隔離檔案系統,Network Namespace 隔離網路等。

一個Network Namespace 提供了一份獨立的網路環境,包括網路卡,路由,iptable 規則等都與其他Network Namespace 隔離。

一個Docker 容器一般會分配一個獨立的Network Namespace

但是如果啟動容器的時候使用host 模式,那麼這個容器將不會獲得一個獨立的Network Namespace ,而是和宿主機共用一個Network Namespace 。容器將不會虛擬出自己的網路卡,配置自己的IP等,而是使用宿主機的IP和埠.此時容器不再擁有隔離的、獨立的網路棧。不擁有所有埠資源


![在這裡插入圖片描述](https://img-blog.csdnimg.cn/f4d1751834a74dd1971215c8d6a8b9f1.png)

??? container模式

>container模式: 使用–net=contatiner:NAME_or_ID 指定

這個模式指定新建立的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。**新建立的容器不會建立自己的網路卡,配置自己的IP,而是和一個指定的容器共享IP,埠範圍等。**可以在一定程度上節省網路資源,容器內部依然不會擁有所有埠。

同樣,兩個容器除了網路方面,其他的如檔案系統,程式列表等還是隔離的。

兩個容器的程式可以透過lo網路卡裝置通訊

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/4e63b0d4ed2a47548f3a33d15f88797a.png)

??? none 模式

>none模式:使用 --net=none指定

使用none 模式,docker 容器有自己的network Namespace ,但是並不為Docker 容器進行任何網路配置。也就是說,這個Docker 容器沒有網路卡,ip, 路由等資訊。

這種網路模式下,容器只有lo 迴環網路,沒有其他網路卡。

這種型別沒有辦法聯網,但是封閉的網路能很好的保證容器的安全性

該容器將完全獨立於網路,使用者可以根據需要為容器新增網路卡。此模式擁有所有埠。(none網路模式配置網路)特殊情況下才會用到,一般不用


??? bridge 模式

>相當於Vmware中的 nat 模式,容器使用獨立network Namespace,並連線到docker0虛擬網路卡。透過docker0網橋以及iptables nat表配置與宿主機通訊,此模式會為每一個容器分配Network Namespace、設定IP等,並將一個主機上的 Docker 容器連線到一個虛擬網橋上。

當Docker程式啟動時,會在主機上建立一個名為docker0的虛擬網橋,此主機上啟動的Docker容器會連線到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就透過交換機連在了一個二層網路中。

從docker0子網中分配一個IP給容器使用,並設定docker0的IP地址為容器的預設閘道器。在主機上建立一對虛擬網路卡veth pair裝置。veth裝置總是成對出現的,它們組成了一個資料的通道,資料從一個裝置進入,就會從另一個裝置出來。因此,veth裝置常用來連線兩個網路裝置。

Docker將veth pair 裝置的一端放在新建立的容器中,並命名為eth0(容器的網路卡),另一端放在主機中, 以veth*這樣類似的名字命名,並將這個網路裝置加入到docker0網橋中。可以透過 brctl show 命令檢視。

容器之間透過veth pair進行訪問

使用 docker run -p 時,docker實際是在iptables做了DNAT規則,實現埠轉發功能。

可以使用iptables -t nat -vnL 檢視。


![在這裡插入圖片描述](https://img-blog.csdnimg.cn/962a60efc8074920b32f7fae121b9f2f.png)

## ⛳️ 12.什麼是Docker的資料卷

>資料卷是一個供容器使用的特殊目錄,位於容器中。可將宿主機的目錄掛載到資料捲上,對資料卷的修改操作立刻可見,並且更新資料不會影響映象,從而實現資料在宿主機與容器之間的遷移。資料卷的使用類似於Linux下對目錄進行的mount操作。

如果需要在容器之間共享一些資料,最簡單的方法就是使用資料卷容器。資料卷容器是一個普通的容器,專門提供資料卷給其他容器掛載使用。

容器互聯是透過容器的名稱在容器間建立一條專門的網路通訊隧道。簡單點說,就是會在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的資訊


## ⛳️ 13.如何搭建Docker私有倉庫


```bash

1.拉取私有倉庫映象

[root@jeames ~]# docker pull registry

Using default tag: latest



2.啟動私有倉庫容器

docker run -di --name registry -p 5000:5000 registry

docker update --restart=always registry   --開機自啟動

docker ps -a  --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"



 訪問網址:http://192.168.1.54:5000/v2/_catalog

3.設定信任

[root@jeames ~]# vi /etc/docker/daemon.json

{

"registry-mirrors":["],

"insecure-registries":["192.168.1.54:5000"]

}


[root@jeames ~]# systemctl restart docker   --重啟docker


4.上傳本地映象

[root@jeames ~]# docker images

[root@jeames ~]# docker tag postgres:11 192.168.1.54:5000/postgres




[root@jeames ~]# docker push 192.168.1.54:5000/postgres



5.重新拉取映象

[root@jeames ~]# docker rmi 192.168.1.54:5000/postgres

[root@jeames ~]# docker images

[root@jeames ~]# docker pull 192.168.1.54:5000/postgres

```


## ⛳️ 14.Docker如何遷移備份?


```bash

1.容器儲存為映象

[root@jeames ~]# docker images

[root@jeames ~]# docker ps -a

docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"

[root@jeames ~]# docker commit redis myredis

##使用新的映象建立容器

docker run -di --name myredis myredis

2.映象的備份

[root@jeames ~]# docker save -o myredis.tar myredis

預設放到當前目錄

[root@jeames ~]# ll

[root@jeames ~]# pwd

3.恢復過程

##刪除容器

docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"

docker stop myredis

docker rm myredis

##刪除映象

docker images

docker rmi myredis

[root@jeames ~]# docker load -i myredis.tar

```

## ⛳️ 15. Docker如何部署MySQL?


```bash

1.下載映象

/ 中搜尋mysql

[root@jeames ~]# docker pull mysql:5.7.30

[root@jeames ~]# docker pull mysql:8.0.20

2.安裝部署

2.1 建立容器

mkdir -p /usr/local/mysql5730/

mkdir -p /usr/local/mysql8020/


docker run -d --name mysql5730 -h mysql5730 \

-p 3309:3306 \

-v /usr/local/mysql5730/conf:/etc/mysql/conf.d \

-e MYSQL_ROOT_PASSWORD=root -e TZ=Asia/Shanghai \

mysql:5.7.30


docker run -d --name mysql8020 -h mysql8020 \

-p 3310:3306 \

-v /usr/local/mysql8020/conf:/etc/mysql/conf.d \

-e MYSQL_ROOT_PASSWORD=root -e TZ=Asia/Shanghai \

mysql:8.0.20


2.2 訪問Mysql

##登陸容器

docker exec -it mysql5730 bash

mysql -uroot -proot

mysql> select user,host from mysql.user


##遠端訪問

mysql -uroot -proot -h192.168.59.220 -P3309

```


![在這裡插入圖片描述](https://img-blog.csdnimg.cn/f97bf2c0757644da889f8baa2390c754.gif#pic_center)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69947868/viewspace-2903987/,如需轉載,請註明出處,否則將追究法律責任。

相關文章