• Docker基本使用(一)


    一、为什么使用容器?

    1. 上线流程繁琐
    开发->测试->申请资源->审批->部署->测试等环节
    2. 资源利用率低
    普遍服务器利用率低,造成过多浪费
    3. 扩容/缩容不及时
    业务高峰期扩容流程繁琐,上线不及时
    4. 服务器环境臃肿
    服务器越来越臃肿,对维护、迁移带来困难

    Docker设计目标:
       提供简单的应用程序打包工具
       开发人员和运维人员职责逻辑分离
       多环境保持一致性
    Kubernetes设计目标:
       集中管理所有容器
       资源编排
       资源调度
       弹性伸缩
       资源隔离

    容器与vm对比:

     

     

    二. Docker的基本使用

    Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。

    官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 centos7 上的安装

    2.1 安装

     CentOS7.x安装Docker
    # 安装依赖包
    yum install -y yum-utils device-mapper-persistent-data lvm2
    # 添加Docker软件包源
    yum-config-manager 
    --add-repo 
    https://download.docker.com/linux/centos/docker-ce.repo
    # 安装Docker CE
    yum install -y docker-ce
    # 启动Docker服务并设置开机启动
    systemctl start docker
    systemctl enable docker
    官方文档:https://docs.docker.com
    阿里云源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
     

    2.2理解容器镜像

    镜像是什么?
    • 一个分层存储的文件
    • 一个软件的环境
    • 一个镜像可以创建N个容器
    • 一种标准化的交付
    • 一个不包含Linux内核而又精简的Linux操作系统
    镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层
    对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/<storage-driver>中。
    镜像从哪里来?
    Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
    地址:https://hub.docker.com

    配置镜像加速器:https://www.daocloud.io/mirror
    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
    #配置完重启生效
    systemctl restart docker
    #配置文件
    cat /etc/docker/daemon.json
    {"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}

     

    如图,容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,
    会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。
    如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多
    少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作
    的,并不会修改镜像的源文件,这种方式提高磁盘利用率。
    若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像。
    • 一个镜像创建多个容器
    • 镜像增量式存储
    • 创建的容器里面修改不会影响到镜像

    管理镜像常用命令

    ls 列出镜像
    build 构建镜像来自Dockerfile
    history 查看镜像历史
    inspect 显示一个或多个镜像详细信息
    pull 从镜像仓库拉取镜像
    push 推送一个镜像到镜像仓库
    rm 移除一个或多个镜像
    prune 移除未使用的镜像。没有被标记或被任何容器引用的。
    tag 创建一个引用源镜像标记目标镜像
    export 导出容器文件系统到tar归档文件
    import 导入容器文件系统tar归档文件创建镜像
    save 保存一个或多个镜像到一个tar归档文件
    load 加载镜像来自tar归档或标准输入

    docker容器之间使用什么做的资源隔离?

    1、namespace:资源隔离
        1)UTS:主机名和域名
      2)IPC:比如消息队列、共享内存
      3) PID:进程编号
      4)Network:网络协议栈,例如IP、端口
      5)Mount:文件系统
      6)User:用户和用户组
    2、cgroups:资源限制,比如CPU、内存、磁盘IO
    3、UFS:联合文件系统,Copy-on-write

    创建容器需要考虑:
    1、应用暴露出去
    2、主机名,IP
    3、数据要不要持久化
    4、变量传入,做相关动作
    5、资源限制,例如cpu、内存

    docker container run  -d 
        -p 8888:8080 
        --name web 
        -e abc=123456   #变量传入
        -v $PWD/wwwroot:/opt  #数据持久:将容器的opt目录映射到宿主机
        -m=1G 
        --cpus="2" 
        lizhenliang/java-demo

    先测试模拟创建个目录跟文件

    [root@k8s-node1 ~]# mkdir wwwroot
    [root@k8s-node1 ~]# cd wwwroot/
    [root@k8s-node1 wwwroot]# touch index.html

    查看镜像

     [root@k8s-node1 ~]# docker ps -l
    CONTAINER ID        IMAGE                   COMMAND             CREATED              STATUS              PORTS                    NAMES
    bdd00191db91        lizhenliang/java-demo   "catalina.sh run"   About a minute ago   Up About a minute   0.0.0.0:8888->8080/tcp   web

    进入镜像

    [root@k8s-node1 ~]# docker exec -it web bash

    查看传递的参数

    [root@bdd00191db91 tomcat]# echo $abc 
    123456

    宿主机wwwroot目录下的文件已经映射到opt目录下

    [root@bdd00191db91 tomcat]# ls /opt/
    index.html

    容器里边创建的文件同时也会在宿主机的目录中

    [root@bdd00191db91 tomcat]# touch /opt/a.html
    [root@bdd00191db91 tomcat]# exit
    exit

    [root@k8s-node1 ~]# ls wwwroot/
    a.html index.html

    #查看容器的资源限制
    [root@k8s-node1 ~]# docker stats web

    创建容器常用命令:
    -i, –interactive 交互式
    -t, –tty 分配一个伪终端
    -d, –detach 运行容器到后台
    -e, –env 设置环境变量
    -p, –publish list 发布容器端口到主机
    -P, –publish-all 发布容器所有EXPOSE的端口到宿主机随机端口
    –name string 指定容器名称
    -h, –hostname 设置容器主机名
    –ip string 指定容器IP,只能用于自定义网络
    –network 连接容器到一个网络
    –mount mount 将文件系统附加到容器
    -v, –volume list 绑定挂载一个卷
    –restart string 容器退出时重启策略,默认no,可选值:[always|on-failure]
     
    容器资源限制:
    -m,–memory 容器可以使用的最大内存量
    –memory-swap 允许交换到磁盘的内存量
    –memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认为-1)
    –oom-kill-disable 禁用OOM Killer
    --cpus 可以使用的CPU数量
    –cpuset-cpus 限制容器使用特定的CPU核心,如(0-3, 0,1)
    –cpu-shares CPU共享(相对权重)
     
    示例:
    内存限额:
    允许容器最多使用500M内存和100M的Swap,并禁用 OOM Killer:
    docker run -d --name nginx03 --memory="500m" --memory-swap=“600m" --oom-kill-disable nginx
    CPU限额:
    允许容器最多使用一个半的CPU:
    docker run -d --name nginx04 --cpus="1.5" nginx
    允许容器最多使用50%的CPU:
    docker run -d --name nginx05 --cpus=".5" nginx
     
    管理容器常用命令:
    ls 列出容器
    inspect 查看一个或多个容器详细信息
    exec 在运行容器中执行命令
    commit 创建一个新镜像来自一个容器
    cp 拷贝文件/文件夹到一个容器
    logs 获取一个容器日志
    port 列出或指定容器端口映射
    top 显示一个容器运行的进程
    stats 显示容器资源使用统计
    stop/start/restart 停止/启动一个或多个容器
    rm 删除一个或多个容器

    持久化容器中应用程序数据

    Docker提供三种方式将数据从宿主机挂载到容器中:
    • volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
    • bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
    • tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用
    tmpfs,同时避免写入容器可写层提高性能。

    bind mounts
    
    默认是-v bind mounts模式 ,这种模式只要是同个镜像创建,即使删除容器,数据也不会丢失    
    
    我们来测试下,先停止,然后删除    
    [root@k8s-node1 ~]# docker stop  web    
    [root@k8s-node1 ~]# docker rm  web
    
    执行
    docker container run  -d 
        -p 8888:8080 
        --name web 
        -e abc=123456 
        -v $PWD/wwwroot:/opt 
        -m=1G 
        --cpus="2" 
        lizhenliang/java-demo
    
    进入容器查看数据是否还在
    [root@k8s-node1 ~]# docker exec -it web bash
    这个opt目录下创建的内容都会持久化到宿主机的目录上
    [root@d95dddf521ec tomcat]# ls /opt/
    a.html  index.html
    
    
    宿主机上wwwroot目录
    [root@k8s-node1 ~]# ls wwwroot/
    a.html  index.html
    
    
    volumes
    
    volumes是由docker进行管理的,bind mounts是由宿主机进行管理,docker去进行映射
    
    
    创建一个volume
    [root@k8s-node1 ~]# docker volume create wwwroot
    
    查看
    [root@k8s-node1 ~]# docker volume ls
    DRIVER              VOLUME NAME
    local               wwwroot
    
    查看宿主机上的目录
    [root@k8s-node1 ~]# docker volume inspect wwwroot
    [
        {
            "CreatedAt": "2019-11-23T09:02:59+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/wwwroot/_data",
            "Name": "wwwroot",
            "Options": null,
            "Scope": "local"
        }
    ]
    
    这个目录默认是空的,只要容器使用这个volumes,数据就会持久化到这个目录
    [root@k8s-node1 ~]# ls -l /var/lib/docker/volumes/wwwroot/_data
    
    
    使用格式:
    --mount bind=volumes,src=wwwroot,dest=/opt2 
    
    也可以-v来指定,绝对路径就是bind mounts去挂载, 直接跟volume的名字就是volume 去挂载,/opt2 就是数据产生的目录
    -v wwwroot:/opt2
    
    
    
    我们来测试下,先停止,然后删除    
    [root@k8s-node1 ~]# docker stop  web    
    [root@k8s-node1 ~]# docker rm  web
    
    执行
    docker container run  -d 
        -p 8888:8080 
        --name web 
        -e abc=123456 
        -v $PWD/wwwroot:/opt 
        -v wwwroot:/opt2 
        -m=1G 
        --cpus="2" 
        lizhenliang/java-demo
    
    进入容器后创建文件
    [root@k8s-node1 ~]# docker exec -it web bash
    [root@6d785e95541c tomcat]# ls /opt2
    [root@6d785e95541c tomcat]# touch /opt2/123.html
    [root@6d785e95541c tomcat]# exit
    exit
    
    数据已经持久化到这个目录
    [root@k8s-node1 ~]# ls  /var/lib/docker/volumes/wwwroot/_data
    123.html
  • 相关阅读:
    2018.8.20 Python之路---常用模块
    2018.8.16 正则表达式
    2018.8.15 python中的冒泡法排序
    2018.8.15 python 中的sorted()、filter()、map()函数
    2018.8.14 python中的内置函数(68个)
    2018.8.13 python中生成器和生成器表达式
    2018.8.10 python中的迭代器
    2018.8.9 python中的动态传参与命名空间
    python测试开发django(1)--开始Hello World!
    UPC-5120 Open-Pit Mining(最大权闭合子图)
  • 原文地址:https://www.cnblogs.com/w787815/p/9380849.html
Copyright © 2020-2023  润新知