man*_*.vu 16 docker docker-compose vscode-devcontainer
在开发容器的文档中它说The Visual Studio Code Dev Containers extension lets you use a container as a full-featured development environment。根据我的理解,它创建一个容器,其中包含本地开发应用程序所需的所有资源/库。这不正是 Docker 和 Docker Compose 的目的吗?更不用说 Dev Container 还需要 Docker 和 dockerfile。
归根结底,他们的目的是让开发人员能够立即启动开发环境,而不必担心依赖关系。那么这两者到底有什么区别呢?
Dav*_*aze 13
Docker主要不是一个开发人员工具,Compose 的主要目标也不是建立一个开发人员环境。
事实上,Docker 有几个核心功能似乎与将其用作开发人员环境相反。每个容器都有一个隔离的文件系统,因此容器通常无法看到主机系统上的代码,主机系统也无法看到仅安装在容器中的工具。此外,容器基于不可变的映像:如果不重建映像并重新创建容器,通常无法更改容器正在运行的代码。对于使用编译语言(C++、Java、Go、Rust)的开发人员来说,这是一个熟悉的工作流程,即使没有 Docker,您仍然需要在每次更改后重新编译并重新启动应用程序。
这种更典型的不可变图像设置的一个很好的例子是运行数据库容器。你会经常跑步
docker run -d -p 5432:5432 -v pgdata:/var/lib/postgresql/data postgres:14
Run Code Online (Sandbox Code Playgroud)
但要运行它,您不需要下载 PostgreSQL 的源代码,并且在正常使用中您可以完全通过已发布的端口与其进行交互。镜像本身不包含任何源代码或构建工具。
除此之外,您可以使用 Compose 构建由多个容器构建的更大的应用程序;例如
version: '3.8'
volumes:
pgdata:
services:
db:
image: postgres:14
ports: ['5432:5432']
volumes: ['pgdata:/var/lib/postgresql/data']
app:
image: registry.example.com/myapp:${MYAPP_TAG:-latest}
ports: ['8000:8000']
depends_on: [db]
environment: {PGHOST: db}
Run Code Online (Sandbox Code Playgroud)
同样,此设置不依赖于任何可用的源代码;只要您有预构建的映像,就可以运行它。
特别是如果您确实有解释性语言,则可以使用绑定安装将本地源代码注入到映像中的代码上。如果执行此操作,容器将运行主机系统上的代码。对于基于节点的应用程序,您经常会看到这种情况
services:
app:
build: .
ports: ['3000:3000']
volumes:
- .:/app # replace everything in the image with local code
- /app/node_modules # hack: use an anonymous volume rather than host library tree
Run Code Online (Sandbox Code Playgroud)
然而,即使这样,您也无法直接与容器内的工具进行交互。我看到几个关于想要使用基于 Docker 的设置而不是基于主机的工具的问题,只要您不介意将所有内容包装在docker某种调用中,您就可以这样做
# doesn't work if yarn isn't installed locally
yarn add somelib
# uses the yarn in the `node` image, but long-winded
docker-compose run app \
yarn add somelib
Run Code Online (Sandbox Code Playgroud)
这确实导致了一种 Docker 镜像的风格,它只是工具的集合,其中没有任何特定的应用程序。例如,可以通过这种方式使用未修改的golang图像。node您可以将它们插入像 Jenkins 这样的 CI 工具中,该工具知道如何执行所有绑定安装,并使容器工具看起来像在正在构建的存储库上工作的正常管道的上下文中可用。
开发容器与此没有什么不同。 具体来说,如果您使用 Visual Studio Code,它们将允许您使用容器外的工具来开发您正在开发的应用程序。您可以使用一个devcontainer.json文件启动多个容器,但这不一定是主要用例;通常的期望是您将拥有一个工具容器,但不将应用程序嵌入到映像中。据我所知,它与 VSCode 相关,不一定在其他环境中可用,在其他环境中您也可以使用 Compose 或普通 Docker 进行生产部署。
| 归档时间: |
|
| 查看次数: |
5470 次 |
| 最近记录: |