溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

docker安裝以及一些操作

發(fā)布時(shí)間:2020-07-15 02:46:28 來源:網(wǎng)絡(luò) 閱讀:460 作者:何去何從_ie 欄目:云計(jì)算

介紹
什么是容器
容器技術(shù)是一種虛擬化的方案

傳統(tǒng)虛擬機(jī)是通過中間層,將一臺(tái)或多臺(tái)獨(dú)立的機(jī)器虛擬運(yùn)行在硬件之上

而容器時(shí)直接運(yùn)行在系統(tǒng)內(nèi)核之上的用戶空間

因此,容器虛擬化也被稱為操作系統(tǒng)虛擬化

由于運(yùn)行在操作系統(tǒng)上,所以容器只能運(yùn)行相同或相似內(nèi)核的操作系統(tǒng)

容器:docker , k8s

什么是docker

docker是能將開發(fā)的應(yīng)用程序自動(dòng)部署到容器的開源引擎。

Github地址:https://github.com/docker/docker

docker是docker.lnc公司開源的一個(gè)基于LXC技術(shù)之上構(gòu)建的Container容器引擎,源代碼托管在GitHub上,基于Go語言并遵從Apache2.0協(xié)議開源

docker是通過內(nèi)核虛擬化技術(shù)(namespaces(命令空間)及cgroups(控制組)等)來提供容器的資源隔離與安全保障等,由于docker通過操作系統(tǒng)層的虛擬化實(shí)現(xiàn)隔離,所以docker容器在運(yùn)行時(shí),不需要虛擬機(jī)(VM)額外的操作系統(tǒng)開銷,提高資源利用率。

注:此內(nèi)核是linux內(nèi)核

docker官網(wǎng):www.docker.com

hub.docker.com 上傳下載docker鏡像的網(wǎng)站

docker的特別之處:
docker在虛擬化的容器執(zhí)行環(huán)境中,增加了一個(gè)應(yīng)用程序部署引擎。
該引擎的目標(biāo):
提供一個(gè)輕量快速的環(huán)境,能夠運(yùn)行開發(fā)者的程序,便于方便高效的從開發(fā)者環(huán)境部署到測試環(huán)境,然后再部署到生產(chǎn)環(huán)境。

docker的優(yōu)點(diǎn):
1、提供簡單輕量的建模方式,運(yùn)行秒級
2、職責(zé)的邏輯分離。開發(fā)人員只需要關(guān)系容器中運(yùn)行的程序,而運(yùn)維人員只需要關(guān)心如何管理程序。
docker設(shè)計(jì)的目的性就是加強(qiáng)開發(fā)人員寫代碼的開發(fā)環(huán)境與應(yīng)用環(huán)境要部署的生產(chǎn)環(huán)境的一致性。
3、快速高效的開發(fā)生命周期。
縮短代碼從開發(fā)到測試,再到上線運(yùn)行的生命周期。讓應(yīng)用和程序具備可移植性。在容器中開發(fā),以容器的形式去交付。

4、鼓勵(lì)使用面向服務(wù)的架構(gòu)。
docker推薦單個(gè)容器只運(yùn)行一個(gè)程序或者一個(gè)進(jìn)程。這樣就形成了一個(gè)分布式的應(yīng)用程序模型。
在這種模型下,應(yīng)用程序或服務(wù)都可以表示為一系列內(nèi)部互聯(lián)的容器,從而使分布式互聯(lián)的程序擴(kuò)展或調(diào)試應(yīng)用程序都變得非常簡單。
這就是在開發(fā)中常用的思想:高內(nèi)聚低耦合

docker的使用場景:
1、使用docker容器開發(fā)、測試、部署服務(wù);
2、創(chuàng)建隔離的運(yùn)行環(huán)境
3、搭建測試環(huán)境
4、構(gòu)建多用戶的平臺(tái)即服務(wù)(PaaS)基礎(chǔ)設(shè)施
5、提供軟件即服務(wù)(SaaS)應(yīng)用程序
6、高性能、超大規(guī)模的宿主機(jī)部署

三大核心理念:
構(gòu)建 基于鏡像構(gòu)建容器
運(yùn)輸 傳輸?shù)较到y(tǒng)中
運(yùn)行 運(yùn)行于容器

構(gòu)建一個(gè)容器,放在某個(gè)地方,然后運(yùn)行起來

docker里面運(yùn)行的是應(yīng)用(APP),這個(gè)應(yīng)用可以是 tomcat、nginx、apache等服務(wù)。

docker組成:
1、docker客戶端/守護(hù)進(jìn)程
cs架構(gòu)(客戶端架構(gòu))
docker client
docker server

