# แชร์ Docker Image ที่สร้างไว้

## 😢 ปัญหา

ของต่างๆที่เราสร้างไว้สามารถทำงานได้แค่ในเครื่องเราคนเดียวเท่านั้น ซึ่งคนอื่นๆในทีมไม่สามารถมาใช้งาน environement เดียวกับเราได้ หรือแม้แต่ตัวเราเองถ้าลง Windows ใหม่ก็ต้องไปนั่งไล่ติดตั้งของต่างๆใหม่อีกครั้ง เสียเวลาจุง

## 😄 วิธีแก้ปัญหา

เราสามารถสร้าง environment ที่เราอยากได้ทิ้งเอาไว้ในสิ่งที่เรียกว่า **Docker Imag**e ได้ แล้วเมื่อไหร่ที่เพื่อนในทีมหรือตัวเราอยากเอาไปใช้เพื่อให้เครื่องคอมแต่ละคนมี environment เดียวกัน ก็แค่เอา Docker Image ไปใช้ต่อได้นั่นโดยไม่ต้องเสียเวลาติดตั้งโปรแกรมอะไรลงเครื่องเลย&#x20;

จากบทความที่แล้วเราได้สอนการสร้าง Docker Image ไปเรียบร้อยแล้ว ซึ่งถ้าเพื่อนๆคนไหนยังไม่ได้อ่านก็สามารถกลับไปอ่านได้จากลิงค์ด้านล่างนี้เลยนะ ส่วนใครที่สร้างเป็นแล้วก็สามารถทำตามขั้นตอนถัดไปนี้ได้เลย

{% content-ref url="/pages/-LpcboSQRQm6qRV11O46" %}
[Image and Container](/basic/docker/image-and-container.md)
{% endcontent-ref %}

## 🤔 จะแชร์ Image ที่สร้างไว้ยังไง ?

หลังจากที่เราได้กำหนด environment ของเราทั้งหมดจนพอใจแล้ว เราก็จะได้ `Image` ออกมา ซึ่งคราวนี้ถ้าเราอยากจะแชร์ตัว image นี้ให้กับคนอื่นๆเอาไปใช้งานบ้าง เราจะต้องส่ง image ของเราขึ้นไปที่ `Docker registries`

### 🔥 Docker registries

(สำหรับคนที่ไม่รู้จัก Git อาจจะอ่านตรงนี้แล้ว งงๆ ก็ให้เข้าใจแค่มันมีเซิฟเวอร์กลางเอาไว้เก็บ Image ของทุกๆคนบนโลกไว้ก็พอ) ถ้าจะให้พูดให้ถูกคือ docker registries จะเป็นมราเก็บ collection ของ repositories ของ user แต่ละคนไว้ และแต่ละ repository จะเก็บ collection ของ Image ไว้อีกทีนึง ซึ่งเจ้า repository ก็จะเหมือนกับของ GitHub ที่มี version ต่างๆของ Image ที่เรา push ขึ้นมานั่นเอง

> โดยปรกติมัน Image ของเราจะถูกเปิดเป็น Public ให้ทุกคนบนโลกสามารถนำ Image เราไปใช้ต่อได้ แต่ถ้าต้องการปิดให้ใช้เฉพาะตัวเองหรือองค์กรเราต้อง push image เราไปที่ `Trusted Registry` แทน

### 🔥 Login

อะเคร๊! ก่อนที่เราจะส่ง Image ของเราไปที่ตัว Docker registries เราก็ต้องทำการ Login กันก่อนด้วยคำสั่งด้านล่างนี้เบย

```
docker login
```

> หากยังไม่มี account ให้ไปสมัครได้จากลิงค์นี้ [https://hub.docker.com](https://hub.docker.com/) ฟรีจ้า

ก่อนที่จะไปต่อผมขออธิบายตรงนี้ไว้นิสนึงว่า Docker registries มันจะมีรูปแบบในการเข้าถึง Image ของแต่ละคนเป็นรูปแบบนี้ `username/repository:tag` ซึ่งตัว Tag จริงๆจะใส่หรือไม่ใส่ก็ได้ แต่ทาง Docker แนะนำว่าให้ใส่ไว้จะดีกว่า เพราะมันเหมือนกับเป็นตัวบอกเวอร์ชั่นของ image ของเรานั่นเอง

### 🔥 Tag

คราวนี้เราจะลองติด tag ให้กับ image ของเรากันบ้าง ซึ่ง docker จะใช้ลักษณะคำสั่งแบบด้านล่างนี้ (ไม่ได้ให้พิมพ์ตามนะ วางถุงกาวลงก่อน)

```
docker tag image username/repository:tag
```

เช่นผมมี image ที่สร้างไว้จากบทก่อนหน้าที่ชื่อว่า `python-img` ส่วนชื่อผู้ใช้ของผมคือ `sakul` แล้วก็ผมอยากจะเอา image ของผมไปแชร์โดยใช้ชื่อว่า `demo-python` ซึ่งผมคิดว่า environment ที่ตั้งไว้มันมีแต่ตัวพื้นฐานดังนั้นผมจะติด tag เป็น `simple` ละกัน ดังนั้นผมจะใช้คำสั่งในการติด tag image นี้ตัวตามคำสั่งด้านล่าง (คราวนี้จะพิมพ์ตามก็ตามสะดวกเลย)

```
docker tag python-img sakul/demo-python:simple
```

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

```
docker images
```

เราก็จะเห็น image ตัวใหม่ที่มีการติด tag ตามที่เรากำหนดไว้โผล่มา

```
REPOSITORY             TAG                 IMAGE ID
python-img             latest              dc76a5395170
sakul/demo-python      simple              dc76a5395170
python                 2.7-slim            eb40dcfcbc42
```

## 🤔 ส่ง image ขึ้นเซิฟเวอร์ทำไง ?

คราวนี้เราก็จะส่ง image ของเราขึ้นไปที่บนเซิฟเวอร์กันละ ด้วยโดยใช้คำสั่งรูปแบบด้านล่าง (อย่าพิมพ์ตามตรงๆนะ ไปแก้ชื่อเป็นของตัวเองด้วย - บอกแล้วไงวางถุงกาวลงก๊อนนนน!!)

```
docker push username/repository:tag
```

ซึ่งในกรณีของผม ก็จะใช้เป็นคำสั่งนี้

```
docker push sakul/demo-python:simple
```

## 🤔 เอา image ที่อยู่บนเซิฟเวอร์มาใช้ยังไง ?

หลังจากที่มันอัพโหลดทุกอย่างไปเสร็จละ ใครอยากจะใช้ image ของเราก็สามารถเอามาลงเครื่องเขาได้เลยด้วยคำสั่งด้านล่าง (ไปแก้ชื่อเป็นของตัวเองด้วย!!)

```
docker pull username/repository:tag
```

ซึ่งในกรณีของผม ก็จะใช้เป็นคำสั่งนี้

```
docker pull sakul/demo-python:simple
```

เพียงแค่นี้เราก็จะได้ image ที่เคย publish ไว้กลับมาลงที่เครื่องได้แบ๊ว ดังนั้นผมก็จะลองเอา image ที่ได้ไปลองสร้าง container เล่นต่อด้วยคำสั่งนี้ (แก้ชื่อเองด้วย)

```
docker run -p 4000:80 sakul/demo-python:simple
```

เห็นมะการแชร์ image นั้นง่ายม๊วก


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.saladpuk.com/basic/docker/share-image.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
