zoukankan      html  css  js  c++  java
  • docker创建容器数据持久化资源限制基础命令

    1. docker简介和核心概念

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

    2. 为什么需要使用到容器

    1. 传统服务部署,维护相对繁琐。
    2. 资源利用存在浪费
    3. 扩容、缩容不够及时
    4. 服务器迁移,维护相对繁琐
    5. 集群环境一致性差
    6. 无法应用突发流量
    7. 弹性伸缩
    docker的出现能够改善以上问题。
    

    3.docker是什么

    1. docker是一个开源的容器引擎
    2. 一个操作系统级的虚拟化技术
    3. 依赖于系统内核的特性,实现:  1. namespace{资源隔离} 2. cgroup{资源限制}
    4. docker也是一个简单的应用程序打包工具。可以将程序封装好,通过docker自身的导出导入能力为迁移提供保障
    5. 多环境一致性。docker的出现,从根本解决了环境一致性问题,它能够将环境必备的程序打包到一个容器中,提供他人使用
    

    4.容器和虚拟机区别

    VM:   硬件-->操作系统-->虚拟机管理程序-->虚拟机-->操作系统-->服务程序
    
    docker:   硬件-->操作系统-->docker-->服务程序
    

    5.docker适合于哪些应用场景

    1. 应用程序打包[能够保证所打包的程序在另一个docker环境中完美运行]
    2. 应用程序隔离
    3. 持续集成
    4. 部署微服务
    5. 快速搭建一个测试环境
    6. 提供平台及服务
    

    6. 安装docker

    1. yum安装
    #源添加
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
    yum clean all
    yum install -y bash-completion.noarch
    
    # 安装指定版版本 
    yum -y install docker-ce-18.09.9-3.el7
    
    #也可以查看版本安装
    yum list docker-ce --showduplicates | sort -r
    
    #启动docker
    systemctl enable docker
    systemctl start docker
    systemctl status docker
    
    
    2. 离线版安装
    #官方下载docker
    https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
    #个人网站下载:
    https://www.chenleilei.net/soft/docker/docker-19.03.9.tgz
    
    tar zxvf docker-19.03.9.tgz
    mv docker/* /usr/bin
    
    #加入systemd
    #--------------------------------------------------------
    cat > /usr/lib/systemd/system/docker.service << EOF
    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    After=network-online.target firewalld.service
    Wants=network-online.target
    [Service]
    Type=notify
    ExecStart=/usr/bin/dockerd
    ExecReload=/bin/kill -s HUP $MAINPID
    LimitNOFILE=infinity
    LimitNPROC=infinity
    LimitCORE=infinity
    TimeoutStartSec=0
    Delegate=yes
    KillMode=process
    Restart=on-failure
    StartLimitBurst=3
    StartLimitInterval=60s
    [Install]
    WantedBy=multi-user.target
    EOF
    #--------------------------------------------------------
    
    #创建配置文件
    mkdir /etc/docker
    cat > /etc/docker/daemon.json << EOF
    {
      "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
    }
    EOF
    
    #个人docker源:
    #这个是阿里云配置的加速,直接添加阿里云加速源就可以了,上面显示了配置办法。
    https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
    
    #设置开机启动和启动即可
    systemctl enable docker
    systemctl start docker
    
    

    7. docker镜像

    镜像是一个分层存储的文件,不是一个单一文件
    一个软件环境
    一个镜像可以创建多个容器
    一个标准化的交付概念
    一个不包含Linux欸和且精简的Linux操作系统

    8. docker常用命令

    # 查看命令:
    docker ps                 #查看已运行中的容器
    docker ps -a              #查看所有容器
    docker history [容器ID]   #查看容器层级
    docker image  ls          #列出镜像,等同于 docker images
    docker build              #使用dockerfile构建镜像 如:docker build -t nginx-test-v001 -f dockerfile-nginx .
    docker inspect [容器ID]   #查看一个容器的详细信息。
    
    #容器删除
     docker rm [容器id]     #删除容器
     docker rmi [容器id]    #删除容器同时删除镜像
     
     
    # 运行命令:
    docker run               #运行一个容器
                -d           #后台运行,然后返回该容器ID
                -t           #分配一个tty终端
                -i           #以交互模式运行容器,通常与 -t 同时使用
                
    # 清除镜像
    docker image prune     #移除没有使用得镜像,并提示
    docker image prune -a  #移除所有没有被使用的镜像
    
    # 推送镜像
    docker push
    
    #其他指令
    docker tag     给一个镜像打标签,用于推送镜像到私有仓库
    docker export  导出容器文件系统到tar包。  如: docker export 1e682c585342 >dashboard.tar.gz  [用的不多]
    docker import  导入容器文件系统tar包。  [这个指挥导出容器里的内容 不会导出整个系统,docker export也是如此]  
    docker save    保存一个或多个[镜像]到tar包   #常用 用法:  docker save nginx >nginx.tar
    docker load    导入一个docker的[镜像]tar包  #常用 用法:  docker load < nginx.tar
    docker info    查看docker版本信息
    
    docker search nginx  搜索镜像
    docker pull	nginx    下载镜像
    ## 停止容器
    docker stop 容器名
    
    一次性停止所有容器
    docker stop $(docker ps -a -q)
    
    ## 干掉容器 
    docker kill $(docker ps -a -q)
    
    #常用参数:
    -v 挂载磁盘  [ -v 宿主机目录:容器目录 ]
    
    #进入容器
    docker exec -it [容器id] bash
    
    #容器相关操作
    docker run   运行一个容器
    docker exec  进入一个容器
    docker ps    查看运行的容器
    docker ps -a 查看所有容器
    docker stop  停止一个容器
    docker start 启动一个容器
    docker kill  关闭一个容器
    docker  rm   删除一个容器
    docker  rename 重命名一个容器 如:docker rename nginx nginx1
    docker  top  查看容器内运行进程信息
    docker  cp   拷贝容器中的文件  示例: docker cp nginx_leilei01:/etc/nginx/nginx.conf ./
    
    docker pause   暂停一个容器:
    docker unpause 恢复被暂停的容器
    
    docker stats   显示容器的实时流资源使用统计信息
    
    docker cp /root/1.txt 23er23rs:/www   拷贝文件到docker中,可通过: docker exec nginx1 ls /tmp  查看
    
    #挂载目录和文件
    -v /leilei:/usr/share/nginx/html
    -v /leilei/nginx.conf:/usr/share/nginx/conf/nginx.conf
    
    #指定映射端口
    -p 90:80     #将80端口映射到公网90端口  默认随机端口是从/etc/sysctl.conf中定义的随机端口范围.
    -P  #大写P 映射为随机端口.
    

    9. docker创建容器选项

    10. docker资源限制

    -m,-memory     设定最大内存量 如: -m='512m'
    -memory-swap    允许交换分区的大小
    -memory-swappiness=<0-100>  允许使用脚本分区的大小0-100  默认禁用 -1
    -oom-kill-disbale    #禁用oom
    --cpus         #限制容器使用的cpu数量
    --cpuset-cpus  #限制容器使用那些核心,如: 0-3   0,1
    --cpu-shares   #cpu共享
    
    #查看限制:
    docker stats 
    [root@k8s-master1 ~]# docker stats [id]
    CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %       NET I/O      BLOCK I/O     PIDS
    359042c33b3d   zealous_napier  0.00%     1.387MiB / 2.922GiB   0.05%       1.3kB / 0B   0B / 0B       2
    
    
    资源限制的例子:
    #只用一个半cpu
    docker run -d --name nginx01 --cpus='1.5' nginx
    
    #最多使用50%cpu
    docker run -d --name nginx02 --cpus=".5" nginx
    
    #允许最多使用500M内存和100mswap,禁用oom
    docker run -d --name nginx03 --memory="500m" --memory-swap="600m" --oom-kill-disable nginx
    
    
    资源扩容:
    [对已创建的容器进行在线扩容(仅支持一部分)]
    docker update 
    

    11. docker namespace

    Linux内核在2.4.19版本开始引入namespace概念,它是将特定的全局系统资源通过抽象方法让namespace中的进程看起来拥有自己隔离的资源。 docker借助该机制实现的容器资源隔离。
    namespace的6中不同命名空间:
    IPC: 隔离进程间通信
    MOUNT: 隔离文件系统挂载点
    NET: 隔离网络协议栈
    PID: 隔离进程号,进程命名空间是一个父子结构,子空间对父空间可见
    USER: 隔离用户
    UTC: 隔离主机名和域名
    

    12. docker CGroups

    namespace不会对资源进行限制,如CPU 内存等,如果CPU被频繁调用,它会影响到其他容器的CPU资源。
    此时,引入了 CGroups 用于限制容器资源。
    cgoups: 所有的人物就是运行在系统的第一个进程,而cgroups以某种标准将一组进程为目标进行资源分配和控制。
    例如: cpu 内存 宽带 并且可以动态配置。
    cgoups主要功能:
    1. 限制进程组使用的资源数量。 设定进程组资源使用上限,例如:限制内存
    2. 进程组优先级控制,可以为进程组分配特定的CPU,磁盘I/O吞吐量
    3. 记录进程组使用的资源数量: 例如,使用记录某个进程组使用的CPU时间
    4. 进程组控制(control): 可以将进程组挂起和恢复
    

    13. docker数据持久化:

    1. 搜索镜像    
    2. 挂载宿主机三个文件: hostname hosts resolv.conf
    3. 挂载容器目录 /var/lib/docker/containers
    

    数据持久化:

    volumes: docker 管理宿主机文件系统的一部分(/var/lib/docker/volumes) 保存数据最佳方式。
    bind mounts:将宿主机上的任意位置文件或者目录挂载到容器中。
    tmpfs : 很少用。 挂载存储在主机的内存中,不会写入到主机的文件系统。
    

    13.1 volume持久化方案:

    1. 创建volume:
    [root@k8s-master1 ~]# docker volume create nginx-volume
    nginx-volume
    2. 检查volume目录: 
    [root@k8s-master docker]# docker inspect nginx-volume 
    [
        {
            "CreatedAt": "2020-07-05T14:08:27+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data",
            "Name": "nginx-volume",
            "Options": null,
            "Scope": "local"
        }
    ]
    
    
    2. 使用volume:
       第一种方法:
       docker run -d -p 80:80 --name=nginx-test --mount src=nginx-volume,dst=/usr/share/nginx/html nginx
       
       第二种方法:
       docker run -d -p 80:80 --name=nginx-test -v nginx-volume:/usr/share/nginx/html nginx
       
       
     3. volume清理办法:
       docker stop nginx-test
       docker rm nginx-test
       docker volume rm nginx-volume
       
       
    例子:
    docker volume create nginx-volume
    docker inspect nginx-volume |grep 'Mountpoint' 获取volume目录。
    1.方法1 bindmount挂载:
    docker run -d -p 80:80 --name=nginx-test --mount type=bind,src=nginx-volume,dst=/usr/share/nginx/html nginx
    2.方法2 挂载[常用]:
    docker run -d -p 80:80 --name=nginx-test -v nginx-volume:/usr/share/nginx/html nginx
    两种方法都是将nginx-volume挂载容器中的网页目录中: /usr/share/nginx/html
    
    检查:
    [root@k8s-master docker]# ls /var/lib/docker/volumes/nginx-volume/_data
    50x.html  index.html
    修改:
    echo chenleilei01 > /var/lib/docker/volumes/nginx-volume/_data/index.html
    
    
    注意:
    bindmount挂载的方式: 如果容器目录非空,则该目录内容会被隐藏,从而使用宿主机目录覆盖容器中的网页目录
    volume挂载方式:  docker管理宿主机文件系统的一部分。组词杭甬的数据保存方式。
    

    13.2 bind mount持久化数据方式:

    1. 创建volume:
    [root@k8s-master1 ~]# docker volume create nginx-volume
    nginx01-volume
    2. 检查volume目录: 
    [root@k8s-master docker]# docker inspect nginx-volume 
    [
        {
            "CreatedAt": "2020-07-05T14:08:27+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data",
            "Name": "nginx-volume",
            "Options": null,
            "Scope": "local"
        }
    ]
    3. 使用bindmount挂载
    docker run -d -p 80:80 --name=nginx-test --mount type=bind,src=nginx01-volume,dst=/usr/share/nginx/html nginx
    

    14. docker核心组件之间关系

    docker deamon: docker的守护进程,负责与docker client交互,并管理镜像和容器
    containerd: 是一个简单的守护进程,向上给docker daemon提供接口,向下通过containerd-shim结合runC管理创建容器。
    runC: 一个命令行工具,它根据OCI标准来创建容器和运行容器
    

    总结:

    namespace: 一个命名空间,Linux内核提供的一种对资源隔离的机制。 如隔离进程 网络 挂载点等资源
    cgroups:    Linux内核提供的一种对进程组限制的机制,如: cpu 内存等。
    unionfs:   联合文件挂在系统。 支持不同位置的目录挂载到同一个虚拟文件系统,并形成一种分层的模型。
    
  • 相关阅读:
    java的构造方法 java程序员
    No result defined for action cxd.action.QueryAction and result success java程序员
    大学毕业后拉开差距的真正原因 java程序员
    hibernate的回滚 java程序员
    验证码 getOutputStream() has already been called for this response异常的原因和解决方法 java程序员
    浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓 java程序员
    你平静的生活或许会在某个不可预见的时刻被彻底打碎 java程序员
    Spring配置文件中使用ref local与ref bean的区别. 在ApplicationResources.properties文件中,使用<ref bean>与<ref local>方法如下 java程序员
    poj1416Shredding Company
    poj1905Expanding Rods
  • 原文地址:https://www.cnblogs.com/superlinux/p/13246032.html
Copyright © 2011-2022 走看看