• Docker


    0、基础

    概念

    Docker是一个开源的容器引擎,基于LXC容器技术,使用Go语言开发。源代码托管在Github上,并遵从Apache2.0协议。

    Docker采用C/S架构,其可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。

    简单来说:Docker就是一种快速解决生产问题的一种技术手段。

    Docker 官网:http://www.docker.com

    Github Docker 源码:https://github.com/docker/docker

    Docker与虚拟机

    传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

    • docker启动快速属于秒级别。虚拟机通常需要几分钟去启动。
    • docker需要的资源更少,docker在操作系统级别进行虚拟化,docker容器和内核交互,几乎没有性能损耗,性能优于通过Hypervisor层与内核层的虚拟化。
    • docker更轻量,docker的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker运行的镜像数远多于虚拟机数量。对系统的利用率非常高。
    • 与虚拟机相比,docker隔离性更弱,docker属于进程之间的隔离,虚拟机可实现系统级别隔离
    • 安全性: docker的安全性也更弱。Docker的租户root和宿主机root等同,一旦容器内的用户从普通用户权限提升为root权限,它就直接具备了宿主机的root权限,进而可进行无限制的操作。虚拟机租户root权限和宿主机的root虚拟机权限是分离的,并且虚拟机利用如Intel的VT-d和VT-x的ring-1硬件隔离技术,这种隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击。
    • 可管理性:docker的集中化管理工具还不算成熟。各种虚拟化技术都有成熟的管理工具,例如VMware vCenter提供完备的虚拟机管理能力。
    • 高可用和可恢复性:docker对业务的高可用支持是通过快速重新部署实现的。虚拟化具备负载均衡,高可用,容错,迁移和数据保护等经过生产实践检验的成熟保障机制,VMware可承诺虚拟机99.999%高可用,保证业务连续性。
    • 快速创建、删除:虚拟化创建是分钟级别的,Docker容器创建是秒级别的,Docker的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间。
    • 交付、部署:虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化;Docker在Dockerfile中记录了容器构建过程,可在集群中实现快速分发和快速部署;

      

          virtualization 虚拟机结构

          docker结构

    优缺点

    更高效的利用系统资源

    由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

    更快速的启动时间

    传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

    一致的运行环境

    开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。

    持续交付和部署

    对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

    使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。

    而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

    更轻松的迁移

    由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

    更轻松的维护和扩展

    Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

    对比传统虚拟机总结

    特性容器虚拟机
    启动 秒级 分钟级
    硬盘使用 一般为 MB 一般为 GB
    性能 接近原生 弱于
    系统支持量 单机支持上千个容器 一般几十个

    缺点:

    • 依赖操作系统
    • 高度依赖网络
    • 银行U盾等场景不能用

    docker三大基本组件:镜像、容器、仓库

    镜像:镜像是构建 Docker 的基石。用户基于镜像来运行自己的容器。镜像也是 Docker 生命周 期中的“构建”部分。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

    镜像只是一个虚拟的概念,并不是非得由一个一个的文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

    镜像构建时,会一层层构建,前一层是后一层的基础,采用分层存储的方式。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

    容器:镜像Image和容器Container的关系,就像是面向对象程序设计中的  和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

    容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

    镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在镜像基础上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为 容器存储层。

    容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

    按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

    仓库:Docker Registry,镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个 仓库Repository);每个仓库可以包含多个 标签Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

     Ubuntu 镜像 为例ubuntu 是仓库的名字,其内包含有不同的版本标签,如16.0418.04我们可以通过 ubuntu:16.04或者 ubuntu:18.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest

    仓库名经常以 两段式路径  形式出现,比如 jwilder/nginx-proxy前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。

    • Docker Registry 公开服务,是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 CoreOS 的 Quay.io,CoreOS 相关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像使用的就是这个服务。由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务Registry Mirror),这些镜像服务被称为加速器。常见的有 阿里云加速器、DaoCloud 加速器 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库 等。
    • 私有 Docker Registry除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 Docker Trusted Registry 中,提供了这些高级功能。除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,Harbor 和 Sonatype Nexus。

    一、基础使用

    官网软件源配置 : https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#upgrade-docker-after-using-the-convenience-script

    国内软件源配置 https://blog.csdn.net/weixin_32820767/article/details/83820505

    cd /etc/apt/
    mv sources.list sources.list.bak
    vim sources.list
    # sohu shangdong
    deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
    
    # 163 guangdong
    deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
    
    # tsinghua.edu
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
    
    # aliyun
    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse partner
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    
    # neu.edu
    deb http://mirror.neu.edu.cn/ubuntu/ xenial main restricted universe multiverse partner
    deb http://mirror.neu.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
    deb http://mirror.neu.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
    deb http://mirror.neu.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
    
    安装依赖软件
    apt-get update
    apt-get install apt-transport-https ca-certificates curl software-properties-common -y
    使用官方推荐源
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    
    使用阿里云的源{推荐1}
    curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    
    使用清华的源{推荐2}
    curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    add-apt-repository "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    
    检查
    apt-get update
    国内软件源

    docker软件安装

    apt-cache madison docker-ce  # 查看支持的docker版本

    apt-get install docker-ce -y    # 安装docker

    apt-get install docker-ce=<VERSION> -y    # 可指定版本安装dockerapt-get install docker=5:18.09.0~3-0~ubuntu-xenial -y

    启动docker

    systemctl start docker

    systemctl status docker

    注意:ubuntu安装完毕后,默认就开启服务了

    docker version      # 测试docker

     

    网卡区别:

    安装前:只有ens33和lo网卡

    安装后:docker启动后,多出来了docker0网卡,网卡地址172.17.0.1

    docker服务命令格式:

    systemctl [参数] docker    参数详解:start 开启服务  stop 关闭  restart 重启  status 状态

    删除docker命令:

    apt-get autoremove remove docker-ce    # 自动删除

    # 单个手动删除

    rm -rf /var/lib/docker/     

    rm -rf /etc/docker 

    基本目录

     /etc/docker/     docker的认证目录

     /var/lib/docker/     docker的应用目录

    docker加速器

     加速器简介 在国内使用docker的官方镜像源,会因为网络的原因,造成无法下载,或者一直处于超时。所以我们使用 daocloud 的方法进行加速配置。

     访问 daocloud.io 网站,登录 daocloud 账户 

    终端执行命令 & 修改配置项

    二、镜像管理

    搜索镜像

    命令格式:

    docker search [image_name]

    命令演示:

    docker search ubuntu

     

    获取镜像

    命令格式:

    docker pull [image_name]  或者  docker image pull [image_name]

    命令演示:

    docker pull Ubuntu  或者  docker image pull nginx

    获取的镜像在  /var/lib/docker 目录下,具体详见docker仓库知识

    查看镜像

    命令格式:

    docker images <image_name>  或者  docker image ls <image_name>

    命令演示:

    docker images 

    docker images -a    列出所有的本地的images(包括已删除的镜像记录)

    镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。TAG信息来区分不同发行版本,如果不指定具体标记,默认使用latest标记信息

    查看镜像历史

    命令格式:

    docker history [image_name]

    我们获取到一个镜像,想知道他默认启动了哪些命令或者都封装了哪些系统层,那么我们可以使用docker history这条命令来获取我们想要的信息

    镜像重命名 : 同一个镜像(id相同),相当于给镜像多添加一个引用

    命令格式:

    docker tag [old_image]:[old_version] [new_image]:[new_version]

    命令演示:

    docker tag nginx:latest sswang-nginx:v1.0

     

    删除镜像

    命令格式:

    docker rmi [image_id/image_name:image_version]  或者  docker image rm [image_id/image_name:image_version]

    命令演示:

    docker rmi 3fa822599e10

    注意:如果一个image_id存在多个名称,那么应该使用 name:tag 的格式删除镜像

    docker image prune    # 清除状态为dangling的镜像

    docker image prune -a      # 移除所有未被使用的镜像

    docker image prune -a --filter "until=24h"    # 删除在24h之前安装的镜像

    导出镜像  :  将已经下载好的镜像,导出到本地,以备后用。

    命令格式:

    docker save -o [新包文件名] [镜像]

    docker save [镜像1] ... [镜像n] > [包文件名]

    或者

    docker image save –o [新包文件] [镜像1] ... [镜像n]

    docker image save [镜像1] ... [镜像n] > [包文件]

    注意:docker save 会保存镜像的所有历史记录和元数据信息

    导出镜像

    docker save -o nginx.tar sswang-nginx

     

    导入镜像

    命令格式:

    docker load < [image.tar_name]

    docker load --input [image.tar_name]

    注意: docker load 不能指定镜像的名称

    导入镜像文件

    docker load < nginx.tar

    三、容器管理 依靠一个镜像创建一个容器  --->  启动容器  --->  执行命令

    查看容器

    命令格式docker ps   或者   docker container ls

    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES      # docker ps

    注意:

    管理docker容器可以通过名称,也可以通过ID,同一个镜像可运行成多个容器

    ps是显示正在运行的容器, -a是显示所有运行过的容器,包括已经不运行的容器

    启动容器

    守护进程方式启动容器

    命令格式docker run <参数,可选> [docker_image] [执行的命令]  或者    docker container run <参数,可选> [docker_image] [执行的命令]

     docker run -d nginx    # 让Docker容器在后台以守护形式运行。此时可以通过添加-d参数来实现

    启动已终止的容器  :  在生产过程中,常常会出现运行和不运行的容器,我们使用 start 命令开起一个已关闭的容器

    命令格式docker start [container_id]    或者   docker container start [container_id]

    关闭容器 : 在生产中,我们会以为临时情况,要关闭某些容器,我们使用 stop 命令来关闭某个容器

    命令格式docker stop|stop|restart [container_id]        或者    docker container stop|stop|restart [container_id]

    关闭容器id  docker stop 8005c40a1d16

     

    删除容器

    删除容器有两种方法:

    正常删除 -- 删除已关闭的

    强制删除 -- 删除正在运行的

     

    正常删除容器

    命令格式: docker rm [container_id]              docker container rm [container_id]

    删除所有已停止的容器: docker container prune

    删除已关闭的容器,命令演示

    docker rm 1a5f6a0c9443

    强制删除运行容器

    命令格式:docker rm -f [container_id]

    删除正在运行的容器

    docker rm -f 8005c40a1d16

    删除部分容器

    docker container prune --filter "until=24h"

    批量关闭容器

    命令格式:  docker rm -f $(docker ps -a -q)    # -a : 所有容器    -q : 所有容器的id     

    创建并进入容器

    命令格式:docker run --name [container_name] -it [docker_image] /bin/bash

            docker container run --name [container_name] -it [docker_image] /bin/bash

    命令演示:

    docker run -it --name sswang-nginx nginx /bin/bash

    root@7c5a24a68f96:/# echo "hello world"  # 在docker中的Ubuntu终端输出信息

    hello world

    root@7c5a24a68f96:/# exit    # 退出docker中的Ubuntu终端

    exit        

     

    docker 容器启动命令参数详解:

    --name:给容器定义一个名称

    -i : 则让容器的标准输入保持打开。

    -t : 让docker分配一个伪终端,并绑定到容器的标准输入上

    /bin/bash : 终端即是一个程序,执行一个终端程序

    退出容器:

    方法一exit

    方法二Ctrl + D

    手工方式进入容器

    命令格式:

    docker exec -it 容器id /bin/bash  或者  docker container exec -it 容器id /bin/bash

    效果演示:

    docker exec -it d74fff341687 /bin/bash

    基于容器创建镜像

    命令格式:

    docker commit -m "改动信息" -a "作者信息" [container_id] [new_image:tag]

    或者

    docker container commit -m "改动信息" -a "作者信息" [container_id] [new_image:tag]

    命令演示:

    进入一个容器,创建文件后并退出

    ./docker_in.sh d74fff341687

    mkdir /sswang

    exit

    创建一个镜像

    docker commit -m 'mkdir /sswang' -a "sswang" d74fff341687 sswang-nginx:v0.2

    查看镜像

    docker images

    启动一个容器

    docker run -itd sswang-nginx:v0.2 /bin/bash

    进入容器进行查看

    docker container exec -it  ae63ab299a84 /bin/bash

    ls

     

    查看容器运行日志

    命令格式:  docker logs [容器id]  或者  docker container logs [容器id]

    命令效果:  docker logs 7c5a24a68f96

    查看容器详细信息

    命令格式:  docker inspect [容器id]  或者  docker container inspect [容器id]

    命令效果:  docker inspect 930f29ccdf8a    # 查看容器全部信息

     

    查看容器网络信息

    docker container  inspect -f '{{.NetworkSettings.IPAddress}}' 759942f45646  # {{ }} 模板语言,用此命令得到的是一个json格式数据

    dockers  image inspect  镜像名:tag          # 查看镜像的-m信息

     

    四、仓库管理

    Docker的仓库有三大类:

    公有仓库:Docker hub、Docker cloud、

     私有仓库:registry、harbor

    本地仓库:在当前主机存储镜像的地方。

     

    相关命令

    和仓库相关的命令:

    docker login [仓库名称]

    docker pull [镜像名称]

    docker push [镜像名称]

    docker search [镜像名称]

    registry私有仓库部署

    创建仓库流程

    1、根据registry镜像创建容器

    2、配置仓库权限

    3、提交镜像到私有仓库

    4、测试

    实施方案

     docker pull registry            # 下载registry镜像

     docker run -d -p 5000:5000 registry   # 启动仓库容器, -p 宿主机端口:容器端口  端口映射,访问registry时可以使用 192.168.137.128:5000|127.0.0.1:5000|172.17.0.2:5000

     curl 127.0.0.1:5000/v2/_catalog       # 检查容器效果

     vim /etc/docker/daemon.json       # 配置容器权限

     {"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": ["192.168.8.14:5000"]}

    注意:私有仓库的ip地址是宿主机的ip,而且ip两侧有双引号

    重启docker服务

     systemctl restart docker

     systemctl status docker

     效果查看

    docker start 315b5422c699    # 启动容器

     docker tag ubuntu-mini 192.168.8.14:5000/ubuntu-14.04-mini    # 标记镜像,需要将push镜像重命名   私有仓库ip/镜像名

     docker push 192.168.8.14:5000/ubuntu-14.04-mini          # 提交镜像

     docker pull 192.168.8.14:5000/ubuntu-14.04-mini          # 下载镜像

    五、数据管理: 将宿主机目录映射到仓库容器目录中,此时就算删除容器,容器内保存的镜像也不会被删除

    数据卷实践 之 目录

    命令格式:  docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称]   # 注意宿主机目录&容器目录都是绝对路径

    命令演示:

    echo "file1" > /tmp/file1.txt      # 创建测试文件

    docker run -itd --name test1 -v /tmp:/test1 nginx    # 启动一个容器,挂载数据卷,宿主机中的目录必须存在

    测试效果

    ~# docker exec -it a53c61c77 /bin/bash

    root@a53c61c77bde:/# cat /test1/file1.txt

    file1

    数据卷实践 之 文件

    命令格式:  docker run -itd --name [容器名字] -v [宿主机文件]:[容器文件] [镜像名称]   # 注意宿主机目录&容器目录都是绝对路径

    注意:容器里面的文件虽然可以改名,但类型必须和宿主机文件一致

    命令演示: 

     echo "file1" > /tmp/file1.txt      # 创建测试文件

    docker run -itd --name test2 -v /tmp/file1.txt:/nihao/nihao.sh nginx    # 启动一个容器,挂载数据卷 

    测试效果

    ~# docker exec -it 84c37743 /bin/bash

     root@84c37743d339:/# cat /nihao/nihao.sh

     file1

     

    数据卷实践 之 删除

     docker volume rm

     docker volume prune

    数据卷容器 

    将宿主机的某个目录,使用容器的方式来表示,然后其他的应用容器将数据保存在这个容器中,达到大批量应用数据同时存储的目的

    docker 数据卷命令详解

    # docker run --help 

      -v, --volumes-from value       Mount volumes from the specified container(s) (default [])    #   从指定的容器挂载卷,默认为空

                   

    数据卷容器操作流程

    1、创建数据卷容器 

    2、其他容器挂载数据卷容器

    注意:数据卷容器不启动

    数据卷容器实践

    创建一个数据卷容器

    命令格式:

    docker create -v [宿主机数据卷目录]:[容器数据卷目录] --name [容器名字] [镜像名称

    docker create -v [宿主机数据卷目录]:[容器数据卷目录]  -v [宿主机数据卷目录]:[容器数据卷目录]  --name [容器名字] [镜像名称

    执行效果:

    docker create -v /data --name v-test nginx    # 数据卷容器无需启动运行,创建即可不用run

    创建两个容器,同时挂载数据卷容器

    命令格式:

    docker run --volumes-from [数据卷容器id/name] -tid --name [容器名字] [镜像名称

    执行效果:

    docker run --volumes-from 4693558c49e8 -tid --name vc-test1 nginx /bin/bash    # 创建 vc-test1 容器

    docker run --volumes-from 4693558c49e8 -tid --name vc-test2 nginx /bin/bash    # 创建 vc-test2 容器

    确认卷容器共享

    进入vc-test1,操作数据卷容器

    ~# docker exec -it vc-test1 /bin/bash

    root@c408f4f14786:/# ls /data/

    root@c408f4f14786:/# echo 'v-test1' > /data/v-test1.txt

    root@c408f4f14786:/# exit

     

    进入vc-test2,确认数据卷

     ~# docker exec -it vc-test2 /bin/bash

     root@7448eee82ab0:/# ls /data/

     v-test1.txt

     root@7448eee82ab0:/# echo 'v-test2' > /data/v-test2.txt

     root@7448eee82ab0:/# exit

     

    回到vc-test1进行验证

     ~# docker exec -it vc-test1 /bin/bash

     root@c408f4f14786:/# ls /data/

     v-test1.txt  v-test2.txt

     root@c408f4f14786:/# cat /data/v-test2.txt

     v-test2

     

    回到宿主机查看/data/目录

     ~# ls /data/

    结果证明:容器间可以共享数据卷里容器,不过数据是保存在数据卷内,并没有保存到宿主机的文件目录中

    六、网络管理 

    端口映射 : 默认情况下,容器和宿主机之间网络是隔离的,可以通过端口映射的方式,将容器中的端口映射到宿主机的某个端口上。这样就可以通过宿主机的 ip+port 的方式来访问容器里的内容

    端口映射种类

    1、随机映射 -P(大写)

    2、指定映射  -p 宿主机端口:容器端口

    注意:生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突,因为涉及到映射,不管哪种映射都会影响性能

    随机映射实践

    命令格式:  docker run -d -P [镜像名称]

    命令效果:  docker run -d -P nginx    # 启动一个 nginx 镜像

    注意:宿主机的32768端口会被映射到容器的80端口,浏览器输入的格式是: docker容器宿主机的ip:容器映射的端口

    -P 自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动随机选择,但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号+1

    指定主机随机映射

    命令格式 :   docker run -d -p [宿主机ip]::[容器端口] --name [容器名称] [镜像名称]

    命令效果 :   docker run -d -p 192.168.8.14::80 --name nginx-2 nginx

    指定映射实践

    命令格式:  docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字] [镜像名称]

    注意:如果不指定宿主机ip的话,默认使用 0.0.0.0,容器端口必须清楚,而且必须写出来

    命令实践:  docker run -d -p 192.168.8.14:1199:80 --name nginx-1 nginx    #  启动容器时,给容器指定一个访问的端口 9999

           docker inspect --format='{{.NetworkSettings.IPAddress}}' 03d6893d32d5  # 查看新容器ip

    多端口映射方法

    命令格式 :   docker run -d -p [宿主机端口1]:[容器端口1]  -p [宿主机端口2]:[容器端口2] --name [容器名称] [镜像名称]

             docker run -d -p 520:443 -p 6666:80 --name nginx-3 nginx    # 开起多端口映射实践

    七、Dockerfile

    Dockerfile类似于学习过的脚本,将我们在上面学到的docker镜像,使用自动化的方式实现出来。dockerfile本质是docker的脚本文件

    Dockerfile 使用准则

    1、大: 首字母必须大写D,创建一个名为 Dockerfile 的文件(固定写法),文件内进行相应配置

    2、空: 尽量将Dockerfile放在空目录中。

    3、单: 每个容器尽量只有一个功能。

    4、少: 执行的命令越少越好。

     

    Dockerfile 基础四指令:

    基础镜像信息 从哪来?

    维护者信息 我是谁?

    镜像操作指令 怎么干?

    容器启动时执行指令 嗨!!!

     

    Dockerfile 使用命令:

    构建镜像命令格式:

    docker build -t [镜像名]:[版本号] [Dockerfile所在目录]

    构建样例:  docker build -t nginx:v0.2 /opt/dockerfile/nginx/

    参数详解:  -t 指定构建后的镜像信息,   /opt/dockerfile/nginx/ 则代表Dockerfile文件存放位置,如果是当前目录,则用 .(点)表示

    准备环境

    mkdir /home/python/Desktop/docker    # 创建Dockerfile专用目录

    cd  /home/python/Desktop/docker

    ssh-keygen -t rsa             #创建秘钥认证

    cat ~/.ssh/id_rsa.pub > authorized_keys

    cp /etc/apt/sources.list ./    # 准备软件源,略过

    定制文件

     /home/python/Desktop/docker 目录下创建Dockerfile文件

    # 构建一个基于ubuntu的ssh定制镜像
    
    FROM ubuntu   # 基础镜像
    
    MAINTAINER President.Wei 000000@qq.com    # 镜像作者
    
    
    ADD sources.list /etc/apt/sources.list    # 增加软件源 
    
    # 安装 ssh 服务
    
    RUN apt-get update && apt-get install -y openssh-server curl vim net-tools && mkdir -p /var/run/sshd && mkdir -p /root/.ssh && sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd && apt-get autoclean && apt-get clean && apt-get autoremove
    
    # 复制配置文件到相应位置,并赋予脚本可执行权限
    ADD authorized_keys /root/.ssh/authorized_keys
    
     
    EXPOSE 22    # 对外端口
    
    
    ENTRYPOINT ["/usr/sbin/sshd","-D"]    # 启动ssh
    Dockerfile

    构建镜像 :  docker build -t ubuntu-ssh .

    效果查看 :  docker run -d -p 10086:22 ubuntu-ssh  # 使用新镜像启动一个容器,查看效果

     

    容器检查 

    docker ps

    docker port c03d146b64d4

    ssh查看效果 :  ssh 192.168.8.14

    注意: 若出现sign_and_send_pubkey: signing failed: agent refused operation” 报错

    执行代码解决:

    eval "$(ssh-agent -s)"

    ssh-add

     

     

     

    Dockerfile 基础指令详解

    FROM 

    格式:

    FROM <image>

    FROM <image>:<tag>。

    解释:FROM Dockerfile 里的第一条而且只能是除了首行注释之外第一条指令

     

    MAINTAINER

    格式:MAINTAINER <name>

    解释:指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用 -a参数 指定的信息

    RUN

    格式:

    RUN <command> (shell模式)              RUN apt-get install python3

    RUN["executable", "param1", "param2"]。 (exec 模式) 

    解释:表示当前镜像构建时候运行的命令,exec模式的param是执行命令时的参数

    注释:

        shell 模式类似于  /bin/bash -c command   举例: RUN echo hello

       exec  模式类似于 RUN ["/bin/bash", "-c", "command"]    举例: RUN ["echo", "hello"]

    EXPOSE

    格式:    EXPOSE <port> [<port>...]

    解释:     设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加-p或者-P参数对容器的端口进行分配。

    ENTRYPOINT

    格式:

       ENTRYPOINT ["executable", "param1","param2"]  (exec 模式)

       ENTRYPOINT command param1 param2 (shell模式)

    解释: 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

    Dockerfile 文件编辑指令详解

    ADDCOPY相当于数据卷操作VOLUME相当于数据卷容器操作

    目录文件编辑指令

    ADD

    格式:

        ADD <src>... <dest>    ADD 宿主机文件路径 容器文件路径

        ADD ["<src>",... "<dest>"]

    解释:将指定的 <src> 文件复制到容器文件系统中的 <dest>  src 指的是宿主机,dest 指的是容器

    如果源文件是个压缩文件,则docker会自动解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)

     

    COPY

    格式:

        COPY <src>... <dest>

        COPY ["<src>",... "<dest>"]

    解释:

      单纯复制文件场景,Docker推荐使用COPY  

     

    VOLUME

    格式:  VOLUME ["/data"]

    解释:

       VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点

    通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。

    举例:      VOLUME ["/var/lib/tomcat7/webapps/"]

     

    Dockerfile环境设置指令

    ENV

    格式:

        ENV <key> <value>

        ENV <key>=<value> ...

    解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定

     

    WORKDIR

    格式:  WORKDIR /path/to/workdir (shell 模式)

    解释:

        切换目录,为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd

        可以多次切换(相当于cd命令),也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

    举例:

        WORKDIR /a

        WORKDIR b

        WORKDIR c

        RUN pwd

        则最终路径为 /a/b/c。

     

    Dockerfile构建过程

    从基础镜像1运行一个容器A

    遇到一条Dockerfile指令,都对容器A做一次修改操作

    执行完毕一条命令,提交生成一个新镜像2

    再基于新的镜像2运行一个容器B

    遇到一条Dockerfile指令,都对容器B做一次修改操作

    执行完毕一条命令,提交生成一个新镜像3

    构建过程镜像

    构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用去启动容器,通过查看容器效果,从侧面能看到我们每次构建的效果。

    通过docker history <镜像名> 可以查看整个构建过程所产生的镜像 

    构建缓存

    我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。即:之后的每一次构建镜像时,如果发现之前曾经构建过,那么就直接使用原本的

    构建镜像时禁用缓存:docker build --no-cache -t [镜像名]:[镜像版本] [Dockerfile位置]

    只要构建的缓存时间不变,那么就用缓存,如果时间一旦改变,就不用缓存了

     

    构建历史:

    docker history  # 查看构建详细过程

       

    清理构建缓存:

    docker system prune

    docker system prune --volumes  

     

  • 相关阅读:
    poj 1035 字符串匹配
    拓扑排序的小总结
    POJ1018
    POJ1328详细题解
    POJ1159题解报告
    POJ1088 (滑雪)
    树状树组区间修改,单点修改模板
    spfa模板
    树状树组离散化求逆序对模板
    POJ3723(最小生成树,负权)
  • 原文地址:https://www.cnblogs.com/hsmwlyl/p/10581903.html
Copyright © 2020-2023  润新知