Docker

1 概述

  • Go语言编写的开源的应用容器引擎,是容器技术的代表;可移植;采用沙箱机制-线程资源隔离;将应用及依赖打包到该容器中,便可发布到任何Linux服务器上,可实现虚拟化

  • 口号1:build创建,ship运输,run运行;口号2:build once,run anywhere创建一次,到处运行

  • 类比解释:

    • Docker容器为口袋;放入文件并系封口袋(只读)的过程为创建镜像build

    • 仓库docker hub,用于存放各式各样的口袋;口袋的复制并获取自用,为镜像运输ship;源口袋中的文件统称镜像文件,复制出的口袋成为容器;一个镜像可复制任意个容器

    • 解开口袋(可写)并运行里面的软件文件,为run

    • 整个过程谁都可操作,可移植,不必关心底层实现;Docker将任何应用程序及其依赖打包成轻量级、可移植、自给自足的标准化容器Container(集装箱)

    • 快:运行时性能极大提升,管理操作(启动,停止,开始,重启等)常达到秒或毫秒级

    • 成本低:占用硬件资源少

    • 资源隔离,安全性高:利用Llinux kernel的资源分配机制CGroup和核心命名空间namespace技术进行资源隔离,容器中的环境和主机运行环境互不干扰,容器崩溃不影响主机

    • 版本控制:Docker通过镜像文件进行分发,每个镜像文件可标注自己的tag来辨别版本

    • 环境统一:统一各种运行时环境、运行时库、各种构建工具、软件版本等

    • 获取便利:镜像仓库包含众多镜像文件,拉取方便(不过国内一般不连接docker hub镜像源)

  • 对比虚拟机:

    • 服务器演变过程:

    • 物理机时代:部署慢,每台服务器都要安装操作系统,配置应用所需环境;资源浪费,硬件利用率低;物理服务器成本高,价格贵;扩展和迁移笨拙,需重新复刻整套环境

      • 虚拟机时代:解决物理机服务器的缺点;但每个VM都需要安装操作系统

      • 容器时代:解决虚拟机服务器的缺点

    特性虚拟机容器
    隔离级别操作系统级别进程级别
    隔离策略HypervisorCGroups
    系统资源5-15%0-5%
    启动时间分钟级秒级
    镜像存储GB-TBKB-MB
    集群规模;上百上万
    高可用策略备份、容灾、迁移弹性、负载、动态
    • 容器是应用层抽象,用于将代码和依赖资源打包为一体;多个容器可运行在一个机器上,共享操作系统内核,而又在各自独立的进程中运行

    • VM是物理硬件层抽象,用于将一台服务器变成多态服务器;管理程序运行多个VM在一台机器上,每个VM都包含整套操作系统和应用


2 安装

  • 构成:

    • 镜像image:模板;以该模板创建N个容器服务,来提供服务;如tomcat镜像 ==》 run ==》 tomcat1-N个容器

    • 容器container:容器技术运行和管理由镜像创建的N个容器,包括容器的启动,停止,删除等

    • 仓库repository:存放镜像

  • 环境:Linux服务器并且能连接和登录;命令cat /etc/os-release可以查看环境信息和配置

  • 安装文档参考:在Linux服务器上跟着官网文档:Docker Documentation | Docker Documentation步骤及其命令操作

    • 卸载旧版本 ==》 选择合适的安装方式 ==》 设置镜像仓库(最好选用国内的镜像仓库) ==》 下载Docker引擎(推荐ce社区版;可选择指定版本进行安装或更行) ==》 启动Docker(docker version检查是否安装成功;run运行hello-world镜像) ==》 查看镜像 ==》 卸载

    • 可选:阿里云镜像加速:登录阿里云网站,找到镜像加速器,根据文档配置使用

  • 可视化工具:portainer、Rancher


3 原理与使用

  • run运行镜像:Docker在本机寻找镜像,无则从设置的镜像仓库pull;pull失败则报错,成功则启动运行

  • Docker:传统CS(Client-Server)结构系统,基于Socket从客户端访问服务器

  • Docker镜像加载原理:镜像由联合文件系统UnionFS组成;RootFS信息可看到所有的层(在pull时显示的进度,每一行就是在pull一层,显示Already exists的说明已经存在,可以公用)

  • Docker命令:命令帮助文档参考官方:https://docs.docker.com/engine/reference强迫自己查看英文文档!!!列举几个重要命令:

    • 镜像命令:参考:https://docs.docker.com/engine/reference/images

      • docker image --help

      • docker images:查看本地存在的镜像,包括:REPOSITORY镜像的仓库源,TAG镜像标签,IMAGE ID镜像ID,CREATED创建时间,SIZE大小;命令可选项:-a查看所有,-q只显示IMAGE ID

      • docker search 镜像名:搜索仓库中的镜像,如docker search mysql;可选项:--filter按照条件搜索

      • docker pull 镜像名:[TAG]:下载镜像;可选项:tag指定下载版本(官网可查的支持的版本),否则默认latest最新版;下载采用分层下载(查询到存在的层,因为公用而不必重复下载),联合文件系统

      • docker rmi []:通过镜像名或ID删除镜像,指定列表批量删除;-f强制删除

    • 容器命令:

      • docker run --help:--name容器名,-d后台方式运行(启动后如果没有前台进程,docker认为没有服务,ps查看到此容器已关闭),-it交互方式运行(可进入容器内查看可操作即前台进程),-p对外暴露指定端口如3305:3306即容器中MySQL的3306映射到本地的3305;-e环境配置如配置MySQL启动密码;其他

      • docker run 镜像名:创建并启动容器;如docker run -it mysql /bin/bash,创建容器并启动后进入容器的bin目录;exit停止容器并退出;快捷键ctrl+p+q仅退出容器

      • docker ps:在运行的容器列表;-a列出所有容器,-n=?最近创建的容器,-q只显示容器编号

      • docker rm 容器ID:删除未运行的容器;docker rm -f $(docker ps -aq)强制删除所有查询到的容器

      • docker start/restart/stop/kill 容器ID:启停

      • docker exec -it 容器ID:进入在运行的容器,开启了新的终端,所以可进行操作;docker attach 容器ID:进入容器但还是原来的终端

    • 其他:

      • docker logs [--help]:

      • docker top 容器ID:容器内进程信息

      • docker inspect 容器ID:容器元数据详细信息;包括RootFS信息

      • 其他常用操作命令,如docker cp复制

      • docker commit:提交容器使之成为一个新个副本;docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名: [TAG]


