相关疑难解决方法(0)

Dockerized Web应用程序连接到主机上的MySQL DB

我想迁移我的应用程序部署以使用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地址.我想尽量避免这样做.

非常感谢

mysql jdbc docker

5
推荐指数
1
解决办法
1820
查看次数

从docker容器内部向localhost发出请求

我有一个应用程序在我的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)

python urllib2 docker

5
推荐指数
1
解决办法
1784
查看次数

将 phpMyAdmin docker 镜像连接到仅在 127.0.0.1 上侦听的 HOST MySQL 服务器

我希望将在容器 (Docker) 中运行的 PhpMyAdmin 连接到在主机上运行并在 127.0.0.1 上侦听的 MySQL 服务器。

但是,当我为 docker 提供 varuable -e PMA_HOST=127.0.0.1 时,它只会查看它自己的 Docker 网络......我如何才能与我的主机 MySQL DB 服务器通信?

mysql networking local phpmyadmin docker

5
推荐指数
1
解决办法
2046
查看次数

如何使用Docker映像从另一个微服务调用一个微服务

我有两个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从另一个服务调用一个微服务?

java rest docker spring-boot microservices

5
推荐指数
1
解决办法
3984
查看次数

从Debian Docker容器连接到Windows Postgres

我在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肯定在我的计算机上运行,​​我可以从本地应用程序查询它.我错过了什么?

postgresql docker docker-for-windows

5
推荐指数
1
解决办法
430
查看次数

带有Docker的“服务器选择超时错误” MongoDB Go驱动程序

我正在使用MongoDB和Docker开发一个非常基本的(我认为)入门程序。在我们开始在工作中使用它们之前,先尝试弄清楚它们。我将MongoDB运行在D​​ocker容器中,仅使用本地主机,使用官方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/

有人可以为此指出正确的方向吗?在这个特定问题上,我找不到很多东西。

谢谢!

go mongodb docker

5
推荐指数
1
解决办法
4758
查看次数

尝试从 docker 容器连接到本地 mysql 数据库时连接被拒绝

我在从 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)

mysql host docker docker-compose lumen

5
推荐指数
1
解决办法
5282
查看次数

如何将 docker-compose 连接到容器网络和本地主机网络

如何设置 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。我该怎么做呢?

docker docker-compose

5
推荐指数
1
解决办法
3万
查看次数

如何在 docker 容器内将 DNS 名称别名为 hosts.docker.internal?

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 但我无法让它工作。

dns docker

5
推荐指数
2
解决办法
1145
查看次数

从 docker 容器内连接到本地主机 postgres 数据库

我有一个linux postgres数据库在我的本地主机上运行,​​端口为5432。我的机器网卡的IP是192.168.68.80。我的 postgres 配置文件如下所示:

/etc/postgresql/13/main/postgresql.conf

listen_addresses = '*'
Run Code Online (Sandbox Code Playgroud)

/etc/postgresql/13/main/pg_hba.conf

host    all             all             0.0.0.0/0               md5
host    all             all             ::/0                    md5
Run Code Online (Sandbox Code Playgroud)

现在我想从 Docker 容器内运行的 Node 应用程序连接到该数据库。这是我的环境变量文件加载到 Node 时的样子:

.env

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)

postgresql networking node.js docker

5
推荐指数
1
解决办法
1万
查看次数