---
# System prepended metadata

title: Docker實戰入門
tags: [DevOps, 入門, Ruisi]

---

# Docker實戰入門
![](https://i.imgur.com/CqI2MHx.png)

## 1.1. 什麼是Docker
容器基於共用linux kernel
### 1.1.1. Docker主要組成
- Docker Container
- Docker Engine (Runtime)

#### 1.1.1.1. Build
- 參與並簡化CI/CD流程
#### 1.1.1.2. Share
- 可攜性
#### 1.1.1.3. Run
- 運行環境相同
- 獨立執行環境

## 1.2. 虛擬化 v.s. 容器化

|           | VM               | Container           |
|-----------|------------------|---------------------|
| 隔離      | OS層(共用硬體層) | Process層(共用OS層) |
| Image體積 | 大               | 小                  |
| 占用資源  | 大               | 小                  |
| 啟動速度  | 慢               | 快                  |

## 1.3. Docker Desktop for Windows

### 1.3.1. Install
#### 1.3.1.1. Installer
https://www.docker.com/get-started/
#### 1.3.1.2. Chocolatey
```` sh
choco install docker-desktop
````
## 1.4. Container Image Repository (Container Registry)
- [DockerHub](https://hub.docker.com/)
- Github Packages
- Azure Container Registry
- etc.

## 1.5. Docker 常用指令
### 1.5.1. pull
下載容器image，預設從DockerHub
````sh
docker pull busybox
````
### 1.5.2. run
執行一個容器，如果不存在image，則會自動進行pull
````sh
docker run busybox
````
常用參數，要注意參數擺放位置
- `-d`背景執行
- `-P`隨機prot映射
- `-p`指定port映射
- `--name`為容器命名
- `-e`設定環境變數
- `-v`綁定volume
- `-i` 互動模式
- `-t` 分配容器TTY並綁定到標準輸出
- `-it` -i及-t同時使用，俗稱進到容器裡操作
### 1.5.3. stop
停止容器
````sh
// e1是容器的uuid
docker stop e1
````
### 1.5.4. rm
刪除容器
````sh
// e1是容器的uuid
docker rm e1
````
### 1.5.5. ps
容器執行狀態(image, uuid, command, 創建時間, 狀態, 占用port, 名稱)
````sh
docker ps
````
````sh
// 加上-a可以看到非執行狀態中的容器
docker ps -a
````
## 1.6. 容器儲存資料
Docker不會儲存狀態，每次重啟容器都是新的開始，因此必須掛載儲存體來儲存容器中記錄的資料

### 1.6.1. Volume
````sh
// 創建一個volume
docker volume create volume_name
````
````sh
// 綁定volume
docker run -v volume_name:Container_paht Image_mane
````
````sh
// volume不存在時會以uuid自動生成
docker run -v Container_paht Image_name
````

### 1.6.2. 路徑映射
````sh
// 將容器內與容器外的檔案系統綁定
docker run -v 絕對位置:Container_paht Image_name
````

## 1.7. 如何製作DOCKERFILE & 建構一個Image
 DOCKERFILE可以使CI/CD中的Build及Deploy的部分更簡單
### 1.7.1. 簡單的DOCKERFILE
````dockerfile
FROM golang:1.18
WORKDIR /go/src
COPY main.go .
COPY go.mod .
ENV CGO_ENABLED=0
RUN go get -d -v ./...
RUN go build -a -installsuffix cgo -o main .
EXPOSE 8080/tcp
ENTRYPOINT ["./main"]
````
### 1.7.2. Build&RUN
````sh
docker build -t Image_name Path
````
### 1.7.3. 進階的DOCKERFILE
````dockerfile
FROM golang:1.18 AS build
WORKDIR /go/src
COPY main.go .
COPY go.mod .
ENV CGO_ENABLED=0
RUN go get -d -v ./...
RUN go build -a -installsuffix cgo -o main .

FROM scratch AS runtime
WORKDIR /app
COPY --from=build /go/src/main ./
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
EXPOSE 8080/tcp
ENTRYPOINT ["./main"]
````
## 1.8. 好用的GUI工具
https://www.portainer.io/
### 1.8.1. Install
````sh
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.11.1
````
## 1.9. Docker-compose
一個可以一次啟動多個容器的工具

````yml
version: '2'
services:
  db:
     image: mysql
     environment:
        MYSQL_ROOT_PASSWORD: 123456
  admin:
     image: adminer
     ports:
       - 8080:8080
````

## 1.10. Contanier Cluster
容器的可攜性使其可以在任意的主機上進行部署  
因此加入Cluster技術後可以使容器在多台主機中進行資源調度  

容器調度管理器
### 1.10.1. Kubernetes (k8s)
- 主流管理器
- 功能很多很強
- 資源及套件很充足
- 非常複雜且難度非常高

### 1.10.2. Docker Swarm
- 極輕量化
- Docker原生
- 更簡單

### 1.10.3. K3s
- k8s官方認證
- 輕量化
- 邊緣運算


## 1.11. 投票下次內容
- 宇宙最強程式語言 - Golang
- 為AI而生的程式語言 - Deno
- Dart語言腳踏三條船 - Flutter2.0
- 免費又開源的虛擬機叢集 - ProxmoxVE
- SPA中的宇宙戰艦 - Angular

## 1.12. 範例程式
[Github](https://github.com/Ruisi-Lu/open-course-ware/tree/main/Docker%E5%AF%A6%E6%88%B0%E5%85%A5%E9%96%80)


###### tags: `入門`, `Ruisi`, `DevOps`