簡體   English   中英

使用docker-compose和docker run的不同結果

[英]Different result using docker-compose vs docker run

我正在建立一個通用的通用數據庫,可以與其他容器鏈接。 使用docker-composedocker 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卷。 冒號之前的主要部分遵循以下規則:

  1. 如果看到前導./ ,則為相對目錄: 錯誤
  2. 如果看到前導/ ,則為絕對路徑。 將體積裝入容器。
  3. 如果您提供類似foo/bar類的東西,則假定這是一條相對路徑。 錯誤
  4. 最后,如果您指定word:/some/path ,則將word作為一個名稱。 將使用名稱word創建一個Docker卷,並將其安裝在/some/path的容器中。

因此,在使用docker run ,您創建了卷。 這些在容器內使用。 正在使用卷,而不是主機安裝的卷。

無法連接錯誤

在網絡方面,我認為您的設置沒有錯。 我對連接錯誤的最佳猜測是,在docker run方案中,您的數據庫未正確設置,因此phpmyadmin無法使用mysql。 如果您糾正了容量問題,並且phpmyadmin仍然存在問題,請使用您遇到的任何特定錯誤來更新您的問題,並對我的答案發表評論,以便我再次查找。

參考文獻

Docker運行參考(VOLUME)

-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM