我安装了最新的Docker CS,并从Docker Hub获得了LAMP image。我正在尝试在其中创建一个数据库,并使用保存在其中的数据库制作一个新映像。
docker run --name mycontainer fauria/lamp
这将启动基于Ubuntu的容器并启动Apache服务器。 MySQL服务器也在容器中运行。docker exec -i -t mycontainer bash
mysql -u root
CREATE DATABASE mydbname;
USE mydbname;
CREATE FUNCTION ...
... docker stop mycontainer
docker commit
docker ps -l -q mynickname/appname:v1
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
我想念什么?
答案 0 :(得分:1)
原因是/var/lib/mysql
在Dockerfile中被列为VOLUME
。
您所做的更改将保留在docker stop <yourcontainer>
和docker start <yourcontainer>
命令之间。但是,当您提交容器时,Dockerfile中标记为VOLUME
的每个目录都将替换为其原始内容。 (即使您没有将外部卷挂载到该目录,也会发生这种情况。)请参见docker commit。
通过在VOLUME
目录之外的某处进行更改,可以轻松地检查其他更改是否保留在提交中。例如,在容器内运行date>/mydate
,然后提交。然后,您从该映像运行新容器时,文件/mydate
仍将存在。
如果要保留数据库更改,可以通过克隆存储库,然后从Dockerfile中删除行VOLUME /var/lib/mysql
来实现。如果您随后构建并运行新映像,则在提交容器时它将保留数据库更改。
通常,在生产环境中,您可以将数据库文件安装在数据容器中或主机上。这样,如果您要提交容器,数据库数据将保留在数据容器或主机中。
答案 1 :(得分:0)
这不是数据库通过容器工作的方式。您必须将数据持久保存在主机上才能保留。容器是一次性的,它们来来去去。
我建议您通过卷将与数据库相关的数据持久存储在主机上。万一容器崩溃,下一个容器应保留该容器的服务,并且数据将被保留。
例如:-
在官方的mysql示例中
$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
您可以看到它们正在装入一个卷以保留数据并在容器重启时保留。
干杯!
答案 2 :(得分:0)
使数据与映像一起提交是用于测试的有用方案。使用预制的基础映像时,您可能必须删除VOLUME条目,请参阅docker-copyedit。
答案 3 :(得分:0)
就我而言,我是通过将数据库转储到SQL文件中来保存数据库架构更改的。我的工作如下:
#!/bin/bash
mysqldump -u root cepheid_development --single-transaction --quick --lock-tables=false > /docker-entrypoint-initdb.d/dump.sql
COPY docker_resources/dump_db.sh /tmp
docker exec $container_id /tmp/dump_db.sh