我正在阅读Project Atomic's guidance for images,其中指出使用卷的两个主要用例是: -
在我的示例中,我没有使用Nginx图像的这些用例。我打算在容器中的Nginx docroot路径中将主机目录作为卷挂载。这样我就可以将网站内容的更改推送到主机,而不是解决容器问题。我觉得使用这种方法更容易,因为我可以 - 例如 - 只需将我的ssh密钥添加到主机一次。
我的问题是,这是否适当地使用了数据卷?如果没有,是否有人可以提出更新容器内数据的替代方法?
答案 0 :(得分:2)
使用Docker的主要原因之一是将您的应用与服务器隔离。这意味着您可以在任何地方运行容器并获得相同的结果。这是我的主要用例。
如果从这个角度来看,让容器依赖主机上的文件以适应已部署的环境会产生反作用 - 在不同的机器上运行相同的容器可能会导致不同的输出。
如果您不关心这一点,并且只是使用docker来简化nginx的安装,那么您可以使用主机系统中的卷。
考虑一下......
#Dockerfile
FROM nginx
ADD . /myfiles
#docker-compose.yml
web:
build: .
然后,您可以使用docker-machine连接到远程服务器并使用简单的命令部署新版本的软件
docker-compose build
docker-compose up -d
甚至更好,你可以做到
docker build -t me/myapp .
docker push me/myapp
然后使用
进行部署docker pull
docker run
答案 1 :(得分:1)
有许多方法可以实现更新容器中的数据。主机卷是一种有效的方法,可能是实现数据可用的最简单方法。
您也可以从主持人copy files into and out of a container。如果您要停止并正在删除正在运行的Web主机容器,则可能需要在之后提交。
docker cp /src/www webserver:/www
您可以将文件从Dockerfile
复制到docker映像构建中,这与上面的过程相同(复制和提交)。然后从新映像重新启动Web服务器容器。
COPY /src/www /www
但我认为主机音量是一个不错的选择。
docker run -v /src/www:/www webserver command
Docker data containers也是已装入卷的选项,但它们无法解决将数据复制到数据容器中的直接问题。
如果你发现自己在想“我需要ssh到这个容器”,你可能做错了。
答案 2 :(得分:0)
不确定我是否完全理解您的要求。但是为什么你需要这样做才能将文件推送到Nginx容器中。
在单独的docker容器中管理卷,这是我的建议并由Docker.io推荐
A data volume is a specially-designated directory within one or more containers that bypasses the Union File System. Data volumes provide several useful features for persistent or shared data:
Volumes are initialized when a container is created. If the container’s base image contains data at the specified mount point, that existing data is copied into the new volume upon volume initialization.
Data volumes can be shared and reused among containers.
Changes to a data volume are made directly.
Changes to a data volume will not be included when you update an image.
Data volumes persist even if the container itself is deleted.
答案 3 :(得分:0)
如上所述,使用docker的主要原因之一是实现始终相同的结果。最佳做法是使用data only container。
使用docker inspect <container_name>
,您可以知道主机上卷的路径并手动更新数据,但不建议这样做;
或者您可以从外部源检索数据,例如git存储库