วิธีดันอิมเมจ docker ไปยังที่เก็บส่วนตัว


418

ผมมีภาพนักเทียบท่าติดแท็กเป็นme/my-imageและฉันมีซื้อคืนภาคเอกชนใน dockerhub me-privateชื่อ
เมื่อฉันผลักme/my-imageฉันลงเอยกระทบกับ repo สาธารณะเสมอ

ไวยากรณ์ที่ถูกต้องในการผลักดันภาพของฉันไปที่ repo ส่วนตัวของฉันคืออะไร?



1
คำว่า "ส่วนตัว" ไม่ได้เกิดขึ้นบนหน้าเว็บที่คุณเชื่อมโยง
Martin Andersson

คำตอบ:


617

คุณต้องติดแท็กรูปภาพให้ถูกต้องก่อนด้วยregistryhost:

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

จากนั้นนักเทียบท่าดันโดยใช้แท็กเดียวกันนั้น

docker push NAME[:TAG]

ตัวอย่าง:

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

1
ดังนั้นด้วยภาพนี้: 518a41981a6a ไวยากรณ์แท็กที่แท้จริงคืออะไรเพื่อให้ไปยัง repo ฉันส่วนตัวได้โปรด
Eugene Goldberg

10
docker tag 518a41981a6a me-private.com/myPrivateImage && docker push me-private.com/myPrivateImage
Abdullah Jibaly

2
ฉันแก้ไขปัญหาไวยากรณ์ในคำตอบของฉันด้านบนด้วย นอกจากนี้ fyi เมื่อคุณผลักดันรีจิสทรีคุณต้องใช้ชื่อภาพที่แท้จริงไม่ใช่รหัสภาพ
Abdullah Jibaly

ด้วยเหตุผลบางอย่างภาพยังคงไปที่รีจิสทรี dockerhub สาธารณะแทนส่วนตัว เพียงเพื่อความกระจ่าง - รีจิสทรีส่วนตัวของฉันยังอยู่ใน dockerhub ฉันติดแท็กรูปภาพและทำการผลักดัน แต่ข้อเสนอแนะแสดงให้เห็นว่าเลเยอร์ทั้งหมดได้ถูกผลักไปแล้วซึ่งจะไม่เกิดขึ้นหากภาพกำลังไปยังรีจิสตรีส่วนตัวเป็นครั้งแรก
Eugene Goldberg

11
โอ้ถ้าคุณใช้รีจิสทรี dockerhub ส่วนตัวมันควรจะค่อนข้างง่าย ตรวจสอบให้แน่ใจว่าคุณได้ทำสิ่งdocker loginแรกจากนั้นติดแท็กรูปภาพของคุณdocker tag 518a41981a6a me-private/myPrivateImageแล้วกด:docker push me-private/myPrivateImage
Abdullah Jibaly

213

เพียงสามขั้นตอนง่ายๆ:

  1. docker login --username username

    • แจ้งให้ใส่รหัสผ่านหากคุณไม่ใช้--passwordสิ่งที่แนะนำเนื่องจากไม่ได้จัดเก็บไว้ในประวัติคำสั่งของคุณ
  2. docker tag my-image username/my-repo

  3. docker push username/my-repo


42
ปล่อย--passwordธงทิ้งไว้หากคุณไม่ต้องการให้รหัสผ่านของคุณปรากฏในประวัติ มันจะแจ้งให้คุณ
AndrewD

5
ไม่ทำงานตามที่ไม่มีชื่อโฮสต์ของเอกชนกล่าวถึง
Boris Ivanov

@ BorisIvanov คุณหมายถึงอะไร?
ร่วมก่อตั้ง

4
@cowlinator คำตอบนี้ดูเหมือนจะใช้ Docker Hub มากกว่า repo ส่วนตัวตามที่คำถามถาม
duct_tape_coder

6
สิ่งนี้ไม่ได้ตอบคำถามของวิธีการส่งไปยังที่เก็บส่วนตัว
Mark K Cowan

48

ก่อนอื่นให้ไปที่บัญชี Docker Hub ของคุณแล้วทำ repo นี่คือภาพหน้าจอของบัญชี Docker Hub ของฉัน: ป้อนคำอธิบายรูปภาพที่นี่

จากรูปคุณสามารถเห็น repo ของฉันคือ“ chuangg”

ตอนนี้ไปที่ repo และทำให้เป็นส่วนตัวโดยคลิกที่ชื่อภาพของคุณ ดังนั้นสำหรับฉันฉันคลิกที่“ chuangg / gene_commited_image” จากนั้นฉันไปที่การตั้งค่า -> ทำให้เป็นส่วนตัว จากนั้นฉันทำตามคำแนะนำบนหน้าจอ ป้อนคำอธิบายรูปภาพที่นี่

วิธีอัปโหลดภาพ DOCKER ของคุณไปยัง DOCKER HUB

