我安装了最新的 Docker CS,从 Docker Hub获得了一个LAMP 镜像。我正在尝试在其中创建一个数据库并使用保存在其中的数据库制作新图像。
docker run --name mycontainer fauria/lamp
这将启动基于 Ubuntu 的容器并启动 Apache 服务器。MySQL 服务器也在容器中运行。docker exec -i -t mycontainer bashmysql -u root
CREATE DATABASE mydbname;
USE mydbname;
CREATE FUNCTION ...
...docker stop mycontainerdocker commitdocker ps -l -qmynickname/appname:v1docker 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
我错过了什么?
原因是它在 Dockerfile中/var/lib/mysql被列为 a VOLUME。
您所做的更改保留在docker stop <yourcontainer>和docker start <yourcontainer>命令之间。但是当你提交一个容器时,VOLUMEDockerfile 中标记为的每个目录都被替换为其原始内容。(即使您尚未将外部卷安装到该目录,也会发生这种情况。)请参阅docker commit。
您可以通过在VOLUME目录之外的某处进行更改来轻松检查您的其他更改是否保留在提交中。例如,date>/mydate在容器内运行然后提交它。当您从该映像运行新容器时,该文件/mydate仍将存在。
如果要保留数据库更改,可以通过克隆存储库然后VOLUME /var/lib/mysql从 Dockerfile 中删除该行来实现。如果您随后构建新映像并运行它,它将在您提交容器时保留您的数据库更改。
通常,在生产环境中,您将数据库文件挂载到数据容器或主机上。这样,如果您提交容器,数据库数据将保留在数据容器或主机上。
| 归档时间: |
|
| 查看次数: |
3621 次 |
| 最近记录: |