본문 바로가기

TroubleShooting/Docker

docker 컨테이너 IP 주소

728x90

docker 컨테이너 IP 주소


 docker 서비스를 시작하면 "docker:0" 라는 브릿지 인터페이스가 생성된다.


[root@235 network]# systemctl start docker

[root@235 network]# ifconfig

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500

        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0

        inet6 fe80::42:60ff:fed3:91a8  prefixlen 64  scopeid 0x20<link>

        ether 02:42:60:d3:91:a8  txqueuelen 0  (Ethernet)

        RX packets 101  bytes 11575 (11.3 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 14  bytes 1081 (1.0 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 10.10.0.235  netmask 255.255.255.0  broadcast 10.10.0.255

        inet6 fe80::feaa:14ff:fe76:ef20  prefixlen 64  scopeid 0x20<link>

        ether fc:aa:14:76:ef:20  txqueuelen 1000  (Ethernet)

        RX packets 881898868  bytes 1029693469981 (958.9 GiB)

        RX errors 0  dropped 202284  overruns 0  frame 0

        TX packets 795019649  bytes 954119417994 (888.5 GiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536

        inet 127.0.0.1  netmask 255.0.0.0

        inet6 ::1  prefixlen 128  scopeid 0x10<host>

        loop  txqueuelen 0  (Local Loopback)

        RX packets 32005471  bytes 3717989024 (3.4 GiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 32005471  bytes 3717989024 (3.4 GiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


 원래 서버의 인터페이스인 enp2s0 는 10.10.0.235/24 이고, docker0 는 172.17.0.1/24 이다.


[root@235 ~]# docker run springcloud/eureka

jar:file:/app.jar!/lib/spring-cloud-netflix-eureka-server-1.0.1.BUILD-SNAPSHOT.jar!/static/eureka/css/wro.css

2017-09-11 01:25:09.941  INFO 1 --- [           main] eurekademo.EurekaApplication             : Starting EurekaApplication v0.0.1-SNAPSHOT on 5aac65cfc5b8 with PID 1 (/app.jar started by root in /)

2017-09-11 01:25:10.004  INFO 1 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@3bd78ffd: startup date [Mon Sep 11 01:25:10 UTC 2017]; root of context hierarchy

2017-09-11 01:25:10.186  INFO 1 --- [           main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring

2017-09-11 01:25:10.509  INFO 1 --- [           main] eurekademo.EurekaApplication             : Started EurekaApplication in 0.869 seconds (JVM running for 1.676)


  .   ____          _            __ _ _

 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \

( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \

 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )

  '  |____| .__|_| |_|_| |_\__, | / / / /

 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::        (v1.2.3.RELEASE)


2017-09-11 01:25:10.953 ERROR 1 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://localhost:8888/eureka/default":Connection refused; nested exception is java.net.ConnectException: Connection refused

2017-09-11 01:25:10.969  INFO 1 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@409510fd: startup date [Mon Sep 11 01:25:10 UTC 2017]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@3bd78ffd

2017-09-11 01:25:11.358  WARN 1 --- [           main] .i.s.PathMatchingResourcePatternResolver : Skipping [/tmp/spring-boot-libs/06f98804e83cf4a94380b46591b976b1d17c36b8-eureka-client-1.1.147.jar] because it does not denote a directory

2017-09-11 01:25:11.454  WARN 1 --- [           main] .i.s.PathMatchingResourcePatternResolver : Skipping [/tmp/spring-boot-libs/b8da6470c5c08e33f9ae3737f338b4b81696fa98-eureka-core-1.1.147.jar] because it does not denote a directory

...
017-09-11 01:25:15.985  INFO 1 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 0
2017-09-11 01:25:15.988  INFO 1 --- [           main] .p.EurekaConfigBasedInstanceInfoProvider : Setting initial instance status as: STARTING
2017-09-11 01:25:16.360  INFO 1 --- [           main] com.netflix.discovery.DiscoveryClient    : Not registering with Eureka server per configuration
2017-09-11 01:25:16.365  INFO 1 --- [           main] c.n.e.EurekaDiscoveryClientConfiguration : Registering application eureka with eureka with status UP
2017-09-11 01:25:16.415  INFO 1 --- [       Thread-4] c.n.eureka.PeerAwareInstanceRegistry     : Adding replica node: http://localhost:8761/eureka/
2017-09-11 01:25:16.494  INFO 1 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8761 (http)
2017-09-11 01:25:16.495  INFO 1 --- [           main] eurekademo.EurekaApplication             : Started EurekaApplication in 6.934 seconds (JVM running for 7.662)
2017-09-11 01:25:16.547  INFO 1 --- [       Thread-4] c.n.eureka.PeerAwareInstanceRegistry     : Updating the replica nodes as they seem to have changed from [] to [http://localhost:8761/eureka/]


 eureka 서버 이미지를 다운받아서 eureka 서버 컨테이너를 띄웠는데, 서버 주소가 localhost 로 나온다. ip 정보를 모르니, 외부에서 접속 테스트를 할수가 없었다. 방법을 찾아보니 inspect 로 컨테이너의 정보(low level) 를 살펴보거나 아니면 실행중인 컨테이너에 쉘로 접속해서 직접 주소를 확인하는 명령어(ifconfig 또는 ip addr)를 실행하는 것이다.


# docker inspect [컨테이너명]


[root@235 ~]# docker inspect peaceful_kare

[

    {

        "Id": "d687dcb66accdc621fe15fb4245d533f54da8f42d4da3024dc5cd8cf595dd54d",

        "Created": "2017-09-11T01:32:06.414766154Z",

        "Path": "java",

        "Args": [

            "-jar",

            "/app.jar"

        ],

        "State": {

            "Status": "running",

            "Running": true,

            "Paused": false,

            "Restarting": false,

            "OOMKilled": false,

            "Dead": false,

            "Pid": 17465,

            "ExitCode": 0,

            "Error": "",

            "StartedAt": "2017-09-11T01:32:08.318323865Z",

            "FinishedAt": "0001-01-01T00:00:00Z"

        },

        "Image": "sha256:3094afcbdf1211d429408f85b9a4469f05ab0db06763b08221be12bbbb3aa03d",

        "ResolvConfPath": "/var/lib/docker/containers/d687dcb66accdc621fe15fb4245d533f54da8f42d4da3024dc5cd8cf595dd54d/resolv.conf",


...

        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "962043b1c6cc2a87a9b0ee485f697dd0eb80454143c103c1be512f4508a61713",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "8761/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/962043b1c6cc",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "6987b0fad0d38260219c173902e2200a763fa60e21db66c7ef61962ef7f1ed2f",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "a4cef3d07e2c39724ee71b124fc4fa16beee03d267b76f016cfed523395cfa19",
                    "EndpointID": "6987b0fad0d38260219c173902e2200a763fa60e21db66c7ef61962ef7f1ed2f",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02"
                }
            }
        }
    }
]


 Networks - bridge - IPAddress 가 172.17.0.2 로 나오고, gateway 가 172.17.0.1(: bridge0 의 IP 주소) 인걸로 나온다.


# docker exec -it [컨테이너 이름] bash


※ -i : interative 모드, -t : 가상 터미널(pseudo tty)  지정. 두 모드를 같이 true(-it 옵션만 주면 true 이다)로 안하고 컨테이너 쉘로 들어가서 명령어를 실행하면 결과를 제대로 못 볼 수 있다.(echo 가 안되거나 엉뚱한 tty 로 보내어 지기 때문에)

※ exec : 새로운 컨터이너를 실행하는게 아니라, 현재 실행중인 컨터이너를 확인하기 때문에 exec 를 사용한다. 쉘 상태에서 여러 명령어를 입력하기 위해 bash 를 COMMAND 로 지정한다.


[root@235 docker]# docker ps

CONTAINER ID        IMAGE                COMMAND                CREATED              STATUS              PORTS               NAMES

d687dcb66acc        springcloud/eureka   "java -jar /app.jar"   About a minute ago   Up About a minute   8761/tcp            peaceful_kare

[root@235 docker]# docker exec springcloud/eureka bash

Error response from daemon: No such container: springcloud/eureka

[root@235 docker]# docker exec -it peaceful_kare bash

root@d687dcb66acc:/#



root@d687dcb66acc:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
68: eth0@if69: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link
       valid_lft forever preferred_lft forever
root@d687dcb66acc:/#


  ip addr 명령어로 eth0 인터페이스에 생성된것을 확인할 수 있고, IP 주소가 172.17.0.2 인 것을 확인할 수 있다. 게이트 웨이는 컨터이너 쉘 안에서 다음 명령어로 확인하자.


root@d687dcb66acc:/# ip route

default via 172.17.0.1 dev eth0

172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.2

root@d687dcb66acc:/#


 eth0 인터페이스에 대한 default gateway 가 172.17.0.1 로 설정되었다는 것을 알 수 있다. 컨테이너의 주소가 172.17.0.0/16 대역이지만 brige 인터페이스(172.17.0.1) 가 있기 때문에 원래 호스트 서버(10.10.0.235) 에서도 접속할 수 있다.


 이제 eureka 서버에 접속해보자.

[root@235 ~]# curl 172.17.0.2:8761

<!doctype html>

<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->

<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->

<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->

<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->

  <head>

    <base href="/">

    <meta charset="utf-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <title>Eureka</title>

    <meta name="description" content="">

    <meta name="viewport" content="width=device-width">


    <link rel="stylesheet" href="eureka/css/wro.css">


  </head>


  <body id="one">

<nav class="navbar navbar-default" role="navigation">

...


웹 브라우저로 접속하면 아래와 같은 화면이 나온다.


docker 의 설정을 통해 브릿지 인터페이스 주소를 변경할 수 있는데, 이건 다음 기회에 작성해보기로 한다.(daemon.json 파일 설정)

기본 설정이 아무것도 없으면 172.17.0.1 로 되는거 같다.

[root@235 ~]# cat /etc/docker/daemon.json

{}



참고한 사이트 :

https://docs.docker.com/engine/userguide/networking/default_network/custom-docker0/