海外雲在線 海外雲在線 立即諮詢

AWS帳號充值 Docker 容器入門:理解容器技術的核心原理

亞馬遜雲AWS / 2026-10-21 15:35:31

# Docker 容器入門:理解容器技術的核心原理

AWS帳號充值 很多人搜尋這個主題,並不是想看抽象概念,而是想弄清楚幾個實際問題:Docker 到底怎麼跑起來?鏡像和容器是什麼關係?為什麼容器一啟動就退出?端口映射後為什麼還是無法訪問?資料刪了為什麼容器重建就沒了?

這篇文章不做泛泛而談,而是按照實際使用流程,帶你從安裝、啟動、運行、排錯,一步步理解 Docker 容器技術的核心原理,並能真正落地使用。

---

## 一、使用者搜尋這個主題時,真正想解決什麼問題?

從工程實踐來看,搜尋「Docker 容器入門」的使用者,通常處在以下幾個場景:

1. **剛拿到一台 Linux 雲伺服器,準備部署應用**,想知道 Docker 是否能簡化環境安裝。
2. **本機開發環境和線上環境不一致**,希望透過容器減少「我這裡能跑」的問題。
3. **學習微服務或 CI/CD 前置知識**,需要先掌握容器的運行機制。
4. **部署 MySQL、Redis、Nginx 等服務時遇到問題**,例如端口不通、資料丟失、容器反覆重啟。
5. **不理解鏡像、容器、數據卷、網路之間的關係**,導致會用命令但不理解原理。

AWS帳號充值 所以,這篇文章的核心不是介紹歷史,也不是講概念定義,而是回答以下幾個最關鍵的操作問題:

- Docker 安裝後第一步該做什麼?
- 容器是怎麼從鏡像啟動的?
- 為什麼容器和虛擬機不一樣?
- 為什麼容器內服務已啟動,但外部還是連不上?
- 如何讓容器資料不因刪除而消失?
- 出現啟動失敗時,應該先看哪裡?

---

## 二、Docker 容器技術的核心原理,用操作方式來理解

如果你正在使用雲伺服器部署服務,可以先把 Docker 理解為一種**標準化打包和運行環境**的方式。

它的核心不是「建立一台新的虛擬機」,而是:

- 使用**鏡像**提供應用運行所需的檔案和環境
- 使用**容器**作為鏡像啟動後的執行實例
- 使用**隔離機制**讓不同應用互不干擾
- 使用**資源限制**控制 CPU、記憶體等佔用
- 使用**數據卷與網路**解決持久化和互聯問題

### 1. 鏡像與容器的關係

最常見的誤解是把鏡像和容器當成同一件事。

可以直接這樣理解:

- **鏡像**:啟動模板,裡面包含應用程式、依賴、啟動命令
- **容器**:鏡像啟動後真正跑起來的進程

例如你執行:

```bash
docker run -d --name web -p 80:80 nginx
```

背後實際發生的是:

1. 本機檢查是否已有 `nginx` 鏡像
2. 若沒有,從鏡像倉庫拉取
3. 根據鏡像建立一個可寫層
4. 啟動容器內主進程
5. 將宿主機 80 端口映射到容器 80 端口

所以,**鏡像是靜態的,容器是動態的**。你可以用同一個鏡像啟動多個容器,但每個容器都是獨立實例。

### 2. 為什麼容器啟動快

因為 Docker 容器本質上不是完整模擬整個作業系統,而是直接利用宿主機核心,只隔離使用者空間、檔案系統、網路和進程視圖。

對實際操作的影響是:

- 啟動速度通常比虛擬機快
- 相同伺服器上可跑更多服務
- 更容易做批量部署與重建

但也因此要注意:

- 容器內程序退出,容器就停止
- 容器預設是無狀態的
- 未做數據卷掛載時,重建容器可能丟資料

### 3. 容器為什麼一啟動就退出

這是新手最常見的問題之一。

Docker 容器依賴主進程存活。如果容器啟動後執行的主命令很快結束,容器就會退出。

例如:

```bash
docker run ubuntu
```

這類命令如果沒有指定持續運行的前台程序,容器會直接結束。

排查方式:

```bash
docker ps -a
docker logs 容器名稱
```

如果你只是想進入容器測試,應該用:

```bash
docker run -it ubuntu /bin/bash
```

---

## 三、在 Linux 雲伺服器上安裝 Docker 的實際步驟

以下以常見的 Ubuntu 為例,適合在雲伺服器上直接操作。

### 1. 更新系統套件

AWS帳號充值 ```bash
sudo apt update
sudo apt upgrade -y
```

### 2. 安裝必要依賴

