从本地主机连接到Docker MySQL容器?


71

我正在运行一个docker mysql映像,以下是docker-compose.yml文件的外观:

db:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD: ""
    MYSQL_ALLOW_EMPTY_PASSWORD: yes
  ports:
    - "3306:3306"

这很好。

我的问题是:如何从主机(我的Macbook)上的命令行mysql客户端连接到在该容器上运行的MySQL实例?

澄清:

  • 我有一台装有Docker的Macbook
  • 我有一个带有mysql的docker容器
  • 我想从Macbook的终端连接到在上述容器上运行的mysql实例
  • 我不想使用docker命令来实现这一点。相反,我想mysql直接从终端使用客户端(而不通过Docker容器进行隧道传输)。

我没有在本地运行的MySQL,因此应打开端口3306并准备使用它。

我用来启动容器的命令是: docker-compose run


这看起来尤其重要:serverfault.com/questions/688513/...
迦勒

如何在Macbook上安装Docker?docker工具箱,boot2docker还是kitematic?
Thomasleveil

boot2docker 泊坞窗工具箱不可靠。我在他们的github上有未解决的问题,如果/当它变得更稳定时,我将使用它,但是目前boot2docker正在管理VM,并且工作正常。
Caleb 2015年

Answers:


89

使用 docker-compose up

自从您3306Docker主机上发布端口后,您将可以从该主机本身连接到127.0.0.1:3306

使用 docker-compose run

在这种情况下,docker-compose.yml文件的端口映射部分将被忽略。要考虑端口映射部分,您必须添加以下--service-ports选项:

docker-compose run --service-ports db

补充说明

请注意,默认情况下,当告诉mysql客户端连接时,mysql客户端会尝试使用unix套接字进行连接localhost。因此,请使用127.0.0.1而不是localhost

 $ mysql -h 127.0.0.1 -P 3306 -u root

欢迎使用MySQL监视器。命令以;结尾; 或\ g。您的MySQL连接ID是1服务器版本:5.6.26 MySQL Community Server(GPL)

版权所有(c)2000、2015,Oracle和/或其分支机构。版权所有。

Oracle是Oracle Corporation和/或其分支机构的注册商标。其他名称可能是其各自所有者的商标。

输入“帮助;” 或'\ h'寻求帮助。键入“ \ c”以清除当前输入语句。

mysql>

$ mysql -h localhost -P 3306 -u root

错误2002(HY000):无法通过套接字'/var/run/mysqld/mysqld.sock'(2)连接到本地MySQL服务器


1
谢谢你的提示。我尝试使用127.0.0.1(和192.168.59.103),但均无效:(
Caleb 2015年

还有其他想法吗?@Thomasleveil
Caleb

抱歉,我从未亲自使用过boot2docker。也许github.com/docker/docker/issues/4007将有所帮助
Thomasleveil 2015年

1
关于如何使用Docker工具箱工作的任何建议?我很乐意抛弃boot2docker
Caleb

1
好的,检查一下:如果我以此方式运行mysql服务器,则可以正常连接: docker run -p 0.0.0.0:3306:3306 -e MYSQL_ROOT_PASSWORD=foo -d mysql 运行时PORTS列如下所示docker ps0.0.0.0:3306->3306/tcp 但是,在docker compose中指定端口- "0.0.0.0:3306:3306"不起作用。与前面的示例相反,PORTS列如下所示:3306/tcp 关于如何在docker-compose中指定端口的任何想法,以便导致0.0.0.0映射?谢谢一群!
Caleb'9

11

我知道了!!答案是--service-ports在运行时使用该选项docker-compose

docker-compose run --service-ports db (原始的docker-compose.yml文件工作正常)

感谢大家的帮助!


这行得通,但是现在容器是不可杀死的吗?你如何阻止它?
slashdottir

8

在Docker映像中登录MySQL的简单方法是:

sudo docker exec -it <CONTAINER_ID> mysql -u root -p

对于root默认情况下未设置mySQL帐户密码的BLANK,只需按Enter /返回键,除非您已更改root密码。

成功执行后,上述命令会提示您mysql。

干杯!


1
最初的问题非常明确地指出,他们不想这样做。
Stevey '20

4

如果您的Docker MySQL主机正常运行,则可以从本地计算机连接到它,但是您应该指定主机,端口和协议,如下所示:

mysql -h localhost -P 3306 --protocol=tcp -u root

因为您正在Docker容器中运行MySQL,所以套接字不可用,您需要通过TCP连接。在mysql命令中设置“ --protocol”将改变它。


1

您的yml文件看起来不错。

您可以直接将Docker容器直接连接到已映射到本地端口3306的容器。只需转到终端并运行

mysql -h 127.0.0.1 -u root -p

注意:您必须有权访问mysql命令行。如果mysql命令显示错误,请检查'/ usr / local / mysql / bin',否则无法连接到mysql服务器。换句话说,您的计算机上必须具有mysql客户端。


1

这对我有用。

/usr/local/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root -p

1
您能否更详细地解释它的工作原理以及在何处使用?
Bartosz X

多数民众赞成在安装mysql的位置。因此,命令“ / usr / local / mysql / bin / mysql”将运行mysql可执行文件。在某些情况下,仅mysql本身无法工作,这取决于您如何在mac上安装mysql
Swannie

我在通过docker-compose运行的mysql 5.7容器上使用了它,并通过
docker

0

由于您已将主机的内部端口公开为3306,因此通过{host ip}:3306连接到MySQL。如果需要访问MySQL CLI工具,则需要docker exec -it mycontainer bash将其放置在容器中,以访问已安装的工具。如果您没有在主机o / s上本地安装它们,请使用MySQL。


好的答案,默认的mysql docker映像具有mysql-client工具(在
5.6,5.7

0

你可以用--network="host"你的搬运工运行命令,然后127.0.0.1或者localhost在您的码头工人,容器将指向您的码头工人的主机。

docker run --network="host" -p 8080:8080 <your-docker-Image>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.