zoukankan      html  css  js  c++  java
  • 使用Docker Registry管理Docker镜像


    一个完整的应用系统可能包含上百个微服务,并可能对应上百个镜像,如果考虑各个微服务的版本,那么可能会构建更多的镜像,那么如何管理这些镜像呢?

    使用Docker Registry管理Docker镜像

    Docker Hub是Docker官方维护的Docker Registry,有很多优秀镜像,此外,还提供认证、工作组结构、工作流工具、构建触发器等工具来简化工作。

    可使用docker search搜索存放在Docker Hub中的镜像。

    1.使用Docker Hub管理镜像

    也可使用docker login命令登录Docker Hub。输入该命令并按照提示输入账号和密码,即可完成登录。

    1.1注册与登录

    Docker Hub的使用非常简单,只需注册一个Docker Hub账号,就可正常使用了。

    网站地址:https://hub.docker.com

    1.2创建仓库

    单机Docker Hub主页上的Create Repository按钮,按照提示填入信息即可创建一个仓库。

    1.3推送镜像

    如何将构建的镜像推送的Docker Hub呢?使用以下命令即可,例如:

    docker push discovery-eureka:0.0.1
    

    经过一段时间的等待,就可推送成功。

    2. 使用私有仓库管理镜像

    相比Docker Hub,私有仓库有以下优势:

    • 节省带宽,对于私有仓库中的镜像,无需从Docker Hub下载。
    • 更加安全
    • 便于内部镜像统一管理。

    2.1 搭建私有仓库

    Docker Registry2.0的搭建,只需执行以下命令即可新建并启动一个Docker Registry2.0.

    docker run -d -p 5000:5000 -restart=always --name registry2 registry:2
    

    2.2 将镜像推送到私有仓库

    只需指定私有仓库的地址,即可将镜像推送到私有仓库。

    docker push localhost:5000/itmuch/discovery-eureka:0.0.1
    

    执行此命令,发现没成功,且提示以下内容:

    The push refers to a repository [docker push localhost:5000/itmuch/discovery-eureka:0.0.1]
    An image does not exist locally with the tag :  localhost:5000/itmuch/discovery-eureka
    

    Docker Hub是默认的Docker Registry,所以/itmuch/discovery-eureka:0.0.1相当于docker.io/itmuch/discovery-eureka:0.0.1。因此,要想将镜像推到到私有仓库,需要修改镜像标签,

    docker tag itmuch/discovery-eureka:0.0.1  localhost:5000/itmuch/discovery-eureka:0.0.1
    

    修改镜像标签后,在执行以下命令,即可将镜像推送到私有仓库。

    docker push localhost:5000/itmuch/discovery-eureka:0.0.1
    

    3.使用Maven插件构建Docker镜像

    以discovery-eureka为例。

    首先,在pom.xml中添加Maven的Docker插件。

    <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <configuration>
                    <imageName>itmuch/discovery-eureka:0.0.1</imageName>
                    <baseImage>java</baseImage>
                    <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>
                    <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    配置说明:

    • imageName用于指定镜像名称,其中itmuch是仓库名称,discovery-eureka是镜像名称,0.0.1是标签名称。
    • baseImage:用于指定基础镜像,类似于Dockerfile中的FROM指令。
    • entrypoint:类似于Dock而file的ENTRYPOINT指令。
    • resources.resource.directory:用于指定需要复制的根目录,${project.build.directory}表示target目录。
    • resources.resouce.include:用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar文件。

    2:执行以下命令,构建Docker镜像

    mvn clean package docker:build
    

    3:执行docker images ,即可查看刚刚构建的镜像。

    4:启动镜像:

    docker run -d -p 8761:8761 itmuch/discovery-eureka0.0.1
    

    5:访问测试。

    插件读取Dockerfile进行构建

    1:首先在/discovery-eureka/src/main/docker目录下,新建一个Dockerfile文件,例如:

    FROM java:8
    VOLUME /tmp
    ADD discovery-eureka0.0.1-SNAPSHOT.jar app.jar
    RUN bash -c 'touch /app.jar'
    EXPOSE 9000
    ENTRYPOINT ["java","Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
    

    2:修改pom.xml

    <build>
        <plugins>
             <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <configuration>
                    <imageName>itmuch/discovery-eureka0.0.2</imageName>
                    <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory> <!-- 指定 Dockerfile 路径-->
                    <!-- 这里是复制 jar 包到 docker 容器指定目录配置,也可以写到 Docokerfile 中 -->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>   
        </plugins>
    </build>
    

    可以看到,不再指定baseImage和entrypoint,而是使用dockerDirectory指定Dockerfile所在的路径。

  • 相关阅读:
    [Jenkins] 批量删除构建历史
    [Android Tips] 32. 解决 Android Device Monitor 在 Mac OS X 卡住
    [Gradle] 查看项目依赖
    [Gradle] 获取 gradle 命令行参数
    [Android Tips] 31.如何将第三库引入的 Permission 删除掉
    [Gradle] 发布构件到本地仓库
    [Android Tips] 30.如何在 Android Studio 中一次性格式化所有代码
    下载安卓应用的历史版本
    设置int、float型数据的输出格式
    头文件limits—各个类型的数据的范围
  • 原文地址:https://www.cnblogs.com/aixing/p/13327489.html
Copyright © 2011-2022 走看看