[英]Different result using docker-compose vs docker run
我正在建立一個通用的通用數據庫,可以與其他容器鏈接。 使用docker-compose
和docker run
時遇到不同的結果。
docker-compose.yml
mysql:
image: mariadb:10.1
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root-secret
MYSQL_USER: dbuser
MYSQL_PASSWORD: my-secret
volumes:
- ./conf:/etc/mysql/conf.d
- ./data:/var/lib/mysql
- ./logs:/var/log/mysql
pma:
image: phpmyadmin/phpmyadmin
links:
- mysql:db
ports:
- 8088:80
environment:
MYSQL_ROOT_PASSWORD: root-secret
MYSQL_USER: dbuser
MYSQL_PASSWORD: my-secret
我正在運行的docker命令是:
docker run -d -P --name mysql -v conf:/etc/mysql/conf.d -v data:/var/lib/mysql \
-v logs:/var/log/mysql -e MYSQL_ROOT_PASSWORD=root-secret \
-e MYSQL_USER=dbuser -e MYSQL_PASSWORD=my-secret -p 3306:3306 mariadb:10.1
docker run -d --name pma --link mysql:db -e MYSQL_ROOT_PASSWORD=root-secret \
-e MYSQL_USER=dbuser -e MYSQL_PASSWORD=my-secret -p 8088:80 phpmyadmin/phpmyadmin
當使用docker-compose up -d
,一切正常,並且主機的數據目錄充滿了數據庫文件。 另外,phpmyadmin可以毫無問題地連接到數據庫容器。
使用docker命令時,主機的數據目錄保持為空,數據存儲在容器中。 嘗試登錄時,phpmyadmin也給我“訪問被拒絕”。
誰能告訴我為什么在使用docker-compose而不是docker時數據量正確掛載並且phpmyadmin能夠通信嗎?
使用以下命令:
docker run -d -P --name mysql \
-v $(pwd)/conf:/etc/mysql/conf.d \
-v $(pwd)/data:/var/lib/mysql \
-v $(pwd)/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=root-secret \
-e MYSQL_USER=dbuser \
-e MYSQL_PASSWORD=my-secret \
-p 3306:3306 \
mariadb:10.1
docker run -d --name pma \
--link mysql:db \
-e MYSQL_ROOT_PASSWORD=root-secret \
-e MYSQL_USER=dbuser \
-e MYSQL_PASSWORD=my-secret \
-p 8088:80 \
phpmyadmin/phpmyadmin
原因
您沒有正確安裝卷。 在docker-compose.yml
文件中,您要指定相對於文件所在目錄的路徑
volumes:
- ./conf:/etc/mysql/conf.d
- ./data:/var/lib/mysql
- ./logs:/var/log/mysql
但是,在docker run
命令中,您沒有使用相對路徑
-v conf:/etc/mysql/conf.d -v data:/var/lib/mysql -v logs:/var/log/mysql
此外, docker run
要求您指定要安裝在容器內的本地目錄的絕對路徑。 因此,必須使用類似於pwd
東西來獲取絕對路徑,或者手動編寫路徑,而不是使用類似於docker-compose.yml
的語法。
-v /path/to/conf:/etc/mysql/conf.d \
-v /path/to/data:/var/lib/mysql \
-v path/to/logs:/var/log/mysql \
干杯!
正如其他人所指出的,區別在於如何指定卷路徑。 但是到目前為止,沒有人解釋為什么,即使您在docker run
“錯誤地”指定了卷,Docker也無誤地接受了它們並繼續前進,或者為什么您看到了所看到的行為。
在docker-compose.yml中,您使用了以下命令:
volumes:
- ./conf:/etc/mysql/conf.d
- ./data:/var/lib/mysql
- ./logs:/var/log/mysql
在這種情況下,您將采用局部相對路徑(以./
,並使用絕對路徑將其安裝在容器內。 這樣很好。
在docker run
命令中,您使用了以下命令:
-v conf:/etc/mysql/conf.d -v data:/var/lib/mysql -v logs:/var/log/mysql
顯然,您打算將此表示為“使用相對路徑”。 如前所述,如果您在此處指定一個以./
的相對路徑,則會出現錯誤,即您無法執行以下操作:
-v ./conf:/etc/mysql/conf.d -v ./data:/var/lib/mysql -v ./logs:/var/log/mysql
您會注意到,通過docker-compose運行時,它按預期運行:使用了主機安裝的卷。 但是,當您通過docker run
,數據將改為保留在容器內,並且不會使用主機安裝的目錄。 為什么?
原因是您使用的-v
語法確實具有有效的目的,而並非您想的那樣。 指定方式創建了命名的 Docker卷。 冒號之前的主要部分遵循以下規則:
./
,則為相對目錄: 錯誤 /
,則為絕對路徑。 將體積裝入容器。 foo/bar
類的東西,則假定這是一條相對路徑。 錯誤 word:/some/path
,則將word
作為一個名稱。 將使用名稱word
創建一個Docker卷,並將其安裝在/some/path
的容器中。 因此,在使用docker run
,您創建了卷。 這些在容器內使用。 正在使用卷,而不是主機安裝的卷。
在網絡方面,我認為您的設置沒有錯。 我對連接錯誤的最佳猜測是,在docker run
方案中,您的數據庫未正確設置,因此phpmyadmin無法使用mysql。 如果您糾正了容量問題,並且phpmyadmin仍然存在問題,請使用您遇到的任何特定錯誤來更新您的問題,並對我的答案發表評論,以便我再次查找。
-v,--volume = [host-src:] container-dest [:]:綁定安裝卷。
逗號分隔的選項是[rw | ro],[z | Z],
[[r] shared | [r] slave | [r] private]和[nocopy]。
“ host-src”是絕對路徑或名稱值。名稱值必須以字母數字字符開頭,后跟a-z0-9,_(下划線)、。 (句號)或-(連字符)。 絕對路徑以/(正斜杠)開頭。
刪除容器后,Docker數據卷仍然存在。 您可以創建命名卷或匿名卷。 命名卷在容器外部具有特定的源形式,例如
awesome:/bar
。 匿名卷沒有特定來源。
一切都對我有用docker-compose和您的docker運行行。 請注意,您不需要-P
標志,文檔說這會將所有公開的端口發布為隨機端口-可能不是您想要的,因為您還指定了-p
標志。
-P, --publish-all Publish all exposed ports to random ports
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.