Comment pousser une image Docker vers un référentiel privé

418

J'ai une image de docker étiquetée comme me/my-image, et j'ai un dépôt privé sur le dockerhub nommé me-private.
Quand je pousse mon me/my-image, je finis toujours par frapper le repo public.

Quelle est la syntaxe exacte pour pousser spécifiquement mon image vers mon référentiel privé?

Eugene Goldberg
la source
1
Le mot «privé» n'apparaît même pas sur la page Web que vous avez liée.
Martin Andersson
Découvrez celui-ci sur Docker publier dans un référentiel privé
Sylhare

Réponses:

618

Vous devez d'abord étiqueter correctement votre image avec votre registryhost:

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

Docker push en utilisant cette même balise.

docker push NAME[:TAG]

Exemple:

docker tag 518a41981a6a myRegistry.com/myImage
docker push myRegistry.com/myImage
Abdullah Jibaly
la source
1
donc, avec cette image: 518a41981a6a, quelle est la syntaxe de balise réelle pour la faire passer au repo me-private, s'il vous plaît?
Eugene Goldberg
10
docker tag 518a41981a6a me-private.com/myPrivateImage && docker push me-private.com/myPrivateImage
Abdullah Jibaly le
2
J'ai également corrigé quelques problèmes de syntaxe dans ma réponse ci-dessus. En outre, fyi lorsque vous accédez à un registre, vous devez utiliser un nom d'image réel et non l'identifiant de l'image.
Abdullah Jibaly le
pour une raison quelconque, l'image va toujours au registre Dockerhub public au lieu du registre privé. Juste pour la clarification - mon registre privé est également sur le dockerhub. J'ai marqué l'image et j'ai fait le push, mais les commentaires indiquaient que toutes les couches avaient déjà été poussées, ce qui ne serait pas le cas si l'image allait dans le registre privé pour la première fois
Eugene Goldberg
11
Oh, si vous utilisez un registre Dockerhub privé, cela devrait être assez simple. Assurez-vous de faire une docker loginpremière, puis marquez votre image: docker tag 518a41981a6a me-private/myPrivateImageet appuyez sur:docker push me-private/myPrivateImage
Abdullah Jibaly
214

Trois étapes simples:

  1. docker login --username username

    • demande un mot de passe si vous omettez --passwordce qui est recommandé car il ne le stocke pas dans votre historique de commandes
  2. docker tag my-image username/my-repo

  3. docker push username/my-repo

Abhishek Dasgupta
la source
42
laissez le --passworddrapeau si vous ne voulez pas que votre mot de passe apparaisse dans l'historique. cela vous demandera.
AndrewD
5
ne fonctionne pas car aucun nom d'hôte de privateregistry n'est mentionné.
Boris Ivanov
@BorisIvanov, que voulez-vous dire?
Cowlinator
4
@cowlinator, Cette réponse semble utiliser Docker Hub plutôt qu'un dépôt privé comme le demande la question.
duct_tape_coder
6
Cela ne répond pas à la question de savoir comment passer à un référentiel privé .
Mark K Cowan
48

Accédez d'abord à votre compte Docker Hub et effectuez le repo. Voici une capture d'écran de mon compte Docker Hub: entrez la description de l'image ici

De la photo, vous pouvez voir que mon repo est "chuangg"

Maintenant, allez dans le repo et rendez-le privé en cliquant sur le nom de votre image. Donc pour moi, j'ai cliqué sur "chuangg / gene_commited_image", puis je suis allé dans Paramètres -> Rendre privé. Ensuite, j'ai suivi les instructions à l'écran entrez la description de l'image ici

COMMENT TÉLÉCHARGER VOTRE IMAGE DOCKER SUR LE HOCK DOCKER

Méthode n ° 1 = pousser votre image via la ligne de commande (cli)

1) docker commit <container ID> <repo name>/<Name you want to give the image>

Oui, je pense que ce doit être l'ID du conteneur. Il ne peut probablement pas s'agir de l'ID d'image.

