복붙노트

[REDIS] 맥 OS 10.12 두 도커 용기 간의 통신

REDIS

맥 OS 10.12 두 도커 용기 간의 통신

나는 맥 OS 10.12에 도커 1.12.5 함께 일하고 있어요, 내가 응용 프로그램 이미지가 함께있는 개발 환경, 일부 사전 인구 구성 변수가 공유 레디 스 이미지를 설정하고있다.

심지어 몇 가지 튜토리얼을 다음과 (와 docker0는 Mac에서 사용할 수없는 방법에 대해 읽기) 나는 두 개의 컨테이너를 연결하기 위해 사투를 벌인거야 후.

나는 사용하여 내 레디 스 이미지를 시작합니다 :

docker run -d -p 6379:6379 (IMAGE ID)

내 레디 스 이미지에서 내가 가진 :

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
dffb89854618        d59                 "docker-entrypoint.sh"   20 seconds ago      Up 19 seconds       0.0.0.0:6379->6379/tcp   drunk_williams

그리고 내 맥 나는 성공적으로 문제없이 레디 스-CLI 명령을 통해 연결할 수에서.

나는 간단한 우분투 이미지를 시작할 때 그러나, 나는이 별도의 레디 스 이미지에 연결할 수없는 것 :

root@2d4eda315f4f:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:03
          inet addr:172.17.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:20707 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11515 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:28252929 (28.2 MB)  TX bytes:635848 (635.8 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:680 (680.0 B)  TX bytes:680 (680.0 B)
root@2d4eda315f4f:/# telnet localhost 6379
Trying ::1...
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
root@2d4eda315f4f:/# telnet 172.17.0.3 6379
Trying 172.17.0.3...
telnet: Unable to connect to remote host: Connection refused

이 호스트에서 사용할 수있는 docker0 인터페이스를 가지고 있지의 결과인가? 개발 환경에서 (동일한 호스트에서 실행되고있는 경우)이 컨테이너가 통신 할 수 있도록 몇 가지 간단한 해결 방법이 있습니까?

업데이트 : 명명 컨테이너를 사용하려고, 난 여전히 연결할 수 없습니다.

docker run -d --name redis_server redis

결과 :

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
5d05820aa985        redis               "docker-entrypoint.sh"   43 hours ago        Up 1 seconds        6379/tcp                 redis_server

그러나 나는 새로운 우분투 컨테이너를 시작하는 경우 :

root@e92b47419bc4:/# redis-cli -h redis_server
Could not connect to Redis at redis_server:6379: Name or service not known

나는 확실하지 찾는 방법 / 연결 첫 redis_server 컨테이너입니다.

해결법

  1. ==============================

    1.각 서비스는 자체 컨테이너에서 실행됩니다. 우분투 용기의 관점에서, 레디 스 로컬 호스트에서 수신되지 않습니다.

    각 서비스는 자체 컨테이너에서 실행됩니다. 우분투 용기의 관점에서, 레디 스 로컬 호스트에서 수신되지 않습니다.

    통신하도록 용기를 얻으려면, 그들은 같은 도커 네트워크에 있어야합니다. 이 세 가지 단계로 구성

    이 작업이 완료하면, 컨테이너가 호스트 인 것처럼 자신의 이름을 사용하여 서로 대화 할 수 있습니다.

    피부에 하나 개 이상의 방법이 고양이는 내가이 답변에 두 볼 것이다 ... 있어요,하지만 난 (예를 들어,는 Kubernetes 또는 스웜을 사용하여 같은)에 익숙하지 오전 그것을 할 수있는 몇 가지 다른 방법이 아마이 있습니다.

    당신은 고정 표시기 네트워크 명령을 사용하여이 응용 프로그램에 대한 네트워크를 만들 수 있습니다.

    # Show the current list of networks
    docker network ls
    
    # Create a network for your app
    docker network create my_redis_app
    

    당신은 레디 스 컨테이너를 실행하면이 이름을 가지고 있으며,이 네트워크에 연결되어 있는지 확인합니다. 당신이 (-p 사용)에 원하는 경우 (맥 OS에) 외부 포트를 노출 할 수 있지만, 그건 그냥 레디 스에 대한 이야기를 다른 용기에 대한 필요가 없습니다.

    docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
    

    이제 우분투 컨테이너를 실행합니다. 당신은뿐만 아니라 당신이 좋아하는 경우에 이름을 지정할 수 있습니다, 그러나 이것은 어떤 서비스를 실행하지 않기 때문에 나는이 예제에서 귀찮게하지 않습니다.

    docker run -it --network my_redis_app ubuntu bash
    

    이제 우분투 컨테이너 내부에서, 당신은 DNS 이름 인 것처럼, 이름 redis_server을 사용하여 레디 스 도달 할 수 있어야합니다.

    그것은 YAML 파일 (IMO)로 쓰기 쉽게 때문에, 작성을 사용하여이 같은 설정을 구축하는 경향이있다. 다음의 예 상기 재 작성된 고정 표시기-compose.yml 형태 :

    version: '2'
    services:
      redis:
        image: <IMAGE ID>
        networks:
          - my_redis_app
        ports: 6379:6379
      ubuntu:
        image: ubuntu:latest
        networks:
          - my_redis_app
    networks:
      my_redis_app:
        driver: bridge
    

    장소에두고, 당신은 고정 표시기-작성까지 -d 레디 스를 실행하고 특정 도커 네트워크를 사용하여 온라인으로 레디 스 서비스를 할 수 있습니다. 이미 존재하지 않는 경우 작성, 당신의 네트워크를 생성합니다.

    이 방법은 ... 그것은 물론, 상호 작용하는 우분투 컨테이너를 실행하는 작은 의미가 있습니다. 그러나 나는 당신이 레디 스가는 일단, 당신은 단지 서비스에서 다른 사람을 넣어뿐만 아니라, 당신은 모두 함께 관리 할 수 ​​있습니다 ... 응용 프로그램 컨테이너 어떤 종류의, 그리고 nginx를 같은 아마도 웹 프록시를 추가 할 것입니다 가정합니다.

    우분투 상호 작용이기 때문에, 당신은 그것을 대화식으로 실행할 수 있습니다 :

    # without -d, container is run interactively
    docker-compose run ubuntu bash
    

    그리고 지금 우분투, 당신은이 예에서 단순히 레디 스 자사의 이름을 사용하여 레디 스에 연결할 수 있어야합니다.

  2. from https://stackoverflow.com/questions/41433411/communication-between-two-docker-containers-on-macos-10-12 by cc-by-sa and MIT license