Docker 네트워크 호스트 명령 사용
 
Docker 컨테이너는 Docker 설치 중에 생성된 네트워크 드라이버를 활용하여 작동합니다. 사용 가능한 기본 드라이버에는 브리지 및 호스트 네트워크가 포함됩니다.
네트워크를 지정하지 않고 컨테이너를 생성하면 bridge 네트워크에 추가되며 host 네트워크 또는 사용자 지정 네트워크에 network 명령을 추가하려면 --network 명령을 사용합니다. .
이 튜토리얼에서는 --network 명령을 사용하여 호스트 네트워크에 컨테이너를 추가하는 방법을 배웁니다. 또한 이 명령을 사용하여 네트워크를 지정하지 않으면 컨테이너가 기본 네트워크에 추가되는 방법도 알아봅니다.
Nginx 프로젝트 생성
WebStorm IDEA를 열고 파일 > 새로 만들기 > 프로젝트를 선택합니다. 열리는 창에서 빈 프로젝트를 선택하고 프로젝트 이름을 제목 없음에서 docker-network-host로 변경하거나 원하는 이름을 사용하십시오.
마지막으로 만들기 버튼을 눌러 프로젝트를 생성합니다.
현재 폴더에 index.html이라는 파일을 만들고 다음 코드를 복사하여 파일에 붙여넣습니다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Welcome to docker networking !</h1>
</body>
</html>
이 파일에서는 컨테이너에서 실행 중인 애플리케이션에 액세스할 때 제목을 표시하는 간단한 웹 페이지를 만들었습니다. 이는 컨테이너가 Nginx 애플리케이션을 실행하고 있는지 확인하는 데 도움이 됩니다.
이미지 정의
Dockerfile이라는 파일을 만들고 다음 지침을 복사하여 파일에 붙여넣습니다. 일반적으로 이 이름의 파일을 사용하여 기존 이미지에서 사용자 지정 이미지를 만듭니다.
FROM nginx:alpine
ADD . /usr/share/nginx/html
- FROM- 후속 지침을 사용하여 사용자 정의 이미지를 생성할 기본 이미지를 설정합니다.
- ADD- 현재 폴더의 파일 및 폴더를 이미지 파일 시스템 대상- /usr/share/nginx/html에 복사합니다.
이미지 구축
위에서 정의한 Dockerfile을 사용하여 사용자 지정 이미지를 빌드합니다. 키보드 단축키 ALT+F12를 사용하여 새 터미널 창을 열고 이 명령을 사용하여 이미지를 빌드합니다.
~/WebstormProjects/docker-network-host$ docker build --tag docker-network-host:latest .
이 명령은 Dockerfile을 순차적으로 실행하여 태그가 있는 이미지를 생성하며, 아래와 같이 터미널 창에서 실행되는 각 명령을 볼 수 있습니다.
=> [1/2] FROM docker.io/library/nginx:alpine@sha256:082f8c10bd47b6acc8ef15ae61ae45dd8fde0e9f389a8b5cb23c37408642bf5d               0.1s
 => => resolve docker.io/library/nginx:alpine@sha256:082f8c10bd47b6acc8ef15ae61ae45dd8fde0e9f389a8b5cb23c37408642bf5d               0.1s
 => CACHED [2/2] ADD . /usr/share/nginx/html
