目錄
一、前言
1.虛擬化產(chǎn)品有哪些
1.1寄居架構(gòu)
1.2源生架構(gòu)
2.虛擬化產(chǎn)品對(duì)比/介紹
2.1虛擬化產(chǎn)品
2.1.1仿真虛擬化
2.1.2半虛擬化
2.1.3全虛擬化
2.2重點(diǎn)
2.2.1KVM——Linux內(nèi)核來(lái)完成的功能和性能
2.2.2ESXI——用的比較多
二、Docker概述
1.Docker定義
2.Docker特點(diǎn)(優(yōu)點(diǎn))
3.Docker與虛擬機(jī)的區(qū)別
4.容器有哪些
5.容器在內(nèi)核中重要技術(shù)
5.1Namespace六項(xiàng)隔離
6.Docker核心概念
6.1鏡像
6.2容器
6.3倉(cāng)庫(kù)
7.總結(jié)
7.1虛擬化產(chǎn)品
7.2Docker的認(rèn)識(shí)
7.3Dcoker核心概念
三、安裝Docker
1.環(huán)境準(zhǔn)備
2.安裝依賴(lài)包
3.設(shè)置阿里云鏡像
4.安裝Docker-CE并自啟
四、Docker鏡像操作
1.搜索鏡像
2.獲取鏡像
3.鏡像加速
4.查看鏡像信息
5.查看下載的鏡像文件信息
6.查看下載到本地的所有鏡像
7.獲取鏡像詳細(xì)信息
8.為本地鏡像添加新的標(biāo)簽
9.刪除鏡像
10.存出鏡像——將鏡像保存為本地文件
11.載入鏡像——將鏡像文件導(dǎo)入到鏡像庫(kù)中
12.上傳鏡像
五、Docker容器操作
1.容器創(chuàng)建——將鏡像加載到容器的過(guò)程
2.容器運(yùn)行狀態(tài)
3.開(kāi)啟容器
3.1創(chuàng)建并啟動(dòng)容器
3.2后臺(tái)持續(xù)運(yùn)行
3.3創(chuàng)建容器并持續(xù)啟動(dòng)
4.停止容器運(yùn)行
5.容器的進(jìn)入
6.Docker容器的生命周期
7.Docker cp
7.1如何將宿主機(jī)的文件傳入到容器內(nèi)部
7.2如何將容器內(nèi)部文件導(dǎo)出到宿主機(jī)
8.容器的導(dǎo)出與導(dǎo)入
8.1容器的導(dǎo)出
8.2容器的導(dǎo)入
9.刪除容器
9.1單獨(dú)刪除容器
9.2批量刪除容器
9.3批量刪除鏡像
六、Docker網(wǎng)絡(luò)
1.使用Docker操作Nginx
2.查看容器輸出日志
3.Docker網(wǎng)絡(luò)模式
3.1Docker network命令
3.2Host模式
3.3Container模式
3.4None模式
3.5Bridge模式
3.6自定義網(wǎng)絡(luò)
4.總結(jié)
七、Cgroup——資源控制
1.Cgroup概述
2.Cgroup功能
3.設(shè)置CPU使用率上限
4.設(shè)置CPU資源占用比
5.設(shè)置容器綁定指定CPU
6.對(duì)內(nèi)存使用限制
6.1-m選項(xiàng)(--memory)
6.2--memory-swap(限制可用swap大小)
7.對(duì)磁盤(pán)I/O配額控制(blkio)的限制
8.故障舉例
8.1解決方案——清除日志
8.2解決方案——當(dāng)日志占滿(mǎn)之后如何處理
八、總結(jié)
1.虛擬化產(chǎn)品
2.Docker的認(rèn)識(shí)
3.Dcoker核心概念
4.Docker命令總結(jié)
5.Docker網(wǎng)絡(luò)模式
6.Cgroup
6.1對(duì)CPU限制
6.2對(duì)內(nèi)存限制
6.3對(duì)磁盤(pán)I/O限制
一、前言
云端:華為云、谷歌云、騰訊云、阿里云、亞馬遜、百度云、天翼云、西部數(shù)碼云燈
國(guó)內(nèi)運(yùn):華為云、阿里云、騰訊云、天翼云(私有云)
國(guó)外云:谷歌云、亞馬遜
云計(jì)算的服務(wù)模式是分幾層的,分別是IaaS、PaaS、SaaS
- IaaS:Infrastructure(基礎(chǔ)設(shè)施)-as-a-Service
- PaaS:Platform(平臺(tái))-as-a-Service
- SaaS:Software(軟件-as-a-Service)
基礎(chǔ)設(shè)置在最下端,平臺(tái)在中間,軟件在頂端
IaaS:提供所有底層設(shè)備
PaaS:軟件也不需要,只需要敲代碼即可(天翼云,目前大部分企業(yè)均使用PaaS)
SaaS用的不多(相當(dāng)于快捷酒店)
1.虛擬化產(chǎn)品有哪些
虛擬機(jī)架構(gòu)一般只有兩種:寄居架構(gòu)和源生架構(gòu)
1.1寄居架構(gòu)
從本機(jī)(真實(shí)的操作系統(tǒng))------>虛擬化產(chǎn)品------>虛擬化操作系統(tǒng)或軟件
1.2源生架構(gòu)
物理機(jī)之上,在一臺(tái)物理機(jī)上直接安裝虛擬產(chǎn)品
裸金屬服務(wù)器------>虛擬化產(chǎn)品
2.虛擬化產(chǎn)品對(duì)比/介紹
2.1虛擬化產(chǎn)品
- 仿真虛擬化(對(duì)系統(tǒng)硬件沒(méi)有要求,性能最低)
- 半虛擬化(虛擬機(jī)可以直接使用,真機(jī)物理機(jī))
- 全虛擬化(直接使用物理硬件,性能要求很高)
2.1.1仿真虛擬化
VMware客戶(hù)端
VMware workstation 個(gè)人在Windows安裝的虛擬機(jī)
VMware Fusion MAC
2.1.2半虛擬化
rehl 5 自帶xen(虛擬機(jī)監(jiān)視器)
微軟Microsoft Hyper-V(虛擬化產(chǎn)品 半虛擬化)
VirtualBox 7.0虛擬盒子
cirix Hypervisor
Linux環(huán)境虛擬機(jī):KVM(在Linux系統(tǒng)中運(yùn)行的)、OpenStack(私有云)
KVM基于內(nèi)核的虛擬機(jī)主機(jī)
2.1.3全虛擬化
VMware服務(wù)端exsi(現(xiàn)在企業(yè)一般使用這個(gè))VMware vsphere裸金屬
全虛擬化,直接使用物理硬件,性能高
客戶(hù)端連接VMware vsphere
現(xiàn)在企業(yè)一般都使用網(wǎng)頁(yè)端連接VMware vsphere
2.2重點(diǎn)
2.2.1KVM——Linux內(nèi)核來(lái)完成的功能和性能
2.2.2ESXI——用的比較多
二、Docker概述
1.Docker定義
Docker是一個(gè)開(kāi)源的應(yīng)用容器引擎,基于go語(yǔ)言開(kāi)發(fā)并遵循了apache2.0協(xié)議開(kāi)源。是一種輕量級(jí)的“虛擬機(jī)”,在Linux容器里運(yùn)行應(yīng)用的開(kāi)源工具。
Docker是在Linux容器里運(yùn)行應(yīng)用的開(kāi)源工具,是一種輕量級(jí)的“虛擬機(jī)”。
Docker 的容器技術(shù)可以在一臺(tái)主機(jī)上輕松為任何應(yīng)用創(chuàng)建一個(gè)輕量級(jí)的、可移植的、自給自足的容器。
Docker的Logo設(shè)計(jì)為藍(lán)色鯨魚(yú),拖著許多集裝箱。
鯨魚(yú)可看作為宿主機(jī),集裝箱可理解為相互隔離的容器,每個(gè)集裝箱中都包含自己的應(yīng)用程序。
?
Docker的設(shè)計(jì)宗旨:Build,Ship and Run Any App,Anywhere,
即通過(guò)對(duì)應(yīng)用組件的封裝、發(fā)布、部署、運(yùn)行等生命周期的管理,達(dá)到應(yīng)用組件級(jí)別的“一次封裝,到處運(yùn)行”的目的。這里的組件,既可以是一個(gè)應(yīng)用,也可以是一套服務(wù),甚至是一個(gè)完整的操作系統(tǒng)。
Docker 發(fā)展歷史 https://www.cnblogs.com/rongba/articles/14782624.html
Docker中文官網(wǎng):http://www.docker.org.cn
Docker支持的系統(tǒng)類(lèi)別很多,Windows和Linux都可以安裝,這也是為什么Docker比較受歡迎的原因之一,只要有Docker就可以運(yùn)行任何狀態(tài),沒(méi)有不兼容的。
2.Docker特點(diǎn)(優(yōu)點(diǎn))
- 靈活:即使是最復(fù)雜的應(yīng)用也可以集裝箱化。
- 輕量級(jí):容器利用并共享主機(jī)內(nèi)核。
- 可互換:可以即時(shí)部署更新和升級(jí)。
- 便攜式:可以在本地構(gòu)建,部署到云,并在任何地方運(yùn)行。
- 可擴(kuò)展:可以增加并自動(dòng)分發(fā)容器副本。
- 可堆疊:可以垂直和即時(shí)堆疊服務(wù)。
容器是在linux上本機(jī)運(yùn)行,并與其他容器共享主機(jī)的內(nèi)核,它運(yùn)行的是一個(gè)獨(dú)立的進(jìn)程,不占用其他任何可執(zhí)行文件的內(nèi)存,非常輕量。
虛擬機(jī)運(yùn)行的是一個(gè)完整的操作系統(tǒng),通過(guò)虛擬機(jī)管理程序?qū)χ鳈C(jī)資源進(jìn)行虛擬訪問(wèn),相比之下需要的資源更多。
3.Docker與虛擬機(jī)的區(qū)別
特性 | Docker容器 | 虛擬機(jī) |
---|---|---|
啟動(dòng)速度 | 秒級(jí) | 分鐘級(jí) |
計(jì)算能力消耗 | 幾乎無(wú) | 損耗50%左右 |
性能 | 接近原生 | 弱于 |
系統(tǒng)支持量(單機(jī)) | 上千個(gè) | 幾十個(gè) |
隔離性 | 資源隔離/限制 | 完全隔離 |
4.容器有哪些
- docker
- podman:與docker相似 OCI(調(diào)用內(nèi)核)redhat
- K8s
- Container(docker核心組件之一)
- LXC:linux 容器化技術(shù)
- Crio:輕量級(jí),專(zhuān)門(mén)用于 k8s
- Apache Mesos:容器編排平臺(tái) ?
5.容器在內(nèi)核中重要技術(shù)
Docker本質(zhì)就是在宿主機(jī)的一個(gè)進(jìn)程,Docker是通過(guò)Namespace(命名空間)實(shí)現(xiàn)資源隔離,通過(guò)Cgroup實(shí)現(xiàn)資源限制,通過(guò)寫(xiě)時(shí)復(fù)制技術(shù)(Copy-On-Write)實(shí)現(xiàn)了高效的文件操作(類(lèi)似虛擬機(jī)的磁盤(pán)比如分配500G并不是實(shí)際占用物理磁盤(pán)500G)
5.1Namespace六項(xiàng)隔離
Namespace | 系統(tǒng)調(diào)用參數(shù) | 隔離內(nèi)容 |
---|---|---|
UTS | CLONE_NAWUTS | 主機(jī)名與域名 |
IPC | CLONE_NEWWIPC | 信號(hào)量、消息隊(duì)列和共享內(nèi)存 |
PID | CLONE_NEWPID | 進(jìn)程編號(hào) |
NETWORK | CLONE_NEWNET | 網(wǎng)路設(shè)備、網(wǎng)絡(luò)棧、端口等 |
MOUNT | CLONE_NEWNS | 掛載點(diǎn)(文件系統(tǒng)) |
USER | CLONE_NEWUSER | 用戶(hù)和用戶(hù)組(3.8以后的內(nèi)核才支持) |
6.Docker核心概念
6.1鏡像
Docker的鏡像是創(chuàng)建容器的基礎(chǔ),類(lèi)似虛擬機(jī)的快照,可以理解為一個(gè)面向 Docker 容器引擎的只讀模板。
通過(guò)鏡像啟動(dòng)一個(gè)容器,一個(gè)鏡像是一個(gè)可執(zhí)行的包,其中包括運(yùn)行應(yīng)用程序所需要的所有內(nèi)容包含代碼,運(yùn)行時(shí)間,庫(kù)、環(huán)境變量、和配置文件。
Docker鏡像也是一個(gè)壓縮包,只是這個(gè)壓縮包不只是可執(zhí)行文件,環(huán)境部署腳本,它還包含了完整的操作系統(tǒng)。因?yàn)榇蟛糠值溺R像都是基于某個(gè)操作系統(tǒng)來(lái)構(gòu)建,所以很輕松的就可以構(gòu)建本地和遠(yuǎn)端一樣的環(huán)境,這也是Docker鏡像的精髓。
6.2容器
Docker的容器是從鏡像創(chuàng)建的運(yùn)行實(shí)例,它可以被啟動(dòng)、停止和刪除。所創(chuàng)建的每一個(gè)容器都是相互隔離、互不可見(jiàn),以保證平臺(tái)的安全性。
可以把容器看做是一個(gè)簡(jiǎn)易版的linux環(huán)境(包括root用戶(hù)權(quán)限、鏡像空間、用戶(hù)空間和網(wǎng)絡(luò)空間等)和運(yùn)行在其中的應(yīng)用程序。
鏡像 nginx ?(run) 起來(lái)之后的一個(gè)實(shí)例,可以把容器看做時(shí)一個(gè)簡(jiǎn)易版的linux環(huán)境容器 就是集裝箱(logo上的集裝箱)
6.3倉(cāng)庫(kù)
Docker倉(cāng)庫(kù)是用來(lái)集中保存鏡像的地方,當(dāng)創(chuàng)建了自己的鏡像之后,可以使用push命令將它上傳到公有倉(cāng)庫(kù)(Public)或者私有倉(cāng)庫(kù)(Private)。當(dāng)下次要在另外一臺(tái)機(jī)器上使用這個(gè)鏡像時(shí),只需從倉(cāng)庫(kù)獲取。
Docker 的鏡像、容器、日志等內(nèi)容全部都默認(rèn)存儲(chǔ)在 /var/lib/docker?
倉(cāng)庫(kù)就是放鏡像的場(chǎng)所,做大的公開(kāi)庫(kù) docker hub
7.總結(jié)
7.1虛擬化產(chǎn)品
- VMware Workstation 個(gè)人
- VMware Sphere/ESXI 企業(yè)級(jí)虛擬化
- OpenStack(開(kāi)發(fā))/KVM Linux環(huán)境虛擬機(jī),私有云環(huán)境
7.2Docker的認(rèn)識(shí)
- 容器:提供多臺(tái)主機(jī)上運(yùn)行的應(yīng)用程序的相同的運(yùn)行環(huán)境
- Docker:是一個(gè)開(kāi)源的應(yīng)用容器引擎,基于go語(yǔ)言開(kāi)發(fā),是容器里面的運(yùn)行應(yīng)用的工具,是一個(gè)輕量級(jí)的虛擬機(jī),可用在Docker多個(gè)平臺(tái)去使用的
- 容器通過(guò)Namespace(命名空間、名稱(chēng))資源隔離,再通過(guò)Cgroup(資源配額)限制資源
7.3Dcoker核心概念
- 鏡像:運(yùn)行容器的基礎(chǔ),包含運(yùn)行的應(yīng)用程序所需的所有內(nèi)容
- 容器:是從鏡像創(chuàng)建的運(yùn)行實(shí)例
- 倉(cāng)庫(kù):集中保存鏡像的地方(公有倉(cāng)庫(kù)Docker HUB,私有倉(cāng)庫(kù)Harhor)
三、安裝Docker
目前的Docker只能支持64位系統(tǒng)
1.環(huán)境準(zhǔn)備
systemctl stop firewalld.service
setenforce 0
2.安裝依賴(lài)包
[root@localhost ~]#yum install -y yum-utils device-mapper-persistent-data lvm2
#yum-utils:提供了 yum-config-manager 工具。
#device mapper: 是Linux內(nèi)核中支持邏輯卷管理的通用設(shè)備映射機(jī)制,它為實(shí)現(xiàn)用于存儲(chǔ)資源管理的塊設(shè)備驅(qū)動(dòng)提供了一個(gè)高度模塊化的內(nèi)核架構(gòu)。
#device mapper存儲(chǔ)驅(qū)動(dòng)程序需要 device-mapper-persistent-data 和 lvm2。
3.設(shè)置阿里云鏡像
[root@localhost ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.安裝Docker-CE并自啟
[root@localhost ~]#yum install -y docker-ce docker-ce-cli containerd.io
#安裝最新版本Docker
[root@localhost ~]#systemctl start docker.service
[root@localhost ~]#systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@localhost ~]#docker info
#查看Docker信息
Client: Docker Engine - Community
Version: 26.0.2
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.14.0
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.26.1
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 0
#容器數(shù)量
Running: 0
Paused: 0
Stopped: 0
Images: 0
#鏡像數(shù)量
Server Version: 26.0.2
#Server版本
Storage Driver: overlay2
#Docker使用的是Overlay2文件驅(qū)動(dòng)
Backing Filesystem: xfs
#宿主機(jī)上的底層文件系統(tǒng)
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
#Cgroup驅(qū)動(dòng)
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: e377cd56a71523140ca6ae87e30244719194a521
runc version: v1.1.12-0-g51d5e94
init version: de40ad0
Security Options:
seccomp
Profile: builtin
Kernel Version: 3.10.0-693.el7.x86_64
#宿主機(jī)相關(guān)信息 內(nèi)核版本
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.781GiB
Name: localhost.localdomain
ID: 27c4cf7d-6341-49f2-b081-c187b852ba73
Docker Root Dir: /var/lib/docker
#Docker數(shù)據(jù)存儲(chǔ)目錄
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
安裝好的Docker系統(tǒng)有兩個(gè)程序,Docker服務(wù)端和Docker客戶(hù)端。其中Docker服務(wù)端是一個(gè)服務(wù)進(jìn)程,負(fù)責(zé)管理所有容器。 Docker客戶(hù)端則扮演著Docker服務(wù)端的遠(yuǎn)程控制器,可以用來(lái)控制Docker的服務(wù)端進(jìn)程。大部分情況下Docker服務(wù)端和客戶(hù)端運(yùn)行在一臺(tái)機(jī)器上。
四、Docker鏡像操作
1.搜索鏡像
[root@localhost ~]#docker search nginx
2.獲取鏡像
[root@localhost ~]#docker pull nginx
3.鏡像加速
瀏覽器訪問(wèn) https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 獲取鏡像加速器配置
[root@localhost docker]#ls /etc/docker/
[root@localhost docker]#tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["URL"]
> }
> EOF
{
"registry-mirrors": ["URL"]
}
[root@localhost docker]#systemctl daemon-reload
[root@localhost docker]#systemctl restart docker.service
4.查看鏡像信息
[root@localhost docker]#pwd
/var/lib/docker
[root@localhost docker]#ls
buildkit engine-id network plugins swarm volumes
containers image overlay2 runtimes tmp
#Docker 相關(guān)的本地資源存放在 /var/lib/docker/ 目錄下
#containers 目錄存放容器信息
#image 目錄存放鏡像信息
#overlay2 目錄下存放具體的鏡像底層文件。
#engine-id 引擎ID號(hào)
#volumes 卷組
5.查看下載的鏡像文件信息
[root@localhost docker]#cat /var/lib/docker/image/overlay2/repositories.json
{"Repositories":{"nginx":{"nginx:latest":"sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580","nginx@sha256:0463a96ac74b84a8a1b27f3d1f4ae5d1a70ea823219394e131f5bf3536674419":"sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580"}}}
6.查看下載到本地的所有鏡像
[root@localhost docker]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2ac752d7aeb1 6 days ago 188MB
#REPOSITORY:鏡像屬于的倉(cāng)庫(kù)
#TAG:鏡像的標(biāo)簽信息,標(biāo)記同一個(gè)倉(cāng)庫(kù)中的不同鏡像
#IMAGE ID:鏡像的唯一ID號(hào),唯一標(biāo)識(shí)一個(gè)鏡像
#CREATED:鏡像創(chuàng)建時(shí)間
#VORTIAL SIZE:鏡像大小
7.獲取鏡像詳細(xì)信息
[root@localhost docker]#docker inspect 2ac752d7aeb1(鏡像ID號(hào))
8.為本地鏡像添加新的標(biāo)簽
格式:docker tag 名稱(chēng):[標(biāo)簽] 新名稱(chēng):[新標(biāo)簽]
[root@localhost docker]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2ac752d7aeb1 6 days ago 188MB
[root@localhost docker]#docker tag nginx:latest nginx:nginx01
[root@localhost docker]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2ac752d7aeb1 6 days ago 188MB
nginx nginx01 2ac752d7aeb1 6 days ago 188MB
9.刪除鏡像
刪除鏡像一定要注意是要先刪除容器,再刪除鏡像
#格式:
docker rmi 倉(cāng)庫(kù)名稱(chēng):標(biāo)簽
#當(dāng)一個(gè)鏡像有多個(gè)標(biāo)簽時(shí),只是刪除其中指定的標(biāo)簽
或者docker rmi 鏡像ID號(hào)
#會(huì)徹底刪除該鏡像
[root@localhost docker]#docker rmi nginx:nginx01
Untagged: nginx:nginx01
[root@localhost docker]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2ac752d7aeb1 6 days ago 188MB
注意:如果該鏡像已經(jīng)被容器使用,正確的做法是先刪除依賴(lài)該鏡像的所有容器,再去刪除鏡像。
10.存出鏡像——將鏡像保存為本地文件
格式:docker save -o 存儲(chǔ)文件名 存儲(chǔ)的鏡像
[root@localhost docker]#cd /opt/
[root@localhost opt]#ls
containerd rh
[root@localhost opt]#docker save -o nginx nginx:latest
#nginx為新名字 nginx:latest為存儲(chǔ)的鏡像名字
[root@localhost opt]#ls
containerd nginx rh
11.載入鏡像——將鏡像文件導(dǎo)入到鏡像庫(kù)中
格式:docker load < 存出的文件 或者 docker load -i 存出的文件
[root@localhost opt]#scp nginx 192.168.241.22:/opt
[root@node2 opt]#docker load -i nginx
[root@node2 opt]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2ac752d7aeb1 6 days ago 188MB
12.上傳鏡像
默認(rèn)上傳到 docker Hub 官方公共倉(cāng)庫(kù),需要注冊(cè)使用公共倉(cāng)庫(kù)的賬號(hào)。https://hub.docker.com
可以使用 docker login 命令來(lái)輸入用戶(hù)名、密碼和郵箱來(lái)完成注冊(cè)和登錄。
在上傳鏡像之前,還需要先對(duì)本地鏡像添加新的標(biāo)簽,然后再使用 docker push 命令進(jìn)行上傳。
[root@localhost ~]#docker tag nginx:latest Gd0120/nginx:cxk
[root@localhost ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wyb latest cc8c4bb69a55 8 hours ago 140MB
Gd0120/nginx cxk 605c77e624dd 2 years ago 141MB
nginx latest 605c77e624dd 2 years ago 141MB
[root@localhost ~]#docker login
[root@localhost ~]#docker push soscscs/nginx:web
#上傳鏡像
五、Docker容器操作
1.容器創(chuàng)建——將鏡像加載到容器的過(guò)程
新創(chuàng)建的容器默認(rèn)處于停止?fàn)顟B(tài),不運(yùn)行任何程序,需要在其中發(fā)起一個(gè)進(jìn)程來(lái)啟動(dòng)容器。
格式:docker create [選項(xiàng)] 鏡像
選項(xiàng) | 含義 |
---|---|
-i | 讓容器開(kāi)啟標(biāo)準(zhǔn)輸入 |
-t | 讓Docker分配一個(gè)偽終端tty |
-it | 合起來(lái)實(shí)現(xiàn)和容器交互的作用,運(yùn)行一個(gè)交互式回話(huà)Shell |
[root@localhost ~]#docker create -it nginx:latest /bin/bash
116cfb7bee31ebdcfc32265c3bf04cc28e235badc130d538b00e81c3cdb675b6
2.容器運(yùn)行狀態(tài)
[root@localhost ~]#docker ps
#只顯示運(yùn)行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]#docker ps -a
#-a可以顯示所有容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
116cfb7bee31 nginx:latest "/docker-entrypoint.…" 13 seconds ago Created zealous_khorana
#CONTAINER ID:容器的ID號(hào)
#IMAGE:加載的鏡像
#COMMAND:運(yùn)行的程序
#CREATED:創(chuàng)建時(shí)間
#STATUS:當(dāng)前的狀態(tài)
#PORTS:端口映射名稱(chēng)
3.開(kāi)啟容器
[root@localhost ~]#docker start 116cfb7bee31
116cfb7bee31
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
116cfb7bee31 nginx:latest "/docker-entrypoint.…" 5 minutes ago Up 2 seconds 80/tcp zealous_khorana
3.1創(chuàng)建并啟動(dòng)容器
可以直接執(zhí)行 docker run 命令, 等同于先執(zhí)行 docker create 命令,再執(zhí)行 docker start 命令。
注意:容器是一個(gè)與其中運(yùn)行的 shell 命令共存亡的終端,命令運(yùn)行容器運(yùn)行, 命令結(jié)束容器退出。
docker 容器默認(rèn)會(huì)把容器內(nèi)部第一個(gè)進(jìn)程,也就是 pid=1 的程序作為docker容器是否正在運(yùn)行的依據(jù),如果docker容器中 pid = 1 的進(jìn)程掛了,那么docker容器便會(huì)直接退出,也就是說(shuō)Docker容器中必須有一個(gè)前臺(tái)進(jìn)程,否則認(rèn)為容器已經(jīng)掛掉。
[root@localhost ~]#docker run centos:7 /usr/bin/bash -c ls/
Unable to find image 'centos:7' locally
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7
/usr/bin/bash: ls/: No such file or directory
[root@localhost ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2ac752d7aeb1 6 days ago 188MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
[root@localhost ~]#docker ps -a
#會(huì)發(fā)現(xiàn)創(chuàng)建了一個(gè)新容器并啟動(dòng)執(zhí)行一條 shell 命令,之后就停止了
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d93d3f6f6306 centos:7 "/usr/bin/bash -c ls/" 23 seconds ago Exited (127) 22 seconds ago affectionate_wilson
116cfb7bee31 nginx:latest "/docker-entrypoint.…" 8 minutes ago Up 3 minutes 80/tcp zealous_khorana
3.2后臺(tái)持續(xù)運(yùn)行
需要在 docker run 命令之后添加 -d 選項(xiàng)讓 Docker 容器以守護(hù)形式在后臺(tái)運(yùn)行。并且容器所運(yùn)行的程序不能結(jié)束。
[root@localhost ~]#docker run -d centos:7 /usr/bin/bash -c "while ture;do echo hello;done"
086cebdee0f63b46b814f7e7c4a921564199977b8ad54e4ac3afd56abad3a18e
該循環(huán)會(huì)造成cpu過(guò)高
3.3創(chuàng)建容器并持續(xù)啟動(dòng)
[root@localhost ~]#docker run -itd --name centos7 centos:7 /bin/bash
067db2ec36f4edb5e14c6414d8db1bc362aea6e94951e335a4e156a710f19052
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
067db2ec36f4 centos:7 "/bin/bash" 5 seconds ago Up 3 seconds centos7
116cfb7bee31 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp zealous_khorana
4.停止容器運(yùn)行
格式:docker stop 容器的ID/名稱(chēng)
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
067db2ec36f4 centos:7 "/bin/bash" About a minute ago Up About a minute centos7
116cfb7bee31 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp zealous_khorana
[root@localhost ~]#docker stop 116cfb7bee31
116cfb7bee31
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
067db2ec36f4 centos:7 "/bin/bash" About a minute ago Up About a minute centos7
直接使用名稱(chēng)終止或啟動(dòng)
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
067db2ec36f4 centos:7 "/bin/bash" 2 minutes ago Up 2 minutes centos7
[root@localhost ~]#docker stop centos7
centos7
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]#docker start centos7
centos7
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
067db2ec36f4 centos:7 "/bin/bash" 2 minutes ago Up 1 second centos7
5.容器的進(jìn)入
需要進(jìn)入容器進(jìn)行命令操作時(shí),可以使用 docker exec 命令進(jìn)入運(yùn)行著的容器。
格式:docker exec -it 容器ID/名稱(chēng) /bin/bash
選項(xiàng) | 含義 |
---|---|
-i | 讓容器輸入保持打開(kāi) |
-t | 讓Docker分配一個(gè)偽終端 |
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
067db2ec36f4 centos:7 "/bin/bash" 3 minutes ago Up 46 seconds centos7
[root@localhost ~]#docker exec -it centos7 /bin/bash
[root@067db2ec36f4 /]# exit
exit
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
067db2ec36f4 centos:7 "/bin/bash" 5 minutes ago Up 2 minutes centos7
#退出容器后,容器仍在運(yùn)行
使用run進(jìn)入容器,不加-d,切換完直接退出 就不顯示正在運(yùn)行
[root@localhost ~]#docker run -it --name test01 centos:7 /bin/bash
[root@3bef5d7b2c46 /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@3bef5d7b2c46 /]# exit
exit
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
067db2ec36f4 centos:7 "/bin/bash" 6 minutes ago Up 4 minutes centos7
6.Docker容器的生命周期
七個(gè)狀態(tài)
- Created:已創(chuàng)建,還未運(yùn)行的容器
- Running:正在運(yùn)行中的容器
- Restarting:容器正在重啟中
- Removing:容器正在遷移中
- Paused:已暫停狀態(tài)的容器
- Exited:停滯狀態(tài)的容器
- Dead:死亡狀態(tài)(主要是操作系統(tǒng)會(huì)出現(xiàn)異常或斷電關(guān)機(jī)等有可能會(huì)引發(fā)Dead狀態(tài),不常見(jiàn))
7.Docker cp
7.1如何將宿主機(jī)的文件傳入到容器內(nèi)部
[root@localhost opt]#ls
containerd nginx rh
[root@localhost opt]#echo "this is cxk" > cxk.txt
[root@localhost opt]#ls
containerd cxk.txt nginx rh
[root@localhost opt]#cat cxk.txt
this is cxk
[root@localhost opt]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
067db2ec36f4 centos:7 "/bin/bash" 10 minutes ago Up 7 minutes centos7
[root@localhost opt]#docker cp /opt/cxk.txt centos7:/opt
Successfully copied 2.05kB to centos7:/opt
[root@localhost opt]#docker exec -it 067db2ec36f4 /bin/bash
[root@067db2ec36f4 /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@067db2ec36f4 /]# cd /opt/
[root@067db2ec36f4 opt]# ls
cxk.txt
[root@067db2ec36f4 opt]# cat cxk.txt
this is cxk
7.2如何將容器內(nèi)部文件導(dǎo)出到宿主機(jī)
[root@067db2ec36f4 opt]# cd ..
[root@067db2ec36f4 /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@067db2ec36f4 /]# echo "this is wyb" > wyb.txt
[root@067db2ec36f4 /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr wyb.txt
[root@067db2ec36f4 /]# cat wyb.txt
this is wyb
[root@067db2ec36f4 /]# exit
exit
[root@localhost opt]#docker cp 067db2ec36f4:/wyb.txt ./
Successfully copied 2.05kB to /opt/./
[root@localhost opt]#ls
containerd cxk.txt nginx rh wyb.txt
[root@localhost opt]#cat wyb.txt
this is wyb
8.容器的導(dǎo)出與導(dǎo)入
用戶(hù)可以將任何一個(gè) Docker 容器從一臺(tái)機(jī)器遷移到另一臺(tái)機(jī)器。在遷移過(guò)程中,可以使用docker export 命令將已經(jīng)創(chuàng)建好的容器導(dǎo)出為文件,無(wú)論這個(gè)容器是處于運(yùn)行狀態(tài)還是停止?fàn)顟B(tài)均可導(dǎo)出。可將導(dǎo)出文件傳輸?shù)狡渌麢C(jī)器,通過(guò)相應(yīng)的導(dǎo)入命令實(shí)現(xiàn)容器的遷移。
8.1容器的導(dǎo)出
導(dǎo)出格式:docker export 容器ID/名稱(chēng) > 文件名
[root@localhost opt]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
067db2ec36f4 centos:7 "/bin/bash" 15 minutes ago Up 12 minutes centos7
[root@localhost opt]#docker export 067db2ec36f4 > centos7.tar
[root@localhost opt]#ls
centos7.tar containerd cxk.txt nginx rh wyb.txt
[root@localhost opt]#ll
總用量 393960
-rw-r--r-- 1 root root 211691008 4月 23 22:40 centos7.tar
drwx--x--x 4 root root 28 4月 22 21:35 containerd
-rw-r--r-- 1 root root 12 4月 23 22:35 cxk.txt
-rw------- 1 root root 191711744 4月 23 18:32 nginx
drwxr-xr-x. 2 root root 6 12月 24 11:43 rh
-rw-r--r-- 1 root root 12 4月 23 22:37 wyb.txt
[root@localhost opt]#scp centos7.tar 192.168.241.22:/opt
8.2容器的導(dǎo)入
導(dǎo)入格式:cat 文件名 | docker import – 鏡像名稱(chēng):標(biāo)簽
[root@node2 ~]#cd /opt/
[root@node2 opt]#ls
centos7.tar containerd nginx rh
[root@node2 opt]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2ac752d7aeb1 6 days ago 188MB
[root@node2 opt]#cat centos7.tar |docker import - centos7.tar
#導(dǎo)入后會(huì)生成鏡像,但不會(huì)創(chuàng)建容器
sha256:f252016fbf108114d82ea72fc9b8c0e56b03c93e0d0ff791540d7da7cf22329f
[root@node2 opt]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7.tar latest f252016fbf10 10 seconds ago 204MB
nginx latest 2ac752d7aeb1 6 days ago 188MB
9.刪除容器
9.1單獨(dú)刪除容器
格式:docker rm [-f] 容器ID/名稱(chēng)
[root@localhost opt]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3bef5d7b2c46 centos:7 "/bin/bash" 13 minutes ago Exited (0) 13 minutes ago test01
067db2ec36f4 centos:7 "/bin/bash" 19 minutes ago Up 17 minutes centos7
1f0dad0bd628 centos:7 "/usr/bin/bash -c 'w…" 58 minutes ago Exited (0) 58 minutes ago great_kowalevski
086cebdee0f6 centos:7 "/usr/bin/bash -c 'w…" 59 minutes ago Exited (0) 59 minutes ago suspicious_gauss
d93d3f6f6306 centos:7 "/usr/bin/bash -c ls/" About an hour ago Exited (127) About an hour ago affectionate_wilson
116cfb7bee31 nginx:latest "/docker-entrypoint.…" 2 hours ago Exited (137) 18 minutes ago zealous_khorana
[root@localhost opt]#docker rm d93d3f6f6306
d93d3f6f6306
[root@localhost opt]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3bef5d7b2c46 centos:7 "/bin/bash" 14 minutes ago Exited (0) 14 minutes ago test01
067db2ec36f4 centos:7 "/bin/bash" 21 minutes ago Up 18 minutes centos7
1f0dad0bd628 centos:7 "/usr/bin/bash -c 'w…" 59 minutes ago Exited (0) 59 minutes ago great_kowalevski
086cebdee0f6 centos:7 "/usr/bin/bash -c 'w…" About an hour ago Exited (0) About an hour ago suspicious_gauss
116cfb7bee31 nginx:latest "/docker-entrypoint.…" 2 hours ago Exited (137) 19 minutes ago zealous_khorana
9.2批量刪除容器
刪除容器前要先停止容器
[root@localhost opt]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3bef5d7b2c46 centos:7 "/bin/bash" 14 minutes ago Exited (0) 14 minutes ago test01
067db2ec36f4 centos:7 "/bin/bash" 21 minutes ago Up 18 minutes centos7
1f0dad0bd628 centos:7 "/usr/bin/bash -c 'w…" 59 minutes ago Exited (0) 59 minutes ago great_kowalevski
086cebdee0f6 centos:7 "/usr/bin/bash -c 'w…" About an hour ago Exited (0) About an hour ago suspicious_gauss
116cfb7bee31 nginx:latest "/docker-entrypoint.…" 2 hours ago Exited (137) 20 minutes ago zealous_khorana
[root@localhost opt]#docker ps -a|awk 'NR>=2{print "docker stop "$1}'|bash
3bef5d7b2c46
067db2ec36f4
1f0dad0bd628
086cebdee0f6
116cfb7bee31
[root@localhost opt]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost opt]#docker ps -a|awk 'NR>=2{print $1}'
3bef5d7b2c46
067db2ec36f4
1f0dad0bd628
086cebdee0f6
116cfb7bee31
[root@localhost opt]#docker ps -a|awk 'NR>=2{print $1}'|xargs docker rm
3bef5d7b2c46
067db2ec36f4
1f0dad0bd628
086cebdee0f6
116cfb7bee31
[root@localhost opt]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9.3批量刪除鏡像
[root@localhost opt]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2ac752d7aeb1 6 days ago 188MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
[root@localhost opt]#docker images|awk 'NR>=2{print "docker rmi "$3}'|bash
Untagged: nginx:latest
Untagged: nginx@sha256:0463a96ac74b84a8a1b27f3d1f4ae5d1a70ea823219394e131f5bf3536674419
Deleted: sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580
Deleted: sha256:6f48b48669b4a97eeac346e72e869c1e4c680268cca70fcdec25da738c5a7548
Deleted: sha256:64a386b3811048d74a7db8d1de097982cbef2ebbeec1dac1595bdbdf7d316328
Deleted: sha256:52a454c478bf4ba5e25a792469347a0796b520496647eca6f17dd385adbf2113
Deleted: sha256:fd16bb266cbd82f06608dfde01edef9d07b42ed0f4abbbd91c343c7764847961
Deleted: sha256:f8393e895cb6daa91475b380620c3531f4b6a1916f6c4d78f32b278d60d86d57
Deleted: sha256:6948ce15ba3e073bca22093105d3b19795b765bf4d51fbadbaff13fad0c523d7
Deleted: sha256:1f00ff20147800878a4ebc9c283f79149a1dde5cc11d659c69d3a9c0bfeb7d4f
Untagged: centos:7
Untagged: centos@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Deleted: sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9
[root@localhost opt]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
注意:如果報(bào)錯(cuò)Error的話(huà),是因?yàn)樘崾緸槭刈o(hù)狀態(tài)運(yùn)行,需要加強(qiáng)制刪除
命令 | 含義 |
---|---|
docker stop 2592d3fad0fb docker rm 2592d3fad0fb |
刪除已經(jīng)終止?fàn)顟B(tài)的容器 |
docker rm -f 2592d3fad0fb | 強(qiáng)制刪除正在運(yùn)行的容器 |
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash | 批量停止容器 |
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop | 批量停止容器 |
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash | 批量刪除所有容器 |
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm | 批量刪除所有容器 |
docker images | awk 'NR>=2{print "docker rmi "$3}' | bash | 批量刪除鏡像 |
docker images | grep none | awk '{print $3}' | xargs docker rmi | 刪除none鏡像 |
docker rm $(docker ps -a -q) | 批量清理后臺(tái)停止的容器 |
六、Docker網(wǎng)絡(luò)
Docker使用Linux橋接,在宿主機(jī)虛擬一個(gè)Docker容器網(wǎng)橋(docker0),Docker啟動(dòng)一個(gè)容器時(shí)會(huì)根據(jù)Docker網(wǎng)橋的網(wǎng)段分配給容器一個(gè)IP地址,稱(chēng)為Container-IP,同時(shí)Docker網(wǎng)橋是每個(gè)容器的默認(rèn)網(wǎng)關(guān)。因?yàn)樵谕凰拗鳈C(jī)內(nèi)的容器都接入同一個(gè)網(wǎng)橋,這樣容器之間就能夠通過(guò)容器的 Container-IP 直接通信。
Docker網(wǎng)橋是宿主機(jī)虛擬出來(lái)的,并不是真實(shí)存在的網(wǎng)絡(luò)設(shè)備,外部網(wǎng)絡(luò)是無(wú)法尋址到的,這也意味著外部網(wǎng)絡(luò)無(wú)法直接通過(guò) Container-IP 訪問(wèn)到容器。如果容器希望外部訪問(wèn)能夠訪問(wèn)到,可以通過(guò)映射容器端口到宿主主機(jī)(端口映射),即 docker run 創(chuàng)建容器時(shí)候通過(guò) -p 或 -P 參數(shù)來(lái)啟用,訪問(wèn)容器的時(shí)候就通過(guò)[宿主機(jī)IP]:[容器端口]訪問(wèn)容器。
1.使用Docker操作Nginx
[root@localhost opt]#docker run -d --name nginx01 -P nginx
#隨機(jī)映射端口
[root@localhost opt]#docker run -d --name nginx02 -p 8080:80 nginx
#指定映射端口
[root@localhost opt]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25c73e6a1f0f nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx02
7779ac68c160 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:32768->80/tcp, :::32768->80/tcp nginx01
2.查看容器輸出日志
[root@localhost ~]#docker run -d --name nginx01 -P nginx
a2d527339732a3f41f49eb35074b06fbcd29e4bca21d4ccf5f111cb489c1d2a5
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a2d527339732 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:32769->80/tcp, :::32769->80/tcp nginx01
[root@localhost ~]#docker logs nginx01
3.Docker網(wǎng)絡(luò)模式
- Host:容器將不會(huì)虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機(jī)的IP和端口。
- Container:創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個(gè)指定的容器共享IP、端口范圍。
- None:該模式關(guān)閉了容器的網(wǎng)絡(luò)功能。(類(lèi)似于局域網(wǎng))
- Bridge:默認(rèn)為該模式,此模式會(huì)為每一個(gè)容器分配、設(shè)置IP等,并將容器連接到一個(gè)docker0虛擬網(wǎng)橋,通過(guò)docker0網(wǎng)橋以及iptables nat 表配置與宿主機(jī)通信。
- 自定義網(wǎng)絡(luò) ?
[root@localhost ~]#docker network ls
#查看Docker網(wǎng)絡(luò)列表
NETWORK ID NAME DRIVER SCOPE
e308a747ac9e bridge bridge local
b7922fbf5a50 host host local
70a8b224c173 none null local
[root@localhost ~]#docker network list
#查看Docker網(wǎng)絡(luò)列表
NETWORK ID NAME DRIVER SCOPE
e308a747ac9e bridge bridge local
b7922fbf5a50 host host local
70a8b224c173 none null local
安裝Docker時(shí),它會(huì)自動(dòng)創(chuàng)建三個(gè)網(wǎng)絡(luò),Bridge(創(chuàng)建容器默認(rèn)連接到此網(wǎng)絡(luò))、None、Host?
使用Docker run創(chuàng)建Docker容器時(shí),可以用--net或--network選項(xiàng)指定容器的網(wǎng)絡(luò)模式
- Host模式:使用--net=host指定
- None模式:使用--net=none指定
- Container模式:使用--net=container:Name_or_ID指定
- Bridge模式:使用--net=bridge指定,默認(rèn)設(shè)置,可省略?
3.1Docker network命令
命令 | 選項(xiàng) |
---|---|
Connect連接 | Connect a container to a network將容器連接到網(wǎng)絡(luò) |
Create創(chuàng)建 | Create a network建立網(wǎng)絡(luò) |
Disconnect未連接 | Disconnect a container from a network斷開(kāi)容器與網(wǎng)絡(luò)的連接 |
Inspect檢查 | Display detailed infomation on one or more networks顯示一個(gè)或多個(gè)網(wǎng)絡(luò)的詳細(xì)信息 |
Ls查看 | List networks查看容器列表網(wǎng)絡(luò)模式 |
Prune刪除 | Remove all unused networks刪除所有未使用的網(wǎng)絡(luò) |
Rm刪除 | Remove one or more networks刪除一個(gè)或多個(gè)網(wǎng)絡(luò) |
3.2Host模式
?相當(dāng)于Vmware中的橋接模式,與宿主機(jī)在同一個(gè)網(wǎng)絡(luò)中,但沒(méi)有獨(dú)立IP地址。
Docker使用了Linux的Namespaces技術(shù)來(lái)進(jìn)行資源隔離,如PID Namespace隔離進(jìn)程,Mount Namespace隔離文件系統(tǒng),Network Namespace隔離網(wǎng)絡(luò)等。
一個(gè)Network Namespace提供了一份獨(dú)立的網(wǎng)絡(luò)環(huán)境,包括網(wǎng)卡、路由、iptable規(guī)則等都與其他的Network Namespace隔離。 一個(gè)Docker容器一般會(huì)分配一個(gè)獨(dú)立的Network Namespace。 但如果啟動(dòng)容器的時(shí)候使用host模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的Network Namespace, 而是和宿主機(jī)共用一個(gè)Network Namespace。容器將不會(huì)虛擬出自己的網(wǎng)卡、配置自己的IP等,而是使用宿主機(jī)的IP和端口。
[root@localhost ~]#docker run -d --name test01 --network host nginx:latest
bd2d6d417e911355d0fa7ed96a7e6850f16ee8ed4b55d22c2299685acf4e64f2
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd2d6d417e91 nginx:latest "/docker-entrypoint.…" 4 seconds ago Up 3 seconds test01
a2d527339732 nginx "/docker-entrypoint.…" 40 minutes ago Up 40 minutes 0.0.0.0:32769->80/tcp, :::32769->80/tcp nginx01
[root@localhost ~]#docker inspect bd2d6d417e91
[root@localhost ~]#docker ps --filter "network=host"
#filter類(lèi)似于grep命令查詢(xún)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd2d6d417e91 nginx:latest "/docker-entrypoint.…" 13 minutes ago Up 13 minutes test01
此時(shí)可以使用80端口來(lái)訪問(wèn),因?yàn)槭褂玫腍ost模式,訪問(wèn)的其實(shí)是宿主機(jī)
3.3Container模式
這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個(gè)指定的容器共享IP、端口范圍等。同樣,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。兩個(gè)容器的進(jìn)程可以通過(guò)lo網(wǎng)卡設(shè)備通信。
和當(dāng)前某一個(gè)容器共享,每個(gè)Container都會(huì)有一個(gè)eth0,也就是每個(gè)Container都有自己的IP
[root@localhost ~]#docker run -itd --name test1 centos:7 /bin/bash
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
620b31a4f256 centos:7 "/bin/bash" 4 seconds ago Up 3 seconds test1
bd2d6d417e91 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour test01
a2d527339732 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:32769->80/tcp, :::32769->80/tcp nginx01
[root@localhost ~]#docker inspect -f '{{.State.Pid}}' 620b31a4f256
#查看容器進(jìn)程號(hào)
30575
[root@localhost ~]#ll /proc/30575/ns/
#查看容器的進(jìn)程、網(wǎng)絡(luò)、文件系統(tǒng)等命名空間編號(hào)
總用量 0
lrwxrwxrwx 1 root root 0 4月 24 19:03 ipc -> ipc:[4026532753]
lrwxrwxrwx 1 root root 0 4月 24 19:03 mnt -> mnt:[4026532751]
lrwxrwxrwx 1 root root 0 4月 24 19:02 net -> net:[4026532756]
lrwxrwxrwx 1 root root 0 4月 24 19:03 pid -> pid:[4026532754]
lrwxrwxrwx 1 root root 0 4月 24 19:03 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 4月 24 19:03 uts -> uts:[4026532752]
[root@localhost ~]#docker run -itd --name test2 --network=container:620b31a4f256 centos:7 /bin/bash
7f344dddcfd23c0c597089b9452f14d8eb5503e36499166ff04c5b3460717681
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f344dddcfd2 centos:7 "/bin/bash" 3 seconds ago Up 2 seconds test2
620b31a4f256 centos:7 "/bin/bash" 2 minutes ago Up 2 minutes test1
bd2d6d417e91 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour test01
a2d527339732 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:32769->80/tcp, :::32769->80/tcp nginx01
[root@localhost ~]#docker inspect 7f344dddcfd2
?從同一網(wǎng)絡(luò)出發(fā),為了安全,可以使用Container模式
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f344dddcfd2 centos:7 "/bin/bash" 2 minutes ago Up 2 minutes test2
620b31a4f256 centos:7 "/bin/bash" 5 minutes ago Up 5 minutes test1
bd2d6d417e91 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour test01
a2d527339732 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:32769->80/tcp, :::32769->80/tcp nginx01
[root@localhost ~]#docker inspect -f '{{.State.Pid}}' 7f344dddcfd2
31271
[root@localhost ~]#ll /proc/31271/ns/
總用量 0
lrwxrwxrwx 1 root root 0 4月 24 19:08 ipc -> ipc:[4026532850]
lrwxrwxrwx 1 root root 0 4月 24 19:08 mnt -> mnt:[4026532848]
lrwxrwxrwx 1 root root 0 4月 24 19:08 net -> net:[4026532756]
lrwxrwxrwx 1 root root 0 4月 24 19:08 pid -> pid:[4026532851]
lrwxrwxrwx 1 root root 0 4月 24 19:08 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 4月 24 19:08 uts -> uts:[4026532849]
Container模式下兩個(gè)Container的網(wǎng)卡是一樣的
lrwxrwxrwx 1 root root 0 4月 ?24 19:02 net -> net:[4026532756]
lrwxrwxrwx 1 root root 0 4月 ?24 19:08 net -> net:[4026532756]
3.4None模式
使用none模式,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。 也就是說(shuō),這個(gè)Docker容器沒(méi)有網(wǎng)卡、IP、路由等信息。這種網(wǎng)絡(luò)模式下容器只有l(wèi)o回環(huán)網(wǎng)絡(luò),沒(méi)有其他網(wǎng)卡。這種類(lèi)型的網(wǎng)絡(luò)沒(méi)有辦法聯(lián)網(wǎng),封閉的網(wǎng)絡(luò)能很好的保證容器的安全性。
[root@localhost ~]#docker run -itd --name test3 --network=none centos:7 /bin/bash
[root@localhost ~]#docker inspect test3|grep NetworkMode
"NetworkMode": "none",
3.5Bridge模式
bridge模式是docker的默認(rèn)網(wǎng)絡(luò)模式,不用--net參數(shù),就是bridge模式。
相當(dāng)于Vmware中的 nat 模式,容器使用獨(dú)立network Namespace,并連接到docker0虛擬網(wǎng)卡。通過(guò)docker0網(wǎng)橋以及iptables nat表配置與宿主機(jī)通信,此模式會(huì)為每一個(gè)容器分配N(xiāo)etwork Namespace、設(shè)置IP等,并將一個(gè)主機(jī)上的 Docker 容器連接到一個(gè)虛擬網(wǎng)橋上。
- 當(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ī)類(lèi)似,這樣主機(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)卡veth pair設(shè)備。veth設(shè)備總是成對(duì)出現(xiàn)的,它們組成了一個(gè)數(shù)據(jù)的通道,數(shù)據(jù)從一個(gè)設(shè)備進(jìn)入,就會(huì)從另一個(gè)設(shè)備出來(lái)。因此,veth設(shè)備常用來(lái)連接兩個(gè)網(wǎng)絡(luò)設(shè)備。
- Docker將 veth pair 設(shè)備的一端放在新創(chuàng)建的容器中,并命名為 eth0(容器的網(wǎng)卡),另一端放在主機(jī)中, 以 * 這樣類(lèi)似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到 docker0 網(wǎng)橋中。可以通過(guò) brctl show 命令查看。
- 使用 docker run -p 時(shí),docker實(shí)際是在iptables做了DNAT規(guī)則,實(shí)現(xiàn)端口轉(zhuǎn)發(fā)功能。可以使用iptables -t nat -vnL 查看。
創(chuàng)建一個(gè)就會(huì)出現(xiàn)一個(gè)Veth
通過(guò)Docker0創(chuàng)建虛擬網(wǎng)橋,相當(dāng)于隧道?
[root@localhost ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8cf406ee1e7f centos:7 "/bin/bash" 2 hours ago Up 2 hours test3
7f344dddcfd2 centos:7 "/bin/bash" 2 hours ago Up 2 hours test2
620b31a4f256 centos:7 "/bin/bash" 2 hours ago Up 2 hours test1
bd2d6d417e91 nginx:latest "/docker-entrypoint.…" 3 hours ago Up 3 hours test01
a2d527339732 nginx "/docker-entrypoint.…" 4 hours ago Up 4 hours 0.0.0.0:32769->80/tcp, :::32769->80/tcp nginx01
[root@localhost ~]#brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024283063bbd no veth252addc
vethf2b6f4c
virbr0 8000.52540053c145 yes virbr0-nic
[root@localhost ~]#ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:83ff:fe06:3bbd prefixlen 64 scopeid 0x20<link>
ether 02:42:83:06:3b:bd txqueuelen 0 (Ethernet)
RX packets 48 bytes 6609 (6.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 67 bytes 10034 (9.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.241.11 netmask 255.255.255.0 broadcast 192.168.241.255
inet6 fe80::de6f:32c8:5a64:a6b2 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:51:4b:b5 txqueuelen 1000 (Ethernet)
RX packets 303543 bytes 377607999 (360.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 335996 bytes 814708813 (776.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 156 bytes 13572 (13.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 156 bytes 13572 (13.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth252addc: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc3b:b8ff:fe65:97c5 prefixlen 64 scopeid 0x20<link>
ether fe:3b:b8:65:97:c5 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vethf2b6f4c: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::c0d9:dbff:fe60:6f5 prefixlen 64 scopeid 0x20<link>
ether c2:d9:db:60:06:f5 txqueuelen 0 (Ethernet)
RX packets 18 bytes 2511 (2.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 28 bytes 3491 (3.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:53:c1:45 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Docker網(wǎng)橋只有一個(gè)Docker0?
3.6自定義網(wǎng)絡(luò)
[root@localhost ~]#docker run -itd --name test4 --network bridge --ip 172.10.0.100 centos:7 /bin/bash
docker: Error response from daemon: invalid config for network bridge: invalid endpoint settings:
* user specified IP address is supported on user defined networks only
* no configured subnet or ip-range contain the IP address 172.10.0.100.
See 'docker run --help'.
#直接使用bridge模式,是無(wú)法支持指定IP運(yùn)行docker的,會(huì)報(bào)錯(cuò)
[root@localhost ~]#docker network create --subnet=172.10.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
#自定義網(wǎng)絡(luò)
[root@localhost ~]#docker run -itd --name test5 --network mynetwork --ip 172.10.0.100 centos:7 /bin/bash
#指定IP運(yùn)行Docker
[root@localhost ~]#docker ps |grep test5
365f72200b1f centos:7 "/bin/bash" 32 seconds ago Up 30 seconds test5
[root@localhost ~]#docker inspect test5|grep Gateway
"Gateway": "",
"IPv6Gateway": "",
"Gateway": "172.10.0.1",
"IPv6Gateway": "",
[root@localhost ~]#docker inspect test5|grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.10.0.100",
4.總結(jié)
-
Host:容器使用宿主機(jī)的網(wǎng)絡(luò)直接公開(kāi)服務(wù),這意味著你在容器中運(yùn)行一個(gè)Web服務(wù),那么它就直接綁定到主機(jī)的網(wǎng)絡(luò)接口上,而不是通過(guò)Dcoker進(jìn)行任何網(wǎng)絡(luò)轉(zhuǎn)發(fā)
-
Container:這種模式允許容器去共享另一個(gè)容器網(wǎng)絡(luò)命名空間,這說(shuō)明兩個(gè)容器可以相同的網(wǎng)絡(luò)接口和IP地址,他們共享的是同一網(wǎng)絡(luò)命名空間
-
None:是最簡(jiǎn)單的網(wǎng)絡(luò)模式,此網(wǎng)絡(luò)模式表示將容器擁有自己的網(wǎng)絡(luò)命名空間,但不會(huì)進(jìn)行任何網(wǎng)絡(luò)配置,這實(shí)際給了用戶(hù)完全的自主權(quán)來(lái)給自己配置容器的網(wǎng)絡(luò)
-
Bridge:默認(rèn)的網(wǎng)絡(luò)模式,每個(gè)新創(chuàng)建的容器都將該網(wǎng)絡(luò)分配一個(gè)IP地址,此網(wǎng)絡(luò)的模式允許所有Docker容器之間以及Docker宿主機(jī)之間進(jìn)行互相通信
-
自定義(User-Defined Network):Docker允許用戶(hù)創(chuàng)建自己的定義網(wǎng)絡(luò),用戶(hù)可以定義的網(wǎng)絡(luò)范圍、子網(wǎng)掩碼、路由等參數(shù),這種類(lèi)型網(wǎng)絡(luò)使用的用戶(hù)可以更好地對(duì)容器網(wǎng)絡(luò)進(jìn)行控制和隔離(生產(chǎn)業(yè)務(wù)需求,注:根據(jù)甲方指定或領(lǐng)導(dǎo)指定)
Host:與宿主機(jī)共享網(wǎng)絡(luò)名稱(chēng)空間
Container:多個(gè)容器之間共享一個(gè)Network Namespace(命名空間)
None:自閉空間
Bridge:默認(rèn)模式,通過(guò)Veth對(duì)連接容器Docker0網(wǎng)橋,網(wǎng)橋分配給容器IP地址,同時(shí)Docker0作為局域網(wǎng)內(nèi)容器的網(wǎng)關(guān),最后與宿主機(jī)網(wǎng)卡進(jìn)行通訊
自定義:根據(jù)業(yè)務(wù)需求指定靜態(tài)IP地址文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-858607.html
七、Cgroup——資源控制
1.Cgroup概述
Cgroups,是一個(gè)非常強(qiáng)大的linux內(nèi)核工具,他不僅可以限制被 namespace 隔離起來(lái)的資源, 還可以為資源設(shè)置權(quán)重、計(jì)算使用量、操控進(jìn)程啟停等等。 所以 cgroups(Control groups)實(shí)現(xiàn)了對(duì)資源的配額和度量。
2.Cgroup功能
- 資源限制:可以對(duì)任務(wù)使用的資源總額進(jìn)行限制
- 優(yōu)先級(jí)分配:通過(guò)分配的cpu時(shí)間片數(shù)量以及磁盤(pán)IO帶寬大小,實(shí)際上相當(dāng)于控制了任務(wù)運(yùn)行優(yōu)先級(jí)
- 資源統(tǒng)計(jì):可以統(tǒng)計(jì)系統(tǒng)的資源使用量,如cpu時(shí)長(zhǎng),內(nèi)存用量等
- 任務(wù)控制:cgroup可以對(duì)任務(wù)執(zhí)行掛起、恢復(fù)等操作
3.設(shè)置CPU使用率上限
Linux通過(guò)CFS(Completely Fair Scheduler,完全公平調(diào)度器)來(lái)調(diào)度各個(gè)進(jìn)程對(duì)CPU的使用。CFS默認(rèn)的調(diào)度周期是100ms。我們可以設(shè)置每個(gè)容器進(jìn)程的調(diào)度周期,以及在這個(gè)周期內(nèi)各個(gè)容器最多能使用多少 CPU 時(shí)間。
使用 --cpu-period 即可設(shè)置調(diào)度周期,使用 --cpu-quota 即可設(shè)置在每個(gè)周期內(nèi)容器能使用的CPU時(shí)間。兩者可以配合使用。
CFS 周期的有效范圍是 1ms~1s,對(duì)應(yīng)的 --cpu-period 的數(shù)值范圍是 1000~1000000。 周期100毫秒,而容器的 CPU 配額必須不小于 1ms,即 --cpu-quota 的值必須 >= 1000。
[root@localhost ~]#docker run -itd --name test6 centos:7 /bin/bash
4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7
[root@localhost ~]#docker ps|grep test6
4d44cc5bb62c centos:7 "/bin/bash" 11 seconds ago Up 10 seconds test6
[root@localhost ~]#cd /sys/fs/cgroup/cpu/docker/4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7/
[root@localhost 4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7]#ls
cgroup.clone_children cpuacct.usage_percpu cpu.shares
cgroup.event_control cpu.cfs_period_us cpu.stat
cgroup.procs cpu.cfs_quota_us notify_on_release
cpuacct.stat cpu.rt_period_us tasks
cpuacct.usage cpu.rt_runtime_us
[root@localhost 4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7]#cat cpu.cfs_period_us
100000
#默認(rèn)為100000微秒
[root@localhost 4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7]#cat cpu.cfs_quota_us
-1
#-1表示不限制上限
[root@localhost 4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7]#echo 5000 > cpu.cfs_quota_us
[root@localhost 4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7]#cat cpu.cfs_quota_us
5000
[root@localhost 4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7]#docker exec -it test6 /bin/bash
[root@4d44cc5bb62c /]# vi test.sh
[root@4d44cc5bb62c /]# cat test.sh
#!/bin/bash
a=0
while true
do
let a++
done
[root@4d44cc5bb62c /]# chmod +x test.sh
[root@4d44cc5bb62c /]# ./test.sh
由此可看出CPU占用比一直是50%左右?
[root@localhost ~]#docker stats
4.設(shè)置CPU資源占用比
[root@node2 ~]#docker run -itd --name c1 --cpu-shares 512 centos:7
[root@node2 ~]#docker run -itd --name c2 --cpu-shares 1024 centos:7
分別進(jìn)入容器進(jìn)行壓力測(cè)試?
[root@node2 ~]#docker exec -it c1 /bin/bash
[root@fdc35030c273 /]# yum install -y epel-release
[root@fdc35030c273 /]# yum install -y stress
[root@node2 ~]#docker exec -it c2 /bin/bash
[root@8cfd4548dcb0 /]# yum install -y epel-release
[root@8cfd4548dcb0 /]# yum install -y stress
[root@fdc35030c273 /]# stress -c 4
[root@8cfd4548dcb0 /]# stress -c 4
?產(chǎn)生四個(gè)進(jìn)程,每個(gè)進(jìn)程都反復(fù)不停的計(jì)算隨機(jī)數(shù)的平方根
[root@node2 ~]#docker stats
5.設(shè)置容器綁定指定CPU
[root@localhost ~]#docker run -itd --name test7 --cpuset-cpus 1 centos:7 /bin/bash
9506e0a61c8072da54c3a3e865595b2151f01e535ec668a11d1f578f455f48d9
[root@localhost ~]#docker exec -it test7 /bin/bash
[root@9506e0a61c80 /]# yum install -y epel-release
[root@9506e0a61c80 /]# yum install stress -y
6.對(duì)內(nèi)存使用限制
6.1-m選項(xiàng)(--memory)
-m(--memory=) 選項(xiàng)用于限制容器可以使用的最大內(nèi)存
[root@localhost ~]#docker run -itd --name test8 -m 512m centos:7 /bin/bash
[root@localhost ~]#docker stats
6.2--memory-swap(限制可用swap大?。?/h4>
限制可用的 swap 大小, --memory-swap
強(qiáng)調(diào)一下,--memory-swap 是必須要與 --memory 一起使用的。
正常情況下,--memory-swap 的值包含容器可用內(nèi)存和可用 swap。
所以 -m 300m --memory-swap=1g 的含義為:容器可以使用 300M 的物理內(nèi)存,并且可以使用 700M(1G - 300)的 swap。
如果 --memory-swap 設(shè)置為 0 或者 不設(shè)置,則容器可以使用的 swap 大小為 -m 值的兩倍。
如果 --memory-swap 的值和 -m 值相同,則容器不能使用 swap。
如果 --memory-swap 值為 -1,它表示容器程序使用的內(nèi)存受限,而可以使用的 swap 空間使用不受限制(宿主機(jī)有多少 swap 容器就可以使用多少)。
[root@localhost ~]#docker run -itd -m 200M --memory-swap=1G nginx:latest --vm 1 --vm-bytes 100M
#--vm 1 啟動(dòng)一個(gè)內(nèi)存的工作線程
#--vm-bytes 每個(gè)線程分配100m(類(lèi)似于分配 分片)
7.對(duì)磁盤(pán)I/O配額控制(blkio)的限制
- --device-read-bps:限制某個(gè)設(shè)備上的讀速度bps(數(shù)據(jù)量),單位可以是kb、mb(M)或者gb。
- --device-write-bps : 限制某個(gè)設(shè)備上的寫(xiě)速度bps(數(shù)據(jù)量),單位可以是kb、mb(M)或者gb。
- --device-read-iops :限制讀某個(gè)設(shè)備的iops(次數(shù))
- --device-write-iops :限制寫(xiě)入某個(gè)設(shè)備的iops(次數(shù))
[root@localhost ~]#docker run -it --name test9 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
#限制某個(gè)設(shè)備上的寫(xiě)速度bps(數(shù)據(jù)量),單位可以是kb、mb(M)或者gb。
[root@e670a9789b5c /]# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
#通過(guò)dd來(lái)驗(yàn)證寫(xiě)速度;添加oflag參數(shù)以規(guī)避掉文件系統(tǒng)cache
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0103881 s, 1.0 GB/s
此處如果是安裝的Docker最新版本的話(huà),寫(xiě)入的數(shù)據(jù)信息會(huì)有些問(wèn)題;但如果Docker版本為20版,將是如下效果
#清理docker占用的磁盤(pán)空間
docker system prune -a
#可以用于清理磁盤(pán),刪除關(guān)閉的容器、無(wú)用的數(shù)據(jù)卷和網(wǎng)絡(luò)
8.故障舉例
由于docker容器故障導(dǎo)致大量日志集滿(mǎn),會(huì)造成磁盤(pán)空間滿(mǎn)
如果磁盤(pán)空間滿(mǎn)了,先使用df -h,到達(dá)指定目錄之后再使用du -sh,對(duì)應(yīng)占比比較大的清理
8.1解決方案——清除日志
#清除日志腳本
#!/bin/bash
logs=$ (find /var/lib/docker/containers/ -name *-json.log*)
#-json.log存儲(chǔ)著Docker的日志
for log in $logs
do
cat /dev/null > $log
done
模擬故障?
[root@localhost ~]#cd /var/lib/docker/containers/
[root@localhost containers]#ls
365f72200b1fe229d407dbcb0dbab3f6f62f71e51e87bd6a87f5659d3ca11d2b
4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7
5e657913128f9ebd127fca43773af0679651f04c1b9f8356c21afe1026ca460a
620b31a4f25601c673305088ccad7243ef15a8a4ddb6514cb181096a772bab7a
7f344dddcfd23c0c597089b9452f14d8eb5503e36499166ff04c5b3460717681
7fc79e8b7409ab0a52ed654afcf4c641b950f9f228e8d31ea01c1ba5d96d49ba
8cf406ee1e7f0face6040042fcc95992d6791293247b20a3581dd72f67aac51e
9506e0a61c8072da54c3a3e865595b2151f01e535ec668a11d1f578f455f48d9
a2d527339732a3f41f49eb35074b06fbcd29e4bca21d4ccf5f111cb489c1d2a5
bd2d6d417e911355d0fa7ed96a7e6850f16ee8ed4b55d22c2299685acf4e64f2
e670a9789b5c6b8ac5dfe42b317f3c72e47874078e952933ab092c4e84d8e67d
[root@localhost containers]#du -sh *
24K 365f72200b1fe229d407dbcb0dbab3f6f62f71e51e87bd6a87f5659d3ca11d2b
24K 4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7
24K 5e657913128f9ebd127fca43773af0679651f04c1b9f8356c21afe1026ca460a
24K 620b31a4f25601c673305088ccad7243ef15a8a4ddb6514cb181096a772bab7a
8.0K 7f344dddcfd23c0c597089b9452f14d8eb5503e36499166ff04c5b3460717681
24K 7fc79e8b7409ab0a52ed654afcf4c641b950f9f228e8d31ea01c1ba5d96d49ba
24K 8cf406ee1e7f0face6040042fcc95992d6791293247b20a3581dd72f67aac51e
24K 9506e0a61c8072da54c3a3e865595b2151f01e535ec668a11d1f578f455f48d9
28K a2d527339732a3f41f49eb35074b06fbcd29e4bca21d4ccf5f111cb489c1d2a5
28K bd2d6d417e911355d0fa7ed96a7e6850f16ee8ed4b55d22c2299685acf4e64f2
28K e670a9789b5c6b8ac5dfe42b317f3c72e47874078e952933ab092c4e84d8e67d
[root@localhost containers]#docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
?清除日志
[root@localhost containers]#du -sh *
512M 2f7d8a6896dede50deb4107a0cead3b8162ef4cede841e3d3346655c8d4d3ee9
24K 365f72200b1fe229d407dbcb0dbab3f6f62f71e51e87bd6a87f5659d3ca11d2b
24K 4839b83f0d65a359b5a9014237023db7953180722ca29c0556f393d54812105c
24K 4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7
24K 5e657913128f9ebd127fca43773af0679651f04c1b9f8356c21afe1026ca460a
24K 620b31a4f25601c673305088ccad7243ef15a8a4ddb6514cb181096a772bab7a
8.0K 7f344dddcfd23c0c597089b9452f14d8eb5503e36499166ff04c5b3460717681
24K 7fc79e8b7409ab0a52ed654afcf4c641b950f9f228e8d31ea01c1ba5d96d49ba
24K 8cf406ee1e7f0face6040042fcc95992d6791293247b20a3581dd72f67aac51e
24K 9506e0a61c8072da54c3a3e865595b2151f01e535ec668a11d1f578f455f48d9
28K a2d527339732a3f41f49eb35074b06fbcd29e4bca21d4ccf5f111cb489c1d2a5
28K bd2d6d417e911355d0fa7ed96a7e6850f16ee8ed4b55d22c2299685acf4e64f2
28K e670a9789b5c6b8ac5dfe42b317f3c72e47874078e952933ab092c4e84d8e67d
[root@localhost containers]#du -sh *
2.0G 2f7d8a6896dede50deb4107a0cead3b8162ef4cede841e3d3346655c8d4d3ee9
24K 365f72200b1fe229d407dbcb0dbab3f6f62f71e51e87bd6a87f5659d3ca11d2b
24K 4839b83f0d65a359b5a9014237023db7953180722ca29c0556f393d54812105c
24K 4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7
24K 5e657913128f9ebd127fca43773af0679651f04c1b9f8356c21afe1026ca460a
24K 620b31a4f25601c673305088ccad7243ef15a8a4ddb6514cb181096a772bab7a
8.0K 7f344dddcfd23c0c597089b9452f14d8eb5503e36499166ff04c5b3460717681
24K 7fc79e8b7409ab0a52ed654afcf4c641b950f9f228e8d31ea01c1ba5d96d49ba
24K 8cf406ee1e7f0face6040042fcc95992d6791293247b20a3581dd72f67aac51e
24K 9506e0a61c8072da54c3a3e865595b2151f01e535ec668a11d1f578f455f48d9
28K a2d527339732a3f41f49eb35074b06fbcd29e4bca21d4ccf5f111cb489c1d2a5
28K bd2d6d417e911355d0fa7ed96a7e6850f16ee8ed4b55d22c2299685acf4e64f2
28K e670a9789b5c6b8ac5dfe42b317f3c72e47874078e952933ab092c4e84d8e67d
[root@localhost containers]#cd /opt/
[root@localhost opt]#ls
centos7.tar containerd cxk.txt nginx rh wyb.txt
[root@localhost opt]#vim ceshi.sh
[root@localhost opt]#cat ceshi.sh
#!/bin/bash
logs=$(find /var/lib/docker/containers/ -name *-json.log*)
for log in $logs
do
cat /dev/null > $log
done
[root@localhost opt]#sh ceshi.sh
[root@localhost opt]#cd -
/var/lib/docker/containers
[root@localhost containers]#du -sh *
513M 2f7d8a6896dede50deb4107a0cead3b8162ef4cede841e3d3346655c8d4d3ee9
24K 365f72200b1fe229d407dbcb0dbab3f6f62f71e51e87bd6a87f5659d3ca11d2b
24K 4839b83f0d65a359b5a9014237023db7953180722ca29c0556f393d54812105c
24K 4d44cc5bb62c14e4046beeb78527192073d8d020471275e6675e7802d9bdbfd7
24K 5e657913128f9ebd127fca43773af0679651f04c1b9f8356c21afe1026ca460a
24K 620b31a4f25601c673305088ccad7243ef15a8a4ddb6514cb181096a772bab7a
8.0K 7f344dddcfd23c0c597089b9452f14d8eb5503e36499166ff04c5b3460717681
24K 7fc79e8b7409ab0a52ed654afcf4c641b950f9f228e8d31ea01c1ba5d96d49ba
24K 8cf406ee1e7f0face6040042fcc95992d6791293247b20a3581dd72f67aac51e
24K 9506e0a61c8072da54c3a3e865595b2151f01e535ec668a11d1f578f455f48d9
24K a2d527339732a3f41f49eb35074b06fbcd29e4bca21d4ccf5f111cb489c1d2a5
24K bd2d6d417e911355d0fa7ed96a7e6850f16ee8ed4b55d22c2299685acf4e64f2
24K e670a9789b5c6b8ac5dfe42b317f3c72e47874078e952933ab092c4e84d8e67d
8.2解決方案——當(dāng)日志占滿(mǎn)之后如何處理
#設(shè)置docker日志文件數(shù)量及每個(gè)日志大小
vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
"log-driver": "json-file", #我的一日志格式
"log-opts": { "max-size" : "500m", "max-file" : "3"} 日志的參數(shù)最大500M 我最大容器中有三個(gè)日志文件 每個(gè)日志文件大小是500M
}
修改完需要重新加載 systemctl daemon-reload
八、總結(jié)
1.虛擬化產(chǎn)品
- VMware Workstation 個(gè)人
- VMware Sphere/ESXI 企業(yè)級(jí)虛擬化
- OpenStack(開(kāi)發(fā))/KVM Linux環(huán)境虛擬機(jī),私有云環(huán)境
2.Docker的認(rèn)識(shí)
- 容器:提供多臺(tái)主機(jī)上運(yùn)行的應(yīng)用程序的相同的運(yùn)行環(huán)境
- Docker:是一個(gè)開(kāi)源的應(yīng)用容器引擎,基于go語(yǔ)言開(kāi)發(fā),是容器里面的運(yùn)行應(yīng)用的工具,是一個(gè)輕量級(jí)的虛擬機(jī),可用在Docker多個(gè)平臺(tái)去使用的
- 容器通過(guò)Namespace(命名空間、名稱(chēng))資源隔離,再通過(guò)Cgroup(資源配額)限制資源
3.Dcoker核心概念
- 鏡像:運(yùn)行容器的基礎(chǔ),包含運(yùn)行的應(yīng)用程序所需的所有內(nèi)容
- 容器:是從鏡像創(chuàng)建的運(yùn)行實(shí)例
- 倉(cāng)庫(kù):集中保存鏡像的地方(公有倉(cāng)庫(kù)Docker HUB,私有倉(cāng)庫(kù)Harhor)
4.Docker命令總結(jié)
命令行 | 含義 |
---|---|
Docker Search 倉(cāng)庫(kù)名/鏡像名 | 搜索鏡像 |
Docker pull 倉(cāng)庫(kù)名/鏡像名:標(biāo)簽 | 拉取鏡像 |
Docker push 倉(cāng)庫(kù)用戶(hù)名/鏡像名:標(biāo)簽 | 上傳鏡像 |
Docker images | 查看本地鏡像 |
Docker tag 源倉(cāng)庫(kù)名 /源鏡像名:標(biāo)簽 新倉(cāng)庫(kù)名/新鏡像名:標(biāo)簽 | 為本地鏡像加新的標(biāo)簽 |
Docker rmi 倉(cāng)庫(kù)名/鏡像名:標(biāo)簽 | 刪除鏡像 |
Docker save -o xxx.tar 倉(cāng)庫(kù)名/鏡像名:標(biāo)簽 | 存出鏡像 |
Docker load -i xxx.tar/Docker < 重定向 | 載入鏡像 |
Docker login{-u指定倉(cāng)庫(kù)名;-p密碼} | 登錄公共倉(cāng)庫(kù) |
Docker inspect 鏡像ID/容器ID | 獲取鏡像詳細(xì)信息 |
Docker Create [選項(xiàng)] 鏡像 | 創(chuàng)建鏡像 |
Docker ps -a | 查看顯示所有容器 |
Docker ps | 查看正在運(yùn)行的容器 |
Docker Start/Restart/Stop | 啟動(dòng)/重啟/關(guān)閉容器 |
Docker exec -it | 切換到容器內(nèi) |
Docker run | 創(chuàng)建并啟動(dòng)容器 |
Docker cp | 復(fù)制,從宿主機(jī)到容器內(nèi),也可以容器內(nèi)到宿主機(jī) |
Docker rm -f | 刪除容器、加-f 強(qiáng)制刪除容器 |
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop |
批量停止容器 |
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm |
批量刪除所有容器 |
docker images | awk 'NR>=2{print "docker rmi "$3}'| bash |
批量刪除鏡像 |
docker images | grep none | awk '{print $3}' | xargs docker rmi |
刪除none鏡像 |
docker rm $(docker ps -a -q)? | 批量清理后臺(tái)停止的容器 |
Docker export | 導(dǎo)出正在運(yùn)行的容器,形成鏡像,遷移使用(容器內(nèi)的數(shù)據(jù)可以保存在鏡像中) |
Docker import | 導(dǎo)入鏡像 |
kill | 停止Docker |
Docker version | 查看Docker版本 |
Docker info | 查看Dcoker詳細(xì)信息 |
Docker stats | 查看運(yùn)行的容器狀態(tài) |
Docker logs | 輸出日志 |
Docker system prune -a | 可以用于清理磁盤(pán),刪除關(guān)閉的容器、無(wú)用的數(shù)據(jù)卷和網(wǎng)絡(luò) |
--device-read-bps | 限制某個(gè)設(shè)備上的讀速度bps(數(shù)據(jù)量) |
--device-write-bps | 限制某個(gè)設(shè)備上的寫(xiě)速度bps(數(shù)據(jù)量) |
--device-read-iops | 限制讀某個(gè)設(shè)備的iops(次數(shù)) |
--device-write-iops | 限制寫(xiě)入某個(gè)設(shè)備的iops(次數(shù)) |
5.Docker網(wǎng)絡(luò)模式
-
Host:容器使用宿主機(jī)的網(wǎng)絡(luò)直接公開(kāi)服務(wù),這意味著你在容器中運(yùn)行一個(gè)Web服務(wù),那么它就直接綁定到主機(jī)的網(wǎng)絡(luò)接口上,而不是通過(guò)Dcoker進(jìn)行任何網(wǎng)絡(luò)轉(zhuǎn)發(fā)
-
Container:這種模式允許容器去共享另一個(gè)容器網(wǎng)絡(luò)命名空間,這說(shuō)明兩個(gè)容器可以相同的網(wǎng)絡(luò)接口和IP地址,他們共享的是同一網(wǎng)絡(luò)命名空間
-
None:是最簡(jiǎn)單的網(wǎng)絡(luò)模式,此網(wǎng)絡(luò)模式表示將容器擁有自己的網(wǎng)絡(luò)命名空間,但不會(huì)進(jìn)行任何網(wǎng)絡(luò)配置,這實(shí)際給了用戶(hù)完全的自主權(quán)來(lái)給自己配置容器的網(wǎng)絡(luò)
-
Bridge:默認(rèn)的網(wǎng)絡(luò)模式,每個(gè)新創(chuàng)建的容器都將該網(wǎng)絡(luò)分配一個(gè)IP地址,此網(wǎng)絡(luò)的模式允許所有Docker容器之間以及Docker宿主機(jī)之間進(jìn)行互相通信
-
自定義(User-Defined Network):Docker允許用戶(hù)創(chuàng)建自己的定義網(wǎng)絡(luò),用戶(hù)可以定義的網(wǎng)絡(luò)范圍、子網(wǎng)掩碼、路由等參數(shù),這種類(lèi)型網(wǎng)絡(luò)使用的用戶(hù)可以更好地對(duì)容器網(wǎng)絡(luò)進(jìn)行控制和隔離(生產(chǎn)業(yè)務(wù)需求,注:根據(jù)甲方指定或領(lǐng)導(dǎo)指定)
Host:與宿主機(jī)共享網(wǎng)絡(luò)名稱(chēng)空間
Container:多個(gè)容器之間共享一個(gè)Network Namespace(命名空間)
None:自閉空間
Bridge:默認(rèn)模式,通過(guò)Veth對(duì)連接容器Docker0網(wǎng)橋,網(wǎng)橋分配給容器IP地址,同時(shí)Docker0作為局域網(wǎng)內(nèi)容器的網(wǎng)關(guān),最后與宿主機(jī)網(wǎng)卡進(jìn)行通訊
自定義:根據(jù)業(yè)務(wù)需求指定靜態(tài)IP地址
6.Cgroup
Cgroup(Control Groups)是一個(gè)Linux內(nèi)核的特性,通過(guò)內(nèi)核來(lái)限制記錄和隔離進(jìn)程組的系統(tǒng)資源使用(CPU/內(nèi)存/磁盤(pán)I/O等)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-858607.html
6.1對(duì)CPU限制
- CPU-period(CPU周期):指的是CPU在給與當(dāng)前管理控制容器的分配資源時(shí),CPU分配周期,默認(rèn)為1s,此配置可以在運(yùn)行時(shí)直接指定
- CPU-quota(CPU配額):直接限制了Cgroup可以使用CPU的時(shí)間,如果設(shè)置了Cgroup的CPU配額1000000us(微秒)那么在每個(gè)100ms(毫秒)內(nèi)的時(shí)間窗口,Cgroup最多使只能使用1000000us(微秒)的CPU
- CPUset-CPU:指定容器僅能使用指定的CPU,按照CPU的下標(biāo)來(lái)表示
6.2對(duì)內(nèi)存限制
- 內(nèi)存使用上限(硬限制)
- 內(nèi)存+swap使用上限(硬限制)比如,swap 1G 必須需要設(shè)置物理內(nèi)存,舉例200M 1G-200M=800M的swap
6.3對(duì)磁盤(pán)I/O限制
- --device-read-bps:限制某個(gè)設(shè)備上的讀速度bps(數(shù)據(jù)量),單位可以是kb、mb(M)或者gb。?
- --device-write-bps : 限制某個(gè)設(shè)備上的寫(xiě)速度bps(數(shù)據(jù)量),單位可以是kb、mb(M)或者gb。?
- --device-read-iops :限制讀某個(gè)設(shè)備的iops(次數(shù))
- --device-write-iops :限制寫(xiě)入某個(gè)設(shè)備的iops(次數(shù))
到了這里,關(guān)于Docker——開(kāi)源的應(yīng)用容器的引擎的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!