bs架構(gòu):web架構(gòu)
web網(wǎng)站網(wǎng)頁
服務(wù)器

一般使用客戶端與服務(wù)端交互

2、docker組件:
鏡像(image)
docker容器的基石。容器基于鏡像啟動(dòng)和運(yùn)行,鏡像就好比容器的源代碼,保存了用于啟動(dòng)容器的各種條件。
層疊的只讀文件系統(tǒng)。
聯(lián)合加載

B
最底端是引導(dǎo)文件系統(tǒng),即bootfs。實(shí)際上,當(dāng)一個(gè)容器啟動(dòng)后,引導(dǎo)文件系統(tǒng)就卸載
第二層是root文件系統(tǒng),位于bootfs之上。它可以是一種或者多種文件系統(tǒng)

容器(Container)

倉庫(Repository)
公有倉庫 docker hub
私有倉庫


centos版本中安裝docker:

docker容器的安裝

建議在linux環(huán)境下安裝Docker,window環(huán)境搭建比較復(fù)雜且容易出錯(cuò),使用Centos7+yum來安裝Docker環(huán)境很方便。

安裝Docker,這是一種操作系統(tǒng)級的虛擬化工具,可以在容器中自動(dòng)部署應(yīng)用程序。

Docker 軟件包已經(jīng)包括在默認(rèn)的 CentOS-Extras 軟件源里。因此想要安裝 docker,只需要運(yùn)行下面的 yum 命令:

注:centos虛擬機(jī)必須要聯(lián)網(wǎng),不然無法安裝。

1.配置repo倉庫
cd /etc/yum.repos.d/

vi docker.repo

[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

2.安裝docker

yum -y install docker

檢查有木有安裝方法:
docker version

3.啟動(dòng)并設(shè)置開啟自啟動(dòng)

systemctl enable docker
systemctl start docker

到此,docker容器安裝完成,并且啟動(dòng)成功。

鏡像操作:

查找鏡像(默認(rèn)從Docker Hub查詢)
docker search httpd     //查找所有httpd相關(guān)的鏡像
docker pull httpd      //下載鏡像
查看本機(jī)鏡像列表
docker images   //查看所有鏡像  (也可以單獨(dú)查詢 后面跟倉庫名稱和標(biāo)簽)
docker inspect 2211e1f06c4e    //指定ID號查看 詳細(xì)信息

注:
各個(gè)選項(xiàng)說明:
REPOSITORY:表示鏡像的倉庫源docker.io
TAG:表示鏡像的標(biāo)簽
IMAGE ID:表示鏡像的ID
CREATED:表示鏡像創(chuàng)建時(shí)間
SIZE:表示鏡像大小

添加新名稱  新標(biāo)簽 ,用于改名稱
docker tag httpd  httpd:centos

刪除鏡像
刪除之前確保沒有被容器使用,若有容器使用需要先刪除容器。  
docker rmi 鏡像名稱 或者鏡像id
鏡像沒有使用才能刪除成功,且只是刪除名稱

docker  rmi  -f   鏡像ID //永久刪除
docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}") 
刪除所有沒有使用的鏡像

存出鏡像和載入鏡像
docker save -o httpd httpd    //將本地鏡像存為文件httpd,保存在當(dāng)前所在的目錄中
docker save -o 文件名   鏡像名稱
docker load < cobbler     //將鏡像文件導(dǎo)入到docker鏡像中

小結(jié)

搜索 : docker search 關(guān)鍵字
下載 : docker pull 關(guān)鍵字
查看:docker images
查看鏡像內(nèi)容信息:docker inspect 鏡像名(ID)
刪除:docker rmi 鏡像名(ID)
導(dǎo)出鏡像:docker save -o 保存的文件名 鏡像名(ID)
導(dǎo)入鏡像:docker load < 保存的文件
更改鏡像名稱及標(biāo)簽docker tag 鏡像id 新的鏡像名:標(biāo)簽

docker容器操作


Docker容器操作
容器是鏡像的一個(gè)運(yùn)行實(shí)例。所不同的是,鏡像是靜態(tài)的只讀文件,而容器帶有運(yùn)行時(shí)需要的可寫文件層。如果認(rèn)為虛擬機(jī)是模擬運(yùn)行的一整套操作系統(tǒng)(包括內(nèi)核、應(yīng)用運(yùn)行態(tài)環(huán)境和其他系統(tǒng)環(huán)境)和跑在上面的應(yīng)用,那么Docker容器就是獨(dú)立運(yùn)行的一個(gè)(或一組)應(yīng)用,以及它們必需的運(yùn)行環(huán)境。

創(chuàng)建容器

對容器進(jìn)行操作就跟直接操作應(yīng)用一樣簡單、快速。Docker容器實(shí)在太輕量級了,用戶可以隨時(shí)創(chuàng)建或刪除容器。

1.新建容器

可以使用docker create命令新建一個(gè)容器,例如:

$ docker create -it ubuntu:latest   //基于鏡像創(chuàng)建容器,默認(rèn)是沒有運(yùn)行的

$ docker ps -a   //查看所有容器

使用docker create命令新建的容器處于停止?fàn)顟B(tài),可以使用docker start命令來啟動(dòng)它。

create命令和后續(xù)的run命令支持的選項(xiàng)都十分復(fù)雜,主要包括如下幾大類:與容器運(yùn)行模式相關(guān)、與容器和環(huán)境配置相關(guān)、與容器資源限制和安全保護(hù)相關(guān)。

create命令與容器運(yùn)行模式相關(guān)的選項(xiàng):
選項(xiàng)  說明
-a,--attach=[]  是否綁定到標(biāo)準(zhǔn)輸入、輸出和錯(cuò)誤
-d,--detach=true|false  是否在后臺(tái)運(yùn)行容器,默認(rèn)為否
--detach-keys=""    從attach模式退出的快捷鍵
--expose=[] 指定容器會(huì)暴露出來的端口或端口范圍
--group-add=[]  運(yùn)行容器的用戶組
-i,--interactive=true|false 保持標(biāo)準(zhǔn)輸入打開,默認(rèn)為false
--ipc=""    容器IPC命名空間,可以為其它容器或主機(jī)
--isolation="default"   容器使用的隔離機(jī)制
--log-driver="json-file"    指定容器的日志驅(qū)動(dòng)類型,可以為json-file,syslog,journald,gelf,fluentd,awslogs,splunk,etwlogs,gcplogs或none
--log-opt=[]    傳遞給日志驅(qū)動(dòng)的選項(xiàng)
--net="bridge"  指定容器網(wǎng)絡(luò)模式,包括bridge,none,其它容器網(wǎng)絡(luò),host的網(wǎng)絡(luò)或者某個(gè)現(xiàn)有網(wǎng)絡(luò)
--net-alias=[]  容器在網(wǎng)絡(luò)中的別名
-P,--publish-all=true|false 通過NAT機(jī)制將容器標(biāo)記暴露的端口自動(dòng)映射到本地主機(jī)的臨時(shí)端口
-p,--publish=[] 指定如何映射到本地主機(jī)端口,例如-p 11234-12234:1234-2234
--pid=host  容器的PID命名空間
--userns="" 啟用userns-remap時(shí)配置用戶命名空間的模式
--uts=host  容器的PID命名空間
--restart="no"  容器的重啟策略,包括no、on-failure[:max-retry]、always、unless-stopped等
--rm=true|false 容器退出后是否自動(dòng)刪除,不能跟-d同時(shí)使用
-t,--tty=true|false 容器運(yùn)行時(shí)指定偽終端
--tmpfs=[]  掛載臨時(shí)文件系統(tǒng)到容器
-v|--volume  host-dir:container-dir 掛載主機(jī)上的文件卷到容器內(nèi)
--volume-driver=""  掛載文件卷的驅(qū)動(dòng)類型
--volumes-from=[]   從其他容器掛載卷
-w,--workdir="" 容器內(nèi)的默認(rèn)工作目錄

create命令與容器環(huán)境和配置相關(guān)的選項(xiàng):
選項(xiàng)  說明
--add-host=[ ]  在容器內(nèi)添加一個(gè)主機(jī)名到IP地址的映射關(guān)系(通過/etc/hosts文件)
--device=[ ]    映射物理機(jī)上的設(shè)備到容器內(nèi)
--dns-search=[ ]    DNS搜索域
--dns-opt=[ ]   自定義的DNS選項(xiàng)
--dns=[ ]   自定義的DNS服務(wù)器
-e,--env=[ ]    指定容器內(nèi)環(huán)境變量
--env-file=[ ]  從文件中讀取環(huán)境變量到容器內(nèi)
-h,--hostname=""    指定容器內(nèi)的主機(jī)名
--ip=“” 指定容器的IPv4地址
--ip6=""    指定容器的IPv6地址
--link=[ <name or id>:alias]    連接到其它容器
--mac-address=""    指定容器的Mac地址
--name=""   指定容器的別名

