使用docker-compose与docker运行不同的结果
我正在build立一个通用的公共数据库,我可以链接到其他容器。 在使用docker-compose
和docker 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的卷。 冒号之前的领导部分遵循这些规则:
- 如果看到一个前导
./
,这是一个相对目录: 错误 - 如果领先
/
被看到,这是绝对path。 将卷装入容器。 - 如果你给
foo/bar
类的东西,这被认为是一个相对path。 错误 - 最后,如果你指定了
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