Docker 刚入门,请问如何正确保存更新后的容器并再次运行?谢谢

2017-09-10 12:12:58 +08:00
 CaptainWho
使用如下命令启动一个新的容器并新建了一个 volume 文件夹
docker run --name my_container --net host -u 0 -p 8080:8080 -v /host_dir:/container_dir image_name
接下来会在容器中进行一些更新等操作,我想知道正确保存这个修改后的容器并再次运行的姿势是怎样的?
( ps:系统是会有重启操作的)
是修改完成后直接 commit 一个新镜像?然后再 run 又新建一个容器?参数怎么加?
还是 stop 或者 pause 容器?重启系统后不会丢失什么东西吗? start 应该怎么加参数?
15948 次点击
所在节点    Docker
13 条回复
bkmi
2017-09-10 12:25:47 +08:00
commit 然后 run 这个新的 image,保持原有的参数就行
kkk330
2017-09-10 12:26:52 +08:00
具体的指令手册上查下,都有。我更想说的是容器使用的思路和虚拟机使用思路不太一样,容器更多用于无状态服务,快速扩容缩容方面,换个思路用 docker 你的很多问题不是问题
hcymk2
2017-09-10 13:26:52 +08:00
为什么总有人以为容器 stop 后再 start 里面的 update 会丢失。
daemonghost
2017-09-10 14:39:29 +08:00
可以修改之后再 commit 一个新的镜像,但是并不推荐这么做。如果你想实现某种特定功能的镜像(在[Docker Store]( https://store.docker.com/)并没有现成可用的),你可以自己尝试着编写 Dockerfile 来生成自定义功能的 Docker 镜像。

可以参考下面这篇文章所述的原则来编写 Dockerfile 文件,去自定义 Docker 镜像。
[编写 Dockerfile 的最佳实践]( https://toutiao.io/posts/0vd16l)
cloverstd
2017-09-10 16:26:48 +08:00
你应该把你的操作写到 Dockerfile 里,生成新的镜像
gamexg
2017-09-10 17:14:15 +08:00
run 可以看作新建虚拟机,如果你没有执行 rm 容器不会丢。
docker ps -a 可以查看所有容器(包括停止运行的)
停止运行的可以用 start 命令启动,里面的东西不会丢!!!

但是不建议这么玩,推荐的方式是把步骤写到 dockerfile 文件。


@hcymk2 主要问题出在 docker ps 默认不显示已经停止的容器,让人以为容器停止后就消失了。
powergx
2017-09-10 21:38:21 +08:00
docker 的容器应该是无状态的. lz 有这个需求代表你用法不对.
CaptainWho
2017-09-10 22:07:29 +08:00
@cloverstd
@powergx
@gamexg
比如 centos、ubuntu 下载了一些软件包,wordpress、jenkins 下载了一些插件,我总不能把步骤写到文件里每次启动都重新下载一遍吧。。。
ParadiseDS
2017-09-10 22:23:40 +08:00
@CaptainWho 写 Dockerfile 是为了干净地生成镜像,只有生成镜像的时候需要下载一次,之后直接用生成的镜像起容器就行了,commit 这种生成的一次性黑盒镜像后期比较蛋疼,建议还是上 dockerfile
cloverstd
2017-09-10 22:24:32 +08:00
@CaptainWho #8 jenkins 可以把 workspace 挂载出来

wordpress 也可以把插件的目录挂载出来
gamexg
2017-09-10 22:39:14 +08:00
@CaptainWho #8 一般 ubuntu 下载软件包这种还真是写到 dockerfile 里面,理论每次重新创建镜像都会重新下载一次。不过实际并不是每次都下载,dockerfile 每一个 RUN 都是独立的一层,都会建立缓存,除非上一层变更或手工删除了镜像,不然会直接使用上次的缓存,不需要重新下载一次。

wordpress 一般是把 www 目录映射到物理主机的一个目录,重新构建容器时就不需要再次下载 wordpress 插件了,直接使用 www 目录即可。对了,wordpress docker 官方有专门的镜像。


另外你用 docker 的场景是什么?
我自己玩的话都是用 docker-compose,例如建立一个 wordpress 目录,在里面放一个 docker-compose.yml 文件,内容是:
web:
image: wordpress
volumes:
- ./web/html/:/var/www/html
links:
- mysql
environment:
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=password
- WORDPRESS_DB_NAME=wordpress
ports:
- "8001:80"

mysql:
image: mysql:5.7
volumes:
- ./mysql/conf.d/:/etc/mysql/conf.d
- ./mysql/datadir/:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=wordpress

然后在同一目录执行 docker-compose up,wordpress 就起来了,所有需要永久保存的数据( www 目录及数据库文件)都在当前目录保存着,需要迁移时只要拷贝这个目录然后在新的电脑下执行下 docker-compose up 就算是部署完毕了。
这个是 docker-compose 老版本的例子,新版本语法有了些修改,不过这个老版本还一样能用。

这个例子使用的是现成的 docker 镜像(基本都是用 dockerfile 生成的),如果需要定制也可以指定 dockerfile 文件自己生成镜像。
CaptainWho
2017-09-10 22:55:25 +08:00
@cloverstd
挂载目录就是我写的那个“-v /host_dir:/container_dir ”吧?
那我宿主机重启了以后只要 docker start container_name 就可以了?不用加其他参数?
xujialiang
2017-09-11 00:48:47 +08:00
@hcymk2 有些教程加了— rm 参数,有些教程并没告诉使用者使用 vol。。所以。。。
刚入门很容易犯这种错

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/389530

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX