我想迁移我的应用程序部署以使用docker/docker hub.当前的生产设置是在两台Linux服务器之间平衡流量,运行Apache,Tomcat和MySQL.Java Web应用程序通过JDBC连接到主+从MySQL数据库.
为了最大限度地减少这种变化的影响,作为第一步,我正在考虑将tomcat和Web应用程序容纳在容器中.让Apache和MySQL像现在一样在主机上运行.
我遇到的问题是将在docker容器中运行的应用程序与在主机上运行的MySQL DB连接起来.
我现在能做的最好的事情是连接到docker容器,获取它的IP地址,然后使用SQL GRANT来允许该IP地址访问数据库.这样做的问题在于,每次运行容器时,您都可能获得新的IP地址,因此每次都必须运行一个授权.
我一直在玩这个东西一段时间,我不敢相信没有比我上面提出的更好的解决方案.
有人做过这样的事吗?任何人都有任何关于如何最好地解决这个问题的建议.
编辑 有人建议" 从Docker容器内部,我如何连接到机器的本地主机? "是一个副本 - 但潜在的问题仍然存在.每次我从图像创建Docker容器时,我都可能获得需要被授予访问DB的容器的新IP地址.我想尽量避免这样做.
非常感谢
我有一个应用程序在我的localhost上运行端口8080.我有一些python代码消耗该服务.代码在我的基本系统上运行正常,但是一旦我把它放在一个docker容器中,我就得到了urllib2.URLError: <urlopen error [Errno 111] Connection refused>.我有另一个在端口6543暴露api的应用程序.同样的问题.
我假设我需要告诉docker它允许使用某些localhost端口.我怎么做?
以下是一些更具体的细节:
我可以在我的基本系统上执行这行代码:
urllib2.urlopen(req, json.dumps(dData))
Run Code Online (Sandbox Code Playgroud)
但是当我尝试从docker容器内部进行操作时,我得到:
File "/usr/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 431, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 449, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 409, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1227, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1197, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [Errno 111] Connection refused>
Run Code Online (Sandbox Code Playgroud)
我已经尝试为docker.sock添加权限
ls -l /var/run/docker.sock …Run Code Online (Sandbox Code Playgroud) 我希望将在容器 (Docker) 中运行的 PhpMyAdmin 连接到在主机上运行并在 127.0.0.1 上侦听的 MySQL 服务器。
但是,当我为 docker 提供 varuable -e PMA_HOST=127.0.0.1 时,它只会查看它自己的 Docker 网络......我如何才能与我的主机 MySQL DB 服务器通信?
我有两个SpringBoot微服务M1(端口2002)和M2(端口2004)
M1并且M2如果我使用eclipse(作为Java Project或SpringBoot Project 运行)运行它们,则通信成功。
但是,我想使用进行交流Docker container。
因此,我使用命令为Microservices(M1和M2)构建图像:
docker build -f Dockerfile -t image_name .
Run Code Online (Sandbox Code Playgroud)
并使用以下命令运行图像:
docker run -p 2004:2004 image_name
Run Code Online (Sandbox Code Playgroud)
注意:我正在按照上述定义从docker暴露相同的端口
但是M1和M2无法通信。我在用RestTemplate
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Boolean> isUp = restTemplate.getForEntity("http://localhost:2002/apis/test",Boolean.class);
Run Code Online (Sandbox Code Playgroud)
我低于异常:
I/O error on GET request for \"http://localhost:2002/apis/test\": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用机器的IP调用另一个微服务,则表示通信成功
ResponseEntity<Boolean> isUp = restTemplate.getForEntity("http://XX.XX.XX.XXX:2002/apis/test",Boolean.class);
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我是否正在写(使用IP地址),还是有另一种好的方法可以使用Docker从另一个服务调用一个微服务?
我在Windows 10计算机上运行Postgres,我想从Docker容器连接到它.我遵循了许多来源的指示,事情应该有效,但事实并非如此.
用于创建Docker容器的命令行:
docker run --rm -d --network=host --name mycontainer myimage
Run Code Online (Sandbox Code Playgroud)
在postgresql.conf:
listen_addresses = '*'
Run Code Online (Sandbox Code Playgroud)
在pg_hba.conf:
host all all 172.17.0.0/16 trust
Run Code Online (Sandbox Code Playgroud)
在我的容器的bash shell中,我运行:
psql -h 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
我收到错误:
psql:无法连接到服务器:连接被拒绝
服务器是否在主机"127.0.0.1"上运行并接受端口5432上的TCP/IP连接?
毋庸置疑,Postgres肯定在我的计算机上运行,我可以从本地应用程序查询它.我错过了什么?
我正在使用MongoDB和Docker开发一个非常基本的(我认为)入门程序。在我们开始在工作中使用它们之前,先尝试弄清楚它们。我将MongoDB运行在Docker容器中,仅使用本地主机,使用官方Docker映像。运行正常,我可以通过MongoDB Compass连接到它并修改数据库。
我的下一个任务是构建一个单独的Docker容器,该容器能够读取和写入数据库。我正在为此使用MongoDB-Go-Driver(https://godoc.org/github.com/mongodb/mongo-go-driver/mongo),因为mgo不再跟上。
这是我的代码,我只是按照在线上的众多教程进行简单连接,然后对数据库执行ping操作以确保连接性。
client, err := mongo.Connect("mongodb://localhost:27017")
if err != nil {
log.Fatal("error ", err)
}
// Check the connection
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal("error2 ", err)
}
fmt.Println("Connected to MongoDB!")
Run Code Online (Sandbox Code Playgroud)
使用以下命令对数据库执行任何操作(Find,FindOne,Ping等)时总是失败 error2 server selection timeout
这是我正在运行的docker-compose文件。
version: "3"
services:
datastore:
image: mongo
ports:
- "27017:27017"
networks:
- maccaptionNet
volumes:
- .:/go/src/maccaption_microservice/dbdata
jobservice:
image: jobservicemaccaption:1.0
networks:
- maccaptionNet
depends_on:
- "datastore"
networks:
maccaptionNet:
driver: bridge
Run Code Online (Sandbox Code Playgroud)
我是MongoDB的新手,经过数小时的研究,这方面没有任何进展。我已经阅读了https://docs.mongodb.com/manual/core/read-preference-mechanics/ https://docs.mongodb.com/manual/replication/
有人可以为此指出正确的方向吗?在这个特定问题上,我找不到很多东西。
谢谢!
我在从 docker 容器连接本地 mysql 数据库时遇到问题。我在容器中使用 docker-compose 和两个服务,数据库不在容器上
我有这个 docker-compose 文件:
version: '2'
services:
web:
build:
context: ./
dockerfile: web-dev.dockerfile
volumes:
- ./:/var/www
ports:
- "8080:80"
links:
- app
network_mode: "bridge"
dns:
- 10.0.50.6
app:
build:
context: ./
dockerfile: app-dev.dockerfile
volumes:
- ./:/var/www
network_mode: "bridge"
dns:
- 10.0.50.6
Run Code Online (Sandbox Code Playgroud)
该web容器与此Dockerfile Nginx上的服务:
FROM nginx:1.10
ADD ./vhost.dev.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www
Run Code Online (Sandbox Code Playgroud)
和这个配置文件:
server {
listen 80;
index index.php index.html;
root /var/www/formapp/public;
location / {
try_files $uri /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info …Run Code Online (Sandbox Code Playgroud) 如何设置 docker-compose 文件以连接到内部容器网络和外部本地主机网络?
我尝试在 docker-compose 中使用 extra_hosts 属性,但无法获得我需要的结果
我的 docker-compose 包含以下内容:
version: '3.7'
services:
myapp1:
container_name:
myapp1
hostname:
myapp1
build:
context:
.
dockerfile:
Dockerfile
command:
["npm", "start"]
networks:
- container_network # This is an internal container network
myapp2:
... # Same idea as above
networks:
- container_network # This is an internal container network
networks:
container_network:
name:
container_network
driver:
bridge
Run Code Online (Sandbox Code Playgroud)
我还有一个独立的服务,我使用以下命令运行它:
docker run --name standalone_service --network host
Run Code Online (Sandbox Code Playgroud)
还有其他与我的问题无关的原因,即为什么standalone_service无法合并到docker-compose文件中。因此,将其合并到 docker-compose 文件并使用 container_network 不是此服务的选项。
我希望属于内部container_network的一部分的myapp1能够访问主机网络上的standalone_service。我该怎么做呢?
TL;DR:如何在我的容器中获取客户端以与主机上的服务建立 HTTPS 连接?
我在本地开发机器 (macOS) 的 VM 上运行了一项服务,该服务在端口 8443 上提供 HTTPS;它有一个证书dev.mycoolproject.com并dev.mycoolproject.com有一个A指向 127.0.0.1的记录。因此,如果我在本地计算机上运行我的客户端并将其指向它,https://dev.mycoolproject.com:8443则会与我的本地服务建立安全连接。
我想在 docker 容器中运行我的客户端,并且仍然让它连接到主机上的本地服务器。但显然dev.mycoolproject.com指向 127.0.0.1 是行不通的,我不能仅仅/etc/hosts用来重定向它,因为主机的 IP 是动态的。我可以在 访问本地服务器host.docker.internal:8443,但我会收到 TLS 错误,因为主机名不匹配。
有什么办法可以让docker的DNS映射dev.mycoolproject.com到主机IP?我研究了在容器中本地运行 dnsmasq 但我无法让它工作。
我有一个linux postgres数据库在我的本地主机上运行,端口为5432。我的机器网卡的IP是192.168.68.80。我的 postgres 配置文件如下所示:
listen_addresses = '*'
Run Code Online (Sandbox Code Playgroud)
host all all 0.0.0.0/0 md5
host all all ::/0 md5
Run Code Online (Sandbox Code Playgroud)
现在我想从 Docker 容器内运行的 Node 应用程序连接到该数据库。这是我的环境变量文件加载到 Node 时的样子:
PGHOST=localhost // Host of the postgres db server
PGPORT=5432 // Port of the postgres db
Run Code Online (Sandbox Code Playgroud)
完成此设置后,我使用 docker 文件构建 docker 映像。然后,我尝试在 Linux 上使用以下命令将 dockerfile 作为容器运行:
sudo docker run --network="host" --env-file .env -p 3000:3000 repo:tag
Run Code Online (Sandbox Code Playgroud)
该应用程序开始运行,并侦听端口 3000 上的连接。但是每当我尝试连接到该应用程序时,该应用程序都无法连接到 postgres 数据库服务器并给出以下错误:
/node_modules/sequelize/lib/dialects/postgres/connection-manager.js:172
reject(new sequelizeErrors.ConnectionRefusedError(err));
^
ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 127.0.0.1:5432
at Client._connectionCallback (/node_modules/sequelize/lib/dialects/postgres/connection-manager.js:172:24)
at Client._handleErrorWhileConnecting (/node_modules/pg/lib/client.js:305:19) …Run Code Online (Sandbox Code Playgroud) docker ×10
mysql ×3
networking ×2
postgresql ×2
dns ×1
go ×1
host ×1
java ×1
jdbc ×1
local ×1
lumen ×1
mongodb ×1
node.js ×1
phpmyadmin ×1
python ×1
rest ×1
spring-boot ×1
urllib2 ×1