使用docker-compose与docker运行不同的结果

我正在build立一个通用的公共数据库,我可以链接到其他容器。 在使用docker-composedocker run时遇到不同的结果。

泊坞窗,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命令时,主机的数据目录保持为空,并且数据存储在容器中。 尝试login时,phpmyadmin也给我“访问被拒绝”。

任何人都可以告诉我为什么数据量正确安装和phpmyadmin能够沟通时使用docker,而不是与docker?

使用以下命令:

 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文件中,您指定了相对于文件所在目录的path

 volumes: - ./conf:/etc/mysql/conf.d - ./data:/var/lib/mysql - ./logs:/var/log/mysql 

然而,在docker run命令中,你没有使用相对path

 -v conf:/etc/mysql/conf.d -v data:/var/lib/mysql -v logs:/var/log/mysql 

另外, docker run要求你指定要在容器中装载的本地目录的绝对path。 因此,使用类似于docker-compose.yml的语法,您必须使用类似于pwd方法获取绝对path,或者手动编写path。

 -v /path/to/conf:/etc/mysql/conf.d \ -v /path/to/data:/var/lib/mysql \ -v path/to/logs:/var/log/mysql \ 

干杯!

正如其他人所指出的,区别在于如何指定卷path。 但到目前为止,没有人解释为什么,即使您在docker run指定了“错误”的卷,Docker也毫不犹豫地接受了这些卷,并继续前进,或者为什么看到您所看到的行为。

泊坞窗,撰写

在docker-compose.yml中,你使用了这个:

 volumes: - ./conf:/etc/mysql/conf.d - ./data:/var/lib/mysql - ./logs:/var/log/mysql 

在这种情况下,您将采用本地相对path,带有./ ,并使用绝对path安装在容器内。 这工作得很好。

docker运行

在你的docker run命令中,你使用了这个:

 -v conf:/etc/mysql/conf.d -v data:/var/lib/mysql -v logs:/var/log/mysql 

很明显,你打算这样做的意思是“使用相对path”。 正如你已经提到的那样,如果你指定一个相对path的话,那么你会得到一个错误,即你不能这样做:

 -v ./conf:/etc/mysql/conf.d -v ./data:/var/lib/mysql -v ./logs:/var/log/mysql 

发生了什么

您注意到,当您通过docker-compose运行时,它可以像预期的那样工作:使用主机安装的卷。 但是当你通过docker run ,数据保存在容器中,而不是使用主机挂载的目录。 为什么?

原因是你使用的-v语法确实有一个有效的目的,这不是你所想的。 您指定的方式创build了名为 Docker的卷。 冒号之前的领导部分遵循这些规则:

  1. 如果看到一个前导./ ,这是一个相对目录: 错误
  2. 如果领先/被看到,这是绝对path。 将卷装入容器。
  3. 如果你给foo/bar类的东西,这被认为是一个相对path。 错误
  4. 最后,如果你指定了word:/some/path ,那么word被认为是一个名字。 Docker卷是使用名称word创build的,并安装在容器的/some/path

所以当使用docker run ,你创build了卷。 这些在容器内被使用。 卷正在使用,而不是主机安装的卷。

无法连接错误

在networking方面我没有看到任何问题。 关于连接错误的最佳猜测是,在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'是绝对path或名称值。

名称值必须以字母数字字符开头,后跟a-z0-9,_(下划线),。 (句点)或 – (连字符)。 绝对path以/(正斜杠)开头。

pipe理容器中的数据(删除卷)

Docker数据卷在容器被删除后仍然存在。 您可以创build命名卷或匿名卷。 命名卷在容器外有一个特定的源表单,例如awesome:/bar 。 匿名卷没有特定的来源。

一切都适用于我的docker组成和docker运行线。 请注意,您不需要-P标志,文档说这会将所有暴露的端口发布到随机端口 – 不是您想要的,因为您也指定了-p标志。

  -P, --publish-all Publish all exposed ports to random ports