Docker——开源的应用容器的引擎

目录

一、前言

1.虚拟化产品有哪些

1.1寄居架构

1.2源生架构

2.虚拟化产品对比/介绍

2.1虚拟化产品

2.1.1仿真虚拟化

2.1.2半虚拟化

2.1.3全虚拟化

2.2重点

2.2.1KVM------Linux内核来完成的功能和性能

2.2.2ESXI------用的比较多

二、Docker概述

1.Docker定义

2.Docker特点(优点)

3.Docker与虚拟机的区别

4.容器有哪些

5.容器在内核中重要技术

5.1Namespace六项隔离

6.Docker核心概念

6.1镜像

6.2容器

6.3仓库

7.总结

7.1虚拟化产品

7.2Docker的认识

7.3Dcoker核心概念

三、安装Docker

1.环境准备

2.安装依赖包

3.设置阿里云镜像

4.安装Docker-CE并自启

四、Docker镜像操作

1.搜索镜像

2.获取镜像

3.镜像加速

4.查看镜像信息

5.查看下载的镜像文件信息

6.查看下载到本地的所有镜像

7.获取镜像详细信息

8.为本地镜像添加新的标签

9.删除镜像

10.存出镜像------将镜像保存为本地文件

11.载入镜像------将镜像文件导入到镜像库中

12.上传镜像

五、Docker容器操作

1.容器创建------将镜像加载到容器的过程

2.容器运行状态

3.开启容器

3.1创建并启动容器

3.2后台持续运行

3.3创建容器并持续启动

4.停止容器运行

5.容器的进入

6.Docker容器的生命周期

