Docker 提交 - 不保存数据库更改

fla*_*mey 2 lamp docker

我安装了最新的 Docker CS,从 Docker Hub获得了一个LAMP 镜像。我正在尝试在其中创建一个数据库并使用保存在其中的数据库制作新图像。

  1. 启动容器:docker run --name mycontainer fauria/lamp 这将启动基于 Ubuntu 的容器并启动 Apache 服务器。MySQL 服务器也在容器中运行。
  2. 访问容器外壳: docker exec -i -t mycontainer bash
  3. 创建一个数据库并在其上运行一些 MySQL 命令: mysql -u root CREATE DATABASE mydbname; USE mydbname; CREATE FUNCTION ... ...
  4. 停止容器: docker stop mycontainer
  5. 创建镜像:docker commitdocker ps -l -qmynickname/appname:v1
  6. 取出容器 docker container rm mycontainer

现在我预计如果我基于新图像运行容器,我已经在那里有了数据库。但它不在那里。 docker run --name mycontainer --rm -p 80:80 -e LOG_STDOUT=true -e LOG_STDERR=true -e LOG_LEVEL=debug -v /home/username/dev/appname/www:/var/www/html mynickname/appname:v1

我错过了什么?

NZD*_*NZD 5

原因是它在 Dockerfile中/var/lib/mysql被列为 a VOLUME

您所做的更改保留在docker stop <yourcontainer>docker start <yourcontainer>命令之间。但是当你提交一个容器时,VOLUMEDockerfile 中标记为的每个目录都被替换为其原始内容。(即使您尚未将外部卷安装到该目录,也会发生这种情况。)请参阅docker commit

您可以通过在VOLUME目录之外的某处进行更改来轻松检查您的其他更改是否保留在提交中。例如,date>/mydate在容器内运行然后提交它。当您从该映像运行新容器时,该文件/mydate仍将存在。

如果要保留数据库更改,可以通过克隆存储库然后VOLUME /var/lib/mysql从 Dockerfile 中删除该行来实现。如果您随后构建新映像并运行它,它将在您提交容器时保留您的数据库更改。

通常,在生产环境中,您将数据库文件挂载到数据容器或主机上。这样,如果您提交容器,数据库数据将保留在数据容器或主机上。