赞
踩
目录
云端:华为云、谷歌云、腾讯云、阿里云、亚马逊、百度云、天翼云、西部数码云灯
国内运:华为云、阿里云、腾讯云、天翼云(私有云)
国外云:谷歌云、亚马逊
云计算的服务模式是分几层的,分别是IaaS、PaaS、SaaS
基础设置在最下端,平台在中间,软件在顶端
IaaS:提供所有底层设备
PaaS:软件也不需要,只需要敲代码即可(天翼云,目前大部分企业均使用PaaS)
SaaS用的不多(相当于快捷酒店)
虚拟机架构一般只有两种:寄居架构和源生架构
从本机(真实的操作系统)------>虚拟化产品------>虚拟化操作系统或软件
物理机之上,在一台物理机上直接安装虚拟产品
裸金属服务器------>虚拟化产品
VMware客户端
VMware workstation 个人在Windows安装的虚拟机
VMware Fusion MAC
rehl 5 自带xen(虚拟机监视器)
微软Microsoft Hyper-V(虚拟化产品 半虚拟化)
VirtualBox 7.0虚拟盒子
cirix Hypervisor
Linux环境虚拟机:KVM(在Linux系统中运行的)、OpenStack(私有云)
KVM基于内核的虚拟机主机
VMware服务端exsi(现在企业一般使用这个)VMware vsphere裸金属
全虚拟化,直接使用物理硬件,性能高
客户端连接VMware vsphere
现在企业一般都使用网页端连接VMware vsphere
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就可以运行任何状态,没有不兼容的。
容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
特性 | Docker容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力消耗 | 几乎无 | 损耗50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源隔离/限制 | 完全隔离 |
Docker本质就是在宿主机的一个进程,Docker是通过Namespace(命名空间)实现资源隔离,通过Cgroup实现资源限制,通过写时复制技术(Copy-On-Write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500G并不是实际占用物理磁盘500G)
Namespace | 系统调用参数 | 隔离内容 |
---|---|---|
UTS | CLONE_NAWUTS | 主机名与域名 |
IPC | CLONE_NEWWIPC | 信号量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
NETWORK | CLONE_NEWNET | 网路设备、网络栈、端口等 |
MOUNT | CLONE_NEWNS | 挂载点(文件系统) |
USER | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持) |
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。
Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
镜像 nginx (run) 起来之后的一个实例,可以把容器看做时一个简易版的linux环境容器 就是集装箱(logo上的集装箱)
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker
仓库就是放镜像的场所,做大的公开库 docker hub
目前的Docker只能支持64位系统
- systemctl stop firewalld.service
- setenforce 0
- [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。
[root@localhost ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- [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服务端和客户端运行在一台机器上。
[root@localhost ~]#docker search nginx
[root@localhost ~]#docker pull nginx
浏览器访问 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
- [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 卷组
- [root@localhost docker]#cat /var/lib/docker/image/overlay2/repositories.json
- {"Repositories":{"nginx":{"nginx:latest":"sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580","nginx@sha256:0463a96ac74b84a8a1b27f3d1f4ae5d1a70ea823219394e131f5bf3536674419":"sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580"}}}
- [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:镜像大小
[root@localhost docker]#docker inspect 2ac752d7aeb1(镜像ID号)
格式: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
删除镜像一定要注意是要先删除容器,再删除镜像
- #格式:
- 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
注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
格式: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
格式: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
默认上传到 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 create [选项] 镜像
选项 | 含义 |
---|---|
-i | 让容器开启标准输入 |
-t | 让Docker分配一个伪终端tty |
-it | 合起来实现和容器交互的作用,运行一个交互式回话Shell |
- [root@localhost ~]#docker create -it nginx:latest /bin/bash
- 116cfb7bee31ebdcfc32265c3bf04cc28e235badc130d538b00e81c3cdb675b6
- [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:端口映射名称
- [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
可以直接执行 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

需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。
- [root@localhost ~]#docker run -d centos:7 /usr/bin/bash -c "while ture;do echo hello;done"
- 086cebdee0f63b46b814f7e7c4a921564199977b8ad54e4ac3afd56abad3a18e
该循环会造成cpu过高
- [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
格式: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
需要进入容器进行命令操作时,可以使用 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
七个状态
- [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

- [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

用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
导出格式: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
导入格式: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
格式: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

删除容器前要先停止容器
- [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
- [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使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
- [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
-
- [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
- [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指定,默认设置,可省略
命令 | 选项 |
---|---|
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删除一个或多个网络 |
相当于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模式,访问的其实是宿主机
这个模式指定新创建的容器和已经存在的一个容器共享一个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]
使用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",
bridge模式是docker的默认网络模式,不用--net参数,就是bridge模式。
相当于Vmware中的 nat 模式,容器使用独立network Namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。
创建一个就会出现一个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
- [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",

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地址
Cgroups,是一个非常强大的linux内核工具,他不仅可以限制被 namespace 隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups(Control groups)实现了对资源的配额和度量。
Linux通过CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms。我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。
使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。
CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 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
- #默认为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
- [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
- [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
-m(--memory=) 选项用于限制容器可以使用的最大内存
- [root@localhost ~]#docker run -itd --name test8 -m 512m centos:7 /bin/bash
-
- [root@localhost ~]#docker stats
限制可用的 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(类似于分配 分片)
- [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
- #可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络
由于docker容器故障导致大量日志集满,会造成磁盘空间满
如果磁盘空间满了,先使用df -h,到达指定目录之后再使用du -sh,对应占比比较大的清理
- #清除日志脚本
-
- #!/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

- #设置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
命令行 | 含义 |
---|---|
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 | 停止Docker |
Docker 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(次数) |
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(Control Groups)是一个Linux内核的特性,通过内核来限制记录和隔离进程组的系统资源使用(CPU/内存/磁盘I/O等)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。