[7.Docker cp](#7.Docker cp)

7.1如何将宿主机的文件传入到容器内部

7.2如何将容器内部文件导出到宿主机

8.容器的导出与导入

8.1容器的导出

8.2容器的导入

9.删除容器

9.1单独删除容器

9.2批量删除容器

9.3批量删除镜像

六、Docker网络

1.使用Docker操作Nginx

2.查看容器输出日志

3.Docker网络模式

[3.1Docker network命令](#3.1Docker network命令)

3.2Host模式

3.3Container模式

3.4None模式

3.5Bridge模式

3.6自定义网络

4.总结

七、Cgroup------资源控制

1.Cgroup概述

2.Cgroup功能

3.设置CPU使用率上限

4.设置CPU资源占用比

5.设置容器绑定指定CPU

6.对内存使用限制

6.1-m选项(--memory)

6.2--memory-swap(限制可用swap大小)

7.对磁盘I/O配额控制(blkio)的限制

8.故障举例

8.1解决方案------清除日志

8.2解决方案------当日志占满之后如何处理

八、总结

1.虚拟化产品

2.Docker的认识

3.Dcoker核心概念

4.Docker命令总结

5.Docker网络模式

6.Cgroup

6.1对CPU限制

6.2对内存限制

6.3对磁盘I/O限制


一、前言

云端:华为云、谷歌云、腾讯云、阿里云、亚马逊、百度云、天翼云、西部数码云灯

国内运:华为云、阿里云、腾讯云、天翼云(私有云)

国外云:谷歌云、亚马逊

云计算的服务模式是分几层的,分别是IaaSPaaSSaaS

  • 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 | 系统调用参数 | 隔离内容 |
| UTS | CLONE_NAWUTS | 主机名与域名 |
| IPC | CLONE_NEWWIPC | 信号量、消息队列和共享内存 |
| PID | CLONE_NEWPID | 进程编号 |
| NETWORK | CLONE_NEWNET | 网路设备、网络栈、端口等 |
| MOUNT | CLONE_NEWNS | 挂载点(文件系统) |

USER CLONE_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.环境准备

bash 复制代码
systemctl stop firewalld.service
setenforce 0

2.安装依赖包

bash 复制代码
[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.设置阿里云镜像

bash 复制代码
[root@localhost ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

4.安装Docker-CE并自启

bash 复制代码
[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.搜索镜像

bash 复制代码
[root@localhost ~]#docker search nginx

2.获取镜像

bash 复制代码
[root@localhost ~]#docker pull nginx

3.镜像加速

浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置

bash 复制代码
[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.查看镜像信息

bash 复制代码
[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.查看下载的镜像文件信息

bash 复制代码
[root@localhost docker]#cat /var/lib/docker/image/overlay2/repositories.json
{"Repositories":{"nginx":{"nginx:latest":"sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580","nginx@sha256:0463a96ac74b84a8a1b27f3d1f4ae5d1a70ea823219394e131f5bf3536674419":"sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580"}}}

6.查看下载到本地的所有镜像

bash 复制代码
[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.获取镜像详细信息

bash 复制代码
[root@localhost docker]#docker inspect 2ac752d7aeb1(镜像ID号)

8.为本地镜像添加新的标签

bash 复制代码
格式:docker tag 名称:[标签] 新名称:[新标签]
bash 复制代码
[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.删除镜像

删除镜像一定要注意是要先删除容器,再删除镜像

bash 复制代码
#格式:
docker rmi 仓库名称:标签
#当一个镜像有多个标签时,只是删除其中指定的标签
或者docker rmi 镜像ID号
#会彻底删除该镜像
bash 复制代码
[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.存出镜像------将镜像保存为本地文件

bash 复制代码
格式:docker save -o 存储文件名 存储的镜像
bash 复制代码
[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.载入镜像------将镜像文件导入到镜像库中

bash 复制代码
格式:docker load < 存出的文件   或者   docker load -i 存出的文件
bash 复制代码
[root@localhost opt]#scp nginx 192.168.241.22:/opt
bash 复制代码
[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 命令进行上传。

bash 复制代码
[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.容器创建------将镜像加载到容器的过程

新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。

bash 复制代码
格式:docker create [选项] 镜像
选项 含义
-i 让容器开启标准输入
-t 让Docker分配一个伪终端tty
-it 合起来实现和容器交互的作用,运行一个交互式回话Shell
bash 复制代码
[root@localhost ~]#docker create -it nginx:latest /bin/bash
116cfb7bee31ebdcfc32265c3bf04cc28e235badc130d538b00e81c3cdb675b6

2.容器运行状态

bash 复制代码
[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.开启容器

bash 复制代码
[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容器中必须有一个前台进程,否则认为容器已经挂掉。

bash 复制代码
[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 容器以守护形式在后台运行。并且容器所运行的程序不能结束。

bash 复制代码
[root@localhost ~]#docker run -d centos:7 /usr/bin/bash -c "while ture;do echo hello;done"
086cebdee0f63b46b814f7e7c4a921564199977b8ad54e4ac3afd56abad3a18e

该循环会造成cpu过高

3.3创建容器并持续启动

bash 复制代码
[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.停止容器运行

bash 复制代码
格式:docker stop 容器的ID/名称
bash 复制代码
[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

直接使用名称终止或启动

bash 复制代码
[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 命令进入运行着的容器。

bash 复制代码
格式:docker exec -it 容器ID/名称 /bin/bash
选项 含义
-i 让容器输入保持打开
-t 让Docker分配一个伪终端
bash 复制代码
[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,切换完直接退出 就不显示正在运行

bash 复制代码
[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如何将宿主机的文件传入到容器内部

bash 复制代码
[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如何将容器内部文件导出到宿主机

bash 复制代码
[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容器的导出

bash 复制代码
导出格式:docker export 容器ID/名称 > 文件名
bash 复制代码
[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容器的导入

bash 复制代码
导入格式:cat 文件名 | docker import -- 镜像名称:标签
bash 复制代码
[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单独删除容器

bash 复制代码
格式:docker rm [-f] 容器ID/名称
bash 复制代码
[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批量删除容器

删除容器前要先停止容器

bash 复制代码
[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
bash 复制代码
[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批量删除镜像

bash 复制代码
[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

bash 复制代码
[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.查看容器输出日志

bash 复制代码
[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
bash 复制代码
[root@localhost ~]#docker logs nginx01

3.Docker网络模式

  • Host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
  • Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
  • None:该模式关闭了容器的网络功能。(类似于局域网)
  • Bridge:默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat 表配置与宿主机通信。
  • 自定义网络
bash 复制代码
[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和端口。

bash 复制代码
[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
bash 复制代码
[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

bash 复制代码
[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模式

bash 复制代码
[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回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

bash 复制代码
[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创建虚拟网桥,相当于隧道

bash 复制代码
[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自定义网络

bash 复制代码
[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的,会报错
bash 复制代码
[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 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~1000000。 周期100毫秒,而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 1000。

bash 复制代码
[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表示不限制上限
bash 复制代码
[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%左右

bash 复制代码
[root@localhost ~]#docker stats

4.设置CPU资源占用比

bash 复制代码
[root@node2 ~]#docker run -itd --name c1 --cpu-shares 512 centos:7

[root@node2 ~]#docker run -itd --name c2 --cpu-shares 1024 centos:7

分别进入容器进行压力测试

bash 复制代码
[root@node2 ~]#docker exec -it c1 /bin/bash
[root@fdc35030c273 /]# yum install -y epel-release
[root@fdc35030c273 /]# yum install -y stress
bash 复制代码
[root@node2 ~]#docker exec -it c2 /bin/bash
[root@8cfd4548dcb0 /]# yum install -y epel-release
[root@8cfd4548dcb0 /]# yum install -y stress
bash 复制代码
[root@fdc35030c273 /]# stress -c 4
bash 复制代码
[root@8cfd4548dcb0 /]# stress -c 4

产生四个进程,每个进程都反复不停的计算随机数的平方根

bash 复制代码
[root@node2 ~]#docker stats

5.设置容器绑定指定CPU

bash 复制代码
[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=) 选项用于限制容器可以使用的最大内存

bash 复制代码
[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 容器就可以使用多少)。

bash 复制代码
[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(次数)
bash 复制代码
[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版,将是如下效果

bash 复制代码
#清理docker占用的磁盘空间
docker system prune -a
#可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络

8.故障举例

由于docker容器故障导致大量日志集满,会造成磁盘空间满

如果磁盘空间满了,先使用df -h,到达指定目录之后再使用du -sh,对应占比比较大的清理

8.1解决方案------清除日志

bash 复制代码
#清除日志脚本

#!/bin/bash
logs=$ (find /var/lib/docker/containers/ -name *-json.log*)
#-json.log存储着Docker的日志
for log in $logs
do
cat /dev/null > $log
done

模拟故障

bash 复制代码
[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"

清除日志

bash 复制代码
[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解决方案------当日志占满之后如何处理

bash 复制代码
#设置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 停止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(次数)

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(次数)
相关推荐
C++忠实粉丝27 分钟前
Linux环境基础开发工具使用(2)
linux·运维·服务器
康熙38bdc1 小时前
Linux 环境变量
linux·运维·服务器
存储服务专家StorageExpert1 小时前
DELL SC compellent存储的四种访问方式
运维·服务器·存储维护·emc存储
大G哥2 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
醉颜凉2 小时前
银河麒麟桌面操作系统修改默认Shell为Bash
运维·服务器·开发语言·bash·kylin·国产化·银河麒麟操作系统
大道归简3 小时前
Docker 命令从入门到入门:从 Windows 到容器的完美类比
windows·docker·容器
苦逼IT运维3 小时前
YUM 源与 APT 源的详解及使用指南
linux·运维·ubuntu·centos·devops
仍有未知等待探索3 小时前
Linux 传输层UDP
linux·运维·udp
zeruns8023 小时前
如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程
linux·运维·服务器·docker·网站
爱跑步的程序员~4 小时前
Docker
docker·容器