วิธีที่ # 1 = ผลักรูปภาพของคุณผ่านบรรทัดคำสั่ง (cli)

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

ใช่ฉันคิดว่ามันต้องเป็น ID คอนเทนเนอร์ อาจเป็นรหัสรูปภาพไม่ได้

ตัวอย่างเช่น = docker commit 99e078826312 chuangg/gene_commited_image

2) docker run -it chaung/gene_commited_image

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

ตัวอย่างเช่น = docker login --username=chuangg --email=gc.genechaung@gmail.com

ใช่คุณต้องเข้าสู่ระบบก่อน ออกจากระบบโดยใช้“ นักเทียบท่าออกจากระบบ”

4) docker push chuangg/gene_commited_image

วิธีที่ # 2 = ผลักรูปภาพของคุณโดยใช้ pom.xml และบรรทัดคำสั่ง

หมายเหตุฉันใช้ Maven Profile ชื่อ "build-docker" หากคุณไม่ต้องการใช้โปรไฟล์ให้ลบ<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 Image (จากไดเรกทอรีที่ 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.docker \ directory และเพิ่มลงในไฟล์ config.json ของคุณ: ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้อยู่ในเทอร์มินัล Docker Quickstart type = ของคุณ mvn clean install -Pbuild-docker

สำหรับผู้ที่ไม่ได้ใช้ Maven Profiles ให้พิมพ์ mvn clean install

นี่คือภาพหน้าจอของข้อความความสำเร็จ: ป้อนคำอธิบายรูปภาพที่นี่

นี่คือ 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 ของฉัน: ป้อนคำอธิบายรูปภาพที่นี่

นี่คือ 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: ป้อนคำอธิบายรูปภาพที่นี่

วิธีแก้ปัญหาสำหรับข้อผิดพลาด # 1 = อย่าซิงค์<execution>กับเฟสการปรับใช้ maven เพราะ maven จะพยายามปรับใช้อิมเมจ 2x และวางการประทับเวลาบน jar <phase>install</phase>นั่นเป็นเหตุผลที่ผมใช้


46

หากนักเทียบท่ารีจิสตรีของคุณเป็นส่วนตัวและโฮสต์ด้วยตนเองคุณควรทำสิ่งต่อไปนี้:

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

15

มีสองตัวเลือก:

  1. ไปที่ฮับและสร้างที่เก็บก่อนแล้วทำเครื่องหมายว่าเป็นส่วนตัว จากนั้นเมื่อคุณกดไปที่ repo มันจะเป็นแบบส่วนตัว นี่เป็นวิธีการทั่วไป

  2. เข้าสู่บัญชีของนักเทียบท่าฮับของคุณและไปที่การตั้งค่าระดับโลก มีการตั้งค่าที่ให้คุณตั้งค่าความสามารถในการมองเห็นเริ่มต้นของคุณสำหรับที่เก็บข้อมูลที่คุณกด ตามค่าเริ่มต้นจะถูกตั้งค่าเป็นสาธารณะ แต่หากคุณเปลี่ยนเป็นส่วนตัวที่เก็บข้อมูลทั้งหมดที่คุณกดจะถูกทำเครื่องหมายเป็นส่วนตัวตามค่าเริ่มต้น เป็นสิ่งสำคัญที่จะต้องทราบว่าคุณจะต้องมี repos ส่วนตัวให้เพียงพอในบัญชีของคุณมิฉะนั้น repo จะถูกล็อคจนกว่าคุณจะอัพเกรดแผนของคุณ


1
จริงอยู่คำถามที่โพสต์นั้นไม่ตรงไปตรงมาเท่าที่ควร แต่ฉันไม่สงสัยเลยว่าประเด็นสำคัญสำหรับผู้ถามคือข้อเท็จจริงที่ว่าที่เก็บข้อมูลบน Docker Hub นั้นเป็นแบบสาธารณะ ทว่าทุกคนในกระทู้นี้ส่วนใหญ่มีการใช้งานวิกิเพื่อการลงทะเบียนส่วนตัวรวมถึงการdocker pushออกคำสั่ง แต่ถ้าฉันเข้าใจคำถามถูกต้องไม่มีคำตอบใดที่ถูกต้องและคำตอบที่ Ken Cochrane โพสต์ไว้ข้างต้นเป็นคำตอบเดียวที่ควรได้รับการยอมรับ
Martin Andersson

สิ่งที่ฉันกำลังมองหา ดังที่ @MartinAndersson กล่าวไว้คำตอบข้างต้นในบรรทัดคำสั่งจะยังคงให้รูปภาพที่คุณผลักดันปรากฏต่อสาธารณะหากคุณกด DockerHub
Shaung Cheng

9

สร้างพื้นที่เก็บข้อมูลบน dockerhub:

$docker tag IMAGE_ID UsernameOnDockerhub/repoNameOnDockerhub:latest

$docker push UsernameOnDockerhub/repoNameOnDockerhub:latest

หมายเหตุ : ที่นี่ "repoNameOnDockerhub": ที่เก็บที่มีชื่อที่คุณพูดถึงจะต้องปรากฏบน dockerhub

"ล่าสุด": เป็นเพียงแท็ก


7

Ref: dock.docker.com

หัวข้อนี้ให้ข้อมูลพื้นฐานเกี่ยวกับการปรับใช้และกำหนดค่ารีจิสทรี

เรียกใช้รีจิสทรีในเครื่อง

ก่อนที่คุณจะสามารถปรับใช้รีจิสตรีคุณต้องติดตั้ง 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. ดึงubuntu:16.04ภาพจาก Docker Hub

    $ docker pull ubuntu:16.04
    
  2. localhost:5000/my-ubuntuแท็กภาพเป็น สิ่งนี้จะสร้างแท็กเพิ่มเติมสำหรับภาพที่มีอยู่ เมื่อส่วนแรกของแท็กเป็นชื่อโฮสต์และพอร์ต Docker จะตีความสิ่งนี้ว่าเป็นที่ตั้งของรีจิสทรีเมื่อทำการพุช

    $ docker tag ubuntu:16.04 localhost:5000/my-ubuntu
    
  3. ผลักภาพไปยังรีจิสทรีภายในที่ทำงานที่localhost:5000:

    $ docker push localhost:5000/my-ubuntu
    
  4. ลบภาพที่เก็บไว้ในเครื่อง นี่ไม่ได้เป็นการลบlocalhost:5000/my-ubuntuภาพออกจากรีจิสตรีของคุณ

    $ docker image remove ubuntu:16.04
    $ docker image remove localhost:5000/my-ubuntu
    
  5. ดึงlocalhost:5000/my-ubuntuภาพจากรีจิสตรีของคุณ

    $ docker pull localhost:5000/my-ubuntu
    
ปรับใช้รีจิสทรี HTTP ธรรมดา

ตามdocs.docker.comนี้เป็นอย่างมากที่ไม่ปลอดภัยและไม่แนะนำให้ใช้

  1. แก้ไขdaemon.jsonไฟล์ซึ่งตำแหน่งเริ่มต้นอยู่/etc/docker/daemon.jsonบน Linux หรือC:\ProgramData\docker\config\daemon.jsonบน Windows Server ถ้าคุณใช้Docker for MacหรือDocker for Windowsคลิกเพิ่มในDocker icon -> Preferences -> Daemoninsecure registry

    หากdaemon.jsonไฟล์ไม่มีอยู่ให้สร้างขึ้น สมมติว่าไม่มีการตั้งค่าอื่น ๆ ในไฟล์ควรมีเนื้อหาดังต่อไปนี้:

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

    เมื่อเปิดใช้งานการลงทะเบียนที่ไม่ปลอดภัย Docker จะทำตามขั้นตอนต่อไปนี้:

    • ก่อนอื่นให้ลองใช้ HTTPS
      • หาก HTTPS พร้อมใช้งาน แต่ใบรับรองไม่ถูกต้องให้ละเว้นข้อผิดพลาดเกี่ยวกับใบรับรอง
      • หากไม่สามารถใช้ HTTPS ให้ถอยกลับไปที่ HTTP
  2. รีสตาร์ท Docker เพื่อให้การเปลี่ยนแปลงมีผล


6

ก่อนเข้าสู่ระบบพื้นที่เก็บข้อมูลส่วนตัวของคุณ

> 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

ในที่สุดก็ผลักรูปภาพ taged ของคุณไปยังที่เก็บส่วนตัวของคุณ

>docker push [OPTIONS] NAME[:TAG]

เช่น:

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

การอ้างอิง


4

วิธีการทำงานที่เรียบง่าย:

https://hub.docker.com/ไปที่นี่เพื่อสร้างที่เก็บข้อมูลส่วนบุคคลที่มีชื่อเช่นjohnsmith/private-repositoryนี้คือที่NAME/REPOSITORYคุณจะใช้สำหรับภาพของคุณเมื่อสร้างภาพ

  • ครั้งแรก docker login

  • ประการที่สองฉันใช้ " docker build -t johnsmith/private-repository:01 ." (โดยที่ 01 เป็นชื่อรุ่นของฉัน) เพื่อสร้างภาพและฉันใช้ " docker images" เพื่อยืนยันภาพที่สร้างขึ้นเช่นในกล่องสีเหลืองด้านล่างนี้: (ขออภัยฉันไม่สามารถวางรูปแบบตาราง แต่สตริงข้อความเท่านั้น )

johnsmith / private-repository (REPOSITORY) 01 (TAG) c5f4a2861d6e (รหัสภาพ) 2 วันที่ผ่านมา (สร้างแล้ว) 305MB (ขนาด)

ทำ!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.