create命令與容器資源限制和安全保護(hù)相關(guān)的選項(xiàng):
選項(xiàng)  說明
--blkio-weight=10~1000  容器讀寫塊設(shè)備的I/O性能權(quán)重,默認(rèn)為0
--blkio-weight-device=[device_name:weight]  指定各個(gè)塊設(shè)備的I/O性能權(quán)重
--cpu-shares=0  允許容器使用CPU資源的相對權(quán)重,默認(rèn)一個(gè)容器能用滿一個(gè)核的CPU
--cap-add=[ ]   增加容器的linux指定安全能力
--cap-drop=[ ]  移除容器的linux指定安全能力
--cgroup-parent=""  容器cgroups限制的創(chuàng)建路徑
--cidfile=""    指定容器的進(jìn)程ID號寫到文件
--cpu-period=0  限制容器在CFS調(diào)度器下的CPU占用時(shí)間片
--cpuset-cpus=""    限制容器能使用哪些CPU核心
--cpuset-mems=""    NUMA架構(gòu)下使用哪些核心的內(nèi)存
--device-read-bps=[ ]   掛載設(shè)備的讀吞吐率(以bps為單位)限制
--device-write-bps=[ ]  掛載設(shè)備的寫吞吐率(以bps為單位)限制
--device-read-iops=[ ]  掛載設(shè)備的讀速率(以每秒i/o次數(shù)為單位)限制
--device-write-iops=[ ] 掛載設(shè)備的寫速率(以每秒i/o次數(shù)為單位)限制
--kernel-memory=""  限制容器使用內(nèi)核的內(nèi)存大小,單位可以是b,k,m或g
-m,--memory=""  限制容器內(nèi)應(yīng)用使用的內(nèi)存,單位可以是b、k、m或g
--memory-reservation="" 當(dāng)系統(tǒng)中內(nèi)存過低時(shí),容器會(huì)被強(qiáng)制限制內(nèi)存到給定值,默認(rèn)情況下等于內(nèi)存限制值
--memory-swap="LIMIT"   限制容器使用內(nèi)存和交換區(qū)的總大小
--oom-kill-disable=true|false   內(nèi)存耗盡(out-of-memory)時(shí)是否殺死容器
--oom-score-adj=""  調(diào)整容器的內(nèi)存耗盡參數(shù)
--pids-limit="" 限制容器的pid個(gè)數(shù)
--privileged=true|false 是否給容器以高權(quán)限,這意味著容器內(nèi)應(yīng)用將不受權(quán)限下限制,一般不推薦
--read-only=true|false  是否讓容器內(nèi)的文件系統(tǒng)只讀
--security-opt=[ ]  指定一些安全參數(shù),包括權(quán)限、安全能力、apparmor等
--stop-signal=STGTERM   指定停止容器的系統(tǒng)信號
--shm-size=""   /dev/shm的大小
--sig-proxy=true|false  是否代理收到的信號給應(yīng)用,默認(rèn)為true,不能代理SIGCHLD、SIGSTOP和SIGKILL信號
--memory-swappiness="0-100" 調(diào)整容器的內(nèi)存交換區(qū)參數(shù)
-u,--user=""    指定在容器內(nèi)執(zhí)行命令的用戶信息
--ulimit=[ ]    通過ulimit來限制最大文件數(shù)、最大進(jìn)程數(shù)等

其他比較重要的選項(xiàng)還包括:

·-l,--label=[]:以鍵值對方式指定容器的標(biāo)簽信息;

·--label-file=[]:從文件中讀取標(biāo)簽信息。

啟動(dòng)容器

使用docker start命令來啟動(dòng)一個(gè)已經(jīng)創(chuàng)建的容器:

docker start 容器ID       //開啟容器
docker stop 容器ID       //關(guān)閉容器

docker容器的狀態(tài):
up   開啟狀態(tài)
Exited    終止?fàn)顟B(tài)
Create    創(chuàng)建狀態(tài)
(Paused)   暫停狀態(tài)
狀態(tài)沒有        停止?fàn)顟B(tài)

docker pause/unpause centos/httpd  //暫停docker容器

docker stop  centos/httpd   //停止指定docker容器

新建并啟動(dòng)容器

除了創(chuàng)建容器后通過start命令來啟動(dòng),也可以直接新建并啟動(dòng)容器。所需要的命令主要為docker run,等價(jià)于先執(zhí)行docker create命令,再執(zhí)行docker start命令。

docker run centos/lamp /bin/bash -c ls / 
//創(chuàng)建容器的同時(shí)啟動(dòng)并運(yùn)行相關(guān)程序,命令完成容器就停止。

啟動(dòng)一個(gè)bash終端,允許用戶進(jìn)行交互:

$ docker run -it ubuntu:14.04 /bin/bash

root@af8bae53bdd3:/#

其中,-t選項(xiàng)讓Docker分配一個(gè)偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上,-i則讓容器的標(biāo)準(zhǔn)輸入保持打開。

