AWS帳號充值 Docker 容器入門:理解容器技術的核心原理
# 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 優化
- 容器資源限制
- 映像版本管理
- 容器部署到雲伺服器的自動化流程
先把單容器部署與排錯練熟,再往更複雜的容器編排走,效率會高很多。

