zoukankan      html  css  js  c++  java
  • docker学习笔记(1)概述、原理学习、常用命令

    一、Docker概述

        Docker是基于Go语言实现的云开源项目,诞生于2013年初,目前主流的Linux操作系统已支持Docker,如Redhat RHEL6.5/CentOS6.5、Ubuntu 14.04以上的操作系统,docker的主要目标为:“BuildShip and Run Any App,Anywhere”,即通过对应用组件的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。

        Docker引擎的基础是Linux容器技术(LXC)。最早的容器技术可以追溯到1982年Unix系列操作系统的chroot工具(目前主流Linux操作系统仍然支持),相关介绍可以看这篇博文:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/,在了解了chroot的大概之后,我们来看具体的LXC的内核实现。首先,Linux内核提供了基于namespace的六种隔离的系统调用,如下表:

    Namespace 系统调用参数 隔离内容
    UTS CLONE_NEWUTS 主机名与域名
    IPC CLONE_NEWIPC 信号量、消息队列、共享内存
    PID CLONE_NEWPID 进程编号
    Network CLONE_NEWNET 网络设备、网络栈、端口等等
    Mount CLONE_NEWNS 挂载点(文件系统)
    User CLONE_NEWUSER 用户和用户组

        这样,通过上面的基于namespace的六种资源隔离, 就实现了一个轻量级虚拟化容器服务。详细介绍参考这篇博客,写的很深入:http://www.infoq.com/cn/articles/docker-kernel-knowledge-namespace-resource-isolation?utm_source=tuicool 

        其次,运用namespace,LXC通过系统调用构建了一个相对隔离的shell环境,这时可以看成一个简单的“容器”,那么如何管理相关的资源呢,这里引入了cgroups的概念:cgroups是Linux内核提供的一种机制,这种机制可以根据特定的行为,把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。通俗的来说,cgroups可以限制、记录、隔离进程组所使用的物理资源(包括:CPU、memory、IO等),为容器实现虚拟化提供了基本保证,是构建Docker等一系列虚拟化管理工具的基石。详细参考这篇博客:http://www.infoq.com/cn/articles/docker-kernel-knowledge-cgroups-resource-isolation/

        以上两篇博客,有时间的话还要结合linux内核架构相关书籍进行研读。

        Docker与VM比较,如下表: (摘自《Docker技术入门与实践》)

    这里说明一下:Docker由于是基于LXC技术的,接近原生OS,所以它的运行自身几乎不产生额外的开销,而VM在运行OS时,VM自身会产生一定的开销。

    我们也可以把思维发散一下,docker不仅仅可以和VM对比,它其实也可以胜任rpm的部分功能、openstack的部分功能、saltstack的部分功能,与它们做对比可能会更好的理解docker。

        

    二、Docker的C/S模式

    docker是C/S的应用,如下图:

    Remote API使用RESTFUL API的风格,与程序语言交互。

    docker client与Server之间有多种连接方式:

       1.unix:///var/run/docker.sock  (通过Unix套接字)

       2.tcp://host:port        (通过tcp方式)

       3.fd://sockfd             (通过文件描述符方式)

    如果docker client希望通过远程访问docker daemon,需要加启动参数 -H

    centos中,启动配置文件在  /etc/sysconfig/docker

      ----->关于docker守护进程的配置和操作:

    启动daemon服务:service docker start   相当于   systemctl start docker    相当于    systemctl start docker.service

     

    三、常用命令

    目前接触docker较少,后面遇到会陆续往里面添加:

    docker部署:
        centos7环境下:
            yum install -y docker
            systemctl start docker
            docker pull centos 获取镜像
            docker search 搜索镜像

    docker常用命令:
        docker images   查看docker镜像
        docker save centos > /opt/centos.tar.gz   导出一个镜像
        docker load < /opt/centos.tar.gz   导入一个镜像
        每个镜像都有一个唯一的image-id
        docker rmi [唯一的image-id]   删除一个docker镜像
        docker run --help       查看帮助

    docker创建并启动一个容器:
         docker run -d centos /bin/echo "hello webber"      centos为镜像的名称;-d选项 以后台方式运行容器
    docker ps -a    查看所有容器的运行状态
    docker start [容器id]     启动在ps -a中的一个停止的容器
    docker run --name mydocker -t -i centos /bin/bash      -t分配一个终端,-i让容器的标准IO保持打开
    docker attach [容器id]      进入容器中(不推荐)
    nsenter -t [容器中进程pid] -u -i -n -p    也可以进入容器中(推荐方式) (没有的话 yum install util-linux)
    注意:容器注重单进程的理念,我们应该尽量把每个进程分别封装在不同的容器中,这样才能体现出隔离的优势。

    docker inspect [容器id]     查看Docker的底层信息
    例如获取容器中进程的pid:
         docker inspect --format "{{.State.Pid}}" [容器id]
    docker rm [容器id]     删除一个容器 加 -f选项 可以删除一个正在运行的容器
    docker run --rm centos /bin/echo "hello"      当容器停止后自动删除容器,测试时常用
    docker kill $(docker ps -a -q)      杀死所有正在运行的容器

    docker网络相关:

          docker run -P 随机端口映射
              docker run -p hostPort:containPort
                  eg: docker run -d -p 81:80 nginx   把容器内部的80端口映射到宿主机上的81端口上。

          docker存储相关:   

             1.挂载数据卷  -v src:dst
                docker run -it -v /opt:/opt centos 物理机的/opt目录下的文件映射到容器的/opt目录中。
             2.数据卷容器   --volumes-from
                docker run -d --name nfs -v /data centos
                docker run -it --name test1 --volumes-from nfs centos nfs  把物理机和容器做了映射,之后,当我们创建了多个容器之后,多个容器可以同时去test1容器中去取数据,达到数据共享的目的。

  • 相关阅读:
    控件显示和隐藏
    删除标题和边框
    界面图片
    VC界面最前端显示
    在VC++6.0开发中实现全屏显示
    VC比例放大缩小
    plsql dev
    通过OCCI连接oracle(C++)
    VC++使用Pro*CC++
    文件对话框
  • 原文地址:https://www.cnblogs.com/webber1992/p/6377936.html
Copyright © 2011-2022 走看看