# Docker
12/14 黑客社程式線社課
---
### ==**__線上__**== 社員簽到
[https://forms.gle/3TgNZeLSb69ekdyD6](https://forms.gle/3TgNZeLSb69ekdyD6)

---
### 先備條件
- Linux 基礎操作
- Windows 10 1903 (建置版本 18362) 以上
---
## 容器 vs 虛擬機

----
### 好處 - 相較於直接部屬
- 移植性高
- 安全
- 部屬快速
----
### 好處 - 相較於虛擬機
- 效能損耗低
- 映像檔案小
----
### 壞處
- 些微效能損耗
- 重新學習
- 架構調整
---
## Docker
熱門的 Linux 容器管理平台之一

---
### 架構

---
### Registry

----
### 官方架設的 Registry
善用別人已經建立好的映像檔
[hub.docker.com](https://hub.docker.com/)
---
### Client
圍繞在 docker 這個指令上

---
### 安裝 Docker
> 熱門的 ==Linux== 容器管理平台之一
Windows 要先裝 WSL2
----
### 安裝 WSL2 (一)
1. 以管理員身分執行以下指令
```cmd=
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
2. ==**重開機**==
----
### 安裝 WSL2 (二)
3. 安裝其中一種 Linux 發行版
- [Debian](https://www.microsoft.com/store/productId/9MSVKQC78PK6)
<!-- - [Ubuntu](https://www.microsoft.com/store/productId/9NBLGGH4MSV6) -->
----
### 安裝 WSL2 (三)
設定 Linux 系統的使用者名稱與密碼
它是另一套作業系統,不必跟 Windows 一樣

----
### 安裝 Docker Desktop
[Docker Desktop](https://www.docker.com/products/docker-desktop)
---
## Docker 指令
----
### docker help
善用[線上說明文件](https://docs.docker.com/engine/reference/commandline/cli/)或 help 指令
```bash=
docker --help
docker <COMMAND> --help
```
----
### 拉取映像檔
範例:從 registry 拉取 Debian 11 的映像檔到 host
```bash=
docker image pull debian:11
docker pull debian:11
```
----
### 推送映像檔
範例:將 Debian 11 的映像檔推送到 docker hub
```bash=
docker image push mikucat/debian-ssh:11
docker push mikucat/debian-ssh:11
```
----
### 建立映像檔
範例:使用當前目錄的 Dockerfile 建立映像檔
```bash=
docker build .
```
----
### 建立並運行容器
範例:以 Debian 11 映像檔建立容器
並命名為 example
```bash=
docker run --name=example debian:11
```
----
### 查看正在運行的容器
```bash=
docker container ps
docker ps
```
----
### 在容器中執行程式
範例:在 example 容器中執行 ls 指令
```bash=
docker container exec example /bin/ls
docker exec example /bin/ls
```
----
### 刪除容器
範例:刪除 example 容器
```bash=
docker container rm example
docker rm example
```
---
### Dockerfile
建構容器映像檔的腳本
關係類似這樣:
映像檔 <-> Dockerfile
執行檔 <-> 程式碼
[Dockerfile 線上說明文件](https://docs.docker.com/engine/reference/builder/)
---
### 手把手練習!
建立一個帶有 SSH 服務的 Debian 11 容器
----
### Dockerfile
```dockerfile=
FROM debian:11
RUN sed -i 's|archive.ubuntu.com|tw.archive.ubuntu.com|g' /etc/apt/sources.list \
&& mkdir /var/run/sshd \
&& echo 'root:hackersir' | chpasswd
RUN apt update \
&& apt install -y openssh-server \
&& sed -i 's|#PermitRootLogin.*|PermitRootLogin yes|' /etc/ssh/sshd_config \
&& sed 's|session\s*required\s*pam_loginuid.so|session optional pam_loginuid.so|g' -i /etc/pam.d/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]
```
----
### 建立映像檔
```bash=
docker build -t debian-ssh:11 .
```
----
### 運行
```bash=
docker run --name hackersir -itd --rm -p 10022:22 debian-ssh:11
```
----
### 測試 SSH 服務
密碼輸入 hackersir
```bash=
ssh -p 10022 root@localhost cat /etc/os-release
```
成功的話會顯示
```
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
```
---
### Docker Compose
- 處理容器之間的依賴關係
- 搭配 Dockerfile 快速測試應用程式
- 採用 YAML 宣告設定
[Docker Compose 線上說明文件](https://docs.docker.com/compose/compose-file/compose-file-v3/)
----
### 指令 vs 宣告
- 指令:狀態與狀態之間的更動
- 宣告:期望狀態

----
### 資料庫+網頁管理介面
docker-compose.yml
```yaml=
version: '3.9'
services:
mariadb:
image: mariadb
environment:
MARIADB_ROOT_PASSWORD: password
adminer:
image: adminer
ports:
- '8080:8080'
```
----
### 一鍵啟動(?)
```bash=
docker-compose up -d
```

----
### 停止
```bash=
docker-compose down
```
---
### 延伸關鍵字
- Docker Swarm
- Ansible
- Kubernetes
- Linux Capability
- Linux Namespace
- Linux Cgroups
---
### 課程回饋
[https://forms.gle/HXpg5DSggqvGXGxL7](https://forms.gle/HXpg5DSggqvGXGxL7)

{"metaMigratedAt":"2023-06-16T16:08:00.813Z","metaMigratedFrom":"YAML","title":"Docker","breaks":true,"description":"12/14 黑客社程式線社課","contributors":"[{\"id\":\"d5ff3cff-6013-437e-ac74-58dddd547e5a\",\"add\":6341,\"del\":1973}]"}