zoukankan      html  css  js  c++  java
  • Docker技术入门及实践

     

    01 Docker技术介绍

    • Docker技术简介
    Docker,是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何支持docker安装的Linux机器上运行。Docker实现了虚拟化,安全隔离,容器是完全沙箱机制,相互之间不会有任何接口。

    一个完整的Docker有以下几个部分组成:

    1、Docker Client客户端

    2、Docker Daemon守护进程

    3、Docker Image镜像

    4、Docker Container容器

    5、Docker Registry仓库

    • Docker技术架构
    Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。Docker容器通过Docker镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。

      Docker采用C/S架构,Docker Daemon作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过socket或者RESTfulAPI来进行通信。

      Docker Daemon一般在宿主机后台运行,等待接收来自客户端的消息。Docker客户端则为用户提供一系列可执行命令,用户用这些命令来实现跟Docker Daemon交互。

                         

    • Docker技术优势
    1、容器跨平台性与镜像。容器在linux容器的基础上设定了一套标准化的配置方法,将应用及其依赖的运行环境打包成镜像,真正实现了“构建一次,到处运行”的理念,大大提高了容器的跨平台性。
    
    2、持续部署与测试。容器消除了线上线下的环境差异,保证了应用生命周期的环境一致性、标准化。开发人员使用镜像实现标准开发环境的构建,开发完成后通过封装完整环境和应用的镜像进行迁移。由此,测试和运维人员可以直接部署软件镜像来进行测试和发布,大大简化了持续集成、测试和发布的过程。
    3、环境标准化和版本控制。基于容器提供的环境一致性和标准化,我们可以使用Git等工具对容器镜像进行版本控制,相比基于代码的版本控制来说,还能够对整个应用运行环境实现版本控制,一旦出现故障还可以快速回滚。相比以前的虚拟机镜像,容器压缩和备份速度更快,镜像启动也像启动一个普通进程一样快速。
    4、高资源利用率与隔离。容器没有管理程序的额外开销,与机器底层共享操作系统,性能更加优良,系统负载更低,在同等条件下可以运行更多的应用实例,可以更充分地利用系统资源。同时,容器拥有资源隔离与限制能力,可以精确地对应用分配CPU、内存等资源,保证了应用间不会相互影响。
    5、应用镜像仓库。Docker官方构建了一个镜像仓库,组织和管理形式类似于Github,其上已累积了成千上万的镜像。因为Docker的跨平台适配性,相当于为用户提供了一个非常有用的应用商店,所有人都可以自由地下载微服务组件,这为开发者提供了巨大便利。

    02 Docker安装配置

    • Linux平台安装Docker
    目前,CentOS仅发行版本中的内核支持Docker。推荐使用CentOS7.0及以上版本,64位操作系统,系统版本内核为3.10及以上。Dokcer安装步骤如下:

    1、查看系统版本是否符合要求 

    cat /etc/redhat-release

    2、安装依赖包 

    yum install -y yum-utils device-mapper-persistent-data lvm2

    3、添加软件源 

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    4、安装Docker-CE 

    yum -y install docker-ce
    若已安装docker,请先卸载
    yum list installed | grep docker
    sudo yum remove docker
    docker-client
    docker-client-latest
    docker-common
    docker-latest
    docker-latest-logrotate
    docker-logrotate
    docker-selinux
    docker-engine-selinux
    docker-engine

    安装指定版本的docker
    yum list docker-ce --showduplicates|sort -r
    yum install docker-ce-18.03.1.ce-1.el7.centos

    5、启动docker后台服务并添加开机自启 

    systemctl start docker 
    systemctl enable docker

    6、查看docker安装版本 

    docker version
    • 安装docker compose 
    7、安装docker-compose
    curl -L  https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
    
    8、赋执行权限
    chmod +x /usr/local/bin/docker-compose
    
    9、查看docker-compose安装版本
    docker-compose --version
    • 配置镜像中心
    10、创建daemon.json文件,添加镜像仓库地址
    { 
        "registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"],
        "insecure-registries":["47.88.149.108:61010", "hdwuhan.ddns.info:41857"] 
    }

     11、重启docker systemctl restart docker

     12、设置docker服务开机自启 systemctl enable docker

    03 Docker镜像、容器、仓库

    • Docker镜像
    Docker镜像(Image)类似于虚拟机镜像,可以理解为面向Docker引擎的只读模板。可以从DockerHub下载官方发布的应用镜像,比如Redis、Mysql、Nginx等,也可以从搭建的镜像中心来下载镜像。镜像常用操作如下:
    1、搜索官方镜像 docker search mysql
    2、下载镜像 docker pull centos:7.0 不带仓库名称则默认从Docker Hub下载 docker pull ubuntu 不带版本号则默认下载latest版本 docker pull hdwuhan.ddns.info:41857/ubuntu 指定仓库下载
    3、上传镜像 docker push hdwuhan.ddns.info:41857/ubuntu:v1.0 上传到指定仓库 docker push ubuntu:v1.0 上传到官方仓库
    4、查看本地镜像 docker images

    5、删除本地镜像
    docker rmi dfs:0.2.0 通过镜像名删除
    docker rmi db52f9bf0787 通过镜像ID删除

    6、提交容器镜像
    docker commit db52f9bf0787 hdwuhan.ddns.info:41857/dfs:0.2.0

    7、给镜像打tag
    docker tag db52f9bf0787 hdwuhan.ddns.info:41857/dfs:0.2.0

    8、从容器导出、导入镜像
    docker export db52f9bf0787 > dfs_0.2.0.tar
    cat dfs_0.2.0.tar | docker import - dfs:v0.2.0

    9、存出和载入镜像(推荐使用
    docker save db52f9bf0787 > dfs_2.3.tar
    docker load < dfs_2.3.tar
    • Docker容器
    Docker容器(Container)是从镜像创建的应用运行实例,可以将其看作是简易版Linux系统环境及运行在其中的应用程序打包而成的应用盒子。容器常用操作如下:
    
    1、新建并启动容器 docker run [OPTIONS] IMAGE [COMMOND] OPTIONS: -t 让docker分配一个伪终端并绑定到容器的标准输入上 -i 表示让容器的标准输入保持打开 -d 让docker容器在后台以守护态形式运行 -p 桥接模式,端口映射 --net=host host模式启动 --restart=always 一直重启 --privileged=true 高级权限 --log-driver=none 不打印容器级别日志 --name 容器命名 新建并启动仓库容器 docker run -d -p 5000:5000 --name registry_5000 --restart=always --privileged=true --log-driver=none -v /home/test:/tmp/registry registry

      2、进入容器

      docker exec -it containerName/ID /bin/bash

      docker exec -it containerName/ID /bin/sh   alpine镜像

      3、停止容器

      docker stop containerName/ID

      4、启动容器

      docker start containerName/ID

      5、重启容器

      docker restart containerName/ID

      6、删除容器

      docker rm containerName/ID

      7、关闭所有容器
      docker stop $(docker ps -q) 

      8、删除所有容器

      docker rm $(docker ps -aq)

      9、删除所有镜像
      docker rmi $(docker images -aq)

    • Docker仓库
    Docker Registry是用于存储容器镜像的仓库。在Docker的运行过程中,Docker Daemon会与Docker Registry通信,并实现搜索镜像、下载镜像、上传镜像三个功能。
    
    Docker可以使用公有的Docker Registry,如Docker Hub,但Docker获取容器镜像文件时,必须通过互联网访问Docker Hub。Docker也允许用户构建本地私有的Docker Registry,这样就可以保证容器镜像的获取在内网中就可以完成。

    04 Docker配置文件

    • docker compose 介绍
    Compose是Docker容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker Compose不再需要使用shell脚本来启动容器。
    
    Compose通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动、停止、重启应用及其所依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
    
    docker-compose默认的模板文件是docker-compose.yml,其中定义的每个服务都必须通过image指令指定镜像或build指令(需要Dockerfile)来自动构建。
    如果使用build指令,在Dockerfile中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV等)将会自动被获取,无需在docker-compose.yml中再次设置。
    
    使用Compose基本上分为三步:
    1、Dockerfile 定义应用的运行环境
    2、docker-compose.yml 定义组成应用的各服务
    3、docker-compose up 启动整个应用

    • docker-compose配置说明
    一份标准配置文件应该包含version、services、networks三大部分,其中最关键的就是services和networks两个部分。

     docker-compose文件是一个定义服务、网络和卷的YAML文件。dfs 配置文件举例:

    version: '3'
    services:
      emqx:
        image: emqx/emqx:v3.2.2
        container_name: emqx
        ports:
           - "333:1883"
        restart: always
      dfs:
        image: hdwuhan.ddns.info:41857/dfs/dfs:2.3
        container_name: dfs_2.3
        restart: always
        ports:
           - "9999:9999"
        volumes:
           - ./application.yml:/dfs/application.yml:rw

      其上docker-compose运行配置文件中,包含2个服务的容器配置,分别是emqx服务和dfs服务。其中

    image:镜像获取地址及版本号,整个地址即为镜像的tag

    container_name:容器名称

    ports:端口映射。规则:”外部映射端口号:内部服务端口号”,注,外部映射端口号可根据需要修改,但内部服务端口号不能修改

    restart:表示服务故障自启

    volumes:文件共享路径

    主要配置项介绍:
    1、version
    Compose目前为止有三个版本分别为Version 1,Version 2,Version 3。Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。目前推荐使用 Version 3
    
    2、services
    配置管理多个容器的标签。所有容器及其配置项都是在services标签下定义的。

      3、image

      services:  

        dfs:    

          image: hdwuhan.ddns.info:41857/dfs/dfs:2.3

    在 services 标签下的第二级标签是 dfs,这个名字是用户自己定义的,它就是服务名称。

    image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。

    例如下面这些格式都是可以的:

    image: redis

    image: ubuntu:14.04

    image: tutum/influxdb

    image: a4bc65fd

      4、container_name

    Compose 的容器名称格式是:<项目名称><服务名称><序号> 虽然可以自定义项目名称、服务名称,但是如果你想完全控制容器的命名,可以使用这个标签指定: container_name: app 这样容器的名字就指定为 app 了。

      5、depends_on

         depends_on:

            - db

            - redis

    在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。 例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。

      6、ports

        ports: - "9999:9999"

    映射端口的标签。 使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。

    ports:  

      - "3000"  

      - "8000:8000"  

      - "49100:22"  

      - "127.0.0.1:8001:8001"

    注意:当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60你可能会得到错误的结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。

      7、volumes

        volumes: - ./application.yml:/dfs/application.yml:rw

    挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER] 这样的格式,或者使用 [HOST:CONTAINER:ro] 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统。 Compose的数据卷指定路径可以是相对路径,使用 . 或者 .. 来指定相对目录。 数据卷的格式可以是下面多种形式:

    volumes:     

       - /var/lib/mysql    // 只是指定一个路径,Docker 会自动再创建一个数据卷(这个路径是容器内部的)

       - /opt/data:/var/lib/mysql    // 使用绝对路径挂载数据卷

       - ./cache:/tmp/cache   // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。

    05 Docker应用案例

    • 案例:DFS应用
    我们使用docker来管理程序的部署,首先是将我们的程序打包成镜像的方式并推送到宏电镜像中心,然后再拉取镜像到docker本地仓库,最后将镜像实例化并运行。
    我们的DFS应用是由多个服务组成的,为方便安装服务,这里我们采用docker compose方式组合一次性地启动我们的容器服务,每个组成部分都对应一个单独容器,这样方便后续运维优化扩展工作。
    DFS应用由以下几个服务组件组成:
    。emqx          
    。mysql
    。redis
    。dfs_server
    。dfs_client
    。dfs_web
    
    DFS部署安装成功后,每一个组件都对应一个运行的容器实例。

    第一步:获取应用配置文件 从我司获取DFS服务的配置文件夹,形如docker-compose文件夹,包含如下文件:

    • 应用部署流程
    第二步:安装应用
    
    1、登录linux系统后,在home目录下创建docker文件夹
    
    mkdir /home/docker
    
    2、将平台配置文件夹上传到/home/docker目录
    
    3、进入平台配置文件夹路径,如
    
    cd /home/docker/docker-compose
    
    4、查看配置文件列表
    
    ll
    
    5、运行docker-compose文件
    
    docker-compose up -d
    
    等待容器安装并启动平台相关组件服务,1分钟左右,取决于网速。安装完成后,可查看正在运行的容器。
    
    6、查看当前正在运行的容器
    
    docker-compose ps
    
    7、访问web页面
    
    平台地址:http://ip:41853 ip为部署平台的服务器地址

     06 Docker常用运维命令

    docker-compose 常用组合命令:
    docker-compose up -d     //后台启动compose容器
    docker-compose ps      //在配置文件目录下执行,查看compose容器
    docker-compose stop     //关闭compose容器
    docker-compose down     //关闭移除除compose容器,网络,镜像和数据卷
    docker-compose pull     //更新compose 镜像

    docker ps -a | grep wmmp   //查找容器
    docker stop `docker ps -aq` //一键关闭所有容器
    docker rm `docker ps -aq` //一键删除所有容器
    docker rmi `docker images` //一键删除所有镜像
    docker rmi `docker images | grep  "<none>" | awk '{print $3}'`     //一键删除<none>标签的镜像
    docker logs -f --tail 100 wedora_server     //查看容器日志
    docker exec -it
    wedora_server bash //进入容器
    exit //退出容器

    打包镜像

    docker save harbor.iotwedora.com:40180/public/emqx:v3.2.2  | gzip > wedora25.tar.gz 

    导入镜像

    docker load -i wedora25.tar.gz 

  • 相关阅读:
    IM服务器架构实现
    TCP打洞技术
    Java的守护线程与非守护线程
    SQL中时间为空的处理小结
    tfs
    Silverlight技术总结
    PMS
    Silverlight的TabControl的selectionChanged事件中读取不到TextBox值的bug。
    hahahahahah
    APM文章
  • 原文地址:https://www.cnblogs.com/relustarry/p/12433246.html
Copyright © 2011-2022 走看看