docker compose.yaml配置
以下是一個常用的 MySQL Docker Compose 配置示例,包含數(shù)據(jù)持久化、環(huán)境變量配置、自定義配置等核心功能,適用于開發(fā)或測試環(huán)境。
1. 基礎(chǔ)配置文件(docker-compose.yml)
創(chuàng)建一個 docker-compose.yml 文件,內(nèi)容如下:
version: '3.8' # Compose 文件版本(根據(jù) Docker 版本選擇,3.8 兼容大部分新版本)
services:
mysql:
image: mysql:8.0 # MySQL 鏡像(可替換為 5.7 等版本,如 mysql:5.7)
container_name: mysql-db # 容器名稱(自定義)
restart: always # 容器退出后自動重啟(可選,推薦生產(chǎn)環(huán)境開啟)
ports:
- "3306:3306" # 端口映射:宿主機端口:容器內(nèi)端口(宿主機端口可自定義,如 3307:3306 避免沖突)
environment:
# 核心環(huán)境變量(必配置)
MYSQL_ROOT_PASSWORD: root123 # root 用戶密碼(自定義)
MYSQL_DATABASE: mydb # 初始化時自動創(chuàng)建的數(shù)據(jù)庫名(可選)
MYSQL_USER: testuser # 初始化時創(chuàng)建的普通用戶(可選)
MYSQL_PASSWORD: test123 # 普通用戶的密碼(可選,與 MYSQL_USER 配套)
# 編碼配置(避免中文亂碼,可選但推薦)
MYSQL_INITDB_SKIP_TZINFO: "1" # 跳過時區(qū)配置(避免部分環(huán)境報錯)
volumes:
# 數(shù)據(jù)持久化:將容器內(nèi)的數(shù)據(jù)目錄掛載到宿主機卷(避免容器刪除后數(shù)據(jù)丟失)
- mysql-data:/var/lib/mysql
# 自定義配置文件掛載(可選,如需修改 MySQL 配置)
# - ./my.cnf:/etc/mysql/conf.d/my.cnf # 本地配置文件路徑:容器內(nèi)配置文件路徑
networks:
- mysql-network # 自定義網(wǎng)絡(luò)(可選,用于多容器通信)
# 定義數(shù)據(jù)卷(持久化數(shù)據(jù))
volumes:
mysql-data:
# 定義網(wǎng)絡(luò)(可選,多容器互聯(lián)時使用)
networks:
mysql-network:
driver: bridge # 橋接網(wǎng)絡(luò)(默認類型)
2. 可選:自定義 MySQL 配置(my.cnf)
如果需要修改 MySQL 配置(如字符集、連接數(shù)等),可在當(dāng)前目錄創(chuàng)建 my.cnf 文件,內(nèi)容示例:
[mysqld]
# 字符集配置(避免中文亂碼)
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 最大連接數(shù)(根據(jù)需求調(diào)整)
max_connections=1000
# 日志配置(可選)
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slow.log
long_query_time=2
然后在 docker-compose.yml 的 volumes 中取消注釋掛載配置,讓自定義配置生效。
3. 環(huán)境變量安全配置(.env 文件)
為避免密碼明文暴露,可使用 .env 文件存儲敏感信息,步驟如下:
-
創(chuàng)建
.env文件:# .env 文件 MYSQL_ROOT_PWD=root123 MYSQL_DB=mydb MYSQL_USER=testuser MYSQL_USER_PWD=test123 -
修改
docker-compose.yml中的environment部分,引用.env變量:environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PWD} MYSQL_DATABASE: ${MYSQL_DB} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_USER_PWD}
4. 使用方法
- 確保當(dāng)前目錄包含
docker-compose.yml(及可選的my.cnf、.env)。 - 啟動容器:
docker-compose up -d # -d 表示后臺運行 - 查看容器狀態(tài):
docker-compose ps # 查看服務(wù)狀態(tài) docker logs mysql-db # 查看容器日志(排查啟動問題) - 連接 MySQL:
使用客戶端工具(如 Navicat、DataGrip)或命令行連接:# 本地連接(宿主機端口為 3306 時) mysql -h 127.0.0.1 -P 3306 -u root -p # 輸入 root 密碼(如 root123)即可登錄 - 停止/刪除容器:
docker-compose down # 停止并刪除容器(數(shù)據(jù)卷保留,數(shù)據(jù)不丟失) docker-compose down -v # 停止并刪除容器+數(shù)據(jù)卷(數(shù)據(jù)會丟失,謹慎使用)
頂層 volumes 定義和服務(wù)內(nèi) volumes 掛載
在 Docker Compose 中,volumes 配置有兩種常見場景:頂層 volumes 定義和服務(wù)內(nèi) volumes 掛載,你提到的兩行配置都屬于頂層 volumes 定義,但含義和寫法有區(qū)別,需要結(jié)合 Docker 數(shù)據(jù)卷的類型來理解。
先明確核心概念:Docker 數(shù)據(jù)卷的兩種類型
Docker 中管理容器數(shù)據(jù)的方式主要有兩種:
- 命名卷(Named Volume):由 Docker 引擎統(tǒng)一管理的持久化存儲,數(shù)據(jù)存儲在 Docker 自身的目錄(通常是
/var/lib/docker/volumes/),名稱由用戶自定義(如mysql-data)。 - 綁定掛載(Bind Mount):直接將宿主機的某個目錄/文件掛載到容器內(nèi),路徑由用戶指定(如
./data:/var/lib/mysql中的./data是宿主機路徑)。
1. 配置 volumes: mysql-data:(正確的命名卷定義)
這是定義命名卷的標(biāo)準寫法,含義是:
創(chuàng)建一個名為 mysql-data 的命名卷,使用 Docker 默認的配置(如默認驅(qū)動 local),由 Docker 引擎負責(zé)管理其存儲位置(無需手動指定宿主機路徑)。
示例場景:
在 docker-compose.yml 中,頂層 volumes 定義命名卷后,服務(wù)內(nèi)可以通過卷名掛載到容器路徑,實現(xiàn)數(shù)據(jù)持久化:
services:
mysql:
# ... 其他配置
volumes:
- mysql-data:/var/lib/mysql # 將命名卷 mysql-data 掛載到容器內(nèi)的 /var/lib/mysql(MySQL 數(shù)據(jù)目錄)
volumes:
mysql-data: # 定義命名卷,使用默認配置
這種方式的優(yōu)勢:
- 數(shù)據(jù)由 Docker 管理,避免手動處理宿主機路徑權(quán)限問題(尤其在 Linux 中)。
- 容器刪除后,卷不會被自動刪除(需手動
docker volume rm刪除),數(shù)據(jù)持久化更可靠。
2. 關(guān)于 volumes: mysql-data: .(錯誤/不規(guī)范的寫法)
這種寫法不符合 Docker Compose 語法規(guī)范,可能是誤解了配置格式導(dǎo)致的。
原因:
頂層 volumes 的作用是定義卷的屬性(如驅(qū)動、選項等),語法是 卷名: {配置項},而 . 是宿主機路徑(通常用于綁定掛載),不能直接寫在頂層 volumes 中。
如果想使用綁定掛載(將宿主機當(dāng)前目錄掛載到容器),正確的寫法是在服務(wù)內(nèi)的 volumes 中配置,而非頂層 volumes:
services:
mysql:
# ... 其他配置
volumes:
- ./mysql-data:/var/lib/mysql # 綁定掛載:宿主機當(dāng)前目錄下的 mysql-data 目錄 → 容器內(nèi)的 /var/lib/mysql
# 這里不需要頂層 volumes 定義(綁定掛載無需提前定義)
這里的 ./mysql-data 是宿主機的相對路徑(. 表示當(dāng)前目錄),容器內(nèi)的 /var/lib/mysql 數(shù)據(jù)會直接同步到宿主機的 ./mysql-data 目錄。
總結(jié)
volumes: mysql-data::在頂層定義命名卷,由 Docker 管理存儲,適合生產(chǎn)環(huán)境持久化數(shù)據(jù)(安全、可靠)。volumes: mysql-data: .:語法錯誤,綁定掛載的路徑配置應(yīng)寫在服務(wù)內(nèi)的volumes中(如- ./mysql-data:/var/lib/mysql),適合開發(fā)時需要手動訪問數(shù)據(jù)文件的場景。
核心區(qū)別:命名卷由 Docker 托管,綁定掛載直接關(guān)聯(lián)宿主機路徑,根據(jù)場景選擇即可。

浙公網(wǎng)安備 33010602011771號