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