如何将docker映像推送到私有存储库

我有一个标记为me/my-image的docker映像,并且我在dockerhub上有一个名为me-private的私有repo 当我按me/my-image时,我最终总是击中公共回购

具体将映像推到私有repo的确切语法是什么?

649185 次浏览

你需要正确地标记你的图像首先用你的registryhost:

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

然后docker push使用相同的标签。

docker push NAME[:TAG]

例子:

docker tag 518a41981a6a myRegistry.com/myImage
docker push myRegistry.com/myImage

有两种选择:

  1. 进入中心,首先创建存储库,并将其标记为私有。然后当你推到那个回购时,它将是私有的。这是最常见的方法。

  2. 登录到docker hub帐户,进入全局设置。有一个设置允许您设置您推送的存储库的默认可见性。默认情况下,它被设置为公共,但如果您将其更改为私有,那么您推送的所有存储库将默认标记为私有。重要的是要注意,您需要在您的帐户上有足够的私人回购,否则回购将被锁定,直到您升级计划。

首先转到Docker Hub帐户并进行回购。这是我Docker Hub账户的截图: # EYZ0 < / p >

从图片中,你可以看到我的回购是“chuangg”

现在进入repo,通过单击图像的名称将其设置为私有。对我来说,我点击了“chuangg/gene_commited_image”,然后我进入设置->设置为私有。然后我按照屏幕上的说明进行操作 # EYZ0 < / p >

如何上传你的docker图像到docker hub

方法#1=通过命令行(cli)推送图像

1) # EYZ0

是的,我想应该是集装箱ID。它可能不是映像ID。

例如= docker commit 99e078826312 chuangg/gene_commited_image

2) # EYZ0

3) # EYZ0

例如= docker login --username=chuangg --email=gc.genechaung@gmail.com

是的,你必须先登录。使用" docker Logout "退出

4) # EYZ0

# EYZ0

注意,我使用了一个名为“build-docker”的Maven概要文件。如果您不想使用概要文件,只需删除<profiles>, <profile>, and <id>build-docker</id>元素。

在父文件pom.xml内部:

<profiles>
<profile>
<id>build-docker</id>
<build>
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.18.1</version>
<configuration>
<images>
<image>
<name>chuangg/gene_project</name>
<alias>${docker.container.name}</alias>
<!-- Configure build settings -->
<build>
<dockerFileDir>${project.basedir}\src\docker\vending_machine_emulator</dockerFileDir>
<assembly>
<inline>
<fileSets>
<fileSet>
<directory>${project.basedir}\target</directory>
<outputDirectory>.</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</inline>
</assembly>
</build>
</image>
</images>
</configuration>
<executions>
<execution>
<id>docker:build</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>

Docker Terminal命令部署Docker镜像(从pom.xml所在目录)= mvn clean deploy -Pbuild-docker docker:push

注意,方法#2和方法#3之间的区别是方法#3有一个额外的<execution>用于部署。

方法#3=使用Maven自动部署到Docker Hub

把这些东西添加到你的父文件pom.xml中:

    <distributionManagement>
<repository>
<id>gene</id>
<name>chuangg</name>
<uniqueVersion>false</uniqueVersion>
<layout>legacy</layout>
<url>https://index.docker.io/v1/</url>
</repository>
</distributionManagement>




<profiles>
<profile>
<id>build-docker</id>
<build>
<plugins>


<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.18.1</version>
<configuration>
<images>
<image>
<name>chuangg/gene_project1</name>
<alias>${docker.container.name}</alias>
<!-- Configure build settings -->
<build>
<dockerFileDir>${project.basedir}\src\docker\vending_machine_emulator</dockerFileDir>
<assembly>
<inline>
<fileSets>
<fileSet>
<directory>${project.basedir}\target</directory>
<outputDirectory>.</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</inline>
</assembly>
</build>
</image>
</images>
</configuration>
<executions>
<execution>
<id>docker:build</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>docker:push</id>
<phase>install</phase>
<goals>
<goal>push</goal>
</goals>
</execution>


</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

进入c:\ users \ gene。并将其添加到您的配置中。json文件: # EYZ0 < / p >

现在在Docker快速入门终端类型= mvn clean install -Pbuild-docker

对于那些没有使用Maven概要文件的人,只需输入mvn clean install

下面是成功消息的截图: # EYZ0 < / p >

这是我完整的pom.xml和我的目录结构的截图:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>


<groupId>com.gene.app</groupId>
<artifactId>VendingMachineDockerMavenPlugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>


<name>Maven Quick Start Archetype</name>
<url>www.gene.com</url>


<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.gene.sample.Customer_View</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>


<source>1.7</source>
<target>1.7</target>


</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>




<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>


</dependencies>


<distributionManagement>
<repository>
<id>gene</id>
<name>chuangg</name>
<uniqueVersion>false</uniqueVersion>
<layout>legacy</layout>
<url>https://index.docker.io/v1/</url>
</repository>
</distributionManagement>




