최근에 Docker 및 QGIS를 가지고 놀았 으며이 자습서 의 지침에 따라 컨테이너를 설치했습니다 .
모든 GIS 데이터가 포함 된 localhost postgres 데이터베이스에 연결할 수 없지만 모든 것이 잘 작동합니다. postgres 데이터베이스가 원격 연결을 허용하도록 구성되지 않았고이 기사 의 지시 사항을 사용하여 원격 연결을 허용하기 위해 postgres conf 파일을 편집하고 있기 때문 입니다.
Docker에서 QGIS를 실행하는 데이터베이스에 연결하려고 할 때 여전히 오류 메시지가 나타납니다. 서버에 연결할 수 없습니다 : Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433?
postgres 서버가 실행 중이며 pg_hba.conf 파일을 편집 하여 IP 주소 (172.17.0.0/32) 이전에 도커 컨테이너의 IP 주소를 쿼리 docker ps
했지만 IP 주소가 변경되었지만 지금까지는 항상 172.17.0.x 범위였습니다.
이 데이터베이스에 연결할 수없는 이유가 있습니까? 아마 내가 생각하는 아주 간단한 것!
우분투 14.04를 실행 중입니다. 포스트그레스 9.3
답변
TL; DR
- 이
172.17.0.0/16
아닌 IP 주소 범위로 사용하십시오172.17.0.0/32
. localhost
호스트의 PostgreSQL 데이터베이스에 연결하는 데 사용하지 말고 대신 호스트의 IP를 사용하십시오. 컨테이너를 이식 가능하게 유지하려면--add-host=database:<host-ip>
플래그로 컨테이너를 시작하고database
PostgreSQL에 연결하기위한 호스트 이름으로 사용하십시오 .- PostreSQL이뿐만 아니라 모든 IP 주소의 연결을 수신하도록 구성되어 있는지 확인하십시오
localhost
.listen_addresses
일반적으로/etc/postgresql/9.3/main/postgresql.conf
(@DazmoNorton의 신용에있는) PostgreSQL 구성 파일에서 설정 을 찾으십시오 .
긴 버전
172.17.0.0/32
없는 범위의 IP 주소,하지만 하나의 주소는 (namly 172.17.0.0
). Docker 브리지 ( docker0
) 인터페이스 의 네트워크 주소이므로 Docker 컨테이너에는 해당 주소가 할당되지 않습니다 .
Docker가 시작되면 새로운 브리지 네트워크 인터페이스가 만들어져 호출 할 때 쉽게 볼 수 있습니다 ip a
.
$ ip a
...
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
보시다시피, 내 경우에는 docker0
인터페이스 172.17.42.1
에 넷 마스크가 /16
(또는 255.255.0.0
) 인 IP 주소 가 있습니다. 이는 네트워크 주소가 172.17.0.0/16
입니다.
IP 주소는 임의로 할당되지만 추가 구성이 없으면 항상 172.17.0.0/16
네트워크에있게됩니다. 각 Docker 컨테이너에 대해 해당 범위의 임의 주소가 할당됩니다.
즉, 가능한 모든 컨테이너에서 데이터베이스로 액세스 권한을 부여하려면을 사용하십시오 172.17.0.0/16
.
답변
Mac 용 Docker 솔루션
17.06 이후
@Birchlabs의 의견 덕분에 이제이 특별한 Mac 전용 DNS 이름을 사용 하면 훨씬 쉽습니다 .
docker run -e DB_PORT=5432 -e DB_HOST=docker.for.mac.host.internal
17.12.0-cd-mac46부터 docker.for.mac.host.internal
대신 사용해야합니다 docker.for.mac.localhost
. 자세한 내용은 릴리스 노트 를 참조하십시오.
이전 버전
@helmbert의 대답은 문제를 잘 설명합니다. 그러나 Mac 용 Docker 는 브리지 네트워크를 노출시키지 않으므로 제한을 해결하기 위해이 트릭을 수행해야했습니다.
$ sudo ifconfig lo0 alias 10.200.10.1/24
/usr/local/var/postgres/pg_hba.conf
이 줄을 열고 추가하십시오.
host all all 10.200.10.1/24 trust
/usr/local/var/postgres/postgresql.conf
변경 사항 열기 및 편집 listen_addresses
:
listen_addresses = '*'
서비스를 다시로드하고 컨테이너를 시작하십시오.
$ PGDATA=/usr/local/var/postgres pg_ctl reload
$ docker run -e DB_PORT=5432 -e DB_HOST=10.200.10.1 my_app
이 해결 방법은 기본적으로 @helmbert의 답변과 동일하지만 네트워크 인터페이스 lo0
대신 연결된 IP 주소를 사용합니다 docker0
.
답변
Mac 용 간단한 솔루션 :
최신 버전의 도커 (18.03)는 내장 포트 포워딩 솔루션을 제공합니다. 도커 컨테이너 안에는 db 호스트가로 설정되어 host.docker.internal
있습니다. 이것은 도커 컨테이너가 실행되는 호스트로 전달됩니다.
이에 대한 설명서는 다음과 같습니다. https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
답변
간단한 솔루션
그냥 추가 --network=host
로docker run
. 그게 다야!
이 방법 컨테이너는 호스트의 네트워크를 사용되므로 localhost
및 127.0.0.1
호스트 (기본적으로 그들이 용기를 가리 키)를 가리 킵니다. 예:
docker run -d --network=host \
-e "DB_DBNAME=your_db" \
-e "DB_PORT=5432" \
-e "DB_USER=your_db_user" \
-e "DB_PASS=your_db_password" \
-e "DB_HOST=127.0.0.1" \
--name foobar foo/bar
답변
우분투에서 :
먼저 다음 명령을 사용하여 시스템에서 Docker 데이터베이스 포트가 사용 가능한지 확인해야합니다-
sudo iptables -L -n
샘플 출력 :
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:3306
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:22
다음은 3306
이 포트는 다음 명령을 사용할 수 실행하지 않은 경우, 172.17.0.2 IP에 도커 데이터베이스 포트로 사용됩니다 –
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
이제 다음 구성에 따라 로컬 시스템에서 Docker 데이터베이스에 쉽게 액세스 할 수 있습니다
host: 172.17.0.2
adapter: mysql
database: DATABASE_NAME
port: 3307
username: DATABASE_USER
password: DATABASE_PASSWORD
encoding: utf8
CentOS에서 :
먼저 다음 명령을 통해 방화벽에서 Docker 데이터베이스 포트가 사용 가능한지 확인해야합니다.
sudo firewall-cmd --list-all
샘플 출력 :
target: default
icmp-block-inversion: no
interfaces: eno79841677
sources:
services: dhcpv6-client ssh
**ports: 3307/tcp**
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
다음은 3307
이 포트는 다음 명령을 사용할 수 실행하지 않은 경우, 172.17.0.2 IP에 도커 데이터베이스 포트로 사용됩니다 –
sudo firewall-cmd --zone=public --add-port=3307/tcp
서버에서 포트를 영구적으로 추가 할 수 있습니다
sudo firewall-cmd --permanent --add-port=3307/tcp
sudo firewall-cmd --reload
이제 위 구성으로 로컬 시스템에서 Docker 데이터베이스에 쉽게 액세스 할 수 있습니다.
답변
여기에 게시 된 솔루션이 효과가 없습니다. 따라서 비슷한 문제에 직면 한 사람을 돕기 위해이 답변을 게시하고 있습니다.
OS : Ubuntu 18
PostgreSQL : 9.5 (Ubuntu에서 호스팅)
Docker : 서버 응용 프로그램 (PostgreSQL에 연결)
docker-compose.yml을 사용하여 응용 프로그램을 작성하고 있습니다.
1 단계 : 추가하십시오host.docker.internal:<docker0 IP>
version: '3'
services:
bank-server:
...
depends_on:
....
restart: on-failure
ports:
- 9090:9090
extra_hosts:
- "host.docker.internal:172.17.0.1"
도커의 IP를 찾으려면 i.e. 172.17.0.1 (in my case)
다음을 사용할 수 있습니다.
$> ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
또는
$> ip a
1: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
2 단계 : postgresql.conf에서 listen_addresses를listen_addresses = '*'
3 단계 : pg_hba.conf에서이 줄을 추가하십시오
host all all 0.0.0.0/0 md5
4 단계 : 이제 다음을 사용하여 postgresql 서비스를 다시 시작하십시오.sudo service postgresql restart
5 단계 :host.docker.internal
호스트 이름을 사용하여 서버 응용 프로그램에서 데이터베이스를 연결 하십시오 .
전의:jdbc:postgresql://host.docker.internal:5432/bankDB
즐겨!!
답변
docker-compose의 경우 추가하면됩니다.
network_mode: "host"
예 :
version: '2'
services:
feedx:
build: web
ports:
- "127.0.0.1:8000:8000"
network_mode: "host"