Docker基础(一)
目錄
一、Docker
1.簡介
2.Docker與虛擬機的區別
3.Docker底層原理
①名稱空間(namespaces)
②系統資源管理(cgroups)
4.Docker的優勢
5.Docker的使用場景
6.Docker三要素
7.Docker引擎
二、Docker的架構
1.Docker使用的是客戶端-服務端的架構
2.Docker 三大組件
三、控制組
四、部署20版Docker
1.安裝Docker
①環境配置
②安裝依賴包
③安裝docker-ce社區版
④開啟docker
2.設置鏡像加速
3.網絡優化
4.docker-server端配置文件
5.查看
①查看docker版本
②顯示docker的系統信息,內核、鏡像數、容器數等
③查看容器資源
五、Docker鏡像操作
1.運行鏡像
2.搜索鏡像-search
3.下載鏡像-pull
4.查看鏡像/容器
5.查看當前docker下的鏡像詳細信息
6.添加鏡像標簽
7.刪除鏡像
8.鏡像導出
六、Docker相關操作
1.查詢容器
2.刪除容器
3.啟動運行容器
①創建容器
②啟動容器
③啟動一次性容器
④持續后臺運行
4.停止容器
5.進入、退出容器
①使用run
②使用exec(容器必須為開啟狀態)
③退出容器
6.容器導入導出
①導出
②導入
七、Docker網絡模式
1.Host模式
2.Container模式
3.None模式
4.Bridge模式
5.Docker自定義網絡
①查看網絡列表
②查看容器IP
③自定義網絡固定IP
④網絡模式內加入指定的IP地址
6.暴露端口
①指定端口
②隨機端口
八、Docker數據卷
1.容器文件復制
2.添加Linux系統命令到容器里
3.免交互在容器進行操作
4.數據卷
5.數據卷容器
①數據卷
②新容器掛載web1
③測試
6.容器互聯(使用centos鏡像)
一、Docker
1.簡介
Docker相當于虛擬機Vmware Workstation,只不過虛擬機Vmware Workstation工作在Windows下,而Docker工作在Linux下。
Docker相當于一個瓶子,里面裝著飲料,服務就相當于飲料,Docker就是裝著不同的飲料,把飲料相互分開不會串味,就是說docker把多個服務互相隔離開來,互不影響。
Docker是基于容器技術的輕量級虛擬化的解決方案。相當于把Linux的資源管理模塊(cgroup)、名稱空間(namespaces)等容器底層技術進行完美封裝、并抽象的為用戶提供創建和管理的便捷界面(C/S)
Docker是一個用于開發,交付和運行應用程序的開放平臺。Docker使您能夠將應用程序與基礎架構分開,從而可以快速交付軟件。
是一個開源的應用容器引擎,讓開發者可以打包方式封裝應用以及依賴包到一個可移植的銳像中,然后發布到任何流行的Linux或者windows機器上,也可以實現虛擬化。容器是完全使用沙箱機制(隔離機制),相互之間不會有任何接口
2.Docker與虛擬機的區別
虛擬機是在操作系統上進行隔離,而docker是在應用上進行隔離
不同點????????????????? container??????????????????????????? ?????? ?????? VM
啟動速度????????????? 秒級(進程控制)????????????? ????????????? 分鐘級(來賓操作系統管理)
運行性能????????????? 接近原生(直接在內核中運行90%) 50%左右損失
磁盤占用????????????? MB?????????????????????????????????????????????????? GB(操作系統鏡像2G)
數量???????????????????? 成百上千(進程)??????????????????????????? 一般幾十臺(操作系統級別)
隔離性????????????????? 進程級別????????????????????????????????????????? 系統級別(更徹底)
操作系統????????????? 主要支持Linux(只需要支持引擎)? 幾乎所有(吃宿主機操作系統的支持)
封裝程度????????????? 只打包項目代碼和依賴關系,共
享宿主機內核?????? ???????????????????? ?????? 完整的操作系統,與宿主機隔離
3.Docker底層原理
①名稱空間(namespaces)
隔離了6個名稱空間
mount?????????? 文件系統、掛載點(一個文件系統內不能重復掛載一個指定目錄)
user?????????????? 操作進程的用戶和用戶組(一個文件系統內不能有重復的用戶和用戶組)
pid??????????????? 進程編號(一個文件系統內每個進程的進程不能重復)
uts???????????????? 主機名和主機域(一個文件系統內主機名不能重復)
ipc???????????????? 信號量、消息隊列、共享內存(不同應用之間不能調用相同的內存空間)
net??????????????? 網絡設備、端口、網絡協議棧等(應用之間端口不能一樣)
②系統資源管理(cgroups)
mount命名空間:管理文件系統掛載點
pid命名空間:???? 進程隔離
uts命名空間:???? 隔離內核和版本標識符
ipc命名空間:????? 管理訪問ipc資源(ipc:進程間通信)
net命名空間:???? 管理網絡接口
4.Docker的優勢
①dockerdocker引擎統一了基礎設施環境-docker環境—》image—》封裝一個簡易的操作系統(3.0+G )
②docker引擎統一了程序打包(裝箱/封裝-類比于集裝箱)方式-docker鏡像—》images
③docker引擎統一了程序部署(運行)方式-docker容器——》基于鏡像-》運行為容器(可運行的環境)
實現了一次構建,多次、多處使用
5.Docker的使用場景
K8S image鏡像+container容器的方式
war jar ——》github gitlab 私有倉庫(代碼倉庫)—》jenkins(測試)(應用程序封裝/構建鏡像)—》運維下載,使用容器技術進行運行/發布
①打包應用程序簡單部署
②可脫離底層硬件任意遷移(實現了應用的隔離,將應用拆分并進行解耦),例如:服務器從騰訊云遷移到阿里云
③持續集成和持續交付(Ci/CD) :開發到測試發布
④部署微服務
⑤提供PAAS產品(平臺即服務){OpenStack的云主機類似于阿里云的ECS,屬于IAAS;Docker (K8S)屬于PAAS
6.Docker三要素
①鏡像——》模板
②容器——》基于鏡像,運行狀態/運行時狀態
③倉庫——》存放鏡像模板
7.Docker引擎
Docker Engine時具有以下主要組件的C/S客戶端-服務器應用程序:
server端:服務器是一種長期運行的程序,稱為守護程序進程(docker命令)
clinet端:rest api,它指定程序可以用來與守護進程進行通信并指示其操作的接口
命令行界面(CLI)客戶端(docker命令)
docker run??????????? 運行
docker start????????? 開啟
docker rm???????????? 刪除
二、Docker的架構
1.Docker使用的是客戶端-服務端的架構
Docker客戶端與Docker守護進程進行對話,該守護進程完成了構建,運行和發布Docker容器的繁重工作。
Docker區別于傳統的虛擬化,不需要虛擬硬件資源,直接使用容器引擎,所以速度快
Docker Client:客戶端/提供一個與用戶交互,展示的平臺+管理、控制docker服務端(功能)的工具docker
Docker客戶端(docker):是許多Docker用戶與Docker交互的主要方式。當使用諸如之類的命令時docker run,客戶端會將這些命令發送到dockerd,以執行這些命令。該docker命令使用docker api。Docker客戶端可以與多個守護程序通信。
Docker daemon:守護進程。Docker守護程序(docker)偵聽Docker api請求并管理Docker對象,例如圖像,容器,網絡和卷。守護進程還可以與其他守護程序通信以管理Docker服務。
Docker images:鏡像
Docker container:容器
Docker registry:鏡像倉庫(yum倉庫)
儲存鏡像的地方,默認在公共的Docker Hub上查找,可以搞個人倉庫(registry harbor)
2.Docker 三大組件
鏡像:一組資源集合,包含了應用程序軟件包、應用程序相關的依賴包、運行應用程序所需要的基礎環境(泛指操作系統環境),可以理解為容器的模板
容器(Docker container):基于鏡像的一種運行時狀態
倉庫(Docker reqistry):存放image鏡像模板;倉庫分類:1、公共倉庫-》docker hub,私有倉庫registry harbor
三、控制組
Linux上的Docker引擎還是依賴于另一種成為控制組(cgroups)的技術,cgroup將應用程序限制為一組特定的資源。控制組允許DockerEngine將可用的硬件資源共享給容器,并有選擇地實施限制和約束。例如,可以限制特定的容器的可用內存。
4個CPU
1、3???????????????????? 2、4
container1??????????? container2
四、部署20版Docker
1.安裝Docker
①環境配置
關閉防火墻
systemctl stop firewall
systemctl disable firewall
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
vim /etc/reslov.conf
nameserver 114.114.114.114
②安裝依賴包
yum install -y yum-utils device-mapper-persistent-data lvm2
device-mapper-persisten-data????????? 存儲驅動
lvm2???????????????????????????????????????????????? 控制工具
設置阿里云鏡像源
cd /etc/yum.repos.d
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
③安裝docker-ce社區版
yum install -y docker-ce
④開啟docker
systemctl start docker
systemctl enable docker
2.設置鏡像加速
官方鏡像加速器 阿里云網站
關于加速器的地址,可以在阿里云容器鏡像服務控制臺登陸后,在左側導航欄選擇鏡像工具,鏡像加速器,在頁面就會顯示獨立分配的加速器地址
通過修改daemon配置文件/etc/docker/daemon.json來使用加速器
tee /etc/docker/daemon.json <<-'EOF'
{
????????????? 地址
}
EOF
systemctl daemon-reload
systemctl restart docker
3.網絡優化
vim /etc/sysctl.conf
net.ipv4.ip_forward=1???????????????? #開啟地址轉發
sysctl -p
由于容器也是個獨立的,需要在虛擬機上開啟路由轉發,才能讓網絡進入容器
systemctl restart network
systemctl restart docker
使用docker images 、docker image ls 查看鏡像列表
docker ps -a
4.docker-server端配置文件
{
?????? "graph": "/data/docker",????????????????????????????????? #數據目錄
?????? "storage-driver": "overlay2",???????????????????? ?????? #存儲引擎 早期的時候存儲引擎時aufs,新的是overlay2(overlayfs:文件系統,解決docker鏡像分層)
?????? "insecure-registries": [" registry.access.redhat.com", "quary.io"]???? #私有倉庫位置
?????? "registry-mirrors": ["https://q***"]???????????? ?????? #鏡像加速
?????? "bip": "172.7.5.1/24",??????????? ??????????????????????????? #docker網絡;控制網段的位置;需要創建新的網橋,系統默認的docker0是不變的
?????? "exec-opts": ["native.cgroupdriver-systemd"],? #啟動時候的額外參數(驅動)
?????? "live-restore":true???????? ?????????????????????????????????? #當docker容器引擎掛掉的時候,使用docker跑起來的容器還能運行(分離)
5.查看
①查看docker版本
②顯示docker的系統信息,內核、鏡像數、容器數等
docker info
③查看容器資源
docker stats
五、Docker鏡像操作
1.運行鏡像
docker run hello-world
解釋:
①The Docker client contacted the Docker daemon.
docker client 客戶端連接到了服務端(服務端是以一個守護進程的形式跑在操作系統里面的)restful api典型的c/s架構
②The Docker daemon pulled the “hello-world” image from the Docker Hub.(amd64)
docker 服務端的守護進程從docker hub 上下載了鏡像(Ps:服務端會先檢查本地系統是否有這個鏡像)
③The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
服務端創建了一個新的容器,然后從拉去的這個鏡像啟動了一個容器,容器執行了腳本/可執行程序讓我們可以查看/使用(client)
④The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
docker服務端把這些信息流(傳遞〉返回到客戶端并展示出來,(展示在終端上)
docker client 可以是多種形式,比如"docker"命令工具所在的終端
2.搜索鏡像-search
docker search nginx
docker search centos:7
搜索對的都是docker公共倉庫里,用戶自己制作上傳上去的鏡像,供其他用戶下載使用
3.下載鏡像-pull
client端連接服務端,從docker(hub)倉庫上把鏡像下載下來
格式:docker pull 鏡像名稱
docker pull nginx
4.查看鏡像/容器
docker images???????????? #查看鏡像列表
docker images -q?????????????? #查詢鏡像過濾出來的ID#q:過濾出鏡像ID
docker ps -a???????? #查看容器列表
5.查看當前docker下的鏡像詳細信息
格式:docker inspect 鏡像ID
docker inspect ea335eea17ab
6.添加鏡像標簽
格式:docker tag 原鏡像:原標簽 原鏡像:新標簽
docker tag hello-world:latest hello-world:new
更改的新的鏡像標簽只是復制了老的鏡像,刪除老的鏡像用新的鏡像不影響
統計鏡像是通過統計不同的鏡像id
7.刪除鏡像
刪除鏡像之前需要刪除容器ID
docker rmi hello-world:lastest
格式:docker rm 容器id
docker rm cfe2aa6e41c9
刪除標簽
格式:docker rmi 標簽
docker rmi hello-wrold
8.鏡像導出
docker svae -o 文件名(自己取名) 鏡像名
docker load <
導出
docker save -o hello-wold-1 hello-world:latest
導入
也可以導入到別的docker下
scp hello-world-1 root@192.168.72.11:/opt
docker load < hello-world-1
六、Docker相關操作
1.查詢容器
docker ps -a??????????????? #顯示所有容器,包括未運行的,a:all(全部)
docker ps -qa????????????? #顯示所有容器的id,q:過濾出ID
2.刪除容器
docker rm 容器id
docker rm -f ???????????????????? #強制刪除容器(正在運行)
docker rm 60078f0578eb
#docker rm -f `docker ps -qa`????????????????? #強制批量刪除容器,不建議使用
#docker ps -a | grep hello|awk '{print $1}'
#docker ps -a | awk '{print "docker rm " $1'} | bash??????? ##批量刪除容器(正則匹配);$1:是容器的id
#for i in `docker ps -a | grep -i exit | awk '{print$1}'`; do docker rm -f $i;done??? ##批量刪除"exit"狀態(指定狀態)的容器
3.啟動運行容器
①創建容器
docker create –[i、t、d] 名字:標簽 /binbash
-i:讓容器的標準輸入保持打開
-t:分配一個偽終端
-d:后臺守護進程的方式運行
docker create -it nginx:latest /bin/bash
②啟動容器
docker start 容器id
③啟動一次性容器
持續性運行浪費資源,就一次性執行操作
docker run centos:7 /usr/bin/bash -c ls /? #-c:傳遞命令參數
④持續后臺運行
docker run -d centos:7 /usr/bin/bash -c “while true;do echo hello;done”
#while true;do echo hello;done代表死循環
4.停止容器
docker stop 容器id
docker stop e9aed6611134
5.進入、退出容器
①使用run
docker run -it 鏡像名 /bin/bash
docker run -it nginx;latest /bin/bash
②使用exec(容器必須為開啟狀態)
docker exec -it 容器id /bin/bash
PS:
1.docker run -it會創建前臺進程,但是會在輸入exit后終止進程。
2.docker attach 會通過連接stdin,連接到容器內輸入輸出流,會在輸入exit后終止容器進程.
3.docker exec -it 會連接到容器,可以像ssh一樣進入容器內部,進行操作,可以通過exit退出容器,不影響容器運行。
③退出容器
cttl+d或exit
6.容器導入導出
①導出
docker export 容器id > 文件名
docker export 6c4380bae87a > centos7
②導入
docker import 導出的文件名(容器) 指定鏡像名稱(打上標簽)
docker import centos7 centos7:new
cat 文件名(容器) | docker import – centos:new
cat centos7 | docker import – centos:new
七、Docker網絡模式
docker的網絡形式
loopback:回環網卡、TCP\IP網卡是否生效
virtual vridge:自身繼承了一個虛擬化功能(kvm架構),是原生架構的一個虛擬化平臺,安裝了一個虛擬化平臺之后就會系統就會自動安裝虛擬網卡
(安裝完vmwokerstation后,在網絡適配器里可以看到很多的VMent1、VMent2……)
dock0:容器的網關,綁定物理網卡,主要是做NAT地址轉換,端口映射;dock0本身也是一種容器
veth對:一組虛擬設備,用戶連接兩個不同的名稱空間,宿主機內就是veth
1.Host模式
就是與宿主機共享網絡名稱空間/網絡協議棧
Host模式下,容器不會虛擬出子的網卡、配置自己的IP等,而是使用宿主機的IP和端口,
啟用容器時使用Host模式,那這個容器就不會獲得一個獨立的網絡名稱空間,而是會和宿主機共用一個名稱空間,但是容器的其他方面像文件系統、進程列表還是會和宿主機隔離的
Host模式下,容器直接使用主機的IP地址與外界通信,容器內的服務端口也可以使用宿主機的端口,不需要進行地址轉換
最大的優勢就是網絡性能比較好,但是docker host已經使用的端口就不能在去使用了,網絡隔離性不好
2.Container模式
多個容器共享一個網絡名稱空間,就是指定新的創建的容器和一個已經存在的容器共享一個網絡名稱空間,就不是和宿主機進行共享了
新創建的容器不會創建自己的網卡,配置自己的ip,而是和一個指定的容器共享IP、端口范圍等。一樣的兩個容器除了網絡方面,其他的像文件系統、進程列表等還是隔離的
3.None模式
容器有自己的獨立網絡名稱空間,但并沒有進行任何網絡設置,相當于自己在一個封閉的網絡環境里,這種模式的網絡無法聯網,但是封閉的網絡能很好的保證容器的安全性
4.Bridge模式
這個模式會為每個容器分配、設置IP等,并將容器連接到一個docker虛擬網橋,通過docker0虛擬網橋及iptables的nat表配置與宿主機通信,當docker進程啟動時,會在主機創建一個名為docker0的虛擬網橋,此主機上啟動的docker容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在一個二層網絡中。
從docker0子網中分配一個IP給容器使用,并設置docker0的IP地址為容器的默認網關。在主機上創建一對虛擬網卡vetj pair設備,Docker講veth pair設備的一端放在新創建的容器中,并命名為eth0(容器的網卡),另一端放在主機中,以vethxxx這樣類似的名字命名,并將這個網絡設備加入到docker0網橋中,可以通過brctl show命令查看
bridge模式是docker的默認網路模式,不寫-net參數,就是bridge模式。使用docker run -p時,docker實際是iptables做了DNAT規則,實現端口轉發功能。可以使用iptables -t nat -vnL查看。
5.Docker自定義網絡
①查看網絡列表
docker network ls
②查看容器IP
docker inspect 6c4380bae87a
③自定義網絡固定IP
docker run -itd –-name test1 –-network bridge –-ip 172.17.0.100 centos:latest? /bin/bash
發現這種方式會報錯:只能遵守默認的分配地址方式;無法指定,狀態是在創建狀態上
只能先創建網絡模式后,在進行指定固定IP
docker network create --subnet=172.20.0.0/16 ttnet
④網絡模式內加入指定的IP地址
docker run -itd --name centos-t1 --net ttnet --ip 172.20.0.100 centos:latest /bin/bash
6.暴露端口
docker run -itd nginx:latest /bin/bash
打開Nginx容器后通過瀏覽器打不開網頁
①指定端口
docker run -itd -p 1234:80 nginx /bin/bash??????????? #暴露出來的端口是1234
開啟nginx
docker exec -it 0c2ee2fc128a /bin/bash -c nginx
輸入ip加端口,這個ip是宿主機ip,端口是暴露出來的端口進行訪問
②隨機端口
docker run -itd -P nginx /bin/bash?????????? #指定隨機端口
重新開啟nginx
docker exec -it 480286ada746 /bin/bash -c nginx
訪問,ip還是宿主機ip,端口就是隨機端口
八、Docker數據卷
1.容器文件復制
負責文件到宿主機里
docker cp /opt/abc 容器id:/opt/abc
2.添加Linux系統命令到容器里
添加的docker容器里是沒有系統命令的,可以手動添加
docker run -itd –name centos-1 –privileged=true centos:7 /sbin/init
在去用系統命令就可以
3.免交互在容器進行操作
docker exec -it centos-1 /bin/bash -c “mkdir /abc”
docker exec -it centos-1 /bin/bash -c "ls"
4.數據卷
數據卷是一個提供容器使用的特殊目錄
創建數據卷
docker run -it -v /data/abc:/data –name test1 centos:7 /bin/bash
cd /data
touch 1.txt
去宿主機查看
5.數據卷容器
就是一個普通的容器,實現榮期間的互聯互通
①數據卷
docker run -it --name web1 -v /data1 -v /data2 centos:7 /bin/bash
②新容器掛載web1
docker run -it --name db1 --volumes-from web1 centos:7 /bin/bash
③測試
創建文件測試
容器web1
cd /data1
touch 1.txt
echo “this is test” > 1.txt
在新容器db1查看
6.容器互聯(使用centos鏡像)
docker run -itd -P --name web1 centos:7 /bin/bash
#創建并運行容器取名web1,端口號自動映射
docker run -itd -P --name web1 centos:7 /bin/bash
#創建并運行容器取名web2,鏈接到web1和其通信 –link:打通隧道
各自下載ifconfig的工具:yum install -y net-tools
web1:
web2:
像redis哨兵模式就需要用到
總結
以上是生活随笔為你收集整理的Docker基础(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 批处理一键安装所有离线的Python库
- 下一篇: 计算机组成原理:浮点数的加、减、乘、除运