DevOps 101 Nexus Repository

สวัสดีครับ วันนี้ผมจะมาพูดถึง tools อีกตัวนึง ที่สำคัญมาก ในการทำ CI/CD นะครับ
นั่นก็คือ Repository ที่เอาไว้เก็บของต่างๆ ของเรา ไม่ว่าจะเป็น docker images, libs, หรือ files binary ต่างๆ ที่นิยมกัน ก็จะมี JFrog Artifactory กับ Nexus วันนี้ ผมจะมาพูดถึงเจ้า Nexus กันนะครับ ..

รายละเอียด เพิ่มเติม https://www.sonatype.com/products/repository-pro

ความสามารถของเจ้า Nexus นั้นมีมากมายมากครับ และมี version ที่เป็น OSS อีกด้วย

ส่วนตัวที่ผมใช้ ก็จะใช้เป็น docker repository กับ docker proxy เพื่อใช้งาน ในองค์กร ทั้งแบบ On-Prem และแบบ Public ครับ หลายๆ ท่านอาจจะคุ้นกับ docker hub จะคล้ายๆ กันเลยครับ ..

อธิบายเพิ่มเติมนะครับ

Docker Repository = ที่เก็บ docker images ของเราครับ มองว่าเป็น docker hub ส่วนตัว ประมาณนั้นครับ ..
Docker Proxy = มองว่าเป็น proxy ที่ไปดึง docker images จากที่อื่นอีกที เช่นไปดึงจาก docker hub อะไรพวกนี้ .. ที่ต้องมี docker proxy นอกเหนือจากช่วย caching docker images แล้ว บางที่ network ภายใน ไม่สามารถ access public โดยตรงได้ ก็เลยต้องใช้เป็น docker repository (docker proxy) ภายในแทนครับ ..

มาดูวิธีการติดตั้งกันครับ ในที่นี่ จะติดตั้งแบบใช้ docker นะครับ (อันนี้ตามสะดวกเลยครับ)

1. Create directory nexus-data

mkdir ~/nexus-data

2. Docker Run

docker run -d -p 8081:8081 -p 5000:5000 -p 5001:5001 --name nexus -v ~/nexus-data:/nexus-data sonatype/nexus3

ที่เรา expose ออกมา 3 port ก็เพื่อเอาไว้ จัดการเรื่องต่างๆ ดังนี้ครับ
– Port 8081 สำหรับหน้า Nexus Dashboard
– Port 5000 สำหรับ docker pull
– Port 5001 สำหรับ docket push

3. จากนั้นเข้า หน้า Nexus Dashboard ด้วย IP:PORT

http://localhost:8081/

4. จะขึ้นหน้า ให้เรา Login จาก password ที่ได้จาก file admin.password

cat ~/nexus-data/admin.password 
89e5664b-f748-49e4-a7dc-cdcc3febdd6b

5. เมื่อทำการ update new password เรียบร้อยแล้ว จะเข้ามาที่หน้าแรกของ nexus ให้คลิกที่ รูปเฟือง แล้วเลือก Repositories > Create repositories

Create repositories

6. จะเห็นว่า มีให้เราเลือกเยอะแยะมากมาย ว่าจะ create repositories ประเภทไหนกันบ้าง ..

Select Recipe

ในที่นี้ ผมจะเลือกเป็น docker (hosted) เพื่อเอาไว้เก็บ private docker images ที่เอาไว้ใช้กันเองภายในองค์กร หน่วยงาน แทน public docker repository พวก docker hub ..

7. เลือก Create repository: docker (hosted) ใส่ค่าต่างๆ ประมาณนี้

Name: docker-private
HTTP: 5001 (Port 5001 จะเอาไว้ใช้ docker push)

Create repository: docker (hosted)

8. ต่อมาเลือก Create repository: docker (proxy) ใส่ค่าต่างๆ ประมาณนี้

Name: docker-hub
Remote storage: https://registry-1.docker.io
Docker Index: Use Docker Hub

Create repository: docker (proxy)

9. จากนั้นเลือก Create repository: docker (group) เพื่อรวม docker (hosted) และ docker (proxy) เข้าด้วยกัน ใส่ค่าต่างๆ ประมาณนี้

Name: docker-group
HTTP: 5000 (Port 5000 จะเอาไว้ใช้ docker pull)

Create repository: docker (group)

ตรงด้านล่าง ในส่วนของ Group

Member repositories: ให้คลิกเลือก docker-private และ docker-hub มาอยู่ในส่วนของ Members

Member repositories

*** เพิ่มเติม ***

สำหรับ docker repository ที่ URL ไม่มี SSL (https) เราต้องทำการ set เพิ่มเติม ในส่วนของ Docker Desktop ให้รองรับ insecure-registries โดยไปที่ Preferences > Docker Engine จากนั้น เพิ่มส่วนนี้ลงไป ..

“insecure-registries”: [“IP:5000”, “IP:5001”],

โดย IP ก็คือ IP ของ Server เรา หรือถ้าเป็น domain ก็ใส่ ชื่อ domain ลงไป

insecure-registries

ในกรณีที่เรา ต้องการ ให้ docker pull ได้แบบ anonymous ไม่ต้องมีการ login
ให้มาติ๊กที่ Allow anonymous docker pull: ในส่วนของ docker-group ครับ

Allow anonymous docker pull:

จากนั้น ให้ไปที่ Realms เลือก Docker Bearer Token Realm เป็น Active

Docker Bearer Token Realm

มาถึงวิธีการทดสอบครับ

ให้เราลอง ทดสอบง่ายๆ ประมาณนี้

# Docker Login
docker login http://IP:5000
docker login http://IP:5001
# Docker Pull
docker pull IP:5000/nginx
# Docker Build
docker build -t IP:5000/demo-app .
# Docker Tag
docker tag IP:5000/demo-app IP:5001/demo-app
# Docker Push
docker push IP:5001/demo-app 
# Docker Run
docker run -p 5000:5000 IP:5000/demo-app 

เพียงเท่านี้ เราก็จะได้ docker repository ของเราเองมาใช้แล้วครับ 🙂

แล้วพบกับ การแนะนำ tools ต่างๆ ที่จำเป็น และมีประโยชน์ สำหรับ DevOps (CI/CD) ในตอนต่อไปเร็วๆ นี้ครับ ..