第一次尝试 Docker,有很多问题。安装了 Docker 和 Ubuntu 容器。不知道它没有附带基本的必备工具,如 net-tools、vim、nano 等。安装了我需要的必要工具,测试它是否工作,然后就结束了。今天运行容器时,它回到了早期阶段,所有已安装的软件包都消失了。这是应该发生的吗?我如何在容器中永久安装软件包?
注:我是借助安装脚本安装的Docker-CE版本。
答案1
您把容器误认为虚拟机了。容器只是为运行特定进程而定制的网络和文件系统气泡。它附带所有软件依赖项,因此只需要 Linux 内核。
Ubuntu 等 Docker 镜像很少直接使用。您可以使用Dockerfile
(参见docker build
命令)根据需要进行定制。Dockerfile 用于:
- 安装对该过程有用的特定软件(主要是运行时支持)
RUN apt-get install python3 python3-pip
:RUN pip install requests numpy
- 复制特定文件(通常是您自己的代码,以及应用程序和系统的配置文件(例如证书)):。
COPY application.py /app/
这些文件通常与 Dockerfile 保存在一起。 - 设置容器启动时运行的命令:
ENTRYPOINT ["/usr/bin/python3","/app/application.py"]
最后docker build
,您将得到一个可以执行您的应用程序的可运行的docker镜像。
如果您调整容器,可以使用 将其状态保存为图像docker commit
,但这被认为是不好的做法,因为它不能确保可重复性:如果您需要升级软件,通常使用 Dockerfile 重建容器,因此最好确保 Dockerfile 及其配套文件是构建最终容器所需的全部内容。这也使容器更难共享,您必须导出整个图像,而不仅仅是发送 Dockerfile 和代码/配置。
在实际使用中,Dockerfile 及其配套文件(配置……)在 Git 存储库中进行版本控制,并使用集成链生成的可执行文件。
通常,人们会尝试将容器保持尽可能小。Docker 镜像包含占用空间非常小的发行版。Ubuntu 有很多无用的包袱,而 Debian 通常也一样好用。还有一些预装了软件(Apache、nginx、MySQL……)的专用镜像。
最后,您可能想知道在容器中创建的文件会发生什么……默认情况下,它们是容器本地的,如果删除容器实例(docker rm
命令),它们就会丢失。但是,在启动容器时,您可以将容器的某些文件/目录绑定到主机上的文件/目录,从而在容器外部拥有持久存储。您还可以使用“卷映像”。
容器非常有用,但必须正确使用......
答案2
是的,这是应该发生的。容器注定是短暂的,这意味着你会不断地创建和销毁容器。创建临时容器
通过创建自定义映像,您将始终可以在未来的容器中使用所需的软件包。为此,您首先需要创建一个Dockerfile
如下映像:
FROM ubuntu:latest
RUN apt update -y && apt -y install vim
然后在同一目录中运行,它将通过向新文件添加新层来docker build .
安装包。在构建结束时,您将看到一个唯一的图像 ID,例如:vim
Image
Successfully built 895449f549db
现在,您可以从以前的 id 生成一个包含所有已安装包的新容器。
docker run -ti 895449f549db bash
这是非常基础的东西。我建议你多读一些类似的东西入门
答案3
经过一些阅读,我发现解决我的菜鸟问题的最简单的方法是使用命令run
来运行现有容器,而不是start
使用命令docker
。我知道这是超级菜鸟,但无论如何,我正在为后人写一个基本的解决方案。
创建容器的命令:
docker run -it --name=Ubuntu <image>
分配一个合适的名称(在本例中为 Ubuntu),以便在使用大量容器时轻松发现容器。
稍后运行同一个容器:
docker start -i Ubuntu
另一种方法是将容器实例提交到镜像中,稍后再运行该镜像。它将在新镜像中保留所有已安装的软件。
docker commit container_ID newimagename
docker run -it newimagename