<profiles>
<profile>
<id>build-docker</id>
<properties>
<java.docker.version>1.8.0</java.docker.version>
</properties>
<build>
<plugins>


<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.18.1</version>
<configuration>
<images>
<image>
<name>chuangg/gene_project1</name>
<alias>${docker.container.name}</alias>
<!-- Configure build settings -->
<build>
<dockerFileDir>${project.basedir}\src\docker\vending_machine_emulator</dockerFileDir>
<assembly>
<inline>
<fileSets>
<fileSet>
<directory>${project.basedir}\target</directory>
<outputDirectory>.</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</inline>
</assembly>
</build>
</image>
</images>
</configuration>
<executions>
<execution>
<id>docker:build</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>docker:push</id>
<phase>install</phase>
<goals>
<goal>push</goal>
</goals>
</execution>


</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>

这是我的Eclipse目录: # EYZ0 < / p >

这是我的Dockerfile:

FROM java:8


MAINTAINER Gene Chuang
RUN echo Running Dockerfile in src/docker/vending_machine_emulator/Dockerfile directory


ADD maven/VendingMachineDockerMavenPlugin-1.0-SNAPSHOT.jar /bullshitDirectory/gene-app-1.0-SNAPSHOT.jar


CMD ["java", "-classpath", "/bullshitDirectory/gene-app-1.0-SNAPSHOT.jar", "com/gene/sample/Customer_View" ]
常见错误#1: # EYZ0 < / p >

错误#1的解决方案=不将<execution>与maven部署阶段同步,因为maven会尝试部署映像2x并在jar上放置时间戳。这就是为什么我使用<phase>install</phase>

只需简单的三步:

  1. < p > # EYZ0

    • 如果你忽略了--password,提示输入密码,这是推荐的,因为它不会存储在你的命令历史中
    • 李< / ul > < / >
    • # EYZ0

    • # EYZ0

如果你的docker注册表是私有的自托管,你应该做以下事情:

docker login <REGISTRY_HOST>:<REGISTRY_PORT>
docker tag <IMAGE_ID> <REGISTRY_HOST>:<REGISTRY_PORT>/<APPNAME>:<APPVERSION>
docker push <REGISTRY_HOST>:<REGISTRY_PORT>/<APPNAME>:<APPVERSION>

例子:

docker login repo.company.com:3456
docker tag 19fcc4aa71ba repo.company.com:3456/myapp:0.1
docker push repo.company.com:3456/myapp:0.1

首先登录您的私有存储库。

> docker login [OPTIONS] [SERVER]


[OPTIONS]:
-u username
-p password

例如:

> docker login localhost:8080

然后为您的私有存储库标记您的映像

> docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

例如:

> docker tag myApp:v1 localhost:8080/myname/myApp:v1

最后将您的标记图像推到您的私有存储库

>docker push [OPTIONS] NAME[:TAG]

例如:

> docker push localhost:8080/myname/myApp:v1

参考

简单的工作解决方案:

点击这里https://hub.docker.com/创建一个PRIVATE存储库,名称为johnsmith/private-repository,这是您在构建映像时将用于映像的NAME/REPOSITORY

  • 首先,# EYZ0

  • 其次,我使用“docker build -t johnsmith/private-repository:01 .”(其中01是我的版本名)来创建图像,我使用“docker images”来确认创建的图像,如下面的黄色框所示:(抱歉,我不能粘贴表格格式,只能粘贴文本字符串)

johnsmith/private-repository(REPOSITORY) 01(TAG) c5f4a2861d6e(IMAGE ID) 2 days ago(CREATED) 305MB(SIZE)

完成了!

裁判:# EYZ0

介绍部署和配置注册表的基本信息

运行本地注册表

在部署注册表之前,需要在主机上安装Docker。

使用如下命令启动注册表容器:

start_registry.sh

#!/bin/bash


docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /data/registry:/var/lib/registry \
registry:2

从Docker Hub复制一个映像到注册表

  1. 从Docker Hub中提取ubuntu:16.04图像。

    $ docker pull ubuntu:16.04
    
  2. Tag the image as localhost:5000/my-ubuntu. This creates an additional tag for the existing image. When the first part of the tag is a hostname and port, Docker interprets this as the location of a registry, when pushing.

    $ docker tag ubuntu:16.04 localhost:5000/my-ubuntu
    
  3. Push the image to the local registry running at localhost:5000:

    $ docker push localhost:5000/my-ubuntu
    
  4. Remove the locally-cached images. This does not remove the localhost:5000/my-ubuntu image from your registry.

    $ docker image remove ubuntu:16.04
    $ docker image remove localhost:5000/my-ubuntu
    
  5. Pull the localhost:5000/my-ubuntu image from your local registry.

    $ docker pull localhost:5000/my-ubuntu
    
Deploy a plain HTTP registry

According to docs.docker.com, this is very insecure and is not recommended.

  1. Edit the daemon.json file, whose default location is /etc/docker/daemon.json on Linux or C:\ProgramData\docker\config\daemon.json on Windows Server. If you use Docker for Mac or Docker for Windows, click Docker icon -> Preferences -> Daemon, add in the insecure registry.

    If the daemon.json file does not exist, create it. Assuming there are no other settings in the file, it should have the following contents:

    {
    "insecure-registries" : ["myregistrydomain.com:5000"]
    }
    

    启用不安全注册表后,Docker将执行以下步骤:

      首先,尝试使用HTTPS。
      • 如果HTTPS协议可用,但证书无效,请忽略证书错误。
      • 如果HTTPS不可用,请退回到HTTP。
      • 李< / ul > < / > 李< / ul > < / >
      • 重新启动Docker使更改生效。

在dockerhub上创建存储库:

# EYZ0

# EYZ0

请注意:这里 "repoNameOnDockerhub":您所提到的名称的存储库已经存在

"latest":只是标签

以下是将Docker Image推送到DockerHub的私有存储库的步骤

1-首先使用命令检查Docker图像

# EYZ0

2-查看Docker Tag命令帮助

# EYZ0

3-现在标记一个名称,以您创建的图像

docker tag localImgName:tagName DockerHubUser\Private-repoName:tagName(标签名是可选的。默认名称为latest)

4-在推送镜像到DockerHub Private Repo之前,请先使用命令登录DockerHub

docker login[提供dockerHub用户名和密码登录]

5-现在推Docker映像到您的私人回购使用命令

例如:docker push DockerHubUser\Private-repoName:tagName

6-现在导航到DockerHub Private Repo,你会看到Docker映像被推送到你的私有存储库上,在前面的步骤中名称写为TagName

还有一种“默认隐私”。在dockerhub中设置。访问https://hub.docker.com/settings/default-privacy或单击帐户设置->默认隐私。

将开关设置为“private”。

这不是一个完整的解决方案,但至少默认的私有比默认的公共要好。你可以返回并公开你想要的。

如果有人正在寻找一种快速的方法将所有图像推送到私有存储库, 你可以使用我的bash脚本-它会将所有Docker映像推送到新的私有注册表:

#!/bin/bash


repo="<change_to_your_new_repo>"
remote_repo="<the_new_repo_name>"


for img in $(docker images --format "\{\{.Repository}}:\{\{.Tag}}")
do
image=$(echo $img | cut -d ":" -f 1)
image_tag=$(echo $img | cut -d ":" -f 2)


docker image tag $image:$image_tag $repo/$remote_repo/$image:$image_tag
docker image push $repo/$remote_repo/$image:$image_tag


docker rmi $repo/$remote_repo/$image:$image_tag
done

在本地拉一个图像后,你可以做下面的事情:

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

然后docker push使用相同的标签。

docker push NAME[:TAG]

例子:

docker tag gvenzl/oracle-xe:21-slim quay.io/repository/yourDirectory/oracle_xe:oracle-xe


docker push quay.io/repository/yourDirectory/oracle_xe:oracle-xe

当推送到码头工人中心帐户时,无论是公共的还是私有的,过程都是相同的。

警察说:

我有一个标记为me/my-image的docker映像,并且我在dockerhub上有一个名为me-private的私有repo。
当我推动我的自我/我的形象时,我最终总是击中公共回购

最直接的问题是私有回购(me-private)的名称似乎与映像(my-image)不同。repo和映像必须具有相同的名称(减去任何标记)。

< p > # EYZ0
一个名为my-imagemy-image:tag的映像必须有一个my-image的repo名称 由于OP的回购被命名为me-private, Docker Hub不会将它们视为相同的,并将创建名为my-image.

的新repo

(默认情况下,新的回购将是公开的,除非您更改设置使所有存储库都是私有的。)


# EYZ0 # EYZ1

给定以下值:

username = yourusername
图片名称= theimage
Tag = thetag

1)标记(或提交)本地图像,添加带有用户名的前缀:

docker tag theimage:thetag yourusername/theimage:thetag

# EYZ0:

  • 如果您在组织,则需要双前缀的图像 -像这样:
docker tag theimage:thetag yourusername/yourorganizationname/theimage:thetag
  • 如果你的标签是latest:thetag部分可以省略;如果你没有输入:thetag部件,Docker会假设是:latest

2)将带前缀的图像推到Docker Hub:

 docker push yourusername/theimage:thetag

 docker push yourusername/yourorganizationname/theimage:thetag

对于private回购,需要以下额外步骤之一:

<强> < / >强

在上述第1步之前,在Docker Hub帐户中创建一个私有存储库

请记住,存储库名称必须与您计划推送的theimage相同。不要在存储库名称中包含thetag部分。例如,如果你的映像是ubuntu:14.04,你可以将你的存储库命名为ubuntu。(所有标记的图像-例如,ubuntu:latestubuntu:14.04等-将进入ubuntu回购。)

<强>或< / >强

如果你没有提前创建存储库(这是不需要!):转到您在码头工人中心中的帐户;点击新推出的回购,然后它的设置选项卡-并使你的回购私有。