기본 네트워크 드라이버에서 컨테이너 실행
기본 네트워크에서 애플리케이션의 컨테이너를 실행하려면 터미널 창에서 아래 명령을 실행합니다. 이 컨테이너는 bridge 네트워크에 추가됩니다.
~/WebstormProjects/docker-network-host$ docker run --name docker-network-bridge-test -d -p 8000:80 docker-network-host:latest
이 명령은 컨테이너의 포트 80에서 수신하고 호스트에서 포트 8000을 노출하는 docker-network-bridge-test라는 컨테이너를 실행합니다. 이 컨테이너가 bridge 네트워크에 추가되었는지 확인하려면 아래 명령을 실행하여 bridge 네트워크를 검사합니다.
~/WebstormProjects/docker-network-host$ docker network inspect bridge
출력:
[
    {
        "Name": "bridge",
        "Id": "45773c7633cf28baa742ceca9c054a8dd6b4ea609dd9944d7ae12bdb57e86bcd",
        "Created": "2022-10-06T07:53:45.935633743Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "5e452da9b047ce94ff23b4841d1cb3358f34b037ef566c2f12a9eb57012a5f85": {
                "Name": "docker-network-bridge-test",
                "EndpointID": "d3491eb0c518d91be71b170e8ca0a077e07781bffbe20f3e1a1fd415eef9c288",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
반환된 JSON에서 Containers 속성에는 docker-network-bridge-test라는 컨테이너가 있으며 MacAddress 및 IPv4Address가 할당됩니다. 이것은 이 섹션의 시작 부분에서 생성된 것과 동일한 컨테이너입니다.
브라우저에서 이 애플리케이션을 제공하려면 localhost:8000(http://localhost:8000/)에 대한 요청을 발행하고 Welcome to docker networking ! 텍스트가 포함된 제목을 반환하는지 확인하십시오.
호스트 네트워크에서 컨테이너 실행
호스트 네트워크라는 용어는 호스트 네트워크가 컨테이너 네트워킹을 컨테이너화할 수 없기 때문에 컨테이너가 호스트 시스템의 네트워크에서 실행됨을 의미합니다. 호스트 네트워크에서 컨테이너를 실행하려면 터미널 창에서 다음 명령을 실행합니다.
~/WebstormProjects/docker-network-host$ docker run --rm -d --network host --name docker-network-host-test docker-network-host:latest
이 명령은 host 값과 함께 --network 명령을 사용하여 호스트 네트워크에서 docker-network-host-test라는 컨테이너를 실행합니다. 이 컨테이너가 호스트 네트워크에 추가되었는지 확인하려면 터미널 창에서 다음 명령을 실행합니다.
~/WebstormProjects/docker-network-host$ docker network inspect host
출력:
[
    {
        "Name": "host",
        "Id": "4ce9d3806cd88f9d9ea446272f4338f7b1f5e7098d4d0bc2a11090c1759d1880",
        "Created": "2022-09-19T07:51:50.247290701Z",
        "Scope": "local",
        "Driver": "host",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "22d15c7eee861ec7fdfd22936c30dfe1d17b2dde52ada93256f3e30943a3ed80": {
                "Name": "docker-network-host-test",
                "EndpointID": "7bd01907c8b86a881b86ae9e9c8ad8c1d3aa9f0583adebb7d41ae15bd565fabe",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
반환된 JSON에서 Containers 속성에는 docker-network-host-test라는 이름의 컨테이너가 있으며 이 경우 컨테이너는 호스트 네트워크. 이것은 이 섹션의 시작 부분에서 생성된 것과 동일한 컨테이너입니다.
브라우저에서 이 애플리케이션을 제공하려면 localhost:80(http://localhost:80/)에 대한 요청을 발행하고 Welcome to docker networking ! 텍스트가 포함된 제목을 반환하는지 확인합니다. 그러나 요청을 수락할 수 있도록 호스트 네트워크의 포트 80이 열려 있는지 확인하십시오.
결론
이 튜토리얼에서는 기본 네트워크 드라이버 bridge 및 host 네트워크 드라이버 모두에서 컨테이너를 실행하는 방법을 배웠습니다. --network 명령을 사용하여 기본 네트워크가 아닌 다른 네트워크에 컨테이너를 추가합니다.
애플리케이션이 새 네트워크에서 작동하는지 확인하려면 사용된 포트가 연결을 위해 열려 있고 다른 프로세스가 해당 포트를 사용하고 있지 않은지 확인하십시오.
David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.
LinkedIn GitHub