programing

도커 컨테이너에서 호스트 데이터베이스 액세스

newstyles 2023. 10. 6. 20:56

도커 컨테이너에서 호스트 데이터베이스 액세스

일부 호스트 시스템에서 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를 확인할 수 없습니다.두가지 방법이 있습니다.

  1. 호스트 네트워크 공유 --net=host:

    docker run -it --net=host  myimage
    
  2. 보통 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개의 파일을 편집해야 합니다.

  1. 모든 주소를 수신하려면 postgresql.conf를 편집합니다.기본적으로 localhost를 가리킵니다.

    listen_addresses = '*'
    
  2. 모든 주소에서 연결할 수 있도록 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