一、前言
云端:华为云、谷歌云、腾讯云、阿里云、亚马逊、百度云、天翼云、西部数码云灯
国内运:华为云、阿里云、腾讯云、天翼云(私有云)
国外云:谷歌云、亚马逊
云计算的服务模式是分几层的,分别是IaaS、PaaS、SaaS
- IaaS:Infrastructure(基础设施)-as-a-Service
- PaaS:Platform(平台)-as-a-Service
- SaaS:Software(软件-as-a-Service)
基础设置在最下端,平台在中间,软件在顶端
IaaS:提供所有底层设备
PaaS:软件也不需要,只需要敲代码即可(天翼云,目前大部分企业均使用PaaS)
SaaS用的不多(相当于快捷酒店)
1.虚拟化产品有哪些
虚拟机架构一般只有两种:寄居架构和源生架构
1.1寄居架构
从本机(真实的操作系统)------>虚拟化产品------>虚拟化操作系统或软件
1.2源生架构
物理机之上,在一台物理机上直接安装虚拟产品
裸金属服务器------>虚拟化产品
2.虚拟化产品对比/介绍
2.1虚拟化产品
- 仿真虚拟化(对系统硬件没有要求,性能最低)
- 半虚拟化(虚拟机可以直接使用,真机物理机)
- 全虚拟化(直接使用物理硬件,性能要求很高)
2.1.1仿真虚拟化
VMware客户端
VMware workstation 个人在Windows安装的虚拟机
VMware Fusion MAC
2.1.2半虚拟化
rehl 5 自带xen(虚拟机监视器)
微软Microsoft Hyper-V(虚拟化产品 半虚拟化)
VirtualBox 7.0虚拟盒子
cirix Hypervisor
Linux环境虚拟机:KVM(在Linux系统中运行的)、OpenStack(私有云)
KVM基于内核的虚拟机主机
2.1.3全虚拟化
VMware服务端exsi(现在企业一般使用这个)VMware vsphere裸金属
全虚拟化,直接使用物理硬件,性能高
客户端连接VMware vsphere
现在企业一般都使用网页端连接VMware vsphere
2.2重点
2.2.1KVM——Linux内核来完成的功能和性能
2.2.2ESXI——用的比较多
二、Docker概述
1.Docker定义
Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。是一种轻量级的“虚拟机”,在Linux容器里运行应用的开源工具。
Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。
Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
Docker的设计宗旨:Build,Ship and Run Any App,Anywhere,
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
Docker 发展历史 https://www.cnblogs.com/rongba/articles/14782624.html
Docker中文官网:http://www.docker.org.cn
Docker支持的系统类别很多,Windows和Linux都可以安装,这也是为什么Docker比较受欢迎的原因之一,只要有Docker就可以运行任何状态,没有不兼容的。
2.Docker特点(优点)
- 灵活:即使是最复杂的应用也可以集装箱化。
- 轻量级:容器利用并共享主机内核。
- 可互换:可以即时部署更新和升级。
- 便携式:可以在本地构建,部署到云,并在任何地方运行。
- 可扩展:可以增加并自动分发容器副本。
- 可堆叠:可以垂直和即时堆叠服务。
容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
3.Docker与虚拟机的区别
特性Docker容器虚拟机启动速度秒级分钟级计算能力消耗几乎无
损耗50%左右
性能接近原生弱于系统支持量(单机)上千个几十个隔离性资源隔离/限制完全隔离
4.容器有哪些
- docker
- podman:与docker相似 OCI(调用内核)redhat
- K8s
- Container(docker核心组件之一)
- LXC:linux 容器化技术
- Crio:轻量级,专门用于 k8s
- Apache Mesos:容器编排平台
5.容器在内核中重要技术
Docker本质就是在宿主机的一个进程,Docker是通过Namespace(命名空间)实现资源隔离,通过Cgroup实现资源限制,通过写时复制技术(Copy-On-Write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500G并不是实际占用物理磁盘500G)
5.1Namespace六项隔离
Namespace系统调用参数隔离内容UTSCLONE_NAWUTS主机名与域名IPCCLONE_NEWWIPC信号量、消息队列和共享内存PIDCLONE_NEWPID进程编号NETWORKCLONE_NEWNET网路设备、网络栈、端口等MOUNTCLONE_NEWNS挂载点(文件系统)USERCLONE_NEWUSER用户和用户组(3.8以后的内核才支持)
6.Docker核心概念
6.1镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。
Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。
6.2容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
镜像 nginx (run) 起来之后的一个实例,可以把容器看做时一个简易版的linux环境容器 就是集装箱(logo上的集装箱)
6.3仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker
仓库就是放镜像的场所,做大的公开库 docker hub
7.总结
7.1虚拟化产品
- VMware Workstation 个人
- VMware Sphere/ESXI 企业级虚拟化
- OpenStack(开发)/KVM Linux环境虚拟机,私有云环境
7.2Docker的认识
- 容器:提供多台主机上运行的应用程序的相同的运行环境
- Docker:是一个开源的应用容器引擎,基于go语言开发,是容器里面的运行应用的工具,是一个轻量级的虚拟机,可用在Docker多个平台去使用的
- 容器通过Namespace(命名空间、名称)资源隔离,再通过Cgroup(资源配额)限制资源
7.3Dcoker核心概念
- 镜像:运行容器的基础,包含运行的应用程序所需的所有内容
- 容器:是从镜像创建的运行实例
- 仓库:集中保存镜像的地方(公有仓库Docker HUB,私有仓库Harhor)
三、安装Docker
目前的Docker只能支持64位系统
1.环境准备
systemctl stop firewalld.service
setenforce 0
2.安装依赖包
[root@localhost ~]#yum install -y yum-utils device-mapper-persistent-data lvm2
#yum-utils:提供了 yum-config-manager 工具。
#device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
#device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
3.设置阿里云镜像
[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
#容器数量
Running: 0
Paused: 0
Stopped: 0
Images: 0
#镜像数量
Server Version: 26.0.2
#Server版本
Storage Driver: overlay2
#Docker使用的是Overlay2文件驱动
Backing Filesystem: xfs
#宿主机上的底层文件系统
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
#Cgroup驱动
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
#宿主机相关信息 内核版本
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数据存储目录
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
四、Docker镜像操作
1.搜索镜像
[root@localhost ~]#docker search nginx
2.获取镜像
[root@localhost ~]#docker pull nginx
3.镜像加速
浏览器访问 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 相关的本地资源存放在 /var/lib/docker/ 目录下
#containers 目录存放容器信息
#image 目录存放镜像信息
#overlay2 目录下存放具体的镜像底层文件。
#engine-id 引擎ID号
#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:镜像属于的仓库
#TAG:镜像的标签信息,标记同一个仓库中的不同镜像
#IMAGE ID:镜像的唯一ID号,唯一标识一个镜像
#CREATED:镜像创建时间
#VORTIAL SIZE:镜像大小
7.获取镜像详细信息
[root@localhost docker]#docker inspect 2ac752d7aeb1(镜像ID号)
8.为本地镜像添加新的标签
格式:docker tag 名称:[标签] 新名称:[新标签]
[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 仓库名称:标签
#当一个镜像有多个标签时,只是删除其中指定的标签
或者docker rmi 镜像ID号
#会彻底删除该镜像
[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
注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
10.存出镜像——将镜像保存为本地文件
格式:docker save -o 存储文件名 存储的镜像
[root@localhost docker]#cd /opt/
[root@localhost opt]#ls
containerd rh
[root@localhost opt]#docker save -o nginx nginx:latest
#nginx为新名字 nginx:latest为存储的镜像名字
[root@localhost opt]#ls
containerd nginx rh
11.载入镜像——将镜像文件导入到镜像库中
格式: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.上传镜像
默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。
[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.容器创建——将镜像加载到容器的过程
新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
格式:docker create [选项] 镜像
选项含义-i让容器开启标准输入-t让Docker分配一个伪终端tty-it合起来实现和容器交互的作用,运行一个交互式回话Shell
[root@localhost ~]#docker create -it nginx:latest /bin/bash
116cfb7bee31ebdcfc32265c3bf04cc28e235badc130d538b00e81c3cdb675b6
2.容器运行状态
[root@localhost ~]#docker ps
#只显示运行的容器
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号
#IMAGE:加载的镜像
#COMMAND:运行的程序
#CREATED:创建时间
#STATUS:当前的状态
#PORTS:端口映射名称
3.开启容器
[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创建并启动容器
可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。
注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。
docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。
[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
#会发现创建了一个新容器并启动执行一条 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后台持续运行
需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。
[root@localhost ~]#docker run -d centos:7 /usr/bin/bash -c "while ture;do echo hello;done"
086cebdee0f63b46b814f7e7c4a921564199977b8ad54e4ac3afd56abad3a18e
该循环会造成cpu过高
3.3创建容器并持续启动
[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.停止容器运行
格式:docker stop 容器的ID/名称
[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
直接使用名称终止或启动
[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.容器的进入
需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。
格式:docker exec -it 容器ID/名称 /bin/bash
选项含义-i让容器输入保持打开-t让Docker分配一个伪终端
[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
#退出容器后,容器仍在运行
使用run进入容器,不加-d,切换完直接退出 就不显示正在运行
[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容器的生命周期
七个状态
- Created:已创建,还未运行的容器
- Running:正在运行中的容器
- Restarting:容器正在重启中
- Removing:容器正在迁移中
- Paused:已暂停状态的容器
- Exited:停滞状态的容器
- Dead:死亡状态(主要是操作系统会出现异常或断电关机等有可能会引发Dead状态,不常见)
7.Docker cp
7.1如何将宿主机的文件传入到容器内部
[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如何将容器内部文件导出到宿主机
[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.容器的导出与导入
用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
8.1容器的导出
导出格式:docker export 容器ID/名称 > 文件名
[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容器的导入
导入格式:cat 文件名 | docker import – 镜像名称:标签
[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
#导入后会生成镜像,但不会创建容器
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单独删除容器
格式:docker rm [-f] 容器ID/名称
[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
注意:如果报错Error的话,是因为提示为守护状态运行,需要加强制删除
命令含义
docker stop 2592d3fad0fb
docker rm 2592d3fad0fb
删除已经终止状态的容器docker rm -f 2592d3fad0fb强制删除正在运行的容器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)批量清理后台停止的容器
六、Docker网络
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
1.使用Docker操作Nginx
[root@localhost opt]#docker run -d --name nginx01 -P nginx
#随机映射端口
[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网络模式
- Host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
- Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
- None:该模式关闭了容器的网络功能。(类似于局域网)
- Bridge:默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat 表配置与宿主机通信。
- 自定义网络
[root@localhost ~]#docker network ls
#查看Docker网络列表
NETWORK ID NAME DRIVER SCOPE
e308a747ac9e bridge bridge local
b7922fbf5a50 host host local
70a8b224c173 none null local
[root@localhost ~]#docker network list
#查看Docker网络列表
NETWORK ID NAME DRIVER SCOPE
e308a747ac9e bridge bridge local
b7922fbf5a50 host host local
70a8b224c173 none null local
安装Docker时,它会自动创建三个网络,Bridge(创建容器默认连接到此网络)、None、Host
使用Docker run创建Docker容器时,可以用--net或--network选项指定容器的网络模式
- Host模式:使用--net=host指定
- None模式:使用--net=none指定
- Container模式:使用--net=container:Name_or_ID指定
- Bridge模式:使用--net=bridge指定,默认设置,可省略
3.1Docker network命令
命令选项Connect连接Connect a container to a network将容器连接到网络Create创建Create a network建立网络Disconnect未连接Disconnect a container from a network断开容器与网络的连接Inspect检查
Display detailed infomation on one or more networks显示一个或多个网络的详细信息
Ls查看List networks查看容器列表网络模式Prune删除Remove all unused networks删除所有未使用的网络Rm删除Remove one or more networks删除一个或多个网络
3.2Host模式
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。
Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。
一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则等都与其他的Network Namespace隔离。 一个Docker容器一般会分配一个独立的Network Namespace。 但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的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类似于grep命令查询
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd2d6d417e91 nginx:latest "/docker-entrypoint.…" 13 minutes ago Up 13 minutes test01
此时可以使用80端口来访问,因为使用的Host模式,访问的其实是宿主机
3.3Container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
和当前某一个容器共享,每个Container都会有一个eth0,也就是每个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
#查看容器进程号
30575
[root@localhost ~]#ll /proc/30575/ns/
#查看容器的进程、网络、文件系统等命名空间编号
总用量 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
从同一网络出发,为了安全,可以使用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模式下两个Container的网卡是一样的
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容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
[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的默认网络模式,不用--net参数,就是bridge模式。
相当于Vmware中的 nat 模式,容器使用独立network Namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。
- 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
- 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
- Docker将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网卡),另一端放在主机中, 以 * 这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以通过 brctl show 命令查看。
- 使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL 查看。
创建一个就会出现一个Veth
通过Docker0创建虚拟网桥,相当于隧道
[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网桥只有一个Docker0
3.6自定义网络
[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模式,是无法支持指定IP运行docker的,会报错
[root@localhost ~]#docker network create --subnet=172.10.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
#自定义网络
[root@localhost ~]#docker run -itd --name test5 --network mynetwork --ip 172.10.0.100 centos:7 /bin/bash
#指定IP运行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.总结
- Host:容器使用宿主机的网络直接公开服务,这意味着你在容器中运行一个Web服务,那么它就直接绑定到主机的网络接口上,而不是通过Dcoker进行任何网络转发
- Container:这种模式允许容器去共享另一个容器网络命名空间,这说明两个容器可以相同的网络接口和IP地址,他们共享的是同一网络命名空间
- None:是最简单的网络模式,此网络模式表示将容器拥有自己的网络命名空间,但不会进行任何网络配置,这实际给了用户完全的自主权来给自己配置容器的网络
- Bridge:默认的网络模式,每个新创建的容器都将该网络分配一个IP地址,此网络的模式允许所有Docker容器之间以及Docker宿主机之间进行互相通信
- 自定义(User-Defined Network):Docker允许用户创建自己的定义网络,用户可以定义的网络范围、子网掩码、路由等参数,这种类型网络使用的用户可以更好地对容器网络进行控制和隔离(生产业务需求,注:根据甲方指定或领导指定)
- Host:与宿主机共享网络名称空间
- Container:多个容器之间共享一个Network Namespace(命名空间)
- None:自闭空间
- Bridge:默认模式,通过Veth对连接容器Docker0网桥,网桥分配给容器IP地址,同时Docker0作为局域网内容器的网关,最后与宿主机网卡进行通讯
- 自定义:根据业务需求指定静态IP地址
七、Cgroup——资源控制
1.Cgroup概述
Cgroups,是一个非常强大的linux内核工具,他不仅可以限制被 namespace 隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups(Control groups)实现了对资源的配额和度量。
2.Cgroup功能
- 资源限制:可以对任务使用的资源总额进行限制
- 优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
- 资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
- 任务控制:cgroup可以对任务执行挂起、恢复等操作
3.设置CPU使用率上限
Linux通过CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms。我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。
使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。
CFS 周期的有效范围是 1ms1s,对应的 --cpu-period 的数值范围是 10001000000。 周期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
#默认为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.设置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
分别进入容器进行压力测试
[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
产生四个进程,每个进程都反复不停的计算随机数的平方根
[root@node2 ~]#docker stats
5.设置容器绑定指定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.对内存使用限制
6.1-m选项(--memory)
-m(--memory=) 选项用于限制容器可以使用的最大内存
[root@localhost ~]#docker run -itd --name test8 -m 512m centos:7 /bin/bash
[root@localhost ~]#docker stats
6.2--memory-swap(限制可用swap大小)
限制可用的 swap 大小, --memory-swap
强调一下,--memory-swap 是必须要与 --memory 一起使用的。
正常情况下,--memory-swap 的值包含容器可用内存和可用 swap。
所以 -m 300m --memory-swap=1g 的含义为:容器可以使用 300M 的物理内存,并且可以使用 700M(1G - 300)的 swap。
如果 --memory-swap 设置为 0 或者 不设置,则容器可以使用的 swap 大小为 -m 值的两倍。
如果 --memory-swap 的值和 -m 值相同,则容器不能使用 swap。
如果 --memory-swap 值为 -1,它表示容器程序使用的内存受限,而可以使用的 swap 空间使用不受限制(宿主机有多少 swap 容器就可以使用多少)。
[root@localhost ~]#docker run -itd -m 200M --memory-swap=1G nginx:latest --vm 1 --vm-bytes 100M
#--vm 1 启动一个内存的工作线程
#--vm-bytes 每个线程分配100m(类似于分配 分片)
7.对磁盘I/O配额控制(blkio)的限制
- --device-read-bps:限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb。
- --device-write-bps : 限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。
- --device-read-iops :限制读某个设备的iops(次数)
- --device-write-iops :限制写入某个设备的iops(次数)
[root@localhost ~]#docker run -it --name test9 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
#限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。
[root@e670a9789b5c /]# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
#通过dd来验证写速度;添加oflag参数以规避掉文件系统cache
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0103881 s, 1.0 GB/s
此处如果是安装的Docker最新版本的话,写入的数据信息会有些问题;但如果Docker版本为20版,将是如下效果
#清理docker占用的磁盘空间
docker system prune -a
#可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络
8.故障举例
由于docker容器故障导致大量日志集满,会造成磁盘空间满
如果磁盘空间满了,先使用df -h,到达指定目录之后再使用du -sh,对应占比比较大的清理
8.1解决方案——清除日志
#清除日志脚本
#!/bin/bash
logs=$ (find /var/lib/docker/containers/ -name *-json.log*)
#-json.log存储着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解决方案——当日志占满之后如何处理
#设置docker日志文件数量及每个日志大小
vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
"log-driver": "json-file", #我的一日志格式
"log-opts": { "max-size" : "500m", "max-file" : "3"} 日志的参数最大500M 我最大容器中有三个日志文件 每个日志文件大小是500M
}
修改完需要重新加载 systemctl daemon-reload
八、总结
1.虚拟化产品
- VMware Workstation 个人
- VMware Sphere/ESXI 企业级虚拟化
- OpenStack(开发)/KVM Linux环境虚拟机,私有云环境
2.Docker的认识
- 容器:提供多台主机上运行的应用程序的相同的运行环境
- Docker:是一个开源的应用容器引擎,基于go语言开发,是容器里面的运行应用的工具,是一个轻量级的虚拟机,可用在Docker多个平台去使用的
- 容器通过Namespace(命名空间、名称)资源隔离,再通过Cgroup(资源配额)限制资源
3.Dcoker核心概念
- 镜像:运行容器的基础,包含运行的应用程序所需的所有内容
- 容器:是从镜像创建的运行实例
- 仓库:集中保存镜像的地方(公有仓库Docker HUB,私有仓库Harhor)
4.Docker命令总结
命令行含义Docker Search 仓库名/镜像名搜索镜像Docker pull 仓库名/镜像名:标签拉取镜像Docker push 仓库用户名/镜像名:标签上传镜像Docker images查看本地镜像Docker tag 源仓库名 /源镜像名:标签 新仓库名/新镜像名:标签为本地镜像加新的标签Docker rmi 仓库名/镜像名:标签删除镜像Docker save -o xxx.tar 仓库名/镜像名:标签存出镜像Docker load -i xxx.tar/Docker < 重定向载入镜像Docker login{-u指定仓库名;-p密码}登录公共仓库Docker inspect 镜像ID/容器ID获取镜像详细信息Docker Create [选项] 镜像创建镜像Docker ps -a查看显示所有容器Docker ps查看正在运行的容器Docker Start/Restart/Stop启动/重启/关闭容器Docker exec -it切换到容器内Docker run创建并启动容器Docker cp复制,从宿主机到容器内,也可以容器内到宿主机Docker rm -f删除容器、加-f 强制删除容器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) 批量清理后台停止的容器Docker export导出正在运行的容器,形成镜像,迁移使用(容器内的数据可以保存在镜像中)Docker import导入镜像kill停止DockerDocker version查看Docker版本Docker info查看Dcoker详细信息Docker stats查看运行的容器状态Docker logs输出日志Docker system prune -a可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络--device-read-bps限制某个设备上的读速度bps(数据量)--device-write-bps限制某个设备上的写速度bps(数据量)--device-read-iops限制读某个设备的iops(次数)--device-write-iops限制写入某个设备的iops(次数)
5.Docker网络模式
- Host:容器使用宿主机的网络直接公开服务,这意味着你在容器中运行一个Web服务,那么它就直接绑定到主机的网络接口上,而不是通过Dcoker进行任何网络转发
- Container:这种模式允许容器去共享另一个容器网络命名空间,这说明两个容器可以相同的网络接口和IP地址,他们共享的是同一网络命名空间
- None:是最简单的网络模式,此网络模式表示将容器拥有自己的网络命名空间,但不会进行任何网络配置,这实际给了用户完全的自主权来给自己配置容器的网络
- Bridge:默认的网络模式,每个新创建的容器都将该网络分配一个IP地址,此网络的模式允许所有Docker容器之间以及Docker宿主机之间进行互相通信
- 自定义(User-Defined Network):Docker允许用户创建自己的定义网络,用户可以定义的网络范围、子网掩码、路由等参数,这种类型网络使用的用户可以更好地对容器网络进行控制和隔离(生产业务需求,注:根据甲方指定或领导指定)
- Host:与宿主机共享网络名称空间
- Container:多个容器之间共享一个Network Namespace(命名空间)
- None:自闭空间
- Bridge:默认模式,通过Veth对连接容器Docker0网桥,网桥分配给容器IP地址,同时Docker0作为局域网内容器的网关,最后与宿主机网卡进行通讯
- 自定义:根据业务需求指定静态IP地址
6.Cgroup
Cgroup(Control Groups)是一个Linux内核的特性,通过内核来限制记录和隔离进程组的系统资源使用(CPU/内存/磁盘I/O等)
6.1对CPU限制
- CPU-period(CPU周期):指的是CPU在给与当前管理控制容器的分配资源时,CPU分配周期,默认为1s,此配置可以在运行时直接指定
- CPU-quota(CPU配额):直接限制了Cgroup可以使用CPU的时间,如果设置了Cgroup的CPU配额1000000us(微秒)那么在每个100ms(毫秒)内的时间窗口,Cgroup最多使只能使用1000000us(微秒)的CPU
- CPUset-CPU:指定容器仅能使用指定的CPU,按照CPU的下标来表示
6.2对内存限制
- 内存使用上限(硬限制)
- 内存+swap使用上限(硬限制)比如,swap 1G 必须需要设置物理内存,举例200M 1G-200M=800M的swap
6.3对磁盘I/O限制
- --device-read-bps:限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb。
- --device-write-bps : 限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。
- --device-read-iops :限制读某个设备的iops(次数)
- --device-write-iops :限制写入某个设备的iops(次数)
版权归原作者 一坨小橙子ovo 所有, 如有侵权,请联系我们删除。