Docker学习笔记 - 第一篇:初识

# 1 Docker课程预览

Docker学习笔记 - 第一篇:初识_第1张图片

1.1 Docker是什么

Docker是基于容器技术的轻量级虚拟化,是一个能够把开发的应用程序自动部署到容器的开源引擎。
Docker借鉴集装箱的概念,只不过集装箱用来运输货物,Docker运输软件,Docker并不关心:装的内容是什么、也不关心要运到何处。
Docker学习笔记 - 第一篇:初识_第2张图片

可以把环境平移迁到另一个环境中,不会因为环境发生改变而产品一些不可预知的问题,上图示例:Docker容器环境通过镜像方式从window平滑移动到linux

1.2 Docker有什么

    • Docker客户端和服务端
      客户端用来通过Docker守护进程,去访问Docker容器,Docker容器运行在 Docker主机上,也就是服务器上
    • Docker镜像

        镜像相当于容器的“源代码”,镜像类似于类,而容器类似于实例;镜像类似于Maven仓库管理的jar
    • Registry

        类似于Maven仓库,Docker公司提供的官方registry被称为Docker Hub
        仓库地址:https://hub.docker.com/
    • Docker 容器

        容器是镜像的运行时实例,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境。容器为镜像提供了一个标准的和隔离的运行环境。
      

    1.3 Docker架构图

    Docker学习笔记 - 第一篇:初识_第3张图片

    Docker machine:相当于docker的客户端
    镜像查找过程:先查找本地,本地找不到去公共仓库(dockers hub)找,后期可以配置成自己的私有仓库(private registry)    
    

    1.4 Docker能干什么

    1:加速本地开发和构建流程,使其更加高效、更加轻量化
    可以做自己的镜像,后期就不用再做任何配置就可以得到相同环境

    2:能让独立服务或应用程序在不同的环境中,得到相同的运行结果
    3:用Docker创建隔离的环境来测试
    4:Docker可以在开发者本机上构建复杂的环境,用来进行测试
    5:构建一个多用户的平台即服务(PaaS)的基础设施
    6:为开发、测试提供一个轻量级的独立沙盒环境
    7:提供软件即服务(SaaS)应用程序
    8:支持高性能、超大规模的宿主机部署

    1.5 Docker的技术概述

    Docker是基于容器技术的轻量级虚拟化,省去了传统虚拟化的hypervisor(运行于物理机和操作系统间的中间软件层)层,其虚拟化技术是基于内核的cgroup和namespace技术,处理逻辑与内核深度融合,所以其性能和物理机相近。
    LXC(linux内核容器技术):包括cgroup和namespace,进程沙盒等:
    1:Namespace:命名空间,主要做访问隔离。其原理是针对一类资源进行抽象,并将其封装在一起提供给一个容器使用,对于不同的容器有不同的抽象,彼此之间是不可见的,从而做到访问隔离。
    2:Cgroup:Control group的简称,称为控制组,主要做资源控制。其原理是将一组进程放进一个控制组中,通过给这个控制组分配指定的可用资源,达到控制这一组进程资源的目的
    通信上,Docker并不直接和内核交互,而是通过一个更底层的工具Libcontainer与内核交互,Libcontainer是真正意义上的容器引擎,而Docker本身侧重于处理更上层的业务。

    1.5.1 传统虚拟机结构与docker结构对:

    Docker没有GuestOS,处理逻辑与内核

    1.6 Docker的技术组件

    1:文件系统隔离:每个容器都有自己的root系统
    2:进程隔离:每个容器都运行在自己的进程环境中
    3:网络隔离:容器间的虚拟网络接口和IP地址都是分开的
    4:资源隔离和分组:使用cgroups,将cpu和内存之类的资源独立分配给每个docker容器
    5:写时复制:文件系统都是通过写时复制创建的,这意味着文件系统是分层的、快速的,且占用磁盘空间更小
    6:日志:容器会收集日志流并计入日志,用来进行日志分析和故障排查
    7:交互式shell:用户可以通过终端,使用交互式shell来与docker服务器交互

    1.7 Docker和传统虚拟机技术的不同

    1:虚拟机是利用硬件虚拟化技术,来实现对硬件资源进行划分,同时通过一个hypervisor来实现对资源的完全隔离;容器上操作系统级别的虚拟化,利用的时候内核的cgroup和namespace特性,完全通过软件实现。
    2:虚拟机会独占分配给自己的资源,各个虚拟机之间基本完全隔离,不存在资源共享,比较重量级;容器与主机共享操作系统内核,不同容器之间可以共享部分系统资源,因此相对更轻量级。
    3:在一台物理机上能启动的虚拟机很有限,而且启动通常都在十几秒以上;我们可以在一台服务器上启动成百上千Docker容器,启动时间通常在秒级

    1.8 Docker服务器安装要求

    官方推荐使用Ubuntu,要求是64位机器,Linux3.8以上内核。这里选用Centos7.x。
    在Centos7上安装Docker
        yum install -y epel-release
    yum install docker-io
    安装后的配置文件在:/etc/sysconfig/docker

    这是最简单的安装方式,学习足够用了,还有采用安装脚本的方式,这里就不去讲了,可以从官方文档获取, https://docs.docker.com/engin...

    1.9 Docker的基本使用

    1.9.1 基本命令

    • 启动Docker服务器
      service docker start
    • 查看帮助
      docker --help
      docker 命令 --help
    • 查看基本信息
      docker version:查看docker的版本号,包括客户端、服务端、依赖的Go等
      docker info:查看系统docker层面信息,包括管理的images, containers数等
      docker stats:查看容器状态信息
    • 操作镜像
      docker search :搜索镜像,在docker index中搜索image
      docker pull :下载镜像,从docker registry server中下拉image
      docker images:查看镜像,列出images
      docker images -a:列出所有的images(包含历史)
      docker rmi :删除一个或多个image

    1.9.2 操作容器

    1.9.2.1 使用镜像创建容器

    docker run -i -t
    docker run -i -t  /bin/bash:
        创建一个容器,运行其中的bash应用,退出后容器关闭
    docker run -it --name 容器名 --restart=always 
        --restart:设置在容器退出后自动重启容器,默认是no,就是不重启;always:无论容器的退出码是多少,都会自动启动容器;也可以设置成on-failure,这样只有退出码为非0时,才会自动重启。还可以指定重启次数,例如:--restart=on-failure:3
    docker run还可以如下常见参数:
        -d:表示在后台运行
        -v:挂载卷的映射
        -p :
            映射宿主机端口到容器,方便外部访问容器内服务,host_port可以省略,表示把 container_port 映射到一个动态端口。
        -P:
            自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动选择
    

    1.9.2.2 使用 -p 进行网络端口映射

    (1)-p 5000:5000,默认-p标识会绑定本地主机上的指定端口
    (2)可以指定绑定的网络地址,比如:
    -p 127.0.0.1:5001:5002

    (3)如果要绑定容器端口5002到宿主机动态端口,并且让localhost访问,如:

    127.0.0.1::5002

    (4)可以绑定UDP端口,在后面添加/udp,如:

    -p 127.0.0.1:5000:5000/udp

    (5)可以使用docker port快捷方式来绑定我们的端口,如:

    docker port 容器id 5000

    (6)-p可以使用多次,以配置多个端口

    1.9.2.3 docker run 和 docker create

    参数基本一样,run是创建容器并后台启动,create是只创建容器。docker run 相当于docker create 和 docker start。

    1.9.2.4 查看容器

    docker ps:列出当前所有正在运行的容器
    docker ps -l :列出最近一次启动的container
    docker ps -a :列出所有的container(包含历史,即运行过的container)
    

    1.9.2.5 容器启动、关闭和重启

    docker start/stop/restart  :启动/停止/重启容器

    1.9.2.6 进入正在运行的docker容器

    docker exec -it [container_id] /bin/bash
    docker attach [container_id]

    1.9.2.7 删除容器

    docker rm  :删除一个或多个container
    docker rm `docker ps -a -q` :删除所有的container
    docker ps -a -q | xargs docker rm:同上, 删除所有的容器

    1.9.2.8 查看容器的日志

    docker logs 容器id 
    docker logs –f 容器id,类似于 tail –f,要添加时间戳,可添加-t
    

    1.9.2.9 查看容器内运行的进程

    docker top 容器id

    1.9.2.10 查看容器内部细节

    docker inspect 容器id:获取更多的容器信息,包括名称、命令、网络配置等,主要有:
    id:image id
    parent:该layer的父层
    comment:每层提交的备注信息
    container:可以把容器保存成一个镜像,通常image的每个layer都保存自一个容器
    config:该image的一些配置信息
    
    也可用-f 也就是format来选定查看结果,如: docker inspect -f='{{.NetworkSettings.SandboxKey}}' 容器id,实际上,-f或者--format 支持完整的go语言模板
    

    你可能感兴趣的:(docker)