更多的命令選項(xiàng)可以通過man docker-run命令來查看。在交互模式下,用戶可以通過所創(chuàng)建的終端來輸入命令。

守護(hù)態(tài)運(yùn)行

更多的時(shí)候,需要讓Docker容器在后臺(tái)以守護(hù)態(tài)(Daemonized)形式運(yùn)行。此時(shí),可以通過添加-d參數(shù)來實(shí)現(xiàn)。

下面的命令會(huì)在后臺(tái)運(yùn)行容器:

$ docker run -d ubuntu  /bin/sh -c "while true; do echo hello world; sleep 1; done"

進(jìn)入運(yùn)行中的容器中,對容器做各種操作:
docker exec -it 容器id  /bin/bash    進(jìn)入容器中
退出方法:
1、輸入exit
2、Ctrl+p, Ctrl+q鍵返回主機(jī)控制臺(tái)

連接到容器的會(huì)話
docker attach 容器id號

//將容器導(dǎo)出成文件
docker export 13198d132fbe > centoslamp
將指定容器導(dǎo)出成名為centoslamp的文件,該文件為docker鏡像文件

//將容器文件生成鏡像
docker import  文件名  鏡像名:標(biāo)簽

//刪除容器
docker rm d4e863a654aa  指定刪除某個(gè)容器
docker rm -f d4e863a654aa  
強(qiáng)制刪除運(yùn)行中的容器,不建議
docker container prune   刪除所有停止的容器
docker rm $(docker ps -qf status=exited)    刪除指定狀態(tài)的容器

擴(kuò)展:
硬件資源相關(guān)
1、 顯示容器硬件資源使用情況
docker stats [選項(xiàng)] [0個(gè)或多個(gè)正在運(yùn)行容器]
docker stats          不指定容器時(shí)顯示所有正在運(yùn)行的容器

2、更新容器的硬件資源限制
docker update [選項(xiàng)]
有可能報(bào)錯(cuò):
vi   /etc/default/grub
GRUB_CMDLINE_LINUX="...   cgroup_enable=memory swapaccount=1"

3、使用壓力測試工具 stress 驗(yàn)證效果
使用已有的stress鏡像 progrium/stress, 開兩個(gè)終端, 在一個(gè)終端中執(zhí)行下面命令

docker run -m 100m --rm -it progrium/stress --cpu 2 --io 1 --vm 10 --vm-bytes 9M

在另一個(gè)終端執(zhí)行 docker stats 進(jìn)行監(jiān)控
再開一個(gè)終端執(zhí)行

# 9eb0為容器id開頭, 請根據(jù)實(shí)際情況替換。內(nèi)存限制只能調(diào)大不能調(diào)小
docker update -m 200m 9eb0

小結(jié)

創(chuàng)建:docker create -itd 鏡像名(ID) /bin/bash
啟動(dòng)容器: docker start 容器名(ID)
停止容器:docker stop 容器名(ID)
暫停:docker pause 容器名(ID)
取消暫停:docker unpause 容器名(ID)
刪除:docker rm -f 容器名(ID)
查看容器詳細(xì)信息:docker inspect 容器id
查看容器列表:docker ps -a

none網(wǎng)絡(luò)

在這個(gè)網(wǎng)絡(luò)下只有容器的lo網(wǎng)卡,在創(chuàng)建容器時(shí)可以使用--network=none指定使用none網(wǎng)絡(luò)

正常不指定網(wǎng)絡(luò)的情況下:
eth0    inet  addr:172.17.0.7

指定網(wǎng)絡(luò)為none的情況下:
docker  run  -it  --network=none  --name  network1    busybox

只有一個(gè)lo網(wǎng)卡

一般來講,這個(gè)封閉的網(wǎng)絡(luò)有什么用處呢?

可用于一些安全性較高的并且不需要聯(lián)網(wǎng)的應(yīng)用可以使用none網(wǎng)絡(luò),比如:某個(gè)容器唯一用途就是生成隨機(jī)密碼,就可以放到none網(wǎng)絡(luò)中避免密碼被竊??;但是大部分容器是需要網(wǎng)絡(luò)的

host網(wǎng)絡(luò)

連接到host網(wǎng)絡(luò)的容器共享docker host的網(wǎng)絡(luò)棧,容器的網(wǎng)絡(luò)配置與host完全一致,可以通過--network=host指定host網(wǎng)絡(luò)

docker  run  -it  --network=host  --name  network2    busybox

在容器中可以看到真機(jī)的所有網(wǎng)卡,并且連hostname也是真機(jī)的

host網(wǎng)絡(luò)的使用場景是什么呢?

