容器管理之Docker基础

目录

前言

一、认识容器

1、容器的优点

2、容器的缺点

二、Docker概述

1、Docker是什么

2、Docker的设计宗旨

3、Docker的优点

4、Docker容器和虚拟机的区别

5、namespace的6项隔离

6、控制组(Control groups)

7、Docker的三个核心概念

7.1 镜像

7.2 容器

7.3 仓库

8、Docker Engine(引擎)

三、安装Docker

1、安装

2、配置镜像加速(阿里云)

3、网络优化

四、Dkcoer镜像与容器命令管理

1、镜像命令管理

2、容器命令管理

总结

思考


前言

容器的概念:容器是一种数据类型,是序列,存储大量的数据,学习容器的意义:容器可以改变变量只能存储单个数据的缺陷

一、认识容器

容器是一种技术,开发人员打包开发完成的一个应用(系统)以及所需的开发环境,然后通过容器可以运行在不同的计算机上面,也不需要重新配置相关环境,不同的是每一台计算机都需要配置运行容器的容器引擎,目前市场上主流就是Docker容器引擎,不过Docker容器引擎的配置很简单,比配置应用(系统)运行的环境简单,方便太多。每台要运行应用(系统)的计算机上面配置了Docker容器引擎之后,都单独独立可以运行之前打包完成的应用(系统)。

1、容器的优点

  • 极其轻量:只打包了必要的Bin/Lib;
  • 秒级部署:根据镜像(应用打包文件)的不同,容器的部署大概在毫秒与秒之间(比虚拟机强很多);
  • 易于移植:一次构建,随处部署;
  • 弹性伸缩:Kubernetes、Swam、Mesos这类开源、方便、好使的容器管理平台有着非常强大的弹性管理能力。
     

2、容器的缺点

  • 复杂性增加:随着容器及应用数量的增加,同时也伴随着复杂性的增加。在生产环境中管理如此之多的容器是一个极具挑战性的任务,可以使用 Kubernetes 和 Mesos 等工具管理具有一定规模数量的容器。
  • 原生 Linux 支持:大多数容器技术,比如 Docker,基于 Linux 容器(LXC),相比于在原生 Linux 中运行容器,在 Microsoft 环境中运行容器略显笨拙,并且日常使用也会带来复杂性。
  • 不成熟:容器技术在市场上是相对新的技术,需要时间来适应市场。开发者中的可用资源是有限的,如果某个开发者陷入某个问题,可能需要花些时间才能解决问题。
     

二、Docker概述

1、Docker是什么

  • Docker 是一个开源的应用容器引擎,基于 go 语言开发并遵循了 apache2.0 协议开源。
  • Docker 是在 Linux 容器里运行的开源工具,是一种轻量级的虚拟机。
  • Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
  • 目前 Docker 只能支持 64 位系统。
     

2、Docker的设计宗旨

  • Docker 的 Logo 设计为蓝色鲸鱼,拖着许多集装箱。鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
  • Docker 的设计宗旨:Build,Ship and Run Any APP,Anywhere

        即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的一次封装,导出运行的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。

3、Docker的优点

  • 灵活:即使是最复杂的应用也可以集装箱化
  • 轻量级:容器利用并共享主机内核
  • 可互换:可以即时部署更新和升级
  • 便携式:可以再本地构建,部署到云,并在任何地方运行
  • 可扩展:可以增加并自动分发容器副本
  • 可堆叠:可以垂直和即时堆叠服务

4、Docker容器和虚拟机的区别

传统部署——>虚拟机部署——>容器化部署的演变如下图所示:

特性Docker容器OpenStack虚拟机
部署难度非常简单组件多,部署复杂
启动速度秒级分钟级
执行性能和物理系统一致VM会占用部分资源
镜像体积MB级别GB级别
管理效率简单各组件相互依赖,管理复杂
可管理性单进程完整的系统管理
网络连接借助neutron可以灵活组件各类网络管理
性能接近原生(直接在内核中运行)50%左右的所示
系统支持量(单机)上千个几十个
隔离性进程级别操作系统级别
封装程度直达包项目代码和依赖关系,共享宿主机内核完整的操作系统,与宿主机隔离

总结:共享内核+进程级别

5、namespace的6项隔离

docker 本质就是宿主机的一个进程,docker 是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制,通过写时复制技术 copy-on-write 实现了高效的文件操作(类似虚拟机的磁盘比如分配 500G 并不是实际占用物理磁盘 500G)。

