zoukankan      html  css  js  c++  java
  • 学习 Docker


    Docker简介

    一种虚拟容器技术。

    • 一种虚拟化分方案;
    • 操作系统级别的虚拟化;
    • 只能运行相同或相似内核的操作系统;
    • 依赖与linux内核特性:Namespace和Cgroups(Control Group)

    虚拟机技术和容器技术最大的区别就是对资源的占用。

    Docker目标

    • 提供简单轻量的建模方式
    • 职责的逻辑分离
    • 快速高效的开发生命周期
    • 鼓励使用面向服务的架构

    Docker使用场景

    • 使用Docker容器开发、测试、部署服务
    • 创建隔离的运行环境
    • 搭建测试环境
    • 构建多用户的平台即服务(PaaS)基础设施
    • 提供软件即服务(SaaS)应用程序
    • 高性能、超大规模的宿主机部署

    Docker的基本组成

    • Docker Client 客户端
    • Docker Daemon 守护进程
    • Docker Image 镜像
    • Docker Container 容器
    • Docker Registry 仓库

    Docker Client 客户端

    • C/S架构
    • 本地/远程调用

    Docker客户端向服务器端发出请求,也就是守护进程。守护进程处理完所有工作将结果返回给客户端。Docker客户端对服务器端的访问既可以在本地也可以在远程。

    客户端访问守护进程

    Docker Image 镜像

    • 容器的基石
    • 层叠的只读文件系统

    Docker镜像是容器的基石,保存了启动容器的条件,容器基于镜像启动和运行。 Docker镜像是一个层叠的只读文件系统,他的最底端是一个引导文件系统及bootfs。 Docker用户几乎永远都不会和引导文件系统有交互,实际上当一个容器启动后,bootfs会被移到内存中,引导文件将被卸载。

    Docker镜像的第二层是rootfs(root文件系统),位于引导文件系统之上,可以有多种操作系统。 在传统的linux系统中root文件系统最先会以只读的方式加载,当引导和启动完成后他才会被切换成读写模式。 但是在Docker里,root文件系统永远只能是只读,并且Docker会用联合加载系统在rootfs之上加载更多的只读文件系统。 联合加载只得是一次加载多个文件系统。但是在外面开来只有一个文件系统。联合加载会将各层文件系统加载到一起, 这样最终的文件系统会包含所有的文件及目录。Docker将这样的文件系统称为镜像。 一个镜像可以放到另一个镜像顶部,位于下面的镜像称为父镜像。以此类推,直到镜像栈的最底部。最底部的镜像称为基础镜像。 也就是bootfs文件系统。

    Docker Container 容器

    • 容器通过镜像来启动
    • 启动和执行阶段
    • 写时复制(copy on write)

    learn_docker_img_006

    一个容器中可以运行用户的一个或多个进程。当一个容器启动时,Docker会在镜像的最顶层增加一个读写文件系统,我们在Docker中运行的程序就是在这个层运行并执行的。第一次启动Docker时,读写层是空的,当文件发生变化后都会应用到这一层。比如修改一个文件,先将该文件从只读层复制到读写层,然后隐藏只读层,这就是Docker的写时复制。

    当创建一个容器时,Docker会创建一个镜像栈,在栈的最顶层增加读写层,这个读写层和下面的镜像层以及一些配置数据就构成了一个容器。 容器的这个特点及镜像分层,可以让我们快速的构建镜像,并运行包含我们自己的应用程序和服务的容器。

    Docker Registry 仓库

    • 共有
      • Docker Hub
    • 私有

    Docker用仓库来保存用户构建的镜像。

    learn_docker_img_002

    从上图可以看出,Docker客户端调用守护进程从而操作Docker的容器,而容器是通过镜像来创建的,而镜像又保存在仓库中。


    Docker容器的相关技术

    Docker依赖的Linux内核特性

    • Namespaces 命名空间
    • Control groups(cgroups)控制组

    Namespaces 命名空间

    • PID(Process ID) 进程隔离
    • NET(Network) 管理网络接口
    • IPC(Inter Process Communication) 管理跨进程通信的访问
    • MNT(Mount) 管理挂载点
    • UTS(Unix Timeshring System) 隔离内核和版本标识

    编程语言中命名空间实现封装,即代码隔离。 操作系统中命名空间实现系统资源的隔离,进程、网络、文件系统...

    各种隔离的资源时如何管理起来的,这就用到了Cgroups。

    Control groups(cgroups)控制组

    • 资源限制
    • 优先级设定
    • 资源计量
    • 资源控制

    Docker容器的能力

    • 文件系统隔离:每个容器都有自己的root文件系统
    • 进程隔离:每个容器都运行在自己的进程环境中
    • 网络隔离:容器间的虚拟网络接口和IP地址都是分开的
    • 资源隔离和分组:使用Cgroups将CPU和内存等资源独立分配给每个Docker容器

    在 Ubuntu 中安装 Docker

    安装前的检查

    • 内核版本

        $ uname -a
      
    • 检查Device Mapper

        $ ls -l /sys/class/misc/device-mapper
      

    Ubuntu中安装Docker的方式

    • 安装Ubuntu维护的版本

        $ sudo apt-get install -y docker.io
        $ source /etc/bash_completion.d/docker.io
      
    • 安装Docker维护的版本

      1. 检查APT对HTTPS的支持,查看/usr/lib/apt/methods/https文件是否存在。如果不存在,运行安装命令。

          $ apt-get update
          $ apt-get install -y apt-transport-https
        
      2. 添加Docker的APT仓库

          $ echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list
        
      3. 添加仓库的key

          $ apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
        
      4. 安装

          $ apt-get update
          $ apt-get install -y lxc-docker
        
    • 安装Docker维护的版本(简易步骤,使用Docker提供的sh脚本)

        $ sudo apt-get install -y curl
        $ curl -sSL https://get.docker.io/ubuntu/ | sudo sh
      

      启动docker若出现下面错误:

        FATA[0000] Error loading docker apparmor profile: fork/exec /sbin/apparmor_parser: no such file or directory ()
      

      请安装apparmor软件即可

        $ sudo apt-get install apparmor
      

    使用非root用户运行Docker

    一般安装完Docker运行时需要加sudo来操作,其实可以增加用户归属的用户组来实现不用root权限运行Docker。

    1. 添加名字为docker的用户组

       $ sudo groupadd docker
      
    2. 将当前用户添加到当前用户组中

        $ sudo gpasswd -a ${user} dokcer
      
    3. 重新启动docker服务

        $ sudo service docker restart
      

    针对当前用户不会立马生效,需要注销后重新登录以获取用户组权限。


    在 Windows 中安装 Docker

    使用虚拟机实现,守护进程在虚拟机中。

    learn_docker_img_003


    在 OS X 中安装 Docker

    learn_docker_img_004

    在OS X 上Docker的运行环境

    在OS X上安装Docker前我们先看一下Docker的运行要求.

    • Linux容器技术
    • 操作系统级别的虚拟化
    • 依赖于linux内核的Namespaces和Cgroups

    Boot2Docker

    OS X的内核是Unix,而且一般root用户苹果是不给用户的。所以要运行Docker在OS X上和在Windows上一样,需要借助虚拟机来实现。

    • 轻量级的Linux发行版,为Docker定制
    • Virtualbox VM
    • Docker客户端
    • 管理工具

    安装前的检查

    • 系统要求:OS X 10.6 "Snow Leopard"以上版本

    安装步骤

    • 访问github上的Boot2Docker

        https://github.com/boot2docker/boot2docker
      
    • 下载Boot2Docker-1.7.0.pkg
    • 安装Boot2Docker-1.7.0.pkg

    Boot2Docker的启动过程

    • 打开命令行窗口
    • 创建 $HOME/.boot2docker/目录
    • 创建VirtualBox ISO
    • 启动虚拟机并运行Docker守护进程

    Boot2Docker的启动命令

    • $ mkdir -p ~/.boot2docker
    • $ if [ ! -f ~/.boot2docker/boot2docker.iso ]; then cp /usr/local/share/boot2docker/boot2docker.iso ~/.boot2docker/ ; fi
    • $ /usr/local/bin/boot2docker init
    • $ /usr/local/bin/boot2docker up
    • $ /usr/local/bin/boot2docker shellinit
    • $ docker version

    learn_docker_img_005

    验证Boot2Docker及Docker安装成功

    • 运行命令 $ docker run ubuntu echo hello world 如果打印如下日志,说明安装成功

        bash-3.2$ docker run ubuntu echo hello world
        Unable to find image 'ubuntu:latest' locally
        latest: Pulling from ubuntu
        428b411c28f0: Pull complete 
        435050075b3f: Pull complete 
        9fd3c8c9af32: Pull complete 
        6d4946999d4f: Already exists 
        ubuntu:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
        Digest: sha256:45e42b43f2ff4850dcf52960ee89c21cda79ec657302d36faaaa07d880215dd9
        Status: Downloaded newer image for ubuntu:latest
        hello world
        bash-3.2$ 

    参考:

    mac安装docker指南: http://docs.docker.com/installation/mac/#command-line-docker-with-boot2docker

    极客学院视频: http://www.jikexueyuan.com/path/docker/

    doker入门指南: http://my.oschina.net/dlpinghailinfeng/blog/384803

    pdf文件下载地址: http://pan.baidu.com/s/1c1corG8

  • 相关阅读:
    URAL 1998 The old Padawan 二分
    URAL 1997 Those are not the droids you're looking for 二分图最大匹配
    URAL 1995 Illegal spices 贪心构造
    URAL 1993 This cheeseburger you don't need 模拟题
    URAL 1992 CVS
    URAL 1991 The battle near the swamp 水题
    Codeforces Beta Round #92 (Div. 1 Only) A. Prime Permutation 暴力
    Codeforces Beta Round #7 D. Palindrome Degree hash
    Codeforces Beta Round #7 C. Line Exgcd
    Codeforces Beta Round #7 B. Memory Manager 模拟题
  • 原文地址:https://www.cnblogs.com/qyf404/p/4620397.html
Copyright © 2011-2022 走看看