簡體   English   中英

無法從另一個容器訪問Docker容器中的MySQL數據庫

[英]Can't access MySQL database in Docker container from another container

我從這里拉了MySQL 5.7容器: https//hub.docker.com/_/mysql/

這是我如何運行它:

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7

它運行良好,我可以從我的主機連接到MySQL數據庫。

但是,當我嘗試運行另一個容器,其中mysql容器鏈接如下:

docker run --link mysql:mysql -p 8080:8080 -d app:dev

我的容器無法連接到mysql

# 172.17.0.3 is mysql's ip taken from /etc/hosts of another container.
mysql -h 172.17.0.3 -u root -ppwd

ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.3'

我試圖使用docker網絡,但我得到了同樣的錯誤。

這是nmap -p 3306 172.17.0.2輸出:

Starting Nmap 7.01 ( https://nmap.org ) at 2018-06-03 08:34 UTC
Nmap scan report for e66874413058 (172.17.0.2)
Host is up (0.00012s latency).
PORT     STATE  SERVICE
3306/tcp closed mysql

Nmap done: 1 IP address (1 host up) scanned in 0.39 seconds

由於未知原因,端口已關閉。 如果我從我的主機運行nmap命令,它是打開的。

如何從另一個docker容器連接到MySQL服務器?

我不得不承認我沒有立即看到它出錯的地方,因為基於IP的通信也應該有效,但讓我解釋讓容器通信的推薦方法。 當您將應用程序容器與mysql容器鏈接時(就像您正在做的那樣),您可以在不使用ip的情況下訪問其容器名稱上的mysql。

在默認橋接網絡中:

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7

現在我啟動一個隨機應用程序並將其與mysql鏈接。 curlping安裝在此容器中。

docker run -d -p 8080:8080 --link mysql:mysql randomapp

現在我進入我的randomapp容器並嘗試ping的mysql容器。

docker exec -it 7c4bc6f1ca7a bash
xxx@7c4bc6f1ca7a:/$ ping mysql
PING mysql (172.17.0.3) 56(84) bytes of data.
64 bytes from mysql (172.17.0.3): icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from mysql (172.17.0.3): icmp_seq=2 ttl=64 time=0.049 ms

我也可以使用nmap容器進行驗證

docker@default:~$ docker run --rm --link mysql:mysql uzyexe/nmap mysql 3306

Starting Nmap 7.60 ( https://nmap.org ) at 2018-06-06 05:54 GMT
setup_target: failed to determine route to 3306 (0.0.12.234)
Nmap scan report for mysql (172.17.0.3)
Host is up (0.000010s latency).
Not shown: 999 closed ports
PORT     STATE SERVICE
3306/tcp open  mysql
MAC Address: 02:42:AC:11:00:03 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 1.65 seconds
docker@default:~$

如果在同一個用戶定義的橋接網絡中部署應用程序和mysql,則無需定義--link選項,並且容器可以使用其容器名稱相互通信。

docker network create my-bridge
docker run --name mysql --net my-bridge -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd -d mysql:5.7
docker run -d -p 8080:8080 --net my-bridge randomapp

建議使用用戶定義的網絡,而不是默認橋接網絡中的“已棄用” - 鏈接功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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