namespace系统调用参数

隔离内容

UTSCLONE_NEWUTS主机名与域名
IPCCLONE_NEWWIPC信号量、消息队列和共享内存
PIDCLONE_NEWPID进程编号
NETWORKCLONE_NEWNET网络设备、网络栈、端口等
MOUNTCLONE_NEWNS挂载点(文件系统)
UDERCLONE_NEWUSER用户和组(3.8以后的内核才支持)

6、控制组(Control groups)

Linux上的Do侧看人引擎还依赖于另一种称为控制组(Cgroups)的技术,Cgroup将应用和程序限制为一组特定的资源,控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。Cgroups主要是用作资源控制——可以用来划分时间片

正常每个任务一轮询的方式去处理,一般是一个CPU为一个整个体

以下是针对的CPU单位时间内的一个资源。按时间划分,1秒划分成10个0.1秒,每个0.1秒可以全力处理10单位的任务。在1秒内,都在全力工作。

cpu 1s全力运转的性能——>逻辑分割成分成了10份,可以理解为在单位时间内可以处理10个任务,每一个0.1s cpu是满的。原先分片前100M以下的任务一次只可以处理1个,现在100M的任务一次可以处理10个。这就是时间分片的一个概念。

虚拟化作用——>缓解/解决了资源利用率的问题

Docker底层原理:namespace + cgroups 

7、Docker的三个核心概念

7.1 镜像

  • Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。
  • 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间、库、环境变量和配置文件。
  • Docker 镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远程一样的环境,这也是 Docker 镜像的精髓。

7.2 容器

  • Docker 的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
  • 可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、镜像空间、用户空间和网络空间等)和运行在其他的应用程序。

7.3 仓库

  • Docker 仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用 push 命令将它上传到公有仓库或者私有仓库。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
  • Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。

8、Docker Engine(引擎)

Docker Engine是具有一下主要组件的C/S客户端——服务器应用程序

Server端:服务器是一种长期运行额程序,称为守护程序进程(dockerd命令)

Client端:REST API ,他指定程序可以用来与守护程序进行通信并指示其它操作的接口

命令行界面(CLI)客户端(Docker命令)

三、安装Docker

1、安装

#环境配置
systemctl stop firewalld && systemctl disable firewalld
setenforce 0

#安装依赖包
yum -y install yum-utils device-mapper-persistemt-data lvm2

#设置阿里云镜像源
cd /etc/yum.repos.d/
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#安装 docker-ce 社区版(企业版叫 docker-ee,收费)
yum -y install docker-ce

#启动
systemctl enable docker && systemctl start docker

2、配置镜像加速(阿里云)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://e2jmea9e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

3、网络优化

cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
EOF

sysctl -p
systemctl restart network
systemctl restart docker

注意:docker-server 端配置文件 daemon.json说明

#生产配置示例,在 daemon.json 中定义
##位置为/etc/docker/daemon.json

{
        "graph": "/data/docker",
        "storage-driver": "overlay2",
        "insecure-registries": ["registry.access.redhat.com","quary.io"],
        "registry-mirrors": ["https://q"],
        "bip": "172.7.5.1/24",
        "exec-opts": ["native.cgroupdriver=systemd"],
        "live-restore": true
}

#参数说明
"graph": "/data/docker",		#指定数据目录
"storage-driver": "overlay2",	#指定存储引擎
"insecure-registries": ["registry.access.redhat.com","quary.io"]	#私有仓库
"registry-mirrors": ["https://q"]	#配置镜像加速
"bip": "172.7.5.1/24",				#docker 网络,中间两位建议和宿主机一样,容器有问题好定位在哪个宿主机	
"exec-opts": ["native.cgroupdriver=systemd"],	#启动时候的额外参数(驱动,k8s使用)
"live-restore": true			#当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)
daemon.json————控制守护进程的
*.json(接口之间的通用格式)
        1、不接受注释
        2、键值对的存储方式

四、Dkcoer镜像与容器命令管理

1、镜像命令管理

指令描述
ls列出镜像
build构建镜像来自Dockerfile
history查看历史镜像
inspect显示一个或多个镜像的详细信息
pull从镜像仓库拉取镜像
push推送一个镜像到仓库
rm移除一个或多个镜像
prune一处未使用的的镜像,没有被标记或被任何容器引用的
tag创建一个引用源镜像标记目标镜像
export到处容器文件系统到tar归档文件
import导入容器文件系统tar归档文件创建镜像
save保存一个或多个镜像到一个tar归档文件
load加载镜像来自tar归档或标准输入

