我有一个现有的应用程序,包含4个在同一主机上运行的docker容器.它们已使用该link命令链接在一起.
但是,在对docker进行一些升级后,该link行为已被弃用,并且似乎已更改.我们遇到的问题是容器现在正在失去彼此的链接.
所以,docker说要使用新Network功能而不是linked容器.但我看不出它是如何工作的.
如果2个容器在同一个网络中,ENV那么容器上自动暴露的相同变量就像链接一样吗?
或者是使用正确的容器名称/ IP地址更新主机文件?即使经过一次docker restart?
我在文档中看不到容器如何在其网络中找到另一个容器的位置?
此外,compose看起来有一个简单的设置来链接容器,并可能自动化其中一些 - 将组成定义多容器应用程序的方式?或者在生产中运行它还为时尚早?
是否也compose支持多个主机配置?
在未来的某个时刻,我们可能需要将其中一个容器移动到不同的主机....
服务器规格:
os: Ubuntu 14.04
docker: 1.10.2
docker-compose: 1.6.0
Run Code Online (Sandbox Code Playgroud)
刚刚从1.9升级到1.10并添加了docker-compose(但不是使用compose).在升级之前没有发生缓慢问题.
Docker也配置了我的DNS IP和代理,如'/ etc/default/docker'
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --dns 138.XX.XX.X"
export http_proxy="http://proxy.myproxy.com:8888/"
Run Code Online (Sandbox Code Playgroud)
(我的ip完全拼写出来,只是使用X的问题)
我有两个容器(container_a,container_b)都运行HTTP服务器(Node.js),两个容器都在桥接网络上运行(--net = mynetwork)我通过以下方式创建:
docker network create mynetwork
Run Code Online (Sandbox Code Playgroud)
这两个容器使用container_name作为HTTP调用的"主机",在彼此之间进行HTTP调用,如下所示:
container_b:3000/someurl
Run Code Online (Sandbox Code Playgroud)
这两个容器通过docker bridge网络进行的调用需要很长时间才能完成(约5秒).这些调用通常在100毫秒以下运行.
当我在这些容器上从--net = mynetwork更改网络时,而是将它们作为--net = host运行,同时还修改我的http调用以使用"localhost"作为主机而不是容器名称并通过它们暴露它们的端口a -p flag ...调用在预期时间<100ms内运行.
似乎docker bridge网络导致我在容器之间调用需要很长时间.
我可以在哪里找到诊断/纠正这个问题的想法?
我是第一次尝试使用Docker,我正试图让一个Spring Boot Web应用程序在Docker容器中运行.我正在构建应用程序(将其打包成一个独立的jar),然后将其添加到Docker镜像(这就是我想要的).
你可以在GitHub上的这个Bootup回购中找到我的SSCCE,它的README具有重现我所看到的所有指令.但基本上:
docker build -t bootup .哪个成功docker run -it -p 9200:9200 -d --name bootup bootup然后容器似乎启动就好了,正如docker ps下面输出的证据http://localhost:9200,我什么都没得到docker ps 输出:
CONTAINER ID IMAGE COMMAND CREATED
a8c4ee64a1bc bootup "/bin/sh -c 'java -ja" 2 days ago
STATUS PORTS NAMES
Up 12 seconds 0.0.0.0:9200->9200/tcp bootup
Run Code Online (Sandbox Code Playgroud)
Web应用程序配置为在端口9200上运行,而不是 Java默认值8080.您可以通过运行在docker之外运行应用程序(因此,只在本地主机上)来自行查看./gradlew clean build && java -jar build/libs/bootup.jar.
据我所知,我的主机上没有运行阻止端口的防火墙(我在Mac 10.11.5上验证System Preferences >> …
Docker 容器(基于microsoft/dotnet-framework映像)中的 .NET 应用程序无法连接到安装在 Docker 主机系统上的 SQL Server 2016。Docker 主机为 Windows Server 2016。Docker 版本为 17.03.2-ee-5。
我使用以下命令序列运行容器和 .NET 应用程序:
docker run -it microsoft/dotnet-framework cmd
docker cp App <container-id>:/
docker exec -it <container-id> cmd
cd App
TestConn.exe
Run Code Online (Sandbox Code Playgroud)
TestConn.exe 在大约 10 秒后抛出异常,抱怨它无法连接到 SQL Server。连接字符串是:
Data Source=localhost;Initial Catalog=SomeDB;Persist Security Info=False;User ID=appuser;Password=apppwd;MultipleActiveResultSets=False;Connection Timeout=30;
Run Code Online (Sandbox Code Playgroud)
如果我在 Docker 主机系统中运行 TestConn.exe,则应用程序成功连接到 SQL Server。
我添加--expose=1433到docker run命令 - 没有用。我希望它起作用的方式是 TestConn.exe 尝试连接到 localhost(默认 SQL 端口 1433),然后连接到 Docker 主机中的端口 1433,该端口对应于 SQL Server。
我像这样启动了一个MongoDB容器:
docker run -d -p 27017:27017 --net=cdt-net --name cdt-mongo mongo
Run Code Online (Sandbox Code Playgroud)
我看到我的MongoDB容器已退出:
0e35cf68a29c mongo "docker-entrypoint.s…" Less than a second ago Exited (1) 3 seconds ago cdt-mongo
Run Code Online (Sandbox Code Playgroud)
我检查了Docker日志,我看到:
$ docker logs 0e35cf68a29c
about to fork child process, waiting until server is ready for connections.
forked process: 21
2018-01-12T23:42:03.413+0000 I CONTROL [main] ***** SERVER RESTARTED *****
2018-01-12T23:42:03.417+0000 I CONTROL [main] ERROR: Cannot write pid file to /tmp/tmp.aLmNg7ilAm: No space left on device
ERROR: child process failed, exited with error number 1
Run Code Online (Sandbox Code Playgroud)
有谁知道这个错误是什么?容器中没有足够的空间?
mongodb docker docker-networking docker-container docker-network
我们目前有使用 supervisord 构建复杂构建的 docker 容器,以便我们可以将服务组合在一起。例如,nginx 和 ssh。
我正在尝试使用由共享卷链接的更多服务驱动隔离来重建这些。但是,如果不将 IP 映射到主机,即使端口可能是离散的,我似乎也找不到允许共享 IP 地址的方法。
我想要做的是这样的:
version: '2'
services:
web:
image: nginx
volumes:
- /data/web:/var/www
networks:
public:
ipv4_address: 10.0.0.1
ports:
- "10.0.0.1:80:80"
ssh:
image: alpine-sshd
volumes:
- /data/web:/var/www
networks:
public:
ipv4_address: 10.0.0.1
ports:
- "10.0.0.1:22:22"
networks:
public:
external: true
Run Code Online (Sandbox Code Playgroud)
...public预定义的 docker macvlan 网络在哪里。
当我尝试这个时,我收到错误:
ERROR: for ssh Cannot start service ssh: Address already in use
Run Code Online (Sandbox Code Playgroud)
我知道另一个解决方案是引入第三个服务作为代理。但是,我认为这将是一个足够简单的案例,不需要它。
是否可以将 docker-compose/docker-networking 配置为通过端口路由以允许相同的 IP 地址用于不同的容器?
我的 NAS 是我运行容器的地方。它位于192.168.1.23我的网络上。
我在用户定义的网络中运行了几个容器。这是docker network inspect(我已经手动删除了容器):
[
{
"Name": "traefik2_proxy",
"Id": "fb2924fe59fbb0436c72f11cb028df832a473a165162ecf08b7e3a946cfa2d3c",
"Created": "2020-05-13T23:23:16.16424119+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.90.0/24",
"Gateway": "192.168.90.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
Run Code Online (Sandbox Code Playgroud)
我有一个特定容器位于该网络中的 IP 地址192.168.90.16,我9118在 docker-compose 中使用以下内容公开了端口:
ports:
- target: 9118
published: 9118
protocol: tcp
Run Code Online (Sandbox Code Playgroud)
这是portainer屏幕截图:
我希望能够使用连接到该容器, …
docker-desktop 中有一个选项可以更改“ Docker 子网”。而且我没有看到192.168.65.0/28在任何地方使用这个默认子网。
我尝试docker network inspect在每个 Docker 内部网络上检查 docker-desktop WSL2 发行版和我的 Windows 主机的路由或 IP,但我没有看到在任何地方使用默认子网(即使在设置自定义子网时)。
这不会更改使用的子网docker network inspect bridge或任何其他子网。
我正在努力寻找关于它是什么和/或它用于什么的任何文档。
我有容器在一个覆盖 docker 网络上连接在一起的一组服务(每个服务在不同的 docker 机器上)中运行。
如何从该网络上的容器内部获取与其服务或容器名称相关联的网络上所有使用过的 IP 地址?
谢谢
如何curl http://barfoo:8002在不更改 docker 文件的情况下从 foobar-container 开始工作?
我有以下撰写文件:
version: '3'
services:
foobar:
build:
context: ./foobar
ports:
- 8001:80
depends_on:
- barfoo
barfoo:
build:
context: ./barfoo
ports:
- 8002:80
Run Code Online (Sandbox Code Playgroud)
我将以下内容添加到我计算机上的主机文件中
127.0.0.1 foobar
127.0.0.1 barfoo
Run Code Online (Sandbox Code Playgroud)
现在我用docker-compose up.
当我在终端上执行以下操作时,这在逻辑上可以正常工作,没有任何问题: curl http://barfoo:8002
当我从 foobar 容器 ( docker-compose exec foobar /bin/bash) 中的 Bash 执行相同操作时Failed to connect to barfoo port 8002: Connection refused,如果我使用curl http://barfoo:80它,我会得到。
原因是我想模拟类似生产的情况,在生产中不需要端口,因为它们使用不同的主机名并且都可以直接使用端口 80
docker ×10
containers ×1
docker-swarm ×1
java ×1
macos ×1
mongodb ×1
networking ×1
ubuntu-14.04 ×1