• Docker


    为什么使用容器

    1.上线流程繁琐
    2.资源利用率底
    3.扩容、缩容不及时(已知,未知)
    业务机器增加承载量,可以应对一些突发状况,30%
    弹性伸缩
    4.服务器环境臃肿 5.环境不一致


    docker介绍

    官网:https://docs.docker.com/

    安装centOS  https://docs.docker.com/engine/install/centos/

    # 广泛介绍
    1,使用最广泛的开源容器引擎
    2.一种操作系统级别的虚拟化技术
    3.依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)
    4.一个简单的应用程序打包工具
    
    # 设计目标
    1.提供简单的应用程序打包工具  (项目环境+代码成镜像)
    2.开发人员和运维人员责任逻辑分离
    3.多环境保持一致性
    
    # 基本组成
    * Docker Client:    客户端
    * Docker Daemon:   守护进程
    * Docker Images:    镜像
    * Docker Container:  容器
    * Docker Registry:  镜像仓库

    容器与虚拟机的区别

                            Container                       VM
    启动速度                    秒级                         分钟级别
    运行性能                   接近原生                      5%左右损失
    磁盘占用                     MB                           GB
    数量                        成百上千                    一般几十台
    隔离性                     进程级别                    系统级别(更彻底)
    操作系统                   只支持linux                   几乎所有
    封装程度        只打包项目代码和依赖关系(共享宿主内存)      整个操作系统


    容器:
    容器提供了一个独立的环境,实现容器隔离、资源限制
    主要解决应用层面问题,应用快速部署、高效管理

    虚拟机:
    提升服务器资源利用率
    提供一个隔离环境

    Docker应用场景

    应用程序打包和发布
    应用程序隔离
    持续集成(解决产品依赖服务,快速部署)
    部署微服务
    快速搭建测试环境
    提供PaaS(平台及服务)

    安装docker

    # CentOS安装 Docker(官网)
      https://docs.docker.com/engine/install/centos/
    # CentOS安装 Docker(菜鸟)
      https://www.runoob.com/docker/centos-docker-install.html
    # yum依赖包
      yum  install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
    
    # 在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker
      $ yum install -y yum-utils
    
      $ yum-config-manager 
        --add-repo 
        https://download.docker.com/linux/centos/docker-ce.repo
    # 安装最新版本(ce:社区版 ee:企业版)
      yum install docker-ce
    
    # 设置docker服务开机启动
      $ systemctl start docker
      $ systemctl enable docker
    
    # 查看是否启动
      docker info
    
    # 在虚拟机安装完docker 分配一个伪终端


    # docker run 命令:https://www.runoob.com/docker/docker-run-command.html
    docker run -i -t centos /bin/bash # 若果不存在镜像,默认官方自动安装
    # 创建容器 -d
    docker run -d nginx # 查看伪终端安装的CentOS版本 cat /etc/redhat-release

    Docker镜像

    镜像是什么

    # 一个分层储存的文件,不是一个单一的文件
    # 一个软件的环境
    # 一个镜像可以创建N个容器
    # 一种标准的交付方式
    # 一个不包换linux1内核而又精简的Linux操作系统

    Docker命令最后一个指定镜像

    # Docker run 
    1. docker命令最后一个指定镜像  (仓库:https://hub.docker.com/)
    2. 默认镜像版本 latest
    3. 分层下载
    
    # Docker查看安装
        docker ps     # 列出容器
    docker ps -a # 显示所有容器(包括未运行)
    docker images # 列出本地镜像
    # 配置镜像加速器: vi /etc/docker/daemon.json { "registry-mirrors":["https://b9pmyelo.mirror.aliyuncs.com"] }

    # 启动容器
    docker start 进程号 # 进程号获取方式 docker ps -a 第一列

    镜像与容器的联系

    # 当启动一个新的容器时,Docker会加载只读镜像,并在其之上添加一个读写层,即容器层  

    容器目录:ls /var/lib/docker/containers/ 镜像储存目录(分层):ls /var/lib/docker/overlay2/

    容器没有自己的内核

    rootfs 根文件系统
    bootfs 引导文件系统,引导程序和内核

    镜像管理常见命令

    # export
    # 备份
      docker container export 82ded77e5342 > nginx.tar 
    # 查看备份出的大小
      du -sh nginx.tar
    # 解压
      tar xvf nginx.tar
    
    # save导出
      docker save nginx > nginx.tar 
    # 删除镜像
      docker image rm -f nginx   # 无法删除占用文件
    # 批量删除容器
      docker rm -f $(docker ps -aq)
    # load导入
      docker load < nginx.tar

    镜像存储核心技术,容器读写

     存储驱动为:overlay2()

    镜像层只读,容器层读写      # 容器之间隔离
    docker exec -it ID bash # ID 需要docker ps 查询
    # 退出容器id
    ctrl+d
    # 镜像高效存储
      答:引用联合文件系统,将镜像多层文件联合挂载到容器文件系统
      将多个目录记录到,一个单独目录中记录 将信息综合起来方便调用,节省空间
    # 写时复制(cow)

    联合文件系统后,镜像是只读,类似共享形式让多个容器使用,如果在容器离修改文件,及镜像里的文件,该怎么办呢? 答:引入写时复制(copy-on-write),需要修改文件操作时,会先从镜像里把要写的文件复制到自己的文件系统中进行修改


    # 容器层创建文件里面存在挂载宿主机三个文件
    hostname
    hosta
    resolv.conf
    # 查看三个文件
    ls /var/lib/docker/overlay2/容器id/diff
    例子:  ls /var/lib/docker/overlay2/1432ab6979524f2c6f8ff3ff6c44e334baab4a3f866f0afcbf706535251d251f/diff

    # 读文件: 容器层-》镜像层
    # 修改文件: 容器层-》镜像层
    # 容器层创建一个文件

    管理容器的常用命令

     创建容器的常用选项

    # 进入容器
      docker container exec -it 容器ID号 bash
    
    # 实例 
      docker run -d -e ABC=123  -p 8888:80 --name nginx -h web --restart=always  nginx 镜像# always 开机重启
    # 查看是否生效
    echo $ABC
    hostname
    # 挂在宿主机三个文件修改
    hostname --hostname
    hosta --dns
    resolv.conf --add-host

    容器资源管理

    # 容器可以使用的最大内存量  
      docker run -d -m="512m" nginx
    # 资源统计信息
      docker stats  长ID

    容器资源扩容

    # 更新容器配置
      docker update 更新配置
    # 查看所有容器(包括停止的)
    docker ps -a 查看所有容器
    # 只显示容器id
    docker ps -aq 只显示容器id
    # 删除所有容器
    docker rm -f $(docker ps -a)
    # 从外部复制到容器中
    # 从外到里
    docker cp nginx.tar web:/opt
    docker exec -it web bash
    # 从里到外
    docker cp web:/opt/xxx ./

    容器实现核心技术

    六种不同的命名空间 namespace

    # 查看进程的命名空间
    ll /proc/$$/ns # 查看有哪些命名空间
    ls /proc/1/ns

    限制容器资源CGroups

     

    Docker核心组件

    将数据从宿主机挂载到容器中的三种方法

     

    volume

     bind mounts

     

    docker网络

    # 查看网络
    docker network ls
    
    # 应用场景
    bridge
    
    host 希望使用宿主机网络
    none 手动配置容器网络,对接公司的IPAM
    container 希望容器与另一个容器在一个网络命名空间,Inmp

    iptables

     

     

  • 相关阅读:
    关键字与标识符
    JAVA 程序的基本语法
    第一个java程序中文乱码以及如何解决
    第一个java程序以及java的运行机制
    java中求余%与取模floorMod的区别
    Volley 框架解析(二)--RequestQueue核心解读
    Volley 源码解析
    Android之Activity系列总结(三)--Activity的四种启动模式
    Android之Activity系列总结(二)--任务和返回栈
    Android之Activity系列总结(一)--Activity概览
  • 原文地址:https://www.cnblogs.com/Pythonzrq/p/14499474.html
Copyright © 2020-2023  润新知