美文网首页三个JAVA臭皮匠IT技术篇Docker容器
Docker基础、Machine、Compose、Swarm入门

Docker基础、Machine、Compose、Swarm入门

作者: 后厂村老司机 | 来源:发表于2018-07-12 16:35 被阅读64次

    前言

    你是否曾经和我一样,想了解一个新的中间件,如redis、kafka、zookeeper等,发现无论是单点还是集群搭建过程都异常繁琐,甚至占用了一半以上的学习时间?很多中间件都是基于linux系统的,但是你却要在windows上做文章?作为一个后端程序员,我只想学习一下中间件怎么使用,却被这种繁琐的过程限制住了手脚,抑或是半途而废?
    正所谓,工欲善其事,必先利其器。Docker可以完美的解决我们以上的痛点,而且安装过程简单。
    本文参照Docker官方文档https://docs.docker.com/,基于windows系统,Linux和Mac系统除了安装过程不同之外其余过程均相同。

    一、安装Docker

    步骤一

    下载安装DockerToolBox: https://docs.docker.com/toolbox/overview/

    image.png

    步骤二

    安装成功之后会有三个图标出现,Docker Quickstart基本上不用,常用的是另两个,打开VM更新到最新版本(因为旧版本打开Kitematic的时候容易卡死)


    image.png

    步骤三

    打开Kitematic软件,点击hello-world-nginx的CREATE按钮,创建一个容器,如果能正常跑起来就证明安装成功了。


    image.png

    二、Docker Machine

    经过上面过程我们已经在Windows里面成功安装了docker环境,但本质上Kitematic软件底层利用的是VirtualBox虚拟机和DockerMachine,那么什么是Docker Machine?

    1、Docker Machine概念

    Docker Machine就是创建Docker环境的机器,简单说就是有了Docker Machine就可以在任何系统任何平台上快速的搭建Docker环境了。

    2、利用Docker Machine快速创建Docker环境

    创建Docker虚拟机

    打开cmd窗口,执行命令 docker-machine create --driver=virtualbox machine1
    该命令以virtualbox为介质快速创建一个包含有docker环境的虚拟机。命令执行完成之后打开virtualbox界面如下:
    可以看到machine1正在运行,双击进入该虚拟机可以执行docker的所有命令。
    你可以利用上面的命令继续创建多个含有Docker Engine的多个虚拟机


    image.png

    进入Docker虚拟机

    打开cmd窗口,执行命令 docker-machine ssh machine1
    该命令可以通过cmd窗口进入到machine1环境,因为virtualbox的复制粘贴操作没有cmd窗口那么便捷,所以我一般复制命令的时候都使用cmd窗口ssh进入

    其他Docker machine命令

    docker-machine start/stop 可以删除容器关闭和不删除容器关闭虚拟机
    更多命令请参考 https://docs.docker.com/machine/reference/

    三、Docker Compose

    1、Dcoker Compose概念

    Docker Compose可以有组织的启动同属于一个服务的多个容器
    换句话说 当一个服务包含多个容器的时候,docker compose可以通过yaml文件预先配置,然后统一启动

    2、Docker Compose安装

    三步走:进入machine1、切换root用户、安装及更改compose权限
    1.21.1为版本,可以到https://github.com/docker/compose/releases去查看可更换的compose版本

    sudo -i
    curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose

    3、Compose的使用

    以三节点的zookeeper伪集群为例,最重要的就是yaml文件,这个是构建服务的蓝图
    首先:随便在哪个目录下创建一个docker-compose.yml文件(注意名称必须为docker-compose),内容如下
    然后:进入docker-compose.yml目录,执行docker-compose up -d -d表示后台运行,结果如图

    version: '3.1'
    
    services:
      zoo1:
        image: zookeeper
        restart: always
        hostname: zoo1
        ports:
          - 2181:2181
        environment:
          ZOO_MY_ID: 1
          ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
    
      zoo2:
        image: zookeeper
        restart: always
        hostname: zoo2
        ports:
          - 2182:2181
        environment:
          ZOO_MY_ID: 2
          ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888
    
      zoo3:
        image: zookeeper
        restart: always
        hostname: zoo3
        ports:
          - 2183:2181
        environment:
          ZOO_MY_ID: 3
          ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888
    
    image.png

    再次:检查zookeeper伪集群是否安装成功,使用docker ps 查看正在运行的容器,记下ID
    然后:通过docker exec -it id /bin/bash进入zookeeper下,进入bin目录,执行zkCli.sh就可以执行zookeeper命令了!


    image.png

    就这样伪集群瞬间搭建好,跟谁说理去?

    4、yml模板说明:

    • version对应compose和Engine版本


      image.png
    • services对应多个容器
    • zoo1/2/3为容器名称
    • image表示基于的镜像为zookeeper
    • environment表示环境变量
    • ports前面的端口号表示容器宿主机的端口号,后面的端口号表示容器的端口号
    • 其他顾名思义

    4、Compose yml其他语法

    https://docs.docker.com/compose/compose-file/


    四、Docker Swarm

    上面两位剑客完成了Docker环境搭建和容器的编排工作,swarm则用来完成多台机器(可物理可虚拟)之间容器集群的管理,Swarm是docker自带的一种模式,内嵌到docker里,不用额外安装。

    1、Swarm中的重要概念

    • 节点:NODE,一个节点本质上是一个包含Docker Engine环境的机器,可以是物理机也可以是虚拟机,我们这里可以是自己构建的docker machine。Node分为两种,一种为leader,一种为worker,前者负责分派工作,后者负责执行工作,同一个NODE可以同时有两种角色。
    • 服务:Service,运行在节点上包含一个或者多个task的综合体,每个task都由一个容器和容器内部运行的一些命令共同代表。
    • 负载均衡:使用内部负载均衡,访问任何节点端口都会通过负载均衡找到服务,即便当前node没有服务
      image.png

    2、快速搭建一个Swarm集群

    步骤一:

    打开cmd窗口,使用docker-compose create worker1 创建一个manager环境和两个worker环境,创建完成可以打开virtualbox查看


    image.png
    步骤二:

    在manager节点即图中的machine1节点内,执行命令
    docker swarm init --advertise-addr 192.168.99.101 注意后边的IP为当前机器的IP可以通过cmd窗口的docker-machine ip machine1查看。--advertise-addr表示设置mannager

    $ docker swarm init --advertise-addr 192.168.99.101
    Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join \
        --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
        172.17.0.2:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    
    步骤三:

    上一步中其实已经给出了加入swarm的命令了,如果没记住可以在mananger节点执行docker swarm join-token worker 命令查看

    docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 192.168.99.101:2377
    执行完上述命令后会有成功的提示

    在Manager节点执行docker node ls可以查看当前节点


    image.png
    步骤四:

    至此Docker swarm集群搭建完成,该集群包含三个节点,一个Manager和两个worker,Manager本质上也是一个worker,都可以执行任务。

    3、在Swarm上操作服务

    • 发布:
      随便在哪个节点上执行命令
      docker service create
      --replicas 3
      --name redis
      --update-delay 10s
      redis:3.0.6
      就可以发布一个3.0.6版本的Redis了,replicas表示有三个副本,update-delay表示当升级的时候,一个节点升级成功之后的10秒后才升级另一个节点
    • 升级:
      docker service update --image redis:3.0.7 redis
      这个过程是滚动的,即一个接一个升级
    • 查看:
      docker service inspect --pretty redis
      或者docker service ps redis
    • 删除:
      docker service rm redis
    • 停止/重启节点:
      docker node update --availability drain worker1
      该命令停止了节点worker1,停止之后不接受新的请求,不接受manager分派
      docker node update --availability active worker1
      该命令重启了节点,使其恢复active状态
    • 指定端口:
      docker service create
      --name my-web
      --publish published=8080,target=80
      --replicas 2
      nginx
      该命令指定了访问端口为8080,映射docker80端口,可以通过任何节点访问到如192.168.99.101:8080

    4、Swarm && Compose

    上面Swarm发布的Service都是单个容器的,多个容器如何操作呢?首先我们会联想到Compose,但是Comopse旧版本只支持在单个Host上发布,在集群里就需要Compose新版本了!先保证Compose是v3以上吧!
    去这个网址https://github.com/docker/compose/releases/查看compose版本和compose yml版本的对应关系

    image.png
    Swarm发布Compose编排的Service过程:
    步骤一:

    编排docker-compose.yml模板文件,此处命名可以随便起,与Compose不同
    下面的yml文件来自官方https://github.com/docker/labs/blob/master/beginner/chapters/votingapp.md

    • version必须是3及以上
    • 该服务包含redis、db、vote服务(投票功能)、result服务(统计结果)等等
    version: "3"
    services:
      redis:
        image: redis:alpine
        ports:
          - "6379"
        networks:
          - frontend
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
      db:
        image: postgres:9.4
        volumes:
          - db-data:/var/lib/postgresql/data
        networks:
          - backend
        deploy:
          placement:
            constraints: [node.role == manager]
      vote:
        image: dockersamples/examplevotingapp_vote:before
        ports:
          - 5000:80
        networks:
          - frontend
        depends_on:
          - redis
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
          restart_policy:
            condition: on-failure
      result:
        image: dockersamples/examplevotingapp_result:before
        ports:
          - 5001:80
        networks:
          - backend
        depends_on:
          - db
        deploy:
          replicas: 1
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
    
      worker:
        image: dockersamples/examplevotingapp_worker
        networks:
          - frontend
          - backend
        deploy:
          mode: replicated
          replicas: 1
          labels: [APP=VOTING]
          restart_policy:
            condition: on-failure
            delay: 10s
            max_attempts: 3
            window: 120s
          placement:
            constraints: [node.role == manager]
    
      visualizer:
        image: dockersamples/visualizer
        ports:
          - "8080:8080"
        stop_grace_period: 1m30s
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        deploy:
          placement:
            constraints: [node.role == manager]
    
    networks:
      frontend:
      backend:
    
    volumes:
      db-data:
    
    步骤二:

    执行命令 docker stack deploy --compose-file docker-compose.yml vote 启动基于yml文件的名称为vote的服务
    注意docker stack不支持build,需要事先指定镜像


    image.png
    步骤三:

    这样多个容器就以服务的形式发布到集群里面了!通过192.168.99.101:5000访问即可看到页面!
    docker stack services vote:可以查看服务状态
    docker stack rm vote:可以删除服务

    image.png
    Docker-Compose所有命令参数可以参考:https://docs.docker.com/compose/compose-file/

    五、Docker基础

    docker主要由仓库、镜像、容器三个概念组成!下图中显示了三者之间的关系

    • 把镜像理解为软件安装包
    • 把容器理解为使用的软件
    • 把仓库理解为安装包下载网站
    image.png

    一:对于镜像:

    1:增加镜像:
    A:从仓库下载:docker pull NAME:TAG
    A1:例子:docker pull ubuntu:latest
    A2:例子:docker pull ubuntu 同上
    A3:例子:docker pull ubuntu:14.04
    B:创建镜像:
    B1:基于已有镜像的容器创建:docker commit已经修改过的容器,如docker容器里创建了文件的镜像
    B11:docker commit -m “消息” -a “作者信息” a925948cb23d(容器ID) test:0.1(标签)
    B2:基于本地模板导入
    B3:基于Dockerfile创建
    C:存出镜像:docker save -o xxx.tar xxx:latest即可保存成tar文件
    D:载入镜像:docker load < xxx.tar即可载入tar文件
    2:删除镜像:
    A:删除镜像:docker rmi image image可以为标签也可以为id
    A1:-f强行删除
    3:修改镜像:
    A:给镜像打标签:docker tag ubuntu:latest myubuntu:latest

    4:查看镜像:
    A:列出镜像:docker images
    A1:-a列出所有的镜像文件
    A2:-q仅输出ID信息
    B:详细信息:docker inspect ubuntu:latest
    C:查看历史:docker history ubuntu:latest
    5:搜索镜像:
    A:搜索镜像:docker search -s 3 —automated ubuntu 搜索3星以上自动创建的ubutnu镜像
    6:上传镜像:
    A:先加标签:docker tag xxx:14.04 user/test:latest
    再往上推:docker push user/test:latest
    B:上传到docker hub里面,跟git很类似

    7:Dockerfile详解:
    构建:
    Kind1:在dockerfile所在目录执行:docker build -t nginx:v3 .
    Kind2: 直接用gitRepo构建:docker build git路径:版本
    解释:BS架构,dockerfile所在目录应该为空目录,所有需要复制或者添加的文件都应该复制到该目录下,这个路径是一个上下文Context,构建过程中会把上下文发送给Docker引擎
    A:FROM命令:以什么为基础,可以是已经存在的镜像,也可以是虚拟镜像scratch
    B:RUN命令:与直接在容器内命令行中输入的命令一样的效果,为了减少层数,可以使用\和&&结合的方式,换行并继续的意思
    C:COPY命令:COPY package.json /usr/src/app,前者为上下文中的路径,后者可以为绝对路径,也可以为WORKDIR目录的相对路径
    D:ADD命令:与COPY一至,源路径可以为url,可以为tar文件,只在自动解压缩的场合使用ADD,其余一律用RUN
    E:CMD命令:制定容器启动时所要执行的命令,只能执行一次,多次会覆盖,CMD 【“可执行程序”,“param1”,“parma2”】
    F:ENTRYPOINT命令:格式与RUN相同,给容器配置一个可执行程序格式与CMD相同,docker run指令不会覆盖ENTRYPOINT命令而会覆盖CMD命令,比如-i
    G:ENV命令:设dockerfile的环境变量 ENV key value,之后的命令可以使用ENV定义的环境变量,容器内也可以使用
    H:VOLUME命令:VOLUME /data,匿名卷容器内的/data映射入主机了
    I:EXPOSE命令:声明端口 EXPOSE 80 8080
    J:WORKDIR:指定工作目录,或者成为当前目录,如果目录不存在WORKDIR会帮你创建
    K:USER命令:制定当前用户

    二:对于容器:
    1:创建容器:
    A:创建容器:docker create -it ubuntu:latest
    保持标准输入打开:-i
    后台运行容器:-d
    分配一个伪终端:-t
    B:创建并启动容器:docker run ubuntu /bin/bash
    2:删除容器:
    A:docker rm命令删除:
    B:删除所有:sudo docker rm $(docker ps -a -q)
    3:停止容器:
    A:优雅的停止:docker stop dockerID
    B:直接杀死:docker kill id
    4:查看容器:docker ps
    A:获取容器输出信息:docker logs id
    5:进入容器:
    A:exec命令:docker exec -it dockerID /bin/bash
    B:nsenter工具:可以去查
    6:容器互联:
    A:docker run -d -P —name dockerName1 --link dockerName2:dockerName2Alias ubuntu:14.04
    B:
    7:启动容器:
    A:docker start af(容器ID)
    B:重启:docker restart id
    C:启动容器会自动在镜像层外挂载一层可读写层
    D:直接从镜像启动容器:docker run -i -t -d -p 8080:8080 --name myname ubuntu:latest
    8:导入导出容器:
    A:导出容器:docker export -o xxx.tar dockerID
    B:导入容器:docker import xxx.tar - dockerName

    三:对于仓库:
    1:创建私有仓库:
    A:创建本地/tmp/registry 位置的仓库 docker run -d -p 5000:5000 registry
    B:创建制定路径仓库 docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
    2:从国内镜像下载镜像:
    A:从时速云下载镜像:docker pull index.tenxcloud.com/docker_library/镜像:标签

    四:对于数据:
    1:数据卷:
    A:容器内数据直接映射到本地主机环境
    B:数据卷可以被多个容器共享和重用
    C:对数据卷修改立马生效,并且更新数据卷不影响镜像
    D:数据卷会一直存在,直到没有容器使用才可以安全卸载
    E:挂载数据卷到容器内目录的两种方法:
    E1:docker run -d -P --name web -v /webapp ubuntu:14.04 把容器的webapp目录映射到主机上
    E2:挂载指定目录到容器:docker run -d -P --name web -v /src/webapp(主机目录):/opt/webapp(容器内目录):ro ubuntu:14.04 加上:ro后容器对锁挂在的数据卷内数据就无法修改了
    E3:可以挂载单个文件到容器内目录作为数据卷,不推荐
    F:删除数据卷:docker rm -v
    2:数据卷容器:
    A:使用特定容器维护数据卷
    B:操作流程:
    B1:创建数据卷容器:docker run -v /dbdata —name dbdata ubuntu
    B2:在其他容器使用—volumes-from dbdata即可挂载改容器,可以寄连挂在,也可以挂载多个数据卷容器

    总结:

    本篇博客涵盖了Docker自家的所有内容,从Docker基础到Docker三剑客都有解析,可以作为入门指导。
    有了docker之后我们就可以随便的安装那些安装过程复杂的软件了,如果你看懂了,请给我一点鼓励哦!

    相关文章

      网友评论

        本文标题:Docker基础、Machine、Compose、Swarm入门

        本文链接:https://www.haomeiwen.com/subject/oxmlpftx.html