---
tags: Docker, Golang, 隨手筆記
---
# 隨手筆記 - 以Golang為例建立Docker完整流程
## 本文目的
學習將golang bulid成docker的image
再綁定port run container
## 說明
**範例 Dockerfile:**
本文皆以此Dockerfile做範例
```dockerfile=
FROM golang:latest
WORKDIR /project_name
COPY . .
RUN go mod download
RUN go build -o main .
EXPOSE 3000
CMD ["./main"]
```
**第一行:**
指定基底image
這裡指定的是golang官方的最新image
```dockerfile=
FROM golang:latest
```
**第二行:**
指定專案資料夾
也就是整個專案的根目錄
```dockerfile=2
WORKDIR /project_name
```
**第三行:**
將專案內所有程式碼複製到docker根目錄
```dockerfile=3
COPY . .
```
**第四行**
RUN用於執行指令
這裡按照go.mod
安裝專案所需套件
```dockerfile=4
RUN go mod download
```
**第五行**
RUN用於執行指令
將專案編譯成可執行檔
```dockerfile=5
RUN go build -o main .
```
**第六行**
指定專案對外port號
記得要和專案內所指定的port號一樣
```dockerfile=6
EXPOSE 3000
```
**第七行**
執行已編譯好的2進位檔
```dockerfile=7
CMD ["./main"]
```
## Build & Run Container
**Build:**
用上面所寫的Dockerfile
build一個叫做user_name/project_name的image
<!-- (-t 參數代表建立) -->
```shell
docker build -t user_name/project_name .
```
**Run:**
按照剛剛bulid好的image
run一個container
並且將port號綁定本機的port號
```shell
docker run --rm -d -p 3000:3000 user_name/project_name
```
## 其他指令
**ps**
以下這個指令會列出
現在正在運行的container
```shell=1
docker ps
```
**stop**
將下列指令的 <CONTAINER ID>改成想停止的container id
就可以將container停掉
```shell
docker stop <CONTAINER ID>
```
**image rm**
刪除image by id
```shell
docker image rm -f IMAGE <image_id>
```
**push image to docker hub**
```shell
docker tag <image_name> <user_name>/<image_name>
docker push <user_name>/<image_name>
```