Par exemple = docker commit 99e078826312 chuangg/gene_commited_image

2) docker run -it chaung/gene_commited_image

3) docker login --username=<user username> --password=<user password>

Par exemple = docker login --username=chuangg [email protected]

Oui, vous devez d'abord vous connecter. Déconnexion à l'aide de la «déconnexion du docker»

4) docker push chuangg/gene_commited_image

Méthode n ° 2 = pousser votre image en utilisant pom.xml et la ligne de commande.

Remarque, j'ai utilisé un profil Maven appelé «build-docker». Si vous ne souhaitez pas utiliser de profil, supprimez simplement les <profiles>, <profile>, and <id>build-docker</id>éléments.

À l'intérieur du parent 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 Command pour déployer l'image Docker (à partir du répertoire où se trouve votre pom.xml) = mvn clean deploy -Pbuild-docker docker:push

Remarque, la différence entre la méthode # 2 et # 3 est que la méthode # 3 a un supplément <execution>pour le déploiement.

Méthode n ° 3 = Utilisation de Maven pour déployer automatiquement sur Docker Hub

Ajoutez ce truc à votre parent 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>

Accédez au répertoire C: \ Users \ Gene.docker \ et ajoutez-le à votre fichier config.json: entrez la description de l'image ici

Maintenant dans votre Docker Quickstart Terminal type = mvn clean install -Pbuild-docker

Pour ceux d'entre vous qui n'utilisent pas les profils Maven, tapez simplement mvn clean install

Voici la capture d'écran du message de réussite: entrez la description de l'image ici

Voici mon pom.xml complet et une capture d'écran de la structure de mon répertoire:

<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>

Voici mon répertoire Eclipse: entrez la description de l'image ici

Voici mon 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" ] 

Erreur courante # 1: entrez la description de l'image ici

Solution pour l'erreur # 1 = Ne synchronisez pas la <execution>phase de déploiement avec maven car ensuite maven essaie de déployer l'image 2x et place un horodatage sur le bocal. Voilà pourquoi j'ai utilisé <phase>install</phase>.

Gène
la source
46

Si votre registre Docker est privé et auto-hébergé, vous devez procéder comme suit:

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

Exemple :

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
Nicolas Delaforge
la source
15

Il y a deux options:

  1. Accédez au hub, créez d'abord le référentiel et marquez-le comme privé. Ensuite, lorsque vous poussez vers ce dépôt, il sera privé. Il s'agit de l'approche la plus courante.

  2. connectez-vous à votre compte Docker Hub et accédez à vos paramètres globaux . Il existe un paramètre qui vous permet de définir votre visibilité par défaut pour les référentiels que vous envoyez. Par défaut, il est défini sur public, mais si vous le changez en privé, tous vos référentiels que vous envoyez seront marqués comme privés par défaut. Il est important de noter que vous aurez besoin d'avoir suffisamment de repos privés disponibles sur votre compte, sinon le dépôt sera verrouillé jusqu'à ce que vous mettiez à jour votre plan.

Ken Cochrane
la source
1
Certes, la question publiée n'est pas aussi simple que l'on pourrait souhaiter, mais je n'ai aucun doute que le problème clé pour l'interrogateur est le fait que les référentiels sur Docker Hub sont publics par défaut. Pourtant, tout le monde sur ce fil est principalement occupé à pomper des wikis pour les registres privés ainsi qu'à toucher à la docker pushcommande. Mais si j'ai bien compris la question, aucune de ces réponses n'est correcte et celle affichée ci-dessus par Ken Cochrane est la seule qui devrait être acceptée.
Martin Andersson
Exactement ce que je recherche. Comme @MartinAndersson l'a mentionné, les réponses ci-dessus en ligne de commande laisseront toujours votre image poussée en public, si vous appuyez sur DockerHub.
Shaung Cheng
9

Créer un référentiel sur dockerhub:

$docker tag IMAGE_ID UsernameOnDockerhub/repoNameOnDockerhub:latest

$docker push UsernameOnDockerhub/repoNameOnDockerhub:latest

