การ Build Docker Image ขึ้นสู่ Registry - แนะนำ Docker Registry ฟรี
หลังจากที่เราเขียน Dockerfile กันเป็นแล้ว นั่นแปลว่าเราก็จะมี Image เป็นของตัวเองเรียบร้อยแล้ว และเพื่อให้สะดวกในอนาคต เราก็จะส่ง Image นี้ไปเก็บไว้ที่ registry กัน
Docker Registry ก็คือที่เก็บ docker image ซึ่งทุกคนที่เคยใช้ docker ก็ต้องเคยดึง image จาก Docker Hub กันอยู่แล้ว นอกจากเราจะสามารถสรรหา image และดึงลงมาใช้งานกันได้แล้ว เรายังสามารถส่ง image ของเราขึ้นไปที่ Docker Hub ได้ด้วยนะ
มาเริ่มกันที่ เขียน Dockerfile กันก่อน
ครั้งนี้เราสร้าง image ที่ run java application บน container กัน
Dockerfile
Step 1/3 : ตั้งต้น parent image ด้วย OpenJDK
Step 2/3 : ก็อปไฟล์ *.jar จากเครื่อง host เข้าไปใน container
Step 3/3 : run *.jar
*.jar ไฟล์ที่ใช้เป็น spring boot application ซึ่งสามารถรันได้ทันที ซึ่งผมได้เตรียมไว้ให้แล้ว
Download >> discovery-service-1.0-SNAPSHOT.jar
เปิด http://localhost:8888/ ก็ควรจะเห็นอะไรแบบนี้
public repository
ตัวอย่างนี้มาลองใช้ demo จาก Harbor กัน
เมื่อ image ขึ้นสู่ registry แล้วเราจะดูได้จากหน้าเว็บของ Registry ที่เราเอาขึ้นไป แปลว่าเราก็จะสามารถ pull มาใช้งานได้แล้ว
Docker Registry ก็คือที่เก็บ docker image ซึ่งทุกคนที่เคยใช้ docker ก็ต้องเคยดึง image จาก Docker Hub กันอยู่แล้ว นอกจากเราจะสามารถสรรหา image และดึงลงมาใช้งานกันได้แล้ว เรายังสามารถส่ง image ของเราขึ้นไปที่ Docker Hub ได้ด้วยนะ
มาเริ่มกันที่ เขียน Dockerfile กันก่อน
ครั้งนี้เราสร้าง image ที่ run java application บน container กัน
Dockerfile
FROM openjdk:8-jdk-alpine ADD ./discovery-service-1.0-SNAPSHOT.jar /data/springboot-app.jar ENTRYPOINT ["java","-jar","/data/springboot-app.jar"]
Step 1/3 : ตั้งต้น parent image ด้วย OpenJDK
Step 2/3 : ก็อปไฟล์ *.jar จากเครื่อง host เข้าไปใน container
Step 3/3 : run *.jar
*.jar ไฟล์ที่ใช้เป็น spring boot application ซึ่งสามารถรันได้ทันที ซึ่งผมได้เตรียมไว้ให้แล้ว
Download >> discovery-service-1.0-SNAPSHOT.jar
ลอง build มาทดสอบกันก่อน (ใครขี้เกียจจะข้ามไปเลยก็ได้)
$ docker build -t discovery .
$ docker run -p 8888:8888 discovery
เปิด http://localhost:8888/ ก็ควรจะเห็นอะไรแบบนี้
การเอา Docker Image ขึ้นสู่ Registry
มองหา Registry
สิ่งที่ต้องเตรียมคือ เราต้องรู้ว่าเราจะเอาของขึ้นไปที่ไหน ซึ่งมีให้เลือกใช้ทั้งแบบ public repository และแบบติดตั้งเป็น local/private repository ขึ้นอยู่กับความสะดวกpublic repository
- Docker Hub (https://hub.docker.com/) - ตัวนี้ทุกคนน่าจะรู้จักกันอยู่แล้ว ถ้ามี id จะสามารถ สามารถนำขึ้นแบบเปิดเผยสู่สาธารณะได้ฟรี (public) แต่ถ้าอยากใช้ส่วนตัว (private) ก็มีให้ใช้ฟรี 1 ช่อง (เปย์เพิ่มได้)
- GitLab Container Registry (https://gitlab.com/) - GitLab อาจโด่งดังมาจากการเป็น version control แต่จริงๆ เราสามารถเอา Docker Image ขึ้น repo ได้ด้วย
- Harbor (https://goharbor.io/) - เป็น Open Source ที่ให้โหลดไปติดตั้งเองได้ ซึ่งมี demo ให้ทดลองใช้ https://demo.goharbor.io/
- Registry Image (https://hub.docker.com/_/registry) - เป็น docker image ที่สำหรับสร้าง registry ขึ้นมาอีกที
Login Registry
เราจำเป็นต้องรู้ URL registry ของแต่ละเว็บ ซึ่งสามารถดูได้จาก document ของเว็บนั้นๆWebpage | Registry URL | |
---|---|---|
Docker Hub | https://hub.docker.com/ | registry.hub.docker.com |
GitLab | https://gitlab.com/ | registry.gitlab.com |
Harbor | https://demo.goharbor.io/ | demo.goharbor.io |
ตัวอย่างนี้มาลองใช้ demo จาก Harbor กัน
$ docker login demo.goharbor.io
Build & Push image
การ build เพื่อขึ้นสู่ registry มีความแตกต่างจากการ build ธรรมดาเพียงแค่ต้องเพิ่ม URL registry เข้าไปใน tag ด้วย$ docker build -t demo.goharbor.io/myprojects/discovery .จากนั้นก็ push ด้วยชื่อ tag ได้เลย **ต้องเหมือนกันกับตอน build
$ docker push demo.goharbor.io/myprojects/discovery
hub.docker.com |
demo.goharbor.io |
gitlab.com |
การใช้งาน
เมื่อ image ขึ้นสู่ registry แล้วเราจะดูได้จากหน้าเว็บของ Registry ที่เราเอาขึ้นไป แปลว่าเราก็จะสามารถ pull มาใช้งานได้แล้ว$ docker pull demo.goharbor.io/myprojects/discovery:latest