4 容器数据卷

  • 应用和环境被打包成镜像,而如果数据也存在于容器中,删除容器时数据丢失;所以数据需要持久化,容器之间需要有数据共享技术,将容器中产生的数据,同步到本地,即卷技术,目录的挂载,将容器内目录挂载到Linux上指定路径下,建立映射关系;数据会双向绑定,即使容器停止,挂载卷中修改后,将容器启动也会查看到数据变化;所以各种操作如配置文件,都可以在本地修改而不必进入容器

  • 数据券容器:将挂载卷设置到另一个容器上,实现这两个容器的数据共享/备份

  • 命令方式挂载:docker run -it --name 卷名 -v 主机目录:容器内目录;ocker inspect 容器ID命令的Mounts信息下可看到挂载信息如挂载目录;可再接:ro设置只读,:rw读写权限

  • 匿名挂载:省略主机目录的指定;指定了目录则为具名挂载;所有匿名挂载的卷都可在/var/lib/docker/volumes下可查看

  • docker volume ls:查看所有卷;docker volume inspect 卷名


5 DockerFile

  • DockerFile:用来构建docker镜像的构建文件,如生成自定义镜像并进行卷挂载,是一组命令脚本;一条命令对应镜像的一层

  • 构建步骤:

    • 编写文件:使用Dockerfile命令;

      • FROM 基础镜像名(DockerHub中常见镜像,使用的基础进项一般都是FROM scratch)

      • MAINTAINER:作者

      • RUN:镜像构建时需要运行的命令

      • ADD:需要添加的资源,如Tomcat(提供压缩包,会自动解压)

      • WORKDIR:镜像的工作目录

      • VOLUME:挂载目录

      • EXPORS:暴露端口

      • CMD:容器启动时需要运行的命令;多个CMD只有最后一个生效

      • ENTRYPOINT:容器启动时需要运行的命令;多个命令则命令追加,如先写了ls -a命令,再写一个l,最终命令为ls -al

      • ONBUILD:

      • COPY:类似ADD,将文件复制到镜像中

      • ENV:设置环境变量

        # 改版centos镜像,官方centos镜像构建文件可百度
        FROM centos
        MAINTAINER userName<abc.@qq.com>
        ENV MYPATH /usr/local
        WORKDIR $MYPATH
        RUN yum -y install vim
        RUN yum -y install net-tools
        EXPOSE 80
        CMD echo $MYPATH    # 打印信息
        CMD echo "===end==="
        CMD /bin/bash
        ​
        # 自定义tomcat镜像
        ...
        ADD jdk-....x64.tar.gz /usr/local # 需要依赖jdk
        ADD apache-tomcat-9.tar.gz /usr/local # 需要依赖tomcat
        ENV JAVA_HOME /usr/local/jdk...
        ENV CLASSPATH $JAVA_HOME/lib...
        ...
    • buildg构建使之成为镜像(之前传统方式是提供项目的jar/war包,而通过Docker部署则是提供构建的镜像):在文件所在目录下执行:docker -f 构建文件名 -t 镜像名:TAG .;可以使用官方默认命名文件名Dockerfile,以自动找到构建文件

    • run运行镜像:

    • push发布镜像到仓库:

    • docker history 镜像ID:查看镜像的生成过程


6 Docker网络

  • 容器内与外的通信机制;安装了docker的服务器,默认成为docker0

  • ip addr:查看所有网关;docker exec -it 容器名 ip addr:查看docker为容器分配的网关IP地址;ping该IP可联通

  • ......

7 Docker Compose

  • 容器编排:批量处理容器,轻松、高效的定义、运行和管理容器

  • 下载安装compose,参考官网

  • 编写docker-compose.yaml文件:

    version:  # 与docker对应的版本
    services: # 应用服务列表及其配置,如web,mysql,redis...;具体有的配置参考官网
        web: .
            build:
            ports:
                - "3306":33060"
            volumes:
                - .:/code
                - logloume01:/var/log
            links:
                - redis
        redis:
            image: redis
    # 其他配置,如挂载卷,网络,全局规则
    volumes:
    networks:
    configs:
  • 在yaml文件目录下构建和运行与停止所有服务:docker-compose up/down .

8 Docker Swarm

  • 集群方式部署

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值