```bash
sudo apt install -y ca-certificates curl gnupg lsb-release
```

### 3. 新增 Docker 官方金鑰

```bash
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```

### 4. 加入 Docker 軟體源

```bash
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

### 5. 安裝 Docker

```bash
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

### 6. 啟動並設定開機自啟

```bash
sudo systemctl enable docker
sudo systemctl start docker
```

### 7. 驗證是否安裝成功

```bash
sudo docker version
sudo docker run hello-world
```

如果 `hello-world` 能正常輸出說明資訊,代表 Docker 已可用。

---

AWS帳號充值 ## 四、Docker 入門必學命令:先學會這些再繼續

### 1. 查看本機鏡像

```bash
docker images
```

### 2. 拉取鏡像

```bash
docker pull nginx
docker pull redis
docker pull mysql:8.0
```

### 3. 查看正在運行的容器

```bash
docker ps
```

查看所有容器:

```bash
docker ps -a
```

### 4. 啟動容器

```bash
docker run -d --name nginx-test -p 80:80 nginx
```

參數說明只講操作需要知道的部分:

- `-d`:背景運行
- `--name`:指定容器名稱
- `-p 80:80`:宿主機端口映射到容器端口
- `nginx`:使用的鏡像名稱

### 5. 停止與刪除容器

```bash
docker stop nginx-test
docker rm nginx-test
```

### 6. 查看容器日誌

```bash
docker logs nginx-test
```

持續追蹤:

```bash
docker logs -f nginx-test
```

### 7. 進入容器內部

```bash
docker exec -it nginx-test /bin/bash
```

如果容器裡沒有 bash,可改用:

```bash
docker exec -it nginx-test /bin/sh
```

---

## 五、用一個 Nginx 例子理解容器運行流程

在雲伺服器上部署 Web 服務時,Nginx 是最容易拿來理解 Docker 的例子。

### 1. 啟動 Nginx 容器

```bash
docker run -d --name mynginx -p 8080:80 nginx
```

這個命令表示:

- 建立名為 `mynginx` 的容器
- 容器內 Nginx 監聽 80 端口
- 宿主機開放 8080,轉發到容器 80

### 2. 測試服務是否正常

在伺服器本機執行:

```bash
curl http://127.0.0.1:8080
```

如果能返回 HTML,代表容器內服務正常。

### 3. 如果瀏覽器仍無法訪問,排查順序如下

這是實務中最常見的問題。

#### 第一步:確認容器是否正在運行

```bash
docker ps
```

#### 第二步:確認端口是否已映射

```bash
docker port mynginx
```

#### 第三步:確認伺服器防火牆是否放行 8080

Ubuntu 常見:

```bash
sudo ufw allow 8080/tcp
sudo ufw status
```

AWS帳號充值 CentOS 或 RHEL 常見:

```bash
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
```

AWS帳號充值 #### 第四步:確認雲平台安全組是否放行 8080

很多人在這一步卡住。即使系統內防火牆已放行,如果雲伺服器的安全組沒有允許對應端口,外部仍然無法訪問。

你需要在雲控制台檢查:

- 入方向規則
- 協議:TCP
- 端口:8080
- 來源:根據實際需求設定,例如 `0.0.0.0/0` 或指定辦公網段

#### 第五步:確認服務是否監聽在容器內正確端口

可進入容器檢查:

```bash
docker exec -it mynginx /bin/sh
```

---

## 六、資料持久化:為什麼容器刪掉後資料就沒了

這也是 Docker 使用中最容易出事故的地方。

如果你直接在容器內修改資料,例如 MySQL 數據目錄、應用上傳目錄、Nginx 配置檔,但沒有掛載資料卷,那麼容器一旦刪除,資料可能一起消失。

### 1. 使用目錄掛載

例如將宿主機目錄掛載到容器內:

AWS帳號充值 ```bash
docker run -d \
--name mynginx \
-p 8080:80 \
-v /data/nginx/html:/usr/share/nginx/html \
nginx
```

這樣網頁內容保存在宿主機 `/data/nginx/html`,即使容器刪除,資料仍保留。

### 2. 使用命名卷

```bash
docker volume create mysql_data

docker run -d \
--name mysql8 \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v mysql_data:/var/lib/mysql \
mysql:8.0
```

### 3. 什麼時候用掛載目錄,什麼時候用命名卷

實務建議:

- **需要直接編輯宿主機檔案**:用目錄掛載
- **只關心資料持久化,不常手動修改底層檔案**:用命名卷

---

## 七、Docker 網路怎麼理解,才能排查連線問題

容器部署中,第二高頻問題就是網路。

### 1. 端口映射不是「容器自動對外開放」