host網(wǎng)絡(luò)的最大好處就是:性能;

如果容器對網(wǎng)絡(luò)傳輸效率要求較高,則可以選擇host網(wǎng)絡(luò)。

但是host網(wǎng)絡(luò)也有缺點(diǎn):靈活性不高,比如:要考慮多口靈活性的問題,docker host上已經(jīng)使用的端口容器就不能使用了

doker host另一個(gè)用途就是:讓容器可以直接配置host網(wǎng)絡(luò),比如:一些跨host的網(wǎng)絡(luò)解決方案,本身也是以容器運(yùn)行的,這些方案需要對網(wǎng)絡(luò)進(jìn)行配置,比如,iptables。

bridge網(wǎng)絡(luò)

容器默認(rèn)使用的時(shí)bridge網(wǎng)絡(luò)
docker安裝時(shí)會(huì)創(chuàng)建一個(gè) 命令為docker0的linux bridge。如果不指定--network=,運(yùn)行的容器會(huì)默認(rèn)掛到docker0上

可以用“brctl   show”命令查看橋接的網(wǎng)卡

容器中“eth0”——》真機(jī)的 veth9cfd9f7
——橋接——》docker0  

注:interface一列就是容器的虛擬網(wǎng)卡,如果容器都處于關(guān)閉的狀態(tài),會(huì)沒有網(wǎng)卡信息
需要docker在開啟狀態(tài)下才能看到接口網(wǎng)卡

如:看到interfaces一列是veth58a8eca
進(jìn)入容器中可以看一下網(wǎng)卡的信息eth0

其實(shí):eth0和veth58a8eca是一對veth pair。veth pair是一種成對出現(xiàn)的特殊網(wǎng)絡(luò)設(shè)備,可以把他想像成由一根虛擬網(wǎng)線連起來的一對網(wǎng)卡,網(wǎng)卡的一頭叫做:eth0@if315,另一頭是veth58a8eca掛在了docker0上,其效果就是將eth0@if315掛在了docker0上

看到eth0@if315配置了172.17.0.2/16的ip,再運(yùn)行一個(gè)容器,看看他的ip是否也是同樣的

新運(yùn)行的容器的IP由172.17.0.3順延下去了,而不是一個(gè)獨(dú)立的網(wǎng)段,而且都是172.17.0的網(wǎng)段的

為什么都是這個(gè)網(wǎng)段上面的呢?

可以通過docker network inspect bridge

看到網(wǎng)卡的配置信息:subnet是172.17.0.0/16,gateway是172.17.0.1,這個(gè)網(wǎng)管來自哪呢?

可以看到host主機(jī)上面的docker0的ip就是172.17.0.1,所以這個(gè)網(wǎng)管就是docker0

自定義網(wǎng)絡(luò)

通常默認(rèn)的情況下使用的是docker的bridge的網(wǎng)絡(luò),用戶也可以根據(jù)自己的業(yè)務(wù)需要,創(chuàng)建user-defined

docker 提供三種user-defined網(wǎng)絡(luò)驅(qū)動(dòng):bridge,overlay,macvlan。

其中overlay和macvlan用于創(chuàng)建跨主機(jī)的網(wǎng)絡(luò)

可以通過bridge驅(qū)動(dòng)創(chuàng)建類似前面默認(rèn)的bridge網(wǎng)絡(luò)docker0

docker network create --driver bridge brnet1

通過brctl show看到我們新建的網(wǎng)絡(luò)

新增加了一個(gè)網(wǎng)橋br-32a5cb322311 ,這里的32a5cb322311正好是新建的brnet1的容器ID

通過docker network inspect brnet1查看

可以看到新建的brnet1的subnet是172.18.0.0/16,網(wǎng)關(guān)是172.18.0.1,這里的172.18.0.0/16網(wǎng)段是docker自動(dòng)分配的網(wǎng)段

也可以自己指定網(wǎng)段和網(wǎng)關(guān):--subent和--gateway

docker   network  create  --driver  bridge  --subnet   192.168.2.0/24   --gateway  192.168.2.1  brnet2

容器要使用新的網(wǎng)絡(luò),需要在新建運(yùn)行(docker run)的時(shí)候,通過--network=去指定

指定一個(gè)靜態(tài)ip地址
可以通過--ip指定

docker  run -it  --network=brnet2  --ip   192.168.2.222   busybox

注:只有通過--subnet創(chuàng)建的網(wǎng)絡(luò)才能指定靜態(tài)IP。

最好不要將容器設(shè)置成與host相同網(wǎng)段的,否則host的主機(jī)將被干擾,當(dāng)然如果收到了干擾也不用怕,可以使用docker network rm <自己設(shè)置的bridge的名稱>  將這個(gè)bridge刪除

