%EA%B0%80%20%EC%8B%A4%ED%96%89%EB%90%98%EA%B3%A0%20%EC%9E%88%EC%A7%80%20%EC%95%8A%EC%9D%84%20%EB%95%8C%EC%97%90%EB%8F%84%20%EC%A1%B4%EC%9E%AC%ED%95%98%EB%8A%94%EC%A7%80%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%99%95%EC%9D%B8%ED%95%98%EB%82%98%EC%9A%94%3F.png)
컨테이너 스택(으로 지정)이 있습니다 docker-compose.yml
. 스택에는 PostgreSQL 데이터베이스가 필요하지만 스택의 일부가 되는 대신 로컬에서 실행되는 기본 인스턴스를 사용하고 있습니다(예: 백업을 더 쉽게 만들고 리소스를 절약하기 위해). PostgreSQL 인스턴스는 172.17.0.1
도커 컨테이너 내에서 호스트에 연결할 수 있는 IP인 를 바인딩하고 수신하도록 설정됩니다.
그러나 시스템 시작 중에 PostgreSQL은 해당 주소에 바인딩되지 않으며 이후 컨테이너는 초기화에 실패합니다. 나중에 PostgreSQL을 다시 시작하면 바인딩되어( 을 통해 ss
) 컨테이너가 제대로 초기화되는 것을 볼 수 있습니다 . 이는 부팅할 때마다 100% 재현 가능합니다.
인터페이스가 아직 존재하지 않아서 바인딩할 것이 없기 때문인 것 같습니다. docker가 아직 초기화되지 않은 동안에도 바인딩될 수 있도록 네트워크(또는 인터페이스)를 "지속"하는 방법이 있습니까?
(또한 PostgreSQL용 시스템 서비스 파일에 지정을 시도했지만 After=docker.service
운이 없었습니다. 도커가 이미 초기화되었지만 컨테이너 스택이 초기화되지 않았기 때문에 네트워크도 아직 생성되지 않았기 때문인 것 같습니다. 지정 " 내가 아는 한 systemd에서 docker 컨테이너가 시작될 때까지 기다리는 것은 불가능합니다.)
답변1
나는 같은 문제를 다루고 있습니다. 해결책을 찾았지만 마음에 들지 않을 수도 있습니다. listen_addresses
Postgresql을 로 설정하면 대신 주소 '*'
에 바인딩되어 0.0.0.0
모든 인터페이스에서 트래픽을 수신하게 됩니다. 여러 서버에서 제대로 작동하는 것을 확인했습니다.
예, DB 서버를 공개 주소에 바인딩하는 것은 죄악입니다. 하지만 외부 트래픽을 차단하는 UFW가 이미 있어야 하고, pg_hba
Docker 서브넷에서 적절한 DB에 대한 연결만 허용하도록 엄격하게 구성해야 하며, postgres
수퍼유저 계정에 대한 로컬 Unix 인증과 다른 모든 계정에 대한 강력한 비밀번호만 허용하므로 충분히 안전하다고 가정합니다. 적어도 작동하지만 작동하게 만드는 다른 방법을 찾지 못했습니다.