• 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
  • 相关阅读:
    how to uninstall devkit
    asp.net中bin目录下的 dll.refresh文件
    查找2个分支的共同父节点
    Three ways to do WCF instance management
    WCF Concurrency (Single, Multiple, and Reentrant) and Throttling
    检查string是否为double
    How to hide TabPage from TabControl
    获取当前系统中的时区
    git svn cygwin_exception
    lodoop打印控制具体解释
  • 原文地址:https://www.cnblogs.com/w787815/p/9380849.html
Copyright © 2020-2023  润新知