小結(jié):

注:如果報(bào)這樣的錯(cuò)用以下命令{Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-01f51f70d9a8 -j RETURN: iptables: No chain/target/match by that name.
(exit status 1)) }


pkill docker

iptables -t nat -F
ifconfig docker0 down
systemctl start docker


使用指定網(wǎng)絡(luò)創(chuàng)建容器:
docker run -it --network bridge 鏡像id /bin/bash

docker網(wǎng)絡(luò)查看:
docker network ls

創(chuàng)建docker網(wǎng)絡(luò):
docker network create --driver=bridge 自定義的網(wǎng)絡(luò)名稱

創(chuàng)建docker網(wǎng)絡(luò)并且自定義可分配的網(wǎng)段和網(wǎng)關(guān):
docker network create --driver=bridge --subnet 192.168.80.0/24 --gateway 192.168.80.1 自定義的網(wǎng)絡(luò)名稱

使用指定網(wǎng)絡(luò)創(chuàng)建容器并且分配一個(gè)靜態(tài)IP地址:
docker run -it --network 網(wǎng)絡(luò)名稱(自定義) --ip 192.168.80.100 鏡像名 /bin/bash

注意:靜態(tài)IP地址只要自定義網(wǎng)段并且使用“--subnet”指定網(wǎng)段才能分配

查看docker網(wǎng)絡(luò)的詳細(xì)信息:
docker network inspect 網(wǎng)絡(luò)名稱

刪除docker網(wǎng)絡(luò):
docker network rm 網(wǎng)絡(luò)名稱

給已創(chuàng)建的容器添加一個(gè)網(wǎng)卡:
docker network connect 網(wǎng)絡(luò)名稱 [--ip ip地址] 容器名稱

端口映射和容器互聯(lián)

容器訪問外部網(wǎng)絡(luò)

容器默認(rèn)指定了網(wǎng)關(guān)為docker0網(wǎng)橋上的docker0內(nèi)部接口。docker0內(nèi)部接口同時(shí)也是宿主機(jī)的一個(gè)本地接口。因此,容器默認(rèn)情況下是可以訪問到宿主機(jī)本地的。更進(jìn)一步,容器要想通過宿主機(jī)訪問到外部網(wǎng)絡(luò),需要宿主機(jī)進(jìn)行轉(zhuǎn)發(fā)。
#sysctl net.ipv4.ip_forward 查看轉(zhuǎn)發(fā)是否打開,1代表打開
net.ipv4.ip_forward = 1

如果為0,則沒有開啟轉(zhuǎn)發(fā),則需要手動(dòng)打開:

#sysctl -w net.ipv4.ip_forward=1

更簡單的,在啟動(dòng)Docker服務(wù)的時(shí)候設(shè)定--ip-forward=true,Docker服務(wù)會(huì)自動(dòng)打開宿主機(jī)系統(tǒng)的轉(zhuǎn)發(fā)服務(wù)。

端口映射

容器中可以運(yùn)行一些網(wǎng)絡(luò)應(yīng)用,要讓外部也可以訪問這些應(yīng)用,可以通過 -P(大寫) 或 -p (小寫) 參數(shù)來指定端口映射。

1、當(dāng)使用 -P 標(biāo)記時(shí),Docker 會(huì)隨機(jī)映射一個(gè) 49000~49900 的端口到內(nèi)部容器開放的網(wǎng)絡(luò)端口
2、-p(小寫)則可以指定要映射的IP和端口,但是在一個(gè)指定端口上只可以綁定一個(gè)容器。支持的格式有 
真機(jī)Port:容器Port、

    hostPort:containerPort(映射所有接口地址)
    將本地的 5000 端口映射到容器的 5000 端口:
    docker run -d -p 5000:5000 training/webapp   /bin/bash
    此時(shí)默認(rèn)會(huì)綁定本地所有接口上的所有地址。

    ip:hostPort:containerPort (映射指定地址的指定端口)
    指定映射使用一個(gè)特定地址,比如 localhost 地址 127.0.0.1
    docker run -d -p 127.0.0.1:5000:5000 training/webapp /bin/bash

    ip::containerPort (映射指定地址的任意端口)
    綁定 localhost 的任意端口到容器的 5000 端口,本地主機(jī)會(huì)自動(dòng)分配一個(gè)端口。
    docker run -d -p 127.0.0.1::5000 training/webapp  /bin/bash
    還可以使用 udp 標(biāo)記來指定 udp 端口
    docker run -d -p 127.0.0.1:5000:5000/udp training/webapp  /bin/bash