很多人以為容器內服務啟動後,外部就能直接訪問。實際上不是。

容器內服務只是在容器自己的網路命名空間中監聽。要讓外部訪問,必須顯式做端口映射,例如:

```bash
docker run -d -p 8080:80 nginx
```

### 2. 查看容器網路資訊

```bash
docker inspect mynginx
```

重點看:

- 容器 IP
- 綁定網路
- 端口映射
- Gateway

### 3. 容器之間互通,優先用自定義網路

例如 Web 服務要連 MySQL,不建議依賴容器 IP,因為容器重建後 IP 可能變。

應該建立網路:

```bash
docker network create app-net
```

啟動容器時加入同一網路:

```bash
docker run -d --name mysql8 --network app-net -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

docker run -d --name webapp --network app-net -p 8080:8080 myapp
```

這樣應用就可以直接用容器名稱 `mysql8` 作為資料庫主機名連接。

### 4. 連不上 MySQL 時的排查順序

AWS帳號充值 如果應用容器連不上 MySQL,按下面順序查:

1. MySQL 容器是否正常運行
2. 兩個容器是否在同一 Docker 網路
3. 應用配置中的主機名是否填容器名稱
4. MySQL 帳號是否允許遠端或指定網段登入
5. MySQL 初始化是否成功
6. 容器日誌是否出現密碼、權限或字符集錯誤

---

## 八、部署 MySQL 容器時最常遇到的問題與正確做法

MySQL 是 Docker 新手最常部署也最常出錯的服務。

### 1. 正確啟動方式示例

```bash
docker run -d \
--name mysql8 \
--restart unless-stopped \
-e MYSQL_ROOT_PASSWORD=StrongPass123 \
-e TZ=Asia/Taipei \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
mysql:8.0
```

### 2. 容器啟動失敗怎麼辦

先看日誌:

```bash
docker logs mysql8
```

常見原因包括:

- root 密碼未設定
- 資料目錄權限不正確
- 舊資料與新版本不相容
- 記憶體不足導致初始化失敗
- 宿主機 3306 已被占用

### 3. 檢查端口占用

```bash
sudo ss -lntp | grep 3306
```

如果宿主機本身已安裝 MySQL,就可能和容器衝突。

### 4. 容器內登入 MySQL

```bash
docker exec -it mysql8 mysql -uroot -p
```

### 5. 外部連不上 MySQL 怎麼查

AWS帳號充值 按這個順序:

- `docker ps` 看容器是否在跑
- `docker logs mysql8` 看初始化是否成功
- `ss -lntp | grep 3306` 看宿主機是否已監聽
- 系統防火牆是否放行 3306
- 雲安全組是否放行 3306
- MySQL 帳號是否允許對應來源 IP 連入

如果只是應用內部連接,不建議把 3306 對公網開放,優先走私網或 Docker 自定義網路。

---

## 九、理解 Dockerfile:自己封裝應用容器的最小實踐

當你不只是拉官方鏡像,而是要部署自己的應用時,就需要 Dockerfile。

以下是一個簡單的 Node.js 示例:

```dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
```

### 建立鏡像

```bash
docker build -t mynodeapp:1.0 .
```

### 啟動容器

```bash
docker run -d --name mynodeapp -p 3000:3000 mynodeapp:1.0
```

### 常見錯誤

#### 1. build 很慢

可能原因:

- 安裝依賴步驟未做快取優化
- 專案目錄過大
- `.dockerignore` 未排除 `node_modules`

AWS帳號充值 #### 2. 容器啟動後立刻退出

通常是 `CMD` 執行失敗,先看:

```bash
docker logs mynodeapp
```

#### 3. 應用在容器內能跑,外部不能訪問

很多 Web 框架預設只綁定 `127.0.0.1`,這樣即使容器映射端口,外部也進不去。

應用應監聽:

```text
0.0.0.0
```

這是非常典型的問題。

---

## 十、雲伺服器使用 Docker 時的配置建議

這部分是很多初學者容易忽略,但對部署穩定性影響很大的內容。

### 1. CPU / 記憶體如何選

如果你是在雲伺服器上學習 Docker:

- **1 核 2GB**:可做基本測試,跑輕量服務
- **2 核 4GB**:更適合跑 Nginx + 應用 + Redis
- **2 核 8GB 以上**:較適合加上 MySQL 並做長時間測試

如果同一台機器同時跑多個容器,記憶體通常比 CPU 更容易先成為瓶頸。

### 2. 磁碟如何選

容器鏡像、日誌、數據卷都會占用磁碟。

建議:

