我正在尝试学习Docker。也许我使它复杂化了。我已经用Nginx构建了一个Docker容器,并且正试图构建一个静态HTML网站。我最初只将Hello World放入HTML文件中,然后运行容器。它出现在浏览器中。然后,我停止了容器并将大量内容添加到html文件中。但是,当我启动容器备份时,没有任何改变,并且Hello World是浏览器中唯一显示的内容。我想我不明白为什么它不会随着我的HTML一起改变。任何帮助将不胜感激。
我通过以下方式停止了该容器:
$ docker stop web
,我将其备份为:
$ docker run -it --rm -d -p 8080:80 --name web webserver
当我停止它并且docker ps
不会出现
此外,使用docker restart似乎根本没有做任何事情
答案 0 :(得分:0)
Docker容器是不可变的,致力于运行单个特定进程。应当构建并运行图像,并且不应更改容器的内容。
因此,在生产的最佳实践中,您将基于图像创建一个新容器,并附加代码/更新。
尽管我知道有一些用例来修改运行中的容器,但它很大程度上取决于您使用的图像以及所产生的容器处理实时更改的性能(是否缓存?)。
答案 1 :(得分:0)
您在哪里修改了HTML文件?容器中的HTML文件似乎没有更新。
docker ps
命令仅显示正在运行的容器。您可以使用docker ps -a
查看所有容器,包括停止的容器。
答案 2 :(得分:0)
一旦构建了dockerfile,它的包含就不再可变了。 因此,您还可以采取其他一些途径来实现自己的目标。
要遵循第二条路径:
docker run -it -v <HTML_LOCAL_PATH>:<HTML_CONTAINER> --rm -d -p 8080:80 --name web webserver
答案 3 :(得分:0)
通常在Docker容器不知道您在容器外部进行更改时会发生这种情况。容器中的代码是您在项目中拥有的代码的副本,而不是代码本身。因此,您必须以某种方式告诉Docker“这是我的代码库,我希望您将其复制到您的容器中”。为此,请使用volumes
。我使用Docker-compose进行此操作,并指定以下卷:
volumes:
- .:/usr/src/service
working_dir: /usr/src/service
.
点表示您的工作目录,而:的另一侧是您的工作目录被复制到的位置–在这种情况下,/usr/src/service
是Docker保留其容器化服务(在unix上)系统(Mac,Linux),至少,我不确定这是否适用于Windows。
working_dir命令告诉Docker侦听容器内部服务目录中发生的更改。
如果您现在运行应用程序并进行更改,并在工作目录中运行实时服务器类型的服务(如Nodemon等),则通常会选择这些更改并显示您编辑的html内容。
如果您对Dockerfile,package.json或其他“构建文件”进行了更改,则必须运行docker-compose up --build
才能将这些更改放入容器中。如果仅更改常规源代码,则仅运行docker-compose up
。