查看映射端口配置
    使用 docker port 來查看當(dāng)前映射的端口配置,也可以查看到綁定的地址
docker  ps  -a

端口——>端口

注:

容器有自己的內(nèi)部網(wǎng)絡(luò)和 ip 地址(使用 docker inspect 可以獲取所有的變量,Docker 還可以有一個(gè)可變的網(wǎng)絡(luò)配置。)
-p 標(biāo)記可以多次使用來綁定多個(gè)端口
例如:
docker run -d -p 5000:5000 -p 3000:80 training/webapp  /bin/bash

2、容器之間互聯(lián)(容器間的通信)

容器之間可通過 IP,Docker DNS Server 或 joined 容器三種方式通信。

docker網(wǎng)絡(luò):none、host、bridge、自定義(bridge,overlay,macvlan)

1、IP 通信
兩個(gè)容器要能通信,必須要有屬于同一個(gè)網(wǎng)絡(luò)的網(wǎng)卡。
即兩個(gè)容器處于同一個(gè)網(wǎng)段中。
滿足這個(gè)條件后,容器就可以通過 IP 交互了。
具體做法是在容器創(chuàng)建時(shí)通過 --network 指定相應(yīng)的網(wǎng)絡(luò),或者通過 docker network connect 將現(xiàn)有容器加入到指定網(wǎng)絡(luò)。

2、Docker DNS Server
通過 IP 訪問容器雖然滿足了通信的需求,但還是不夠靈活。因?yàn)槲覀冊诓渴饝?yīng)用之前可能無法確定 IP,部署之后再指定要訪問的 IP 會(huì)比較麻煩。對于這個(gè)問題,可以通過 docker 自帶的 DNS 服務(wù)解決。

從 Docker 1.10 版本開始,docker daemon 實(shí)現(xiàn)了一個(gè)內(nèi)嵌的 DNS server,使容器可以直接通過“容器名”通信。

方法很簡單,只要在啟動(dòng)時(shí)用 --name 為容器命名就可以了。

下面啟動(dòng)兩個(gè)容器 bbox1 和 bbox2:

docker run -it --network=brnet2 --name=web1 centos

docker run -it --network=brnet2 --name=web2 centos

然后,web2 就可以直接 ping 到 web1 了:

注: 使用 docker DNS 有個(gè)限制:只能在自定義網(wǎng)絡(luò)中使用。也就是說,默認(rèn)的 bridge 網(wǎng)絡(luò)docker0是無法使用 DNS 的。下面驗(yàn)證一下:

創(chuàng)建 bbox3 和 bbox4,均連接到 bridge 網(wǎng)絡(luò)。

docker run -it --name=bbox3 busybox

docker run -it --name=bbox4 busybox

bbox4 無法 ping 到 bbox3。
3、joined 容器

joined 容器是另一種實(shí)現(xiàn)容器間通信的方式。

joined 容器非常特別,它可以使兩個(gè)或多個(gè)容器共享一個(gè)網(wǎng)絡(luò)棧,共享網(wǎng)卡和配置信息,joined 容器之間可以通過 127.0.0.1 直接通信。

例子:
先創(chuàng)建一個(gè) httpd 容器,名字為 web1。

docker run -d -it --name=web1 httpd

然后創(chuàng)建centos容器并通過 --network=container:web1 指定 jointed 容器為 web1:
docker run -it --network=container:web1 --name web2 centos

進(jìn)入兩個(gè)容器中查看地址
web1和web2 的網(wǎng)卡 mac 地址與 IP 完全一樣,它們共享了相同的網(wǎng)絡(luò)棧。
這樣web2就可以直接用127.0.0.1訪問web1的httpd服務(wù)

joined 容器非常適合以下場景:

  不同容器中的程序希望通過 loopback 高效快速地通信,比如 web server 與 app server。

  希望監(jiān)控其他容器的網(wǎng)絡(luò)流量,比如運(yùn)行在獨(dú)立容器中的網(wǎng)絡(luò)監(jiān)控程序。

擴(kuò)展:
當(dāng)兩個(gè)容器在不同的bridge的時(shí)候,容器之間是不能ping通的

如何讓兩個(gè)不同的網(wǎng)段之間能夠ping通呢?

1.增加路由
如果host上對每個(gè)網(wǎng)絡(luò)都有一個(gè)路由,同時(shí)操作系統(tǒng)上打開了ip forwarding,host就成了一個(gè)路由,掛在不同的網(wǎng)橋上的網(wǎng)絡(luò)就能夠互相ping通

可以看一下host上是否滿足這個(gè)條件

ip r查看host上的路由表

打開路由轉(zhuǎn)發(fā)功能

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI