走进容器的心里——理解Docker

目录

前言

什么是Docker

Docker的使用场景

Docker引擎(Docker Engine)

Docker的架构(docker architecture)

                Docker原理

​  

         使用Docker的意义/优势

名称空间(NameSpaces)

                 Docker Engine在Linux上使用名称空间

                container和vm的区别

控制组(Container groups)

部署docker

                 设置镜像加速

                网络优化

                docker的一些简单命令

运行 

总结


前言

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

1、首先由开发进行代码研发,研发好之后进行编译、打包(一般会使用maven工具打war包或者jar包)

2、打完包之后,放置对应地运行时环境中,进行试运行

3、中间会加上一些测试过程,测试代码的有效性、可用性和可执行性

4、以上测试完成之后,运维会将这个软件包拉过来,运行在实际生产的运行环境中。

        此时我们会想到一个问题,在以上第2点中,不同的开发语言的运行环境混淆在一起运行会有很大的隐患,以及不便。

传统中,所谓的运行环境,例如tomcat、PHP等

容器中,所谓的运行环境,指的时“容器”内部

在此之前,容器——》是一个运行的环境,构成容器的组件时images镜像(一个运行时的环境模板)

Docker就是在容器中脱颖而出的一个开源应用容器引擎。

什么是Docker

        docker是一个用于开发、交付和运行应用程序的开放平台。docker使我们能够将应用程序与基础架构分开,从而可以快速交付软件。是一个开源的应用容器引擎,让开发者可以打包大门的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

        沙箱(sandbox):在计算机安全领域,沙箱是一种程序的隔离运行机制,Docker从2013年开始“一炮而红”,直到现在做到“build once,run anywhere(一次构建,多个地方执行)”可以将同一个构建版本用于开发、测试、预发布、生产等环境中,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出cass(容器即服务)技术、

Docker的使用场景

K8s image镜像+ container容器的方式
war jar—》github gitlab私有仓库(代码仓库)—》jenkins(测试)(应用程序封装/构建镜像)—》运维下载,使用容器技术进行运行/发布

        打包应用程序解部署,可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)例如:服务器从腾讯云迁移到阿里云,持续集成和持续交付(CI/CD)开发测试发布,部署微服务,提供PAAS(平台及服务)产品{OpenStack的云主机类似于阿里云的ECS、属于IAAS,Docker(K8S)属于PAAS}

IAAS:基础设施及服务

SAAS:应用即服务

PAAS:平台及服务

Docker引擎(Docker Engine)

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

服务器是一种长期运行的程序,称为守护程序进程(dockerd命令)。

        RESI API,它指定程序可以用来守护程序进行通信并指示其操作的接口

命令行界面(cli) 客户端(docker命令)

Docker的架构(docker architecture)

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

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

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

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

Docker三大组件

Docker images(镜像):一组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板,比如 Centos系统。

Docker Container(容器):容器是独立运行的一个或一组应用,基于镜像的一种运行时状态。是镜像运行时的实体。

Dcoker Registry(镜像仓库):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库

仓库大类:1、公共仓库—》docker hub 2、私有仓库registryharbor
docker镜像
docker hub公共仓库
docker-harbor 上传下载方便、安全

                Docker原理

  

借用网上的背景图,做了一些注释。图片如有侵权,联系删除 

         使用Docker的意义/优势

三个统一:①封装的模式image ②运行时环境container  统一的平台engine

1、docker引擎统一了基础设施环境——docker容器环境引擎

2、docker引擎统一了程序打包(装箱/封装) 方式——docker镜像

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

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

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

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

名称空间(NameSpaces)

        Docker使用一种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建一组名称空间。

        这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间。

容器隔离了6个名称空间(namespaces资源隔离——用容器化技术封装)

cgroup资源控制与namespaces 结合控制管理了6个名称空间资源(以下)
mount :文件系统,挂载点——》一个文件系统内,不能重复挂载一个指定的目录,例如/mnt

user:操作进程的用户和组

pid:进程编号

uts:主机名和主机域

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

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

                 Docker Engine在Linux上使用名称空间

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

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

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

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

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

PS:

Cgroups:是Linux内核态中资源管理的模块,管理一些系统资源

                container和vm的区别

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

Docker主要处理了vm的环境孤岛的一个问题

控制组(Container groups)

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

部署docker

首先安装docker所需的依赖包

[root@localhost ~]# yum install yum-utils device-mapper-persistent-data.x86_64 lvm2 -y

 设置阿里云镜像源

docker-ce镜像-docker-ce下载地址-docker-ce安装教程-阿里巴巴开源镜像站阿里巴巴开源镜像站为您提供免费的docker-ce下载地址及docker-ce安装教程,docker-ce镜像简介:docker ce阿里巴巴开源镜像站https://developer.aliyun.com/mirror/docker-ce

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost /etc/yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Loaded plugins: fastestmirror, langpacks
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo

可以查看docker-ce.repo这个镜像 ,是docker-ce源的一些信息

 安装doceker-ce(社区版)

[root@localhost /etc/yum.repos.d]# yum install docker-ce -y

开启docker

[root@localhost /etc/yum.repos.d]# systemctl start docker
[root@localhost /etc/yum.repos.d]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

                 设置镜像加速

阿里云镜像加速的官网

官方镜像加速 - 容器镜像服务 ACR - 阿里云https://help.aliyun.com/document_detail/60750.html

[root@localhost /etc/yum.repos.d]# cd /etc/docker/
[root@localhost /etc/docker]# ls
key.json
[root@localhost /etc/docker]# tee /etc/docker/daemon.json <<-'EOF'
> {
>   "registry-mirrors": ["https://xgftn.mirror.aliyuncs.com"]
> }
> EOF
{
  "registry-mirrors": ["https://xgfn.mirror.aliyuncs.com"]
}
[root@localhost /etc/docker]# ls
daemon.json  key.json

因为我在之前启动过了,会有data目录,设置完成之后会自动生成daemon.json (守护进程的配置文件),没启动要重载守护进程

systemctl daemon-reload

systemctl restart docker

                网络优化

为什么要做优化

因为docker网桥默认的IP地址是172.17.0.1,意味着我们需要跨网段,所有要有一个地址转发

[root@localhost /etc/docker]# vim /etc/sysctl.conf

.....
net.ipv4.ip_forward=1

刷新

[root@localhost /etc/docker]# sysctl -p
net.ipv4.ip_forward = 1

                docker的一些简单命令

docker向客户端发送images请求,查看容器中有几个镜像

[root@localhost /etc/docker]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

 查看有多少个容器ps、ps-a查看所有状态的容器

[root@localhost /etc/docker]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost /etc/docker]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

 查看版本

[root@localhost /etc/docker]# docker version
Client: Docker Engine - Community
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.16.12
 Git commit:        e91ed57
 Built:             Mon Dec 13 11:45:41 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.12
  Git commit:       459d0df
  Built:            Mon Dec 13 11:44:05 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

 查询镜像,比如查询nginx这个镜像

[root@localhost /etc/docker]# docker search nginx

他会去docker仓库(hub仓库)中去查找 ,所显示的信息都是hub仓库里面的,它把nginx特定场景下的nginx全部封装为一个镜像,我们可以根据它的模式为我们使用

 下载最新的镜像


[root@localhost /etc/docker]# docker pull nginx

运行 

 

总结

        1、Dcoker是基于容器技术的轻量级虚拟化解决方案
        2、docker是容器技术,把linux的cgroup、namespaces等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行cli、api等) c/s,cgroup和namespaces两者构成了docker底层原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柏ぁ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值