- 系統盤至少保留足夠空間給 `/var/lib/docker`
- 資料庫類服務用獨立資料盤更容易維護
- 定期清理不用的鏡像與停止容器

清理命令:

```bash
docker system prune -a
```

執行前要先確認,避免誤刪仍需使用的資源。

### 3. 地域與網路延遲

如果 Docker 容器需要對外提供服務,雲伺服器地域應盡量靠近主要使用者。

如果你遇到:

- 鏡像拉取很慢
- API 請求延遲高
- 遠端 SSH 卡頓

除了應用本身,還要檢查:

- 伺服器所在地域是否合理
- 是否需要配置鏡像加速
- 是否存在跨地域資料庫訪問

---

## 十一、常見故障排查清單:按這個順序查最有效

下面這份清單非常適合實際操作時使用。

### 問題 1:Docker 服務無法啟動

```bash
sudo systemctl status docker
sudo journalctl -u docker
```

AWS帳號充值 重點看:

- 磁碟空間是否不足
- containerd 是否異常
- 配置檔是否有語法問題

### 問題 2:鏡像拉取失敗

排查方向:

- DNS 是否正常
- 伺服器能否訪問外網
- 是否需要配置鏡像源
- 防火牆是否限制出站連線

### 問題 3:容器一直重啟

```bash
docker ps -a
docker logs 容器名
```

AWS帳號充值 常見原因:

- 啟動命令錯誤
- 配置檔掛載有誤
- 依賴服務未就緒
- 環境變數缺失

### 問題 4:容器端口不通

按這個順序:

1. 容器是否在跑
2. 容器內服務是否真的監聽對應端口
3. 是否做了 `-p` 映射
4. 宿主機防火牆是否放行
5. 雲安全組是否放行
6. 應用是否只綁定 `127.0.0.1`

AWS帳號充值 ### 問題 5:容器刪掉後資料遺失

原因幾乎都是:

- 沒有做 volume 掛載
- 誤把資料存在容器可寫層
- 重建容器前未備份

### 問題 6:磁碟空間突然被吃滿

檢查:

```bash
docker system df
```

再看:

- 未使用鏡像是否過多
- 容器日誌是否過大
- volume 是否長期累積

---

## 十二、實務上的最佳操作習慣

AWS帳號充值 如果你打算把 Docker 用在雲伺服器正式環境,建議至少養成下面幾個習慣:

### 1. 容器名稱、卷名稱、網路名稱統一規範

例如:

AWS帳號充值 - `prod-nginx`
- `prod-mysql`
- `prod-app-net`
- `prod-mysql-data`

方便排查與維運。

### 2. 不要把重要資料只存在容器內

尤其是:

- MySQL / PostgreSQL 數據
- Redis 持久化檔案
- 應用上傳檔案
- Nginx 配置與 SSL 憑證

### 3. 部署前先規劃端口

避免:

- 宿主機服務與容器衝突
- 多個容器映射相同端口
- 安全組放行規則混亂

### 4. 先用日誌排查,不要盲目重裝

很多人遇到問題第一反應是刪容器重建,但這樣容易掩蓋根因,甚至造成資料丟失。

正確順序應是:

1. 看 `docker ps -a`
2. 看 `docker logs`
3. 看端口與網路
4. 看掛載與權限
5. 最後才考慮重建

### 5. 重要服務加上重啟策略

AWS帳號充值 例如:

```bash
--restart unless-stopped
```

可在伺服器重啟後自動恢復容器服務。

---

## 十三、總結:Docker 入門真正要掌握的是哪幾件事

如果你讀完這篇文章,只記住下面幾點,已經足夠支撐你開始實際部署:

1. **鏡像是模板,容器是運行中的實例**。
2. **容器的主進程退出,容器就會停止**。
3. **端口映射、系統防火牆、雲安全組,三者缺一都可能導致無法訪問**。
4. **不做數據卷掛載,容器重建後資料可能丟失**。
5. **容器互聯優先使用自定義網路,不要依賴臨時 IP**。
6. **排錯時先看 logs,再看網路、掛載、權限與端口**。

Docker 的核心原理,最終都會落到這些日常操作上。你不需要一開始就記住所有底層機制,但一定要把啟動流程、網路映射、資料持久化、日誌排查這幾個關鍵點真正跑通。

如果後續你要繼續進階,建議下一步學習:

- Docker Compose 多容器編排
- Dockerfile 優化
- 容器資源限制
- 映像版本管理
- 容器部署到雲伺服器的自動化流程

先把單容器部署與排錯練熟,再往更複雜的容器編排走,效率會高很多。

Telegram售前客服
客服ID
@cloudcup
联系
Telegram售后客服
客服ID
@yanhuacloud
联系