注意 

  • docker client 客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的)restful api 典型的 C/S 架构
  • 由 docker 服务端的守护进程从 docker hub 上下载了镜像(PS:服务端会先检查本地系统是否有这个镜像)
  • 服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用
  • docker 服务端把这些信息流(传递)返回到客户端并展示出来(展示在终端上)
     
#查询 docker 版本和信息
docker version
docker info

#搜索镜像(可以自己制作镜像上传本地或官网仓库 dockerfile)
docker search <镜像名>
 
#下载镜像
docker pull <镜像名>

#查看镜像列表
docker images

#查看镜像详细信息
docker inspect <镜像 ID>

#给镜像打标签
docker tag <镜像名>:<原标签> <镜像名>:<新标签>
#docker tag nginx:latest nginx:lnmp

#删除镜像
docker rmi <镜像名>
docker rmi <镜像标签>
docker rmi <镜像 ID>
docker rmi `docker images -aq`		#删除所有镜像
docker images | awk 'NR>=2{print "docker rmi -f "$3}' | bash

#镜像导出
docker save -o <导出的文件名> <镜像名>
#docker save -o nginx_v1 nginx:latest

#镜像导入
docker load < [镜像文件]
#docker load < nginx_v1

2、容器命令管理

指令描述
ls列出容器
inspect显示一个或多个容器详细信息
attach附加本地标准输入,输出和错误到一个运行的容器
exec在运行容器中执行命令
commit出啊构建一个新镜像来自一个容器
cp拷贝文件(夹)到一个容器
logs获取一个容器日志
port列出或指定容器端口映射
stats显示一容器资源使用统计
top显示一个或多个容器运行的进程
update更新一个或多个容器配置
stop/start停止/启动一个或多个容器
rm删除一个或多个容器
#查询容器
docker ps -a

#查看容器占用系统资源信息
docker stats

#创建容器
docker create -it nginx:latest /bin/bash
#常用参数说明
> -i 让容器的标准输入保持打开
> -t 分配一个伪终端
> -d 以后台守护进程的方式运行

#开启/停止/重启 容器
docker start <容器 ID>
docker stop <容器 ID>
docker restart <容器 ID>

#后台运行,指定容器名称为 test
docker run -itd --name test nginx:latest /bin/bash

#进入容器
docker exec -it <容器 ID> /bin/bash		#exit 退出

#容器 导出/导入
docker export [容器 ID] > [文件名]
docker import [容器文件名] [指定镜像名称]		#导入的是镜像

#批量停止容器
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
docker ps -a | awk 'NR>=2{print $1}' | xargs docker stop

#批量删除容器
docker rm -f `docker ps -aq`
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm -f

#批量删除 "exit" 状态(指定状态)的容器
for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done

#查看容器进程号
docker inspect -f '{{.State.Pid}}' <容器名>
docker inspect -f '{{.State.Pid}}' <容器 ID>

##进入容器没有 systemctl 命令解决
添加 --privileged=true(指定此容器是否为特权容器),使用此参数,则不能用 attach。
> 示例:
docker run -itd --name test3 --privileged=true centos /sbin/init

`/sbin/init 内核启动时主动呼叫的第一个进程`

可以使用 docker inspect <容器ID>
docker ps -a
docker exec -it <容器ID> /bin/bash
yum install httpd -y
systemctl status httpd

docker 在后台的标准运行过程:

  1. 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
  2. 利用镜像创建并启动一个容器;
  3. 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
  4. 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
  5. 分配一个地址池中的IP地址给容器;
  6. 执行用户指定的应用程序,执行完毕后容器被终止运行。
     

总结

1、镜像优化

  • 有效减少镜像大小(dockerfile 优化方向---->对于部分企业而言,是一种升阶面试题)

2、怎么看当下有多大号容器,怎么看当下所有容器占用的I/O有多少,占用内存多少?

  • 使用docker stats命令查看

3、Docker容器可以有四种状态

  • 运行
  • 已暂停
  • 重新启动
  • 已退出

4、overlay2由哪几部分组成 

  • LowerDir
  • MergedDir
  • UpperDir
  • WorkDir
     

思考

Docker和VM解决了虚拟机的什么问题

  • docker解决了VM的一个环境孤岛问题
  • docker可以自定义传参(创建——创建镜像/容器、启动(基于镜像启动之前)) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值