Docker 容器技術已成為現代軟體開發和佈署流程中不可或缺的一環。理解並熟練運用 Docker 指令,能大幅提升開發效率。本文將探討 Docker 的各項核心指令,從容器狀態檢查、容器內命令執行、容器重新命名,到主機與容器間的檔案複製,提供完整的操作。此外,文章也涵蓋了容器的暫停與還原、新容器的建立以及如何將容器的變更提交成新的映像,讓讀者能全方位掌握容器生命週期的管理。最後,文章以 MySQL 容器的 Dockerfile 建置為例,詳細說明 Dockerfile 的語法及各指令的應用,並輔以建置和啟動 MySQL 容器的實際操作步驟,讓讀者能更具體地理解 Dockerfile 的使用方式。
Docker 容器操作
Docker 是現代軟體開發與佈署的重要工具,能夠讓開發者輕鬆地封裝、分發和執行應用程式。玄貓在此將探討 Docker 的常用指令,包括檢查容器狀態、執行容器內命令、重新命名容器以及在容器與主機之間複製檔案。
檢查容器狀態
Docker 提供了 inspect 指令,可以詳細檢視容器的狀態與組態。以下是如何使用 inspect 指令來檢視 MySQL 容器的詳細資訊。
使用 docker inspect 檢視容器資訊
假設我們有個 MySQL 容器的 ID 為 fcb85434597b,可以使用以下指令來檢視該容器的詳細資訊:
docker inspect fcb85434597b
這個指令會傳回一個完整的 JSON 檔案,包含了容器的所有資訊。如果我們只想檢視特定的資訊,例如資料函式庫名稱、IP 地址或埠號,可以使用格式化選項來篩選結果。
範例:查詢資料函式庫名稱
docker inspect --format='{{.Name}}' fcb85434597b
這個指令會傳回該容器的名稱。
內容解密:
docker inspect:用於檢查 Docker 容器的詳細資訊,包括其組態、狀態和網路設定等。--format='{{.Name}}':這個選項允許我們指定輸出格式,這裡我們只取出.Name欄位的值,即容器的名稱。fcb85434597b:這是我們要檢查的容器 ID。
執行容器內命令
Docker 提供了 exec 指令,讓我們可以在已執行中的容器內執行命令。以下是如何使用 exec 指令來列出 Ubuntu 容器中的所有檔案。
使用 docker exec 執行容器內命令
假設我們有個 Ubuntu 容器的 ID 為 c8b9770c88e9,可以使用以下指令來在該容器內列出所有檔案:
docker exec c8b9770c88e9 ls -a
這個指令會在該 Ubuntu 容器內執行 ls -a 命令,列出所有檔案。
內容解密:
docker exec [Options] Container ID Command [Arg...]:這是exec指令的基本語法,用於在已執行中的 Docker 容器內執行命令。[Options]:可選引數,用於設定執行命令的各種選項。Container ID:要執行命令的 Docker 容器 ID。Command [Arg...]:要在容器內執行的命令及其引數。ls -a:這是 Unix/Linux 系統中的一個常用命令,用於列出目錄中的所有檔案,包括隱藏檔案。
命名與重新命名 Docker 容器
Docker 生成的容器 ID 是一串隨機字串,不易記憶。我們可以使用 rename 指令來為容器取一個更易記憶且具有意義的名稱。
重新命名 Docker 容器
假設我們有一個 Ubuntu 容器 ID 為 e510f8e769fc,現在我想將它命名為 Parminder。以下是步驟:
- 首先檢視當前所有執行中的或已停止的 Docker 容器:
docker ps -a
- 使用以下指令重新命名該 Ubuntu 容器:
docker rename e510f8e769fc Parminder
內容解密:
docker ps -a:這個指令會列出當前所有執行中的或已停止的 Docker 容器。docker rename Container ID new_name:這是重新命名 Docker 容器的指令,其中Container ID是原本的容器 ID,而new_name是我們要設定的新名稱。- 在重新命名後,我們可以使用新名稱來替代原本的 Container ID 執行其他操作。
在主機與 Docker 容器之間複製檔案
Docker 提供了 cp 指令,讓我們可以方便地在主機與 Docker 容器之間複製檔案。
在主機與 Docker 容器之間複製檔案
假設我們有一個已經命名為 Parminder 的 Ubuntu 容器,並在該容器內有個名為 /var/sample.txt 的檔案。以下是如何將該檔案從 Docker 容器複製到主機上:
docker cp Parminder:/var/sample.txt .
這個指令會將 /var/sample.txt 檔案從名為 Parminder 的 Docker 容器中複製到當前目錄下。
內容解密:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH:這是將檔案從 Docker container 複製到主機上的指令。[OPTIONS]:可選引數,用於設定複製操作的各種選項。[CONTAINER:SRC_PATH]:源路徑所在的 Docker container 和檔案路徑。[DEST_PATH]:目標路徑所在主機上所需放置檔案路徑。
在主機與 Docker container 複製檔案
假設現在有一個主機上的檔名稱為 /home/user/file.txt, 想將它複製到已經命名為 Parminder 的 Ubuntu container 中, 路徑為 /var/backup/file.txt, 做法如下:
docker cp /home/user/file.txt Parminder:/var/backup/
內內容解密:
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH: 用於將檔案從主機上複制到 docker container 上.[OPTIONS]: 用於設定複製操作各種選項.[SRC_PATH|-]: 源路徑所在主機上的檔案.[CONTAINER:DEST_PATH]: 則是目標路徑所在 docker container 和檔案路徑.
摘要
玄貓在此介紹了幾個常用且實用的 Docker 指令,包括如何檢視和篩選 container 資訊、執行 container 中命令和重新命名 container, 再加上如何在 主機與 container 做互動。希望透過這些實際操作經驗, 能夠讓讀者更靈活應用於日常工作中。
使用 Docker 進行容器操作
從本機複製檔案到容器
在進行 Docker 容器操作時,經常需要在本機與容器之間傳遞檔案。這裡玄貓將介紹如何從本機複製檔案到 Docker 容器內。
假設我們在本機上有一個名為 MyFile.txt 的檔案,並且我們希望將這個檔案複製到一個名為 Parminder 的容器內的 /var 目錄中。以下是具體的操作步驟:
首先,我們使用 docker cp 命令來完成這個操作:
docker cp MyFile.txt Parminder:/var
內容解密:
docker cp:這是 Docker 提供的檔案複製命令,用於在主機和容器之間傳遞檔案。MyFile.txt:這是我們要複製的本機檔案。Parminder:/var:這表示目標是容器Parminder中的/var目錄。
執行完這個命令後,我們可以進入 Parminder 容器內檢視 /var 目錄,確認檔案已成功複製。
暫停與還原容器
在某些情況下,我們可能需要暫停或還原某些容器中的所有程式。Docker 提供了 docker pause 和 docker unpause 命令來完成這個操作。
暫停容器
以下是暫停容器的命令:
docker pause CONTAINER [CONTAINER...]
例如,我們暫停名為 Parminder 的容器:
docker pause Parminder
還原容器
當我們需要還原暫停的容器時,可以使用以下命令:
docker unpause CONTAINER [CONTAINER...]
例如,我們還原名為 Parminder 的容器:
docker unpause Parminder
內容解密:
docker pause CONTAINER [CONTAINER...]:這個命令會暫停指定容器中的所有程式。在 Linux 系統上,這是透過 cgroups freezer 功能來實作的。docker unpause CONTAINER [CONTAINER...]:這個命令會還原暫停的容器中的所有程式。
這些命令非常有用於管理資源或進行維護操作時,因為它們可以快速地暫停和還原容器中的程式而不需要完全停止或重啟容器。
建立新的 Docker 容器
Docker 提供了 docker create 命令來建立一個新的可寫入層,覆寫指定的映像並準備好執行指定的命令。以下是具體的語法:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
例如,我們建立一個根據 Fedora 像映像並執行 bash 的新容器:
docker create -t -i fedora bash
內容解密:
-t:分配一個偽終端(TTY)。-i:以互動模式執行。fedora:指定使用 Fedora 像映像。bash:指定執行 bash shell。
執行完這個命令後,我們可以看到一個新的容器已經建立但尚未啟動。我們可以透過使用 docker start 命令來啟動它。
提交變更到新映像
當我們對一個執行中的 Docker 容器進行了一些修改後,可能希望將這些修改提交成一個新的映像。Docker 提供了 docker commit 命令來完成這個操作。
語法如下:
docker commit [OPTIONS] Container [Repository:Tag]
例如,假設我們有一個名為 running_container_id 的執行中的容器,並且我們希望將它提交成一個新的映像。以下是具體的命令:
docker commit running_container_id new_image_name:tag
內容解密:
running_container_id:這是目前執行中的 Docker 容器 ID。new_image_name:tag:這是要建立的新映像名稱和標籤。
這個命令會建立一個新的映像,包含了執行中的容器所做的所有修改。然後我們可以將這個新映像分享給其他開發或測試團隊使用。
MySQL 容器的 Dockerfile 實作與說明
在前文中,我們探討瞭如何使用 Docker 命令來管理容器。接下來,我們將探討如何利用 Dockerfile 來建立一個 MySQL 容器。Dockerfile 是一組指令的集合,這些指令會被 Docker 逐步執行以建立一個完整的映像檔。與一般的程式碼編寫不同,Dockerfile 的指令非常簡單且直觀,適合初學者快速上手。
Dockerfile 基本語法
Dockerfile 的基本語法如下:
FROM:指定基礎映像,所有 Dockerfile 必須以
FROM指令開始。FROM ubuntu:14.04MAINTAINER:設定映像的作者資訊。
MAINTAINER [email protected]RUN:執行指定的命令並建立一個新的層。
RUN apt-get update && apt-get install -y mysql-serverEXPOSE:公開容器內部埠以供外部存取。
EXPOSE 3306CMD:指定當容器啟動時要執行的命令。
CMD ["/usr/bin/mysqld_safe"]
建立 MySQL 容器的 Dockerfile
以下是一個簡單的 MySQL 容器 Dockerfile 範例:
FROM ubuntu:14.04
MAINTAINER [email protected]
RUN apt-get update && apt-get install -y mysql-server
EXPOSE 3306
CMD ["/usr/bin/mysqld_safe"]
內容解密:
FROM ubuntu:14.04:從 Ubuntu 14.04 基礎映像開始。MAINTAINER [email protected]:設定映像作者資訊。RUN apt-get update && apt-get install -y mysql-server:更新系統軟體包索引並安裝 MySQL 伺服器。EXPOSE 3306:公開 MySQL 預設埠 3306,使外部可以連線到這個埠。CMD ["/usr/bin/mysqld_safe"]:指定當容器啟動時要執行的命令,這裡是啟動 MySQL 安全模式。
建置 MySQL 映像
使用以下命令來建置 MySQL 映像:
docker build -t pkocher/mysql .
這條命令會根據當前目錄中的 Dockerfile 和其相關檔案來建置映像,並將其標籤為 pkocher/mysql。-t 選項用於標籤映像,方便後續管理和識別。
Sending build context to Docker daemon 3.072 kB
Step 0 : FROM ubuntu:14.04
---
> 91e54dfb1179
Step 1 : MAINTAINER [email protected]
---
> Running in ff60156730fd
---
> 0dd9db6f7989
Removing intermediate container ff60156730fd
Step 2 : RUN apt-get update && apt-get install -y mysql-server
---
> Running in fe6f48d526af
Reading package lists ...
Building dependency tree ...
Reading state information ...
The following extra packages will be installed:
libaio1 libdbd-mysql-perl libdbi-perl libhtml-template-perl libmysqlclient18 ...
The following NEW packages will be installed:
libaio1 libdbd-mysql-perl libdbi-perl libhtml-template-perl libmysqlclient18 ...
Need to get 9159 kB of archives.
After this operation, 97.0 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/main libaio1 amd64 ...
啟動 MySQL 容器
建置完成後,可以使用以下命令來啟動 MySQL 容器:
docker run -d --name mysql-container -p 3306:3306 pkocher/mysql
這條命令會在後台執行一個新的 MySQL 容器,並將主機的埠 3306 接到容器內部的埠 3306。
docker diff 指令
除了建置和執行容器外,Docker 提供了一些有用的命令來檢視和管理容器。例如,docker diff 指令可以列出容器檔案系統中已經改變過的檔案和目錄。
docker diff <container_id>
這個命令會顯示出自從基礎映像建立之後,當前容器檔案系統中的變更。這在需要除錯或理解容器變更時非常有用。
不同 Docker 指令與其應用
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Docker 容器操作:指令詳解與實務應用
package "Docker 架構" {
actor "開發者" as dev
package "Docker Engine" {
component [Docker Daemon] as daemon
component [Docker CLI] as cli
component [REST API] as api
}
package "容器運行時" {
component [containerd] as containerd
component [runc] as runc
}
package "儲存" {
database [Images] as images
database [Volumes] as volumes
database [Networks] as networks
}
cloud "Registry" as registry
}
dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置
@enduml
此圖示展示了在 Dockerfile 中各種指令之間的關係及其應用情境。瞭解這些指令和它們之間的關係,有助於更好地設計和管理 Docker 的工作流程。
分析不同指令和其應用
FROM指定基礎映像,所有 Dockerfile 必須以此指令開始。RUN執行安裝依賴或組態操作。每次修改執行命令都會生成新層。MAINTAINER則是設定作者資訊以便標記和識別。EXPOSE用於公開容器內部埠以供外部存取,確保特定服務能夠被外部存取。CMD則是用於指定當容器啟動時要執行的預設命令。