目录

    • 背景:
  • 一、名称空间
    • Namespaces
      • Docker Engine在Linux.上使用以下名称空间:
  • 二、docker与虚拟化
    • 2.1cgroups
    • 2.2全虚拟、半虚拟、容器技术
    • 2.3那如何区分虚拟机中的不同应用呢?
    • 2.4微服务
    • 2.5企业中——开发运维整体流程
    • 2.6docker数据流向图
    • 2.7docker镜像流向
    • 2.8Container和VM(虚拟机)
    • 2.9docker和虚拟化比有什么优势
      • docker 有哪些优势?
  • 三、Docker
    • 3.1Docker的使用场景
    • 3.2 Docker引擎( Docker Engine )
    • 3.3 Docker的架构 ( Docker architecture )
    • 3.4docker 三大组件
  • 四、安装 Docker
  • 五、Docker 镜像与容器命令管理
    • 5.1 镜像命令管理
    • 5.2 容器命令管理

背景:

以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务
例如: pid=2 --> python pid=3–>java pid4–>php ,三个服务可能会相互影响
使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本
延伸出一-》能否将这三种服务分别封装起来一》KVM虛拟化技术,实现了一-个操作系统模拟多个操作系统/不同的运行时
环境
随着技术发展—》虚拟化技术开销较大( 例如:只要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理)
延伸出容器技术
虚拟化层的抽象层(用户层)剥离,使用docker engine
来替代(来宾操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销
1232
2464
docker与虚拟机区别之一( 资源利用率/损耗)
###那如何实现应用A和应用B隔离
应用和应用的隔离,如何进行判断
以操作系统维度
应用A.与应用B隔离,在操作系统中,是通过namespaces( 名称空间、命名空间)实现的,只要实现以下6个空间隔离,才能
认为两个应用实现了完全/完整隔离

一、名称空间

容器隔离了6个名称空间(namespace次元隔离-用容器化技术封装)* * * * *

mount 文件系统,挂载点 ——》一个文件系统内,不能重复挂在一个指定目录,例如: /mnt

user 操作进程的用户和用户组 .。。。。。。。。。。

pid 进程编号

uts 主机名和主机域

ipc 信号量、消息队列,共享内存 (理解,不同的应用调用内存资源的时候应该使用不同的内存空间)

net 网络设备、网络协议栈、端口等

  • cgroups 管理 3.8版本

  • cgroups linux 内核态中资源管理的模块

  • cgroups 管理一些系统资源

Namespaces

Docker使用-种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker 会为该容器创建- -组名称空间。这些名称空间提供了一-层隔离。容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间。

Docker Engine在Linux.上使用以下名称空间:

该pid命名空间:进程隔离(PID:进程ID)

该net命令空间:管理网络接口(NET:网络)

该ipc命名空间:管理访问IPC资源(IPC: 进程间通信)

该mnt命名空间:管理文件系统挂载点(MNT:mount)

该uts命名空间:隔离内核和版本标识符。(UTS:Unix时间共享系统)

docker 引擎 对内核版本是有要求的 (至少是3.8+)

docker 需要cgroups 的资源管理功能

最晚的一个名称空间是3.8

使用docker有什么意义?

ECS,属于IAAS、Docker(k8s) 属于PAAS

IASS : 基础设施服务

SAAS : 应用即服务

PAAS : 平台及服务

Docker images :镜像

Docker container:容器

Docker registry:镜像仓库

存储镜像的地方,默认在公共的Docker Hub上查找,可以搞个人仓库

二、docker与虚拟化

2.1cgroups

Linux上的Docker引擎还依赖于另一种称为控制组( cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。
例如,您可以限制特定容器可用的内存。

2.2全虚拟、半虚拟、容器技术

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SS6HlBWQ-1641814563053)(C:\Users\赵金华\Desktop\整理复习\docker图片\1.png)]

2.3那如何区分虚拟机中的不同应用呢?

虚拟机一般不可能只跑一个应用,因为这样确实也太浪费资源了,我们可以想想,现在手上的电脑,可以用 Vmvare 导入几个虚拟机,所以诸如 Cloud Foundry通过引入操作系统的 CgroupsNamespace 等机制,从而来为每个应用单独创建一个叫做「沙盒」的隔离环境,然后在这些「沙盒」中启动应用,通过这样的方法就让虚拟机中应用各自互不干扰,让其自由翱翔,至于 Cgroups 和 Namespace 的实现原理,后续我们再共同的探讨

这里所谓的隔离环境就是「容器」。

2.4微服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynGF9ZOG-1641814563054)(C:\Users\赵金华\Desktop\整理复习\docker图片\2.png)]

将40G的包拆分成4组10G的包来同时进行运作,化整为零就是微服务的概念,本来需要一台机器跑40G的包,但是微服务进行细小化,分成多个小块,同时进行处理,极大的加快了部署的速度。

在更新的时候包的时候一般需要全部更新,这样极度的消耗时间,而这个时候可以单独给单拆分的模块来进行镜像升级,一般只有10G左右,升级时间就减少了。

2.5企业中——开发运维整体流程

①首先由开发进行代码研发,研发好之后进行编译、打包

PS: 打包:一般会使用maven.工具打war包或者jar包.
②打完包之后,放置对应的运行时环境中,进行试运行
PS: 这里的运行时环境指:例如tomcat ( java环境) php (php环境)等1
③中间会加.上一些测试过程,测试代码的有效性、可用性和可执行性
④以上测试完成,运维会将这个软件包拉过来,运行在实际生产的运行时
环境中
问题:在以上的第o点中,不同开发语言的运行时环境混淆在一起运行会有很大的隐患,以及不便
传统中,所谓的运行时环境,例如tomcat (java环境) php ( php环境)等
容器中,所谓的运行时环境,指的试"容器”内部
在此之前,容器一》是一个运行时环境,构成容器的组件是image镜像(一个运行时环境的模板)

2.6docker数据流向图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q5c6mNTg-1641814563055)(C:\Users\赵金华\Desktop\整理复习\docker图片\3.png)]

Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象,例如图像,容器,网络卷。守护程序还可以与其他守护程序通信以管理Docker服务。

Docker images:镜像

Docker container:容器

Docker registry:镜像仓库65却55lo’iuu

2.7docker镜像流向

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e9idnL4L-1641814563055)(C:\Users\赵金华\Desktop\整理复习\docker图片\4.png)]

2.8Container和VM(虚拟机)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vQJZNElH-1641814563056)(C:\Users\赵金华\Desktop\整理复习\docker图片\5.png)]

2.9docker和虚拟化比有什么优势

不同点 container VM
启动速度 秒级 分钟级
运行性能 接近原生(直接在内核中运行) 50%左右损失
磁盘占用 MB GB
数量 成百上千 一般十几台
隔离性 进程级别 系统级别(更彻底)
操作系统 主要支持Linux 几乎所有
封装程度 只打包项目代码和依赖关系,共享主机内核 完整的操作系统,与宿主机隔离

docker 有哪些优势?

PS: (三个统一 封装的模式image ,运行时环境container,统一的平台engine)

和虚拟化比有什么优势(表格中的对比)

docker和VM之前的区别,主要就是在于资源利用率和隔离性(共享内核、独立的造作系统)

docker 把容器化技术做成了标准化平台CAAS ( docker统一-/指定了容器化技术的标准化平台)使用docker有什么意思?

docker 引擎统一了基础设施环境-docker容器环境(引擎)

docker 引擎统一了程序打包(装箱)方式-docker镜像

docker 引擎统一了程序部署(运行)方式-docker容器

镜像————》封装的某个时刻的服务/应用状态

容器————》应用跑起来的状态(正常提供服务的状态-运行时)

实现了一次构建、多次、多处使用

docker-ce (社区版) docker-ee(企业版)

三、Docker

3.1Docker的使用场景

K8S image镜像+ container容器的方式
war jar——》 github gitlab 私有仓库(代码仓库) 一-》 jenkins (测试)
(应用程序封装/构建镜像)一-》运维下载,使用容器技术进行运行/发布
打包应用程序简单部署
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从
腾讯云迁移到阿里云
持续集成和持续交付(CI/CD):开发到测试发布
部署微服务
提供PAAS产品(平台即服务) {OpenStack的云 主机类似于阿里云的ECS,属于IAAS、Docker (
K8S) 属于PAAS}

docker 三要素

镜像——》模板

容器——》基于镜像,运行状态/运行时状态

仓库——》存放镜像模板

3.2 Docker引擎( Docker Engine )

Docker Engine 是具有以下主要组件的C/S客户端-服务器应用程序:
server端:服务器是一种长期运行的程序,称为守护程序进程(dockerd命令)。
CLIENT端:RESTAPI,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
命令行界面(CLI) 客户端(docker命令)。
docker run
docker start
docker rm

客户端传入——》通过restAPI——》进入内核中的docker-server端

——》由server端进行处理

——》通过rest API 返回给docker-client 端进行展示

3.3 Docker的架构 ( Docker architecture )

Docker使用客户端-服务器架构。Docker 客户端与Docker
守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。

Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快

Docker Client: 客户端/提供一个与用户交互,展示的平台+
管理、控制docker服务端(功能)的工具docker

Docker客户端(docker) 是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的
命令时docker
run,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker
API。Docker客户 端可以与多个守护程序通信。
Docker daemon:守护进程

Docker守护程序( dockerd)侦听Docker
API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。
Docker images: 镜像

cgroups namespace

3.4docker 三大组件

容器可以被打包成镜像

  • Docker container: 容器

  • Docker registry:镜像仓库(yum仓库)

组件:

  • 镜像:–组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板
  • 容器:基于镜像的一-种运行时状态
  • 仓库:存放image镜像,仓库大类: 1、公共仓库一-》 docker hub 2、私有仓库registry
    harbor

四、安装 Docker

#环境配置
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
12345678910111213141516
配置阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://4iv7219l.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
12345678
网络优化
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
EOFsysctl -p
systemctl restart network
systemctl restart docker
1234567
一键安装
[root@c7-1 ~]#cat docker.sh
#!/bin/bash#环境配置
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#配置阿里云镜像加速(尽量使用自己的)
#地址 https://help.aliyun.com/document_detail/60750.html
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://4iv7219l.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload#网络优化
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
EOFsysctl -p
systemctl restart network
systemctl enable docker && systemctl restart docker
1234567891011121314151617181920212223242526272829303132333435

PS
docker-server 端配置文件 daemon.json

#生产配置示例,在 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跑起来的容器还能运行(分离)
12345678910111213141516171819

五、Docker 镜像与容器命令管理

5.1 镜像命令管理

PS:

  • 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
12345678910111213141516171819202122232425262728293031323334

5.2 容器命令管理


#查询容器
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>
12345678910111213141516171819202122232425262728293031323334353637383940414243

容器与宿主机之间文件的复制

docker run -itd --name nginx_test nginx:latest /bin/bash#主机复制到容器
[root@tengxun-02 ~]#touch testfile
[root@tengxun-02 ~]#ls
testfile
[root@tengxun-02 ~]#docker cp testfile nginx_test:/opt
[root@tengxun-02 ~]#docker exec -it nginx_test bash
root@2ca07b152329:/# cd /opt
root@2ca07b152329:/opt# ls
testfile#容器复制到主机
root@2ca07b152329:/opt# ls
testfile
root@2ca07b152329:/opt# touch haha
root@2ca07b152329:/opt# ls
haha  testfile
root@2ca07b152329:/opt# exit
exit
[root@tengxun-02 ~]#docker cp nginx_test:/opt/haha .
[root@tengxun-02 ~]#ls
haha  testfile
1234567891011121314151617181920212223
进入容器没有 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
1234567891011

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

初识docker容器(优势真的巨大,比虚拟机好用多了)相关推荐

  1. docker容器虚拟化技术_Docker,虚拟机和容器的全面介绍

    docker容器虚拟化技术 by shota jolbordi 通过Shota Jolbordi Docker has been a buzzword for tech people for the ...

  2. Docker容器技术——真的很细

    目录 一.容器介绍 1.云计算服务类型 2.容器本质 3.容器和虚拟机对比 4. docker基本概念 5.docker的优势 交付物标准化 一次构建,多次交付 应用隔离 6.Docker三大核心组件 ...

  3. docker容器的分层思想

    1. 容器分层结构图: 2.dockerfile分层的结构图: 配合图详解: bootfs : kernel boot rootfs : /etc /dev /bin /usr .. 容器的内核会映射 ...

  4. Windows如何Share目录给docker容器

    本篇我将把windows的c:\lcj\project\core目录共享给docker容器 这里要先共享给虚拟机,然后再在虚拟机共享给docker容器. 1.打开vbox, 点击设置. 2.选择左边的 ...

  5. 虚拟服务器容器,docker容器和虚拟机的区别

    结构方面区别 虚拟机实现资源隔离的方式,是利用Hypervisor虚拟化 而 简单来说,Docker就是利用namespace实现的系统环境的隔离,利用cgroup实现资源限制,利用镜像实现根环境的的 ...

  6. Docker 容器 和 虚拟机 的异同

    见:https://www.docker.com/what-container 将软件打包成标准化的单元进行开发,发货和部署 容器映像是一个软件的轻量级独立可执行软件包,包含运行所需的所有内容:代码, ...

  7. 初识docker《部署docker容器虚拟化平台》

    目录 1.Docker 概述 1.1 Docker 介绍 1.2 Docker 容器技术和虚拟机对比 1.3 Docker 架构 1.4 Docker 特性 1.5 Docker 版本简单介绍 2.部 ...

  8. Docker安全性(一)——Docker容器真的安全吗?

    Docker安全性(一)--Docker容器真的安全吗? 本文翻译自Daniel J Walsh的一篇开源文章:http://opensource.com/business/14/7/docker-s ...

  9. Docker容器与虚拟机有什么区别?

    转载:http://virtual.51cto.com/art/201805/572135.htm Docker是一个虚拟环境容器,可以将你的可执行文件.配置文件及一切其他你需要的文件一并打包到这个容 ...

最新文章

  1. UC,qq浏览器强制横屏
  2. LeetCode 88. 合并两个有序数组 golang
  3. jar命令指定入口类
  4. find a ubuntu featue
  5. PCB解决(Failed to add class member)问题
  6. mac安装java环境
  7. 华硕k5555l拆解图解_华硕k50id的拆机过程详解【图文教程】
  8. PostgresSQL弱密码导致命令执行
  9. iOS开发中图片的模糊处理
  10. Vue之assets图片加载不出来
  11. github android涂鸦,Android 涂鸦最佳实践
  12. 【下载所有XKCD漫画】 详细解析
  13. Oracle EBS APP-FND-02901: you don‘t have privilege to any operating unit
  14. Unity 进阶 之 实现简单的音频可视化封装(包括音频和麦克风)
  15. D435i安装驱动时遇到的configuring Secure Boot问题
  16. driver 的功能是什么
  17. 7-4 求幂级数展开的部分和(20 分)
  18. chroot jail
  19. 计算机连接游戏手柄,电脑如何使用手柄_电脑怎么连手柄打游戏-系统城
  20. 【翻译】WannaCry ransomware attack

热门文章

  1. 【编程实践】Git命令基础教程和代码实例讲解
  2. 露营从“非电”到“插电”,火星玩家开创“电核露营”的新时代
  3. 上网管理系统--帮助企业管理和分析员工上网行为
  4. 理发店真是一个暴利行业吗?
  5. AJAX 同步请求导致的UI阻塞问题
  6. python输入半径求圆的面积、保留三位小数_编写程序,输入圆的半径,求该圆的面积与周长(保留三位小数)。 /* 程序功能:输入圆的半径,计算圆的面积与周长*/_学小易找答案...
  7. 转载 Org-mode 简明手册
  8. 网络炸飞机 v1.20 官方
  9. 总结禁止弹窗关闭弹窗的六种方法
  10. 我们编写的python代码在运行过程中_在Rust代码中编写Python是种怎样的体验?