docker 总结

一.Docker 简介


        Docker是一个开源的容器引擎,它有助于更快地交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理
    。使用Docker,可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。
    图:

    1.Docker daemon(Docker守护进程)
        Docker daemon是一个运行在宿主机(DOCKER-HOST)的后台进程。可通过Docker客户端与之通信。
    2.Client(Docker客户端)
        Docker客户端是Docker的用户界面,它可以接受用户命令和配置标识,并与Docker daemon通信。图中,docker build等都是Docker的相关命令。
    3.Images(Docker镜像)
        Docker镜像是一个只读模板,它包含创建Docker容器的说明。它和系统安装光盘有点像一使用系统安装光盘可以安装系统,同理,使用Docker
    镜像可以运行Docker 镜像中的程序。
    4.Container(容器)
        容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过Docker API或者CLI命令来启停、移动、删除容器。
    5.Registry
        Docker Registry是一个集中存储与分发镜像的服务。构建完Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,
    就需要手动复制。此时可借助Docker Registry来避免镜像的手动复制。一个Docker Registry可包含多个Docker仓库,每个仓库可包含多个镜像标签,
    每个标签对应一个Docker镜像。这跟Maven的仓库有点类似,如果扌巴Docker Registry比作Maven仓库的话,那么Docker仓库就可理解为某jar包的路径,
    而镜像标签则可理解为jar包的版本号。
二。docker安装及常用命令
    安装:
    1.移除旧版本 sudo yum -y remove docker
    2.安装yum-utils,这样就能使用yum-config-manager工具设置Yum源。
    sudo yum install -y yum-utils
    3.更新Yum包的索引。
    sud0 yum makecache fast
    4.安装最新版本的Dockero
    sudo yum -y install docker-engine 这样,经过一段时间的等待后,Docker就安装完成了。
    5.安装指定版本的docker
        yum list docker-engine.x86-64 --showduplicates }sort -r (其中,sort一r命令表示对结果由高到低排序)
        安装指定版本:sudo yum -y install docker-engine-<VERSION-STRING> 例如: sudo yum -y install docker-engine-1.13.0
    6.启动Dokcero
        sudo systemctl start docker
    7.执行以下命令,验证安装是否正确。
        sudo docker run hello-world
    8.查看版本:docker version
    9.删除docker :sudo yum -y remove docker-engine
    10.移除所有信息:sudo rm -r f /var/lib/docker
    常用命令:
    搜索镜像可使用docker search  xx 命令
    下载docker pull xx命令
    删除指定名称的镜像:docker rmi hello-world
    使用以下docker run命令即可新建并启动一个容器。
    该命令是最常用的命令,它有很多选项,下面将列举一些常用的选项。
    -d选项:表示后台运行
    -P选项:随机端口映射
    -p选项:指定端口映射,有以下四种格式。
    ip:hostPort:containerPort 
    ip:containerPort 
    hostPort:containerPort 
    containerPort
    -network选项:指定网络模式,该选项有以下可选参数:-network=bridge:默认选项,表示连接到默认的网桥。
    -network=host:容器使用宿主机的网络。
    -network=container:NAME-or-1D:告诉Docker让新建的容器使用已有容器的网络配置。
    -network=none:不配置该容器的网络,用户可自定义网络配置。
    docker run java /bin/echo 'Hello World' 这样终端会打印HelloWorld的字样,跟在本地直接执行/bin/echo 'Hello'一样。
    列出容器使用docker ps命令即可列出运行中的容器,如需列出所有容器(包括已停止的容器),可使用一a参数。
    停止容器docker stop 容器id,强行停止docker kill 容器id,启动已停止的容器使用docker run 容器id,使用docker restart命令来重启容器。
    docker remove 删除容器。
三.将微服务运行在Docker上。
三.一 使用Dockerfile构建Docker镜像(不推荐,麻烦):
        Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节。
    使用Dockerfile构建服务镜像:
        1.先构建jar包:mvn clean package    #使用Maven打包项目(或编译器直接导出)
        2.在jar包所在路径创建docker file(touch Dockerfile)
        3.在docker file添加以下内容(FROM java :8)基于什么镜像
        4.将本地文件挂载到当前容器:VOLUME /tmp
        5.复制文件到jar包路径 add  src dest(.jar)
        6.声明暴露端口 
        7.配置容器启动后执行的命令 ENTRYPOINT ["java" , "-Djava.security. egd=file:/dev/./urandom","-jar","/app.jar"]
        8.使用docker build 构建镜像:docker build -t itmuch/microservice-discovery-eureka:0.0.1 .
        10.启动镜像:docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1 
        11.访问http://Docker宿主机IP:8761/
    私有仓库的管理:
        Docker Registry2.0搭建一个私有仓库:
        执行命令:docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
        修改标签、推送镜像到私有仓库:docker tag itmuch/microservice-discovery-eureka:0.0.1 localhost:5000/itmuch/microservice-discovery-eureka:0.0.1;
        docker push itmuch/microservice-discovery-eureka:0.0.1 
