Docker 虛擬化技術

Docker 是一個虛擬化技術
可以根據映像檔製作獨立的容器來模擬特定環境

很多人認識 docker 是為了部署作業
不過除了部署還有很多的學習價值
像是用來認識不同的作業系統與環境

底下就來說明 Docker 的基本使用方式吧!

  • 用 homebrew 來安裝 Docker
  • Docker 中的 image 和 container
  • Docker 的基本指令
  • 替 React 專案撰寫 Dockerfile

用 homebrew 來安裝 Docker

首先這是 Docker 的官網
進去可以直接下載 Docker Desktop

因為本身是使用 macOS 作業系統
順便推廣一下 homebrew
homebrew 是一個 macOS 的套件管理工具
能以指令的方式統一且輕鬆的管理電腦上安裝的軟體

基本上安裝的軟體都會被放在 /opt/homebrew 下面
另外使用 brew list 就可以看見自己安裝過的軟體有哪些

使用 brew search docker 在列表中查看 docker 軟體

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
==> Formulae
docker docker-machine-driver-vmware
docker-buildx docker-machine-driver-vultr
docker-clean docker-machine-driver-xhyve
docker-completion docker-machine-nfs
docker-compose docker-machine-parallels
docker-compose-completion docker-slim
docker-credential-helper docker-squash
docker-credential-helper-ecr docker-swarm
docker-gen docker2aci
docker-ls dockerize
docker-machine lazydocker
docker-machine-completion powerman-dockerize
docker-machine-driver-hyperkit mockery

==> Casks
docker ✔ docker-toolbox dockey dozer

可以注意到有兩個分類都有 docker
這兩個分類分別是:

  • Formulae
  • Casks

中文名稱是配方(Formulae)和酒桶(Casks)
是 homebrew 裡面的術語
配方代表的是 CLI 工具(文字指令行介面)
酒桶則是 GUI 工具(圖形化使用者介面)

GUI 使用上比較親民也和官網直接下載的一樣
另外也同時包含了 CLI 的用法
所以可以直接安裝 Casks 裡面的 docker
當安裝過後再搜尋時就會看見小勾勾
代表這是已經安裝過的軟體

使用 homebrew 安裝 GUI 版本的 docker:

brew install --cask docker

Docker 中的 image 和 container

在使用 Docker 前要先認識的兩個術語

  • image 映像檔/鏡像
  • container 容器

image 可以理解為包含了特定服務及環境的模板檔案
而 container 則是 image 的運行實例並且和原先的系統有所分隔

至於映像檔有哪些呢?
可以到 docker hub 上面搜索

Docker 的基本指令

安裝完成後
如果直接下 docker 的相關指令會發現無法運行
而且會得到底下的訊息:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock.
Is the docker daemon running?

這則訊息是在說明 daemon 尚未運行
翻譯查了一下 daemon 可以叫做守護進程或是常駐程式
指在電腦後台運行的程式
為使其運行可以直接點擊 docker 圖像啟動
或是使用指令 open --background -a docker

當安裝完 docker 並確認將其在後台運行後
接下來就可以安裝 image 了


這邊以下載 nginx 的 image 為例

docker pull nginx

這樣就可以下載最新版的 nginx image 到本地


如果要查看本地已經有的 image 可以使用下面指令

docker images


運行容器方式

docker run -d -p 80:80 nginx

參數說明
-ddaemon -> 守護進程
-pport -> local:container -> 表示本機的 80 port 會映射到容器裡的 80 port

另外因為 nginx 是網頁伺服器
預設 80port 為其根目錄
所以此時本機網址用 localhost 可以看到 nginx 的歡迎畫面

1
2
3
4
5
6
7
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

確認運行中的容器

docker ps

CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
4d251324d169nginx“/docker-entrypoint…”5 minutes agoUp 5 minutes0.0.0.0:80->80/tcp, :::80->80/tcprecursing_wilson

註:docker ps -a 可以查看所有容器包含未運行的


再來是進入容器的終端機

docker exec -it 4d251324d169 /bin/bash

4d251324d169 為上一步驟查到的 CONTAINER ID

-it 每次查這兩個參數都覺得很深奧
總之是開啟可以從本機和容器間互動的介面所需要的參數
/bin/bash 則是要開啟的終端機


離開容器終端機:

1
root@4d251324d169:/# exit

關閉容器

docker stop 4d251324d169


刪除容器

docker rm 4d251324d169


刪除本地 image

docker rmi <image>


OK..以上的一輪說明已經包含:

  • 下載 image
  • 啟動 container
  • 使用 container
  • 關閉 container
  • 刪除 image 和 container

真的是又臭又長…

不過恭喜你已經對 docker 的基本使用方式有所了解了

替 React 專案撰寫 Dockerfile

Dockerfile 是啥呢?
主要是一份文檔可以用來製作 image
裡面會敘述 image 要包含的指令與配置

底下先提供一份範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 使用 Node.js 作為基礎映像
FROM node:latest as builder

# 設定工作目錄
WORKDIR /app

# 複製整個專案文件
COPY . .

# 安裝依賴項
RUN npm install

# 執行編譯
RUN npm run build

# 使用 Nginx 作為基礎映像
FROM nginx:latest

# 將 React 打包生成的檔案複製到 Nginx 預設的檔案目錄
COPY --from=builder /app/build /usr/share/nginx/html

# 複製自定義的 Nginx 配置檔案
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 定義容器運行時的指令(Nginx 伺服器會自動啟動)
CMD ["nginx", "-g", "daemon off;"]

這份 dockerfile 會被放在專案的根目錄

最後一步是建構映像檔

docker build -t name:version -f Dockerfile ."

  • -t: 用來打標籤名稱和版本號
  • -f Dockerfile 表示套用的檔案
  • . 表示當前目錄

本文作者: David Huang
本文地址https://davidblog.github.io/2023/07/29/docker-虛擬化技術/

0%