도커 컨테이너에서 호스트 데이터베이스 액세스
일부 호스트 시스템에서 mysql 데이터베이스가 실행되고 있고 해당 호스트에서 도커 컨테이너도 실행 중인 경우:호스트에서 실행 중인 도커 컨테이너 내에서 mysql 데이터베이스에 액세스하려면 어떻게 해야 합니까?
예를 들어, 호스트 포트를 컨테이너에 게시하는 방법이 있습니까?(도커 런-p가 하는 것의 역)
18.03 문서부터:
컨테이너에서 호스트의 서비스에 연결하려고 합니다.
호스트에 변경된 IP 주소가 있습니다(또는 네트워크 액세스가 없는 경우에는 없음).부터는 특수 이름 .03한 DNS다에 하는 것이 .
host.docker.internal
IP 로 합니다.게이트웨이는 다음과 같이 연결할 수 있습니다.
gateway.docker.internal
.
예: 컨테이너 내부의 MySQL 연결 문자열을 사용하여 호스트의 MySQL 인스턴스에 액세스하는 방법은 다음과 같습니다.
mysql://host.docker.internal:3306/my_awesome_database
이 작업을 일관되고 잘 이해되고 휴대 가능한 방법으로 수행하는 방법에 대해 오랫동안 논의되어 왔습니다.완전한 해결책은 없지만 아래 논의 내용으로 연결하겠습니다.
대부분의 경우 --add-host 옵션을 사용하여 도커를 실행하여 컨테이너의 /etc/host 파일에 호스트의 IP 주소를 추가하려고 합니다.여기서부터는 필요한 포트에서 호스트에 연결하는 것이 중요하지 않습니다.
컨테이너 호스트 파일에 항목 추가
하나 이상의 --add-host 플래그를 사용하여 컨테이너의 /etc/hosts 파일에 다른 호스트를 추가할 수 있습니다.다음 예제에서는 도커라는 이름의 호스트에 대해 정적 주소를 추가합니다.
$ docker run --add-host=docker:10.180.0.1 --rm -it debian $$ ping docker PING docker (10.180.0.1): 48 data bytes 56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms 56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms ^C--- docker ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms
참고: 때로는 도커 호스트에 연결해야 하는데, 이는 호스트의 IP 주소를 가져오는 것을 의미합니다.다음 셸 명령을 사용하여 이 프로세스를 단순화할 수 있습니다.
$ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }'" $ docker run --add-host=docker:$(hostip) --rm -it debian
설명서:
https://docs.docker.com/engine/reference/commandline/run/
컨테이너에서 호스트에 액세스하는 것에 대한 논의:
https://github.com/docker/docker/issues/1143
https://github.com/docker/docker/issues/10023
도커 18.03 이후부터는 host.docker.internal을 사용합니다.
도커 17.06 이후부터는 호스트의 IP 주소로 해결되는 도커 컨테이너에서 특별한 Mac 전용 DNS 이름을 사용할 수 있습니다.다음과 같습니다.
docker.for.mac.localhost
설명서는 다음과 같습니다. https://docs.docker.com/docker-for-mac/networking/ # httphttps- proxy-support
다른 답변들은 저에게 잘 통하지 않았습니다.컨테이너에서 host.docker.internal을 사용하여 host IP를 확인할 수 없습니다.두가지 방법이 있습니다.
호스트 네트워크 공유 --net=host:
docker run -it --net=host myimage
보통 172.17.0.1인 도커의 IP 주소를 사용합니다.ifconfig 명령어를 호출하고 도커 인터페이스의 인터넷 주소를 파악하여 확인할 수 있습니다.
user@ubuntu:~$ ifconfig docker0 Link encap:Ethernet HWaddr 02:42:a4:a2:b2:f1 inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:a4ff:fea2:b2f1/64 Scope:Link
일단 이 ip 주소를 가지고 있으면 도커를 실행하고 응용 프로그램에 전달하거나 내가 실행하는 동안 볼륨을 통해 jdbc.properties의 위치를 호스트 시스템의 디렉토리에 매핑하여 파일을 외부에서 관리할 수 있습니다.
docker run -it -v /host_dir/docker_jdbc_config:${jetty_base}/var/config myimage
참고: 데이터베이스에서 외부 연결을 허용하지 않을 수 있습니다.postgresql의 경우 여기와 여기에 설명된 것처럼 2개의 파일을 편집해야 합니다.
모든 주소를 수신하려면 postgresql.conf를 편집합니다.기본적으로 localhost를 가리킵니다.
listen_addresses = '*'
모든 주소에서 연결할 수 있도록 pg_hba.conf를 편집합니다.마지막 줄에 추가:
host all all 0.0.0.0/0 md5
중요: 데이터베이스 액세스의 마지막 단계를 업데이트하는 것은 정말로 무엇을 하고 있는지 확신할 수 없는 한 프로덕션 용도로 사용하는 것이 좋습니다.
리눅스 전용
사례 1:-Mysqldb가 로컬 호스트에서 실행되는 도커가 아님
연결하도록 호스트 IP를 수정하고 로컬 호스트 대신 해당 IP에 연결할 수 있습니다.
Linux 도커의 경우 호스트가 172.17.0.1로 고정되어 있습니다.따라서 localhost 대신 172.17.0.1에 연결합니다.
사례 2:- 만약 mysqldb가 도커에서도 실행되고 있다면 IP 주소 대신 도커 컨테이너 이름으로 연결하는 것이 최선의 방법입니다.
따라서 도커로 작성된 파일은 이렇게 보여야 합니다.
version: '3.8'
services:
mysqldb:
image: mysql:5.7
restart: unless-stopped
env_file: ./.env
environment:
- MYSQL_ROOT_PASSWORD=$MYSQLDB_ROOT_PASSWORD
- MYSQL_DATABASE=$MYSQLDB_DATABASE
ports:
- $MYSQLDB_LOCAL_PORT:$MYSQLDB_DOCKER_PORT
volumes:
- db:/var/lib/mysql
producer:
build: .
ports:
- '$LOCAL_PORT:$DOCKER_PORT'
depends_on:
- mysqlsb
volumes:
- ./:/usr/src/app
이제 ip 또는 localhost 대신 mysqlsb에 연결합니다.
var mysql = require('mysql');
var con = mysql.createConnection({
host: mysqldb,
user: "yourusername",
password: "yourpassword"
});
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
});
언급URL : https://stackoverflow.com/questions/28056522/access-host-database-from-a-docker-container
'programing' 카테고리의 다른 글
Angular UI Grid 3.x 버전의 Action 버튼 (0) | 2023.10.06 |
---|---|
Cython을 Python to C Converter로 사용 (0) | 2023.10.06 |
함수 포인터가 명령 파이프라인을 삭제하도록 강제합니까? (0) | 2023.10.06 |
MariaDB의 COLUMN_ADD 함수에 해당하는 PHP 또는 MySQL 찾기 (0) | 2023.10.01 |
팬더 데이터 프레임 열에서 목록 길이를 결정하는 방법 (0) | 2023.10.01 |