三.二 使用maven插件构建镜像(推荐,相对简单):
        1.<plugin>
            <groupId>com.spotify</groupId>
            <artifactld>docker-maven-plugin</artifactld>
            <configuration>
                <imageName>itmuch/microservice-discovery-eureka:0.0.1</imageName>
                <baselmage>java</baselmage>
                <entryPoint>["java","-jar",/${project.build.finalName}.jar"]</entryPoint>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.directory.directory}<directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
                Maven 
            </configuration>
        </plugin>
        说明:
            imageName:指定镜像名称,其中itmuch指定仓库名称;
            microservice-discovery-eureka:0.0.1:镜像名称/标签名称
            baselmage:用于指定基础镜像
            entryPoint:类似dockerfile的entryPoint指令。
            resources.resource.directory:用于指定根目录
            ${project.directory.directory}:表示target根目录
            resources.resource.include:用于指定需要复制的文件
        2.执行命令,构建docker镜像:
            mvn clean package docker:build

        3.docker images查看刚刚构建的镜像
        4.启动镜像
        5.启动镜像:docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1 
三.三 插件读取dockerfile进行构建
        很多时候希望使用dockerFile更精确的构建
        1.创建dockerfile文件
        2.修改pom.xml
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactld>docker-maven-plugin</artifactld>
            <version>0.4.13</version>
            <configuration>
                <imageName>itmuch/microservice-discovery-eureka:0.0.2</imageName>
                <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.directory.directory}<directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources> 
            </configuration>
        </plugin>
        注不再指定dockerimage和entrypoint
    将插件绑定在某个phase 执行 maven clean package 就会自动构建镜像。
    使用maven插件推送镜像:
        1.修改maven的全局配置settings.xml
        <server>
            <id>docker-hub<id>
            <username>用户名</username>
            <password>密码</password>
            <configuration>
                <email>dockerhub邮箱</email>
            </configuration>
        </server>
        2.修改pom.xml
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactld>docker-maven-plugin</artifactld>
            <version>0.4.13</version>
            <configuration>
                <imageName>itmuch/microservice-discovery-eureka:0.0.2</imageName>
                <baselmage>java</baselmage>
                <entryPoint>["java","-jar",/${project.build.finalName}.jar"]</entryPoint>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.build.directory}<directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
                <serverId>settings.xml id一致<serverId>
            </configuration>
        </plugin>
        3.执行以下命令添加pushImage的标识,标识推送镜像
            mvn clean package docker:build -DpushImage
            同理也可推送致私有仓库,将imageName指定类似如下形式即可
            <imageName>localhost:5000/itmuch/microservice-discovery-eureka:0.0.4</imageName>
            以上示例中,是通过imageName指定镜像名称和标签的,例如: 
            <imageName>itmuch/microservice-discovery-eureka:0.0.4</imageName> 
            也可借助imageTags元素更为灵活地指定镜像名称和标签,例如:
            <configuration>
                <imageName>itmuch/microservice-discovery-eureka</imageName> 
                <imageTags>
                <imageTag>0.0.5</imageTag>
                <imageTag>latest</imageTag>
                </imageTags>
            <configuration> 这样就可为同一个
四容器管理
    1.dockercpmpose安装(略)
    2.安装dockercompose 命令补全工具
    3工程、服务、容器
        Docker Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker Compose运行目录下的所有文件
(docker-compose.yml、extends 文件或环境变量文件等)组成一个工程(默认为docker-compose.yml所在目录的目录名称)。一个工程可包含多个服务,每个
服务中定义了容器运行的镜像、参数和依赖,个服务可包括多个容器实例。
    基本步骤:
    1.使用Dockerfile(或其他方式)定义应用程序环境,以便在任何地方重现该环境。
    2.在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行。
    3.运行docker-compose up命令,启动并运行整个应用程序。
    使用示例:
    1.使用mvn clean package命令打包项目,获得jar包microservice-discovery-eureka-0.0.1SNAPSHOT,jar
    2·在microservice-discovery-eureka-0.0.I-SNAPSHOT.jar所在路径(默认是项目的target目录)创建Dockerfile文件,并在其中添加如下内容。
        FROM java:8
        VOLUME /tmp
        ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar 
        RUN bash -c 'touch /app.jar'
        EXPOSE 9000
        ENTRYPOINT ["java",“-Djava.security.egd=file:/dev/./urandom",'/app.jar"] 
    3.在microservice-discovery-eureka-0.0.1-SNAPSHOT,jar所在路径创建文件docker.compose.yml,在其中添加如下内容。
 
        version:'2' #表示该docker-compose.yml文件使用的是Version 2 file
        format
        servers: 
            eureka:  #指定服务名称
            build: . #指定Dockerfile所在路径
            ports:
               - "8761:8761" 形式 #指定端口映射,类似docker run的-p选项,注意使用字符串
    4.生在docker-compose.yml所在路径执行以下命令:docker-compose up
    5.访问http://宿主机IP:8761/ 即可访问EurekaServer首页。
五.其他
    1.docker-compose.yml常用命令
    image:java 指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来。
    build:./dir 指定Dockerfile⽂件的路径。可以是⼀个路径。
    build:
        context:    ./dir
        dockerfile:    Dockerfile-alternate
        args:
            buildno:1
    也可以是个对象,⽤以指定Dockerfile和参数。
    expose:
    -    "3000"
    -    "8000"
    暴露端口,只将端⼝暴露给连接的服务,⽽不暴露给宿主机。
    2.docker-compose常用命令
    docker-compose run 
    更新容器 docker-compose up 旧容器关闭所有服务指向新容器
六 使用docker-compose编排微服务
    1.微服务:各个微服务
    2.使用docker插件构建docker镜像,在各个pom.xml中添加
    <plugin>
        <groupld>com.spotify</groupld>
        <artifactld>docker-maven-plugin</artifactld>
        <configuration>
            <imageName>itmuch/$(project.artifactld):${project.version}</imageName>
            <forceTags>true</forceTags>
            <baselmage>java</baselmage>
                <entryPoint>["java,"-jar"," /${project.build.finalName}.jar"]</entryPoint>
            <resources>
                <resource>
                    <targetPath>/</targetPath>
                    <directory>${project.build.finalName}</directory>
                    <include>${project.build.finalName}.jar</include>
                </resource>
            </resources>
        </configuration>
    </plugin>
    由配置可知构建的镜像itmuch/下名格式如:microservice-discovery-eureka:0.0.l-SNAPSHOT
    3.由于docker默认模式bridge各个服务ip不同,为eureka server 配置一个主机名:
    eureka:
        client:
            serviceUrl:
                defaultZone: http://discovery:8761/eureka/
    4.在每个项目的根目录执行命令构建镜像:
        mvn clean package docker:build
    5.编写docker-compose.yml:
    # 表示该docker-compose.yml使用的是version 2 file format(固定写法)
    version:'2'
    services:
        #指定服务名称
        microservice-discovery-eureka:
            #指定服务所用镜像
            image: itmuch/microservice-discovery-eureka:0.0.1-SNAPSHOT
            #暴露端口信息
            ports:
            -"8761:8761" 
        microservice-provider-user:
            image: itmuch/microservice-provider-user:0.0.1-SNAPSHOT 
            #连接到microservice-discovery-eureka, 
            links :
                -microservice-discovery-eureka:discovery 
        microservice-consumer-movie-ribbon-hystrix:
            image: itmuch/microservice-consumer-movie-ribbon-hystrix:0.0.1-SNAPSHOT 
            links :
                -microservice-discovery-eureka : discovery 
        microservice-gateway-zuul: 
            image:
            links :
                -microservice-discovery-eureka:discovery 
        microservice-hystrix-dashboard:
            image: itmuch/microservice-hystrix-dashboard:0.0.1-SNAPSHOT 
            links :
        -microservice-discovery-eureka:discovery 
        microservice-hystrix-turbine:
            image: itmuch/microservice-hystrix-turbine:0.0.1-SNAPSHOT 
            links :
        -microservice-discovery-eureka:discovery
    6.启动测试:
    docker-compose up
    7.简化compose编写
        用服务名称作为主机名称来发现其他服务:
    version:'2'
    services:
        discovery:
            image:itmuch/microservice-discovery-eureka:0.0.1-SNAPSHOT
            ports:
                -"8761:8761"
                microservice-provider-user:
                    image: itmuch/microservice-provider-user:0.0.1-SNAPSHOT 
                    ......(其他服务类似)
七。编排高可用eureka server(构建一个双节点集群)
    1.执行命令构建镜像
        mvn clean package docker:build
    2.编写docker-compose.yml
    version:"2"    
        services:
            microservice-discovery-eureka-hal:
                hostname: peerl    # 指定hostname 
                image: itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT 
                links : 
                    -microservice-discovery-eureka-ha2 
                ports :
                    -"8761:8761" 
                environment :
                    -spring.profiles.active-peerl 
            microservice-discovery-eureka-ha2:
                hostname: peer2 
                image: itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT 
                links :
                    -microservice-discovery-eureka-hal 
                ports :
                    -"8762 :8762" 
                environment:
                    -spring.profiles.active=peer2
    3.执行命令启动
        docker-compose up
    以上会出现循环依赖,解决(其他服务科通过服务名连接服务):
    version:"2"
        services:
            peerl:
                image:itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT 
                ports :
                    -"8761"
                environment:
                    -spring.profiles.active=peerl

            peer2:
                image:itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT 
                ports :
                    -"8762"
                environment:
                    -spring.profiles.active=peer2
八。编排高可用服务集群及动态伸缩
    1.服务列表
    2.将所有microservice-discovery-eureka-ha设置:
    eureka:
        client:
            service-url:
                defaultZone:http://peerl:8761/eureka/,http://peer2:8762/eureka/
    3.在每个项目的根目录执行命令构建镜像:maven clean package docker:build
    4.编写docker-compose.yml
    version:"2"
    services:
        peerl:
        image:itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT 
        ports :
            -"8761 :8761 " 
        environment:
            -spring.profiles.active=peerl 
        peer2:
            image:itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT 
            hostname:peer2 
            ports :
                -"8762: 8762 
            environment:
                -spring.profiles.active=peer2
        microservice-provider-user:
            image:itmuch/microservice-provider-user:0.0.1-SNAPSHOT 
        microservice-consumer-movie-ribbon-hystrix:
            image:itmuch/microservice-consumer-movie-ribbon-hystrix:0.0.1-SNAPSHOT 
        microservice-gateway-zuul:
            image:itmuch/microservice-gateway-zuul:0.0.1-SNAPSHOT 
        microservice-hystrix-turbine:
            image:itmuch/microservice-hystrix-turbine:0.0.1-SNAPSHOT
        5.启动测试 docker-compose up
        6.执行命令,为各个微服(除eureka server)务实现动态扩容:
            docker-compose scale microservice-provider-user=3 
            microservice-consumer-movieribbon-hystrix=3 
            microservice-gateway-zuul=3 
            microservice-hystrix-turbine=3 
    
    
    
    
    
    
    
    
    
    
    
    
    
    

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值