• 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:   联合文件挂在系统。 支持不同位置的目录挂载到同一个虚拟文件系统,并形成一种分层的模型。
    
  • 相关阅读:
    我就是想找个人聊聊天,说说我这近四年来的经历-02
    我就是想找个人聊聊天,说说我这近四年来的经历
    Padas交叉表新增二级分类小计
    superset开启本地缓存filesystem
    Superset连接Impala数据源
    Python实现网站注册验证码生成类
    Python爬虫原理
    Superset导出pivot_table到excel
    Superset导出CSV文件中文或日文乱码
    Linux下如何高效删除一个几十G的文本文件的最后一行或几行
  • 原文地址:https://www.cnblogs.com/superlinux/p/13246032.html
Copyright © 2020-2023  润新知