도커 컨테이너가 로컬/호스트 postgres 데이터베이스에 연결할 수 있도록 허용
저는 최근에 도커와 QGIS를 가지고 놀았고 이 튜토리얼의 지침에 따라 컨테이너를 설치했습니다.
모든 GIS 데이터가 포함된 localhost postgres 데이터베이스에 연결할 수는 없지만 모든 것이 잘 작동합니다.이것은 내 postgres 데이터베이스가 원격 연결을 허용하도록 구성되어 있지 않고 이 문서의 지침을 사용하여 원격 연결을 허용하도록 postgres conf 파일을 편집하고 있기 때문이라고 생각합니다.
할 때 메시지가 여전히 할 수 : "QGIS를 사용할 수 없습니다."라는 메시지가 나타납니다. 서버에 연결할 수 없습니다.Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433?
postgres 서버가 실행 중이며, IP 주소 범위(172.17.0.0/32)에서 연결을 허용하도록 pg_hba.conf 파일을 편집했습니다.나는 이전에 다음을 사용하여 도커 컨테이너의 IP 주소를 쿼리했습니다.docker ps
IP 주소가 변경되더라도 지금까지 항상 172.17.0.x 범위에 있었습니다.
이 데이터베이스에 연결할 수 없는 이유가 있습니까?아마도 내가 상상하는 아주 간단한 것일 것입니다!
Ubuntu 14.04; Postgres 9.3을 실행하고 있습니다.
TL;DR
- 사용하다
172.17.0.0/16
주소 범위가 IP 범위로 됩니다.172.17.0.0/32
. - 사용하지
localhost
Postgre 에 하지만 에 연결합니다.호스트에 SQL 데이터베이스가 있지만 대신 호스트의 IP가 있습니다.컨테이너를 이동 가능한 상태로 유지하려면 다음을 사용하여 컨테이너를 시작합니다.--add-host=database:<host-ip>
를 합니다.database
Postgre Postgre에 연결하기 이름입니다SQL. - 인확SQL이 SQL에서만 하지 않고 IP 주소에서 되었는지 합니다.
localhost
.listen_addresses
포스트그레에서.의 구성 로, 일반적으로 SQL 구파로, 일으에 ./etc/postgresql/9.3/main/postgresql.conf
(@Dazmo Norton 공로의).
롱 버전
172.17.0.0/32
IP 주소 범위가 아니라 단일 주소(즉,172.17.0.0
브리지의 에 해당 할 수 .docker0
). 인터페이스.
도커가 시작되면 호출할 때 쉽게 볼 수 있는 새로운 브리지 네트워크 인터페이스가 생성됩니다.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
주소는 인페이에 IP 소가있입니다.172.17.42.1
의 넷마스크를 쓰고/16
(또는)255.255.0.0
) 가 )라는 것을 172.17.0.0/16
.
IP 로 지정됩니다.172.17.0.0/16
됩니다.각 도커 컨테이너에 대해 해당 범위의 임의 주소가 할당됩니다.
권한을 하려면 즉, 가한모든컨테에서데너스이에대다권액부사니다용합면음여을려하한을세스한이베터를 의미합니다172.17.0.0/16
.
간단한 솔루션
도커의 최신 버전(18.03)은 내장 포트 포워딩 솔루션을 제공합니다.를 도커 컨안너서db 다과음같이하됩니다로 만 하면 .host.docker.internal
이것은 도커 컨테이너가 실행 중인 호스트로 전달됩니다.
이에 대한 설명서는 다음과 같습니다. https://docs.docker.com/docker-for-mac/networking/ #i-voice-to-connect-from-a-voice-to-service-on-the-host
Mac용 도커 솔루션
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
자세한 내용은 릴리스 노트를 참조하십시오.
이전 버전
@헬버트의 대답은 문제를 잘 설명합니다.그러나 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 기과본변동적로연으일다 IP 합니다.lo0
에 docker0
네트워크 인터페이스.
간단한 해결책
그냥추를 추가하세요.--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
여기에 게시된 솔루션은 저에게 적용되지 않습니다.그래서 저는 비슷한 문제에 직면한 누군가를 돕기 위해 이 답변을 올립니다.
참고: 이 솔루션은 Windows 10에서도 작동합니다. 아래 설명을 확인하십시오.
OS: 우분투 18
포스트그레SQL: 9.5(Ubuntu에서 호스팅됨)
도커:서버 응용프로그램(Postgre에 연결)SQL)
나는 애플리케이션을 빌드하기 위해 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"
주소를 확인하십시오.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
OR
$> 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
맛있게 드세요!!
합격할 수 있습니다--network=host
시대에docker run
localhost
컨테이너 안에
예:
docker run --network=host docker-image-name:latest
localhost를 하십시오. env 파일 이름은 env 파일 이름입니다.--env-file
컨테이너 내부의 환경 변수에 액세스하기 위한 매개 변수입니다.
예:
docker run --network=host --env-file .env-file-name docker-image-name:latest
참고: 도커 이미지 이름 앞에 매개 변수를 전달합니다. 그렇지 않으면 매개 변수가 작동하지 않습니다. (이 문제에 직면했으니 주의하십시오!)
도커-디버깅의 경우 그냥 추가해 볼 수 있습니다.
network_mode: "host"
예:
version: '2'
services:
feedx:
build: web
ports:
- "127.0.0.1:8000:8000"
network_mode: "host"
https://docs.docker.com/compose/compose-file/ #network_mode
도커 컨테이너에서 로컬 호스트로 Postgresql을 연결할 수 있는 간단한 설정을 위해 postgresql.conf:
listen_addresses = '*'
그리고 다음 pg_hba.conf를 추가했습니다.
host all all 172.17.0.0/16 password
그런 다음 다시 시작합니다.그러면 도커 컨테이너(172.17.0.2에 있던)의 클라이언트가 호스트(암호, 데이터베이스, 사용자 이름 및 암호)를 사용하여 로컬 호스트에서 실행 중인 Postgresql에 연결할 수 있습니다.
제가 무엇을 했는지 설명해 보겠습니다.
사후 gresql
우선 Postgres 데이터베이스가 외부에서 연결을 허용하는지 확인하는 데 필요한 구성을 수행했습니다.
다열pg_hba.conf
마지막에 다음 행을 추가합니다.
host all all 0.0.0.0/0 md5
다열postgresql.conf
그리고 찾아보세요listen_addresses
다음과 같이 수정합니다.
listen_addresses = '*'
위의 라인에 다음과 같은 주석이 달리지 않았는지 확인합니다.#
-> 데이터베이스를 다시 시작합니다.
OBS: 이 구성은 프로덕션 환경에 권장되지 않습니다.
다음으로, 저는 제 호스트의 것을 찾았습니다.ip
ip를 사용하고 .127.0.0.1
그러나 컨테이너가 이를 보지 못하므로 컨테이너를 실행할 때 문제의 연결 거부 메시지가 표시됩니다.이에 대해 웹에서 오랫동안 검색한 결과, 컨테이너가 로컬 네트워크의 내부 IP를 본다는 것을 알게 되었습니다(라우터가 연결하는 모든 장치에 귀속시키는 것이지, 인터넷에 대한 액세스를 제공하는 IP를 말하는 것이 아닙니다).그렇긴 하지만, 저는 터미널을 열고 다음과 같은 일을 했습니다.
로컬 네트워크 IP를 찾습니다.
터미널 또는 CMD 열기
(MacOS/Linux)
$ ifconfig
(Windows)
$ ipconfig
이 명령은 네트워크 구성 정보를 표시합니다.그리고 다음과 같이 보입니다.
en4:
ether d0:37:45:da:1b:6e
inet6 fe80::188d:ddbe:9796:8411%en4 prefixlen 64 secured scopeid 0x7
inet 192.168.0.103 netmask 0xffffff00 broadcast 192.168.0.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect (100baseTX <full-duplex>)
status: active
활성화된 것을 찾습니다.
의 경우,제 IP는 제경, 제워는 IP였습니다.192.168.0.103
이것을 끝내고, 저는 컨테이너를 돌렸습니다.
도커
으로 합니다.--add-host
매개 변수, 다음과 같습니다.
$ docker run --add-host=aNameForYourDataBaseHost:yourLocalNetWorkIp --name containerName -di -p HostsportToBind:containerPort imageNameOrId
제 경우에는 다음과 같이 했습니다.
$ docker run --add-host=db:192.168.0.103 --name myCon -di -p 8000:8000 myImage
는 중용사를 합니다.Django
그 래서그서8000
포트가 기본값입니다.
장고 애플리케이션
데이터베이스에 액세스하기 위한 구성은 다음과 같습니다.
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': ‘myDataBaseName',
'USER': ‘username',
'PASSWORD': '123456',
'HOST': '192.168.0.103',
'PORT': 5432,
}
}
레퍼런스
에 대하여-p
flag: 네트워크 포트 매핑을 사용하여 연결
흥미로운 기사:도커 팁 #35: 도커 호스트에서 실행 중인 데이터베이스에 연결
Ubuntu에서:
먼저 다음 명령을 사용하여 시스템에서 도커 데이터베이스 포트를 사용할 수 있는지 확인해야 합니다.
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
이제 다음 구성을 통해 로컬 시스템에서 도커 데이터베이스에 쉽게 액세스할 수 있습니다.
host: 172.17.0.2
adapter: mysql
database: DATABASE_NAME
port: 3307
username: DATABASE_USER
password: DATABASE_PASSWORD
encoding: utf8
CentOS에서:
먼저 다음 명령을 사용하여 도커 데이터베이스 포트를 방화벽에서 사용할 수 있는지 확인해야 합니다.
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
이제 위의 구성을 통해 로컬 시스템에서 도커 데이터베이스에 쉽게 액세스할 수 있습니다.
더 나은 보안을 위해 수신 주소를 여러 개 추가할 수 있습니다.
listen_addresses = 'localhost,172.17.0.1'
추가하기listen_addresses = '*'
아주 위험하고 postgresql 데이터베이스를 서부 지역에 노출시키는 것은 좋은 선택이 아닙니다.
3단계 솔루션
도커 합성 파일 업데이트
먼저, 데이터베이스가 로컬이기 때문에 다음 구성을 컨테이너 서비스에 추가하여 호스트 네트워크를 컨테이너에 바인딩해야 합니다.
services:
...
my-web-app:
...
extra_hosts:
- "host.docker.internal:host-gateway"
...
...
/etc/postgresql/12/main/pg_hba.conf 업데이트
파일이 이 용도로 사용되지 않는 경우find / -name 'pg_hba.conf'
찾을 수 있습니다.
태그 합니다.# IPv4 local connections:
host all all 172.17.0.1/16 md5
/etc/postgresql/12/main/postgresql.conf
파일이 이 용도로 사용되지 않는 경우find / -name 'postgresql.conf'
찾을 수 있습니다.
다음 줄 찾기(줄에 주석이 달 수 있음)
#listen_addresses = 'localhost'
할 수 하고 "localhost" 및 ""localhost" postgres"에서 postgres로 연결합니다.172.17.0.1
listen_addresses = 'localhost,172.17.0.1'
다음으로 변경할 수도 있지만, 데이터베이스를 외부에 노출시킬 수 있으므로 프로덕션에는 권장되지 않습니다(즉, 모든 IP 주소가 데이터베이스에 연결될 수 있음).
listen_addresses = '*'
마지막으로 다음을 잊지 마십시오.
- postgres를 사용하여 를 다시 합니다.
sudo systemctl restart postgresql
- 를 연결데업트대상으로 합니다.
host.docker.internal
만약을 위해, 위의 해결책은 아무에게도 통하지 않습니다.아래 문장을 사용하여 도커에서 호스트 포스트그레스(Mac)로 연결합니다.
psql --host docker.for.mac.host.internal -U postgres
내 설정에 필요한 한 가지는 다음과 같습니다.
172.17.0.1 localhost
/etc/hosts
도커가 가리키는 것은172.17.0.1
DB 호스트 이름으로, DB를 찾기 위해 변경되는 외부 IP에 의존하지 않습니다.이것이 이 문제에 대해 다른 누군가에게 도움이 되기를 바랍니다!
또 다른 솔루션은 서비스 볼륨입니다. 서비스 볼륨을 정의하고 호스트의 Postgre를 마운트할 수 있습니다.해당 볼륨의 SQL 데이터 디렉터리입니다.자세한 내용은 지정된 작성 파일을 확인하십시오.
version: '2'
services:
db:
image: postgres:9.6.1
volumes:
- "/var/lib/postgresql/data:/var/lib/postgresql/data"
ports:
- "5432:5432"
이렇게 함으로써, 또 다른 Postgre.SQL 서비스가 컨테이너에서 실행되지만 Postgre 호스트와 동일한 데이터 디렉토리를 사용합니다.SQL 서비스가 사용 중입니다.
언급URL : https://stackoverflow.com/questions/31249112/allow-docker-container-to-connect-to-a-local-host-postgres-database
'programing' 카테고리의 다른 글
HTML에서 가로 인쇄 (0) | 2023.09.02 |
---|---|
CrudRepository를 유형으로 확인할 수 없습니다. (0) | 2023.09.02 |
PowerShell "string not contains" cmdlet 또는 구문이 있습니까? (0) | 2023.09.02 |
POST는 문자 집합을 준수하지 않지만 AJAX 요청은 수행하는 이유는 무엇입니까?톰캣 6 (0) | 2023.09.02 |
라라벨:문자열 데이터, 오른쪽 잘림: 1406 데이터가 열에 대해 너무 깁니다. (0) | 2023.09.02 |