# Week17<br>
## Docker, Container, OS
[TOC]
----
Made by FanRende (030Mortal#5525)
<img src="https://www.docker.com/wp-content/uploads/2013/09/docker-meme.jpg.webp" width="60%">
###### [ref](https://www.docker.com/blog/docker-can-now-run-within-docker/)
---
## 什麼是 Docker
- Docker 是一個開源的容器化平臺,可用於構建、打包和運行應用程序。
- 它通過容器的方式提供了輕量級、可移植和可擴展的應用程序解決方案。
---
## 容器和虛擬機的差異

----
<div class="flex-container">
<div class="flex-content">
- 資源需求
- 虛擬機佔用大量的資源來運行完整的 OS
- 容器僅需要運行應用程序的運行時環境
- 啟動時間
- 虛擬機需要較長的啟動時間
- 容器可以在幾秒鐘內啟動。
- 隔離性
- 虛擬機提供了完整的隔離環境
- 容器共享主機的操作系統核心
- 效能開銷
- 虛擬機需要虛擬化,帶來額外的效能開銷
- 容器運行在主機的操作系統上,效能開銷較低。
</div>
<div class="flex-content">

</div>
</div>
---
## 容器的優點:
- 快速部署:容器可以在幾秒鐘內部署
- 隔離性:容器提供了隔離環境
- 可移植性:容器可以在不同的環境中運行
- 高效管理:容器可以通過 CI/CD 來管理和維護
---
## 安裝 Docker<br>(on Windows WSL2)
- [Install Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/)
- <img src="https://hackmd.io/_uploads/B1v49M-53.png" width=35%>
- WSL 中安裝 Client tools
```shell
sudo apt update
sudo apt install docker.io
sudo usermod -aG docker $USER
```
- `docker run hello-world`
----
### 成功畫面
<div class="flex-container">
<div class="flex-content">
- 
</div>
<div class="flex-content">
- 
</div>
</div>
---
## Docker 的基本使用步驟
- 定義 Dockerfile 描述 Image 的內容
- 構建映像 (Image)
- 創建容器 (Container) 並執行
- 使用 docker compose 建立關聯的多容器架構 (optional)
----
### Dockerfile
<img src="https://hackmd.io/_uploads/SJJKZ7W5h.png" width=75%>
```dockerfile=
# 使用 Ubuntu 作為基礎 Image
FROM ubuntu:latest
# 安裝需要的 Package
RUN apt-get update && apt-get install -y vim
# 設置工作目錄
WORKDIR /app
# 複製當下目錄到 container 中
COPY . /app
# 定義 container 執行的預設指令
CMD ["cat", "/app/example_file"]
```
----
- `docker build -t myimage .`

- `docker run -it myimage`

----
- 讓 container 執行後不會自行停止
```Dockerfile
CMD tail -f /dev/null
```
```shell
$ docker build -t myimage . --no-cache
```
- `docker run -itd myimage`
<img src="https://hackmd.io/_uploads/B1qVm7Wc3.png" width=75%>
- `docker exec -it <name> bash`
<img src="https://hackmd.io/_uploads/r1pIXmb53.png" width=75%>
---
## docker compose
<img src="https://hackmd.io/_uploads/BkzHtQZ52.png" width=65%>
```yaml=
# docker-compose.yaml
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- ./code:/code
depends_on:
- redis
redis:
image: redis
```
----
- `docker compose up -d`
<img src="https://hackmd.io/_uploads/Sy5zqQb9h.png" width=50%>
- `docker compose down`
<img src="https://hackmd.io/_uploads/Hkh-9Q-92.png" width=50%>
- overview
<img src="https://hackmd.io/_uploads/Syh5umW9n.png" width=50%>
---
參考 / 延伸閱讀:
- [Docker Desktop WSL 2 backend on Windows](https://docs.docker.com/desktop/wsl/)
- [Docker Hub](https://hub.docker.com/)
- [Dockerfile reference](https://docs.docker.com/engine/reference/builder/)
- [Docker Compose overview](https://docs.docker.com/compose/)
<div class="flex-container">
<div class="flex-content">
</div>
<div class="flex-content">
</div>
</div>
<style>
.gray {
color: gray;
font-size: 0.5em;
}
.slides .rust {
font-size: 0.75em !important;
line-height: 1.2em !important;
}
.mermaid {
background-color: rgba(1, 1, 1, .2) !important;
}
.slides code {
background-color: #444 !important;
border-radius: 10px;
white-space : pre-wrap !important;
padding-right: 0.1em;
padding-left: 0.1em;
}
.code-wrapper code {
background-color: inherit !important;
border-radius: inherit;
}
.flex-container {
display: flex;
justify-content: center;
}
.flex-content {
flex-grow: 1;
font-size: 0.75em;
}
</style>
<style>
/* Customize website's scrollbar like Mac OS */
::-webkit-scrollbar {
-webkit-appearance: none;
width: 7px;
}
::-webkit-scrollbar-thumb {
border-radius: 4px;
background-color: rgba(128, 128, 128, 1);
-webkit-box-shadow: 0 0 1px rgba(255, 255, 255, .5);
}
</style>
{"title":"Week17 - Docker, Container, OS","slideOptions":"{\"theme\":\"dark\",\"transition\":\"fade\",\"previewLinks\":true}","description":"簡介 Docker, container, os\n並介紹 Docker Desktop on Windows WSL2\n及基本 docker, docker compose 指令","image":"https://hackmd.io/_uploads/HylXaXW92.png","contributors":"[{\"id\":\"82f6b599-31b8-4112-9dc5-7d7b7d6a3ebb\",\"add\":5590,\"del\":1045}]"}