V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CaptainWho
V2EX  ›  Docker

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

  •  
  •   CaptainWho · 2017-09-10 12:12:58 +08:00 · 15948 次点击
    这是一个创建于 2661 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用如下命令启动一个新的容器并新建了一个 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 应该怎么加参数?
    13 条回复    2017-09-11 00:48:47 +08:00
    bkmi
        1
    bkmi  
       2017-09-10 12:25:47 +08:00 via Android
    commit 然后 run 这个新的 image,保持原有的参数就行
    kkk330
        2
    kkk330  
       2017-09-10 12:26:52 +08:00 via iPhone   ❤️ 1
    具体的指令手册上查下,都有。我更想说的是容器使用的思路和虚拟机使用思路不太一样,容器更多用于无状态服务,快速扩容缩容方面,换个思路用 docker 你的很多问题不是问题
    hcymk2
        3
    hcymk2  
       2017-09-10 13:26:52 +08:00   ❤️ 2
    为什么总有人以为容器 stop 后再 start 里面的 update 会丢失。
    daemonghost
        4
    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
        5
    cloverstd  
       2017-09-10 16:26:48 +08:00
    你应该把你的操作写到 Dockerfile 里,生成新的镜像
    gamexg
        6
    gamexg  
       2017-09-10 17:14:15 +08:00 via Android
    run 可以看作新建虚拟机,如果你没有执行 rm 容器不会丢。
    docker ps -a 可以查看所有容器(包括停止运行的)
    停止运行的可以用 start 命令启动,里面的东西不会丢!!!

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


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

    wordpress 也可以把插件的目录挂载出来
    gamexg
        11
    gamexg  
       2017-09-10 22:39:14 +08:00   ❤️ 1
    @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
        12
    CaptainWho  
    OP
       2017-09-10 22:55:25 +08:00
    @cloverstd
    挂载目录就是我写的那个“-v /host_dir:/container_dir ”吧?
    那我宿主机重启了以后只要 docker start container_name 就可以了?不用加其他参数?
    xujialiang
        13
    xujialiang  
       2017-09-11 00:48:47 +08:00 via iPad
    @hcymk2 有些教程加了— rm 参数,有些教程并没告诉使用者使用 vol。。所以。。。
    刚入门很容易犯这种错
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5520 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 05:50 · PVG 13:50 · LAX 21:50 · JFK 00:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.