Remarque : ici "repoNameOnDockerhub": le référentiel avec le nom que vous mentionnez doit être présent sur dockerhub

"dernier": c'est juste une balise

Anurag Manikkame
la source
7

Réf: dock.docker.com

Cette rubrique fournit des informations de base sur le déploiement et la configuration d'un registre

Exécutez un registre local

Avant de pouvoir déployer un registre, vous devez installer Docker sur l'hôte.

Utilisez une commande comme la suivante pour démarrer le conteneur de registre:

start_registry.sh

#!/bin/bash

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

Copiez une image de Docker Hub dans votre registre

  1. Tirez l' ubuntu:16.04image du Docker Hub.

    $ docker pull ubuntu:16.04
    
  2. Marquez l'image comme localhost:5000/my-ubuntu. Cela crée une balise supplémentaire pour l'image existante. Lorsque la première partie de la balise est un nom d'hôte et un port, Docker l'interprète comme l'emplacement d'un registre lors de la transmission.

    $ docker tag ubuntu:16.04 localhost:5000/my-ubuntu
    
  3. Envoyez l'image au registre local en cours d'exécution à localhost:5000:

    $ docker push localhost:5000/my-ubuntu
    
  4. Supprimez les images mises en cache localement. Cela ne supprime pas l' localhost:5000/my-ubuntuimage de votre registre.

    $ docker image remove ubuntu:16.04
    $ docker image remove localhost:5000/my-ubuntu
    
  5. Tirez l' localhost:5000/my-ubuntuimage de votre registre local.

    $ docker pull localhost:5000/my-ubuntu
    
Déployer un registre HTTP simple

Selon docs.docker.com , cela est très précaire et n'est pas recommandé .

  1. Modifiez le daemon.jsonfichier, dont l'emplacement par défaut est /etc/docker/daemon.jsonsous Linux ou C:\ProgramData\docker\config\daemon.jsonsur Windows Server. Si vous utilisez Docker for Macou Docker for Windows, cliquez sur Docker icon -> Preferences -> Daemon, ajoutez le insecure registry.

    Si le daemon.jsonfichier n'existe pas, créez-le. En supposant qu'il n'y ait pas d'autres paramètres dans le fichier, il devrait avoir le contenu suivant:

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

    Avec les registres non sécurisés activés, Docker passe par les étapes suivantes:

    • Tout d'abord, essayez d'utiliser HTTPS.
      • Si HTTPS est disponible mais que le certificat n'est pas valide, ignorez l'erreur sur le certificat.
      • Si HTTPS n'est pas disponible, revenez à HTTP.
  2. Redémarrez Docker pour que les modifications prennent effet.

David Ding
la source
6

Connectez-vous d'abord à votre référentiel privé.

> docker login [OPTIONS] [SERVER]

[OPTIONS]: 
-u username 
-p password

par exemple:

> docker login localhost:8080

Et puis marquez votre image pour votre référentiel privé

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

par exemple:

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

Poussez enfin vos images Taged vers votre référentiel privé

>docker push [OPTIONS] NAME[:TAG]

par exemple:

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

Référence

grue-yuan
la source
4

Solution de travail simple:

Allez ici https://hub.docker.com/pour créer un référentiel PRIVÉ avec un nom par exemple, johnsmith/private-repositoryc'est celui que NAME/REPOSITORYvous utiliserez pour votre image lors de la construction de l'image.

  • Première, docker login

  • Deuxièmement, j'utilise " docker build -t johnsmith/private-repository:01 ." (où 01 est le nom de ma version) pour créer l'image, et j'utilise " docker images" pour confirmer l'image créée, comme dans cette boîte jaune ci-dessous: (désolé, je ne peux pas coller le format du tableau mais la chaîne de texte uniquement )

johnsmith / private-repository (REPOSITORY) 01 (TAG) c5f4a2861d6e (ID D'IMAGE) Il y a 2 jours (CREATED) 305MB (SIZE)

Terminé!

Fumier
la source