Docker 容器相關操作
Docker 容器是 Docker 技術的核心概念之一,它是一個輕量級、可移植、自包含的運行環境。本文將詳細介紹 Docker 容器的各種操作,幫助你更好地管理和使用容器。
查看 docker run 命令 ,創建並且啟動容器
docker run 是最常用的 Docker 命令之一,用於創建並啟動一個新的容器。讓我們深入瞭解這個命令的各個參數和用法。
docker run --helpdocker run 常用參數詳解
docker run 後面的參數
-i # 交互式模式(interactive),保持標準輸入打開,即使沒有連接
-t # 分配一個偽終端(tty),通常與 -i 一起使用形成 -it
-v # 目錄映射/掛載(volume),將宿主機的目錄或文件掛載到容器中
-d # 守護進程模式(detached),後臺運行容器,返回容器ID
-p # 端口映射(publish),格式為 宿主機端口:容器端口
--name # 為容器指定一個名稱,方便後續管理
--rm # 容器退出後自動刪除,適用於臨時任務
-e # 設置環境變量,如 -e MYSQL_ROOT_PASSWORD=123456
--network # 指定網絡模式,如 bridge、host、none 或自定義網絡
--restart # 設置重啟策略,如 no、on-failure、always、unless-stopped端口映射深入理解
端口映射是實現容器內外通信的關鍵。例如容器裡面有 Tomcat,你本地的 Windows 想訪問:
# docker tomcat 端口號是8080,需要在虛擬機映射一個端口9099
# windows才可以訪問 http://虛擬機ip:9099
docker run -d -p 9099:8080 tomcat端口映射的幾種形式:
-p 8080:80- 映射指定端口-p 8080:80/tcp- 映射 TCP 端口-p 127.0.0.1:8080:80- 綁定到特定 IP-p 8080-8090:80-90- 映射端口範圍-P- 隨機映射所有暴露的端口
創建容器,並且進入命令行
這是最常用的交互式容器啟動方式,適合調試和學習:
docker run -it --name=myTomcat2 tomcat /bin/bash參數說明:
-it:組合參數,-i保持交互,-t分配終端--name=myTomcat2:為容器命名,便於識別和管理tomcat:使用的鏡像名稱/bin/bash:容器啟動後執行的命令,這裡是啟動 bash shell
退出容器
有兩種退出方式,效果不同:
# 方式1:正常退出(會停止容器)
exit
# 方式2:使用快捷鍵(也會停止容器)
Ctrl + D注意: 使用 exit 或 Ctrl+D 退出後,容器會停止運行。如果需要保持容器運行,請使用下面介紹的方法。
退出之後,重新進入容器
如果容器已經停止,需要先啟動它;如果容器正在運行,可以直接進入。
方法一:啟動已停止的容器並進入
# 首先啟動已停止的容器
docker start myTomcat2
# 然後進入容器
docker exec -it myTomcat2 /bin/bash方法二:創建守護式容器(推薦)
# 創建一個後臺運行的守護容器
docker run -id --name=myTomcat2 tomcat
# 隨時進入正在運行的容器
docker exec -it myTomcat2 /bin/bashdocker exec 的優勢:
- 不會停止容器
- 可以在運行中的容器內執行任意命令
- 可以多次進入同一個容器
- 適合生產環境使用
其他進入容器的方式
# 使用 sh 而不是 bash(某些精簡鏡像可能沒有 bash)
docker exec -it myTomcat2 /bin/sh
# 以 root 用戶身份進入
docker exec -it -u root myTomcat2 /bin/bash
# 在容器中執行單條命令而不進入交互模式
docker exec myTomcat2 ls -la /usr/local/tomcat宿主機與 docker 容器的文件傳遞
在實際使用中,經常需要在宿主機和容器之間傳輸文件。Docker 提供了多種方式實現這一需求。
使用 docker cp 命令
docker cp 是最直接的文件複製方式,類似於 Linux 的 cp 命令。
從宿主機複製到容器
# 1、在宿主機上創建一個文件
touch test.txt
echo "Hello Docker" > test.txt
# 2、把文件複製到容器裡面去
docker cp test.txt myTomcat2:/tmp/
# 3、進入容器驗證
docker exec -it myTomcat2 /bin/bash
cd /tmp
ls -la test.txt
cat test.txt從容器複製到宿主機
# 在容器中創建文件
docker exec -it myTomcat2 /bin/bash
touch /tmp/abc.txt
echo "From Container" > /tmp/abc.txt
exit
# 將容器中的文件複製到宿主機
docker cp myTomcat2:/tmp/abc.txt /root/
# 驗證文件
cat /root/abc.txtdocker cp 的特點:
- 支持文件和目錄的複製
- 不需要容器正在運行(但需要存在)
- 複製是單向的,不會自動同步
- 適合一次性文件傳輸
使用數據卷掛載(推薦用於持久化)
相比 docker cp,數據卷掛載是更優雅的解決方案,特別適合需要持續同步的場景。
# 創建本地目錄
mkdir -p /opt/docker-data/webapps
# 啟動容器時掛載數據卷
docker run -d \
--name=myTomcat3 \
-p 8080:8080 \
-v /opt/docker-data/webapps:/usr/local/tomcat/webapps \
tomcat
# 現在在宿主機的 /opt/docker-data/webapps 放置 war 包
# 容器會自動同步,無需手動複製
cp myapp.war /opt/docker-data/webapps/數據卷掛載的優勢:
- 實時同步,無需手動複製
- 數據持久化,容器刪除後數據不丟失
- 性能更好,特別是大量小文件
- 支持多個容器共享同一數據卷
其他文件傳輸方式
# 使用 tar 進行批量傳輸
docker exec myTomcat2 tar czf - /path/in/container | tar xzf - -C /local/path
# 使用 docker save/load 傳輸整個鏡像
docker save myimage > myimage.tar
docker load < myimage.tar訪問 Tomcat
在生產環境中,我們通常需要讓外部能夠訪問容器中運行的應用。這就涉及到端口映射和數據卷的綜合使用。
基本訪問配置
# 啟動並作為守護進程
# -p 宿主機的端口: 容器裡應用的端口8080
# war 掛載宿主機 -v 宿主機的路徑: 容器路徑
docker run -di \
--name=myTomcat \
-p 9999:8080 \
-v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps \
tomcat訪問地址:http://虛擬機ip:9999
完整的 Tomcat 部署流程
# 1. 準備 WAR 包
mkdir -p /opt/tomcat-webapps
cp your-application.war /opt/tomcat-webapps/
# 2. 啟動 Tomcat 容器
docker run -d \
--name=production-tomcat \
-p 8080:8080 \
-v /opt/tomcat-webapps:/usr/local/tomcat/webapps \
-v /opt/tomcat-logs:/usr/local/tomcat/logs \
-e JAVA_OPTS="-Xms512m -Xmx1024m" \
--restart=always \
tomcat:latest
# 3. 把war包放到宿主機的掛載目錄中,直接刷新瀏覽器就出現項目的頁面
# 訪問 http://服務器IP:8080/your-application微服務與容器化部署
在現代微服務架構中,容器化部署已成為標準實踐:
# 微服務 k8s 容器式的性能測試
# 單個微服務容器
docker run -d \
--name=user-service \
-p 8081:8080 \
-e SPRING_PROFILES_ACTIVE=prod \
user-service:latest
# 另一個微服務
docker run -d \
--name=order-service \
-p 8082:8080 \
--link user-service \
order-service:latest容器化微服務的優勢:
- 環境一致性:開發、測試、生產環境完全一致
- 快速部署:秒級啟動新實例
- 資源隔離:每個服務獨立運行
- 彈性伸縮:根據負載動態調整實例數量
容器之間的關聯
在實際應用中,多個容器之間經常需要通信。Docker 提供了多種方式實現容器互聯。
使用 --link 參數(傳統方式)
# 先啟動 MySQL 容器
docker run -d \
--name=mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
# 啟動 Tomcat 並鏈接到 MySQL
docker run -di \
--name=tomcat2 \
-p 8080:8080 \
--link mysql:mysql \
tomcat--link 的工作原理:
- 在 tomcat2 容器的
/etc/hosts中添加 mysql 的 IP 映射 - 自動注入環境變量,如
MYSQL_PORT_3306_TCP_ADDR - 注意: 這種方式已被官方標記為遺留特性
使用自定義網絡(推薦方式)
現代 Docker 推薦使用自定義網絡來實現容器通信:
# 1. 創建自定義網絡
docker network create my-network
# 2. 啟動 MySQL 容器並加入網絡
docker run -d \
--name=mysql \
--network=my-network \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
# 3. 啟動 Tomcat 容器並加入同一網絡
docker run -d \
--name=tomcat \
--network=my-network \
-p 8080:8080 \
tomcat
# 4. 在 Tomcat 容器中可以直接通過容器名訪問 MySQL
docker exec -it tomcat ping mysql自定義網絡的優勢:
- 支持 DNS 解析,直接使用容器名通信
- 更好的網絡隔離
- 支持動態添加/移除容器
- 可以配置網絡策略
容器通信實戰示例
# 典型的三層架構部署
# 1. 創建網絡
docker network create app-network
# 2. 啟動數據庫層
docker run -d \
--name=mysql \
--network=app-network \
-v mysql-data:/var/lib/mysql \
-e MYSQL_DATABASE=myapp \
-e MYSQL_USER=app \
-e MYSQL_PASSWORD=secret \
mysql:8.0
# 3. 啟動應用層
docker run -d \
--name=backend \
--network=app-network \
-e DB_HOST=mysql \
-e DB_PORT=3306 \
backend-app:latest
# 4. 啟動 Web 層
docker run -d \
--name=nginx \
--network=app-network \
-p 80:80 \
-v ./nginx.conf:/etc/nginx/nginx.conf \
nginx:latest容器生命週期管理
瞭解容器的完整生命週期對於有效管理至關重要。
容器狀態
# 查看所有容器(包括停止的)
docker ps -a
# 查看正在運行的容器
docker ps
# 查看容器詳細信息
docker inspect myTomcat2
# 查看容器日誌
docker logs myTomcat2
docker logs -f myTomcat2 # 實時跟蹤日誌
docker logs --tail 100 myTomcat2 # 查看最後100行容器啟停控制
# 啟動已停止的容器
docker start myTomcat2
# 停止運行中的容器
docker stop myTomcat2
# 重啟容器
docker restart myTomcat2
# 強制停止容器(不推薦,除非必要)
docker kill myTomcat2
# 暫停容器(保留內存狀態)
docker pause myTomcat2
# 恢復暫停的容器
docker unpause myTomcat2容器清理
# 刪除已停止的容器
docker rm myTomcat2
# 強制刪除運行中的容器
docker rm -f myTomcat2
# 刪除所有已停止的容器
docker container prune
# 刪除容器及其數據卷
docker rm -v myTomcat2實用技巧和最佳實踐
1. 容器資源限制
# 限制容器使用的 CPU 和內存
docker run -d \
--name=limited-container \
--cpus="1.5" \
--memory="512m" \
--memory-swap="1g" \
tomcat2. 健康檢查
docker run -d \
--name=healthy-tomcat \
--health-cmd="curl -f http://localhost:8080/ || exit 1" \
--health-interval=30s \
--health-timeout=10s \
--health-retries=3 \
tomcat
# 查看健康狀態
docker inspect --format='{{.State.Health.Status}}' healthy-tomcat3. 容器備份和恢復
# 基於容器創建新鏡像(相當於快照)
docker commit myTomcat2 my-tomcat-backup:latest
# 導出容器文件系統
docker export myTomcat2 > container-backup.tar
# 導入為鏡像
docker import container-backup.tar my-tomcat-restored:latest4. 查看容器資源使用
# 實時監控容器資源
docker stats
# 查看特定容器
docker stats myTomcat2
# 一次性輸出(不持續監控)
docker stats --no-stream常見問題排查
問題1:容器啟動後立即退出
# 查看容器日誌
docker logs myContainer
# 常見原因:
# 1. 前臺進程結束
# 2. 配置文件錯誤
# 3. 端口衝突
# 4. 依賴服務未就緒問題2:無法進入容器
# 檢查容器是否在運行
docker ps | grep myContainer
# 嘗試不同的 shell
docker exec -it myContainer /bin/sh
docker exec -it myContainer /bin/bash
# 檢查容器健康狀態
docker inspect myContainer | grep -A 10 Health問題3:端口映射不生效
# 檢查端口占用
netstat -tlnp | grep 8080
# 檢查防火牆規則
iptables -L -n
# 驗證容器內部服務是否啟動
docker exec myContainer netstat -tlnp總結
本文詳細介紹了 Docker 容器的各項操作,包括:
- 容器創建和啟動:掌握
docker run的各種參數和用法 - 容器交互:學會進入和退出容器,以及如何在後臺運行容器
- 文件傳輸:瞭解
docker cp和數據卷掛載兩種方式 - 端口映射:實現外部訪問容器內服務
- 容器互聯:使用
--link和自定義網絡實現容器間通信 - 生命週期管理:掌握容器的啟停、刪除等操作
- 最佳實踐:資源限制、健康檢查、備份恢復等
掌握這些技能後,你將能夠高效地管理和運維 Docker 容器,為後續的 Docker Compose 和 Kubernetes 學習打下堅實基礎。
下一步學習建議: