English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
먼저 우리는 Docker 컨테이너 내에서 실행되는 서비스에 네트워크 포트를 통해 접근하는 방법을 구현했습니다.
컨테이너에서는 일부 네트워크 애플리케이션을 실행할 수 있습니다. 이 애플리케이션을 외부에서도 접근할 수 있도록 하려면}} -P 또는 -p 파라미터를 사용하여 포트 맵핑을 지정합니다.
아래에서는 포트를 통해 docker 컨테이너에 연결하는 방법을 구현해 보겠습니다.
python 애플리케이션 컨테이너를 생성했습니다.
w3codebox@w3codebox:~$ docker run -d -P training/webapp python app.py fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d
또한, 컨테이너가 바인딩된 네트워크 주소를 지정할 수 있습니다. 예를 들어, 바인딩 127.0.0.1。
사용하면 -P 파라미터를 사용하여 컨테이너를 생성하면 docker ps 컨테이너 포트를 볼 수 있습니다. 5000 호스트 포트 바인딩 32768。
w3codebox@w3codebox:~$ docker ps CONTAINER ID IMAGE COMMAND ... ... PORTS NAMES fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
사용할 수도 있습니다. -p 지시자를 사용하여 컨테이너 포트가 호스트 포트에 바인딩됨을 지정.
두 방식의 차이는:
-P :은 컨테이너 내부 포트임의호스트에 맵핑된 고 포트.
-p : 은 컨테이너 내부 포트가 호스트 포트에 바인딩됨지정의 호스트 포트.
w3codebox@w3codebox:~$ docker run -d -p 5000:5000 training/webapp python app.py 33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
w3codebox@w3codebox:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES 33e4523d30aa training/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp berserk_bartik fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
또한, 컨테이너가 바인딩된 네트워크 주소를 지정할 수 있습니다. 예를 들어, 바인딩 127.0.0.1。
w3codebox@w3codebox:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py 95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c w3codebox@w3codebox:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES 95c6ceef88ca training/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5001->5000/tcp adoring_stonebraker 33e4523d30aa training/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp grave_hopper fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
이렇게 하면 접근하여 127.0.0.1:5001 컨테이너에 접근하기 위해 5000 포트.
위의 예제에서는 기본적으로 tcp 포트가 바인딩되어 있습니다. UDP 포트를 바인딩하려면 포트 뒤에 "을 추가할 수 있습니다. /udp。
w3codebox@w3codebox:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py 6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a w3codebox@w3codebox:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS ... NAMES 6779686f06f6 training/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5000->5000/udp drunk_visvesvaraya 95c6ceef88ca training/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5001->5000/tcp adoring_stonebraker 33e4523d30aa training/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp grave_hopper fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
docker port 명령어는 포트 바인딩 상태를 빠르게 확인할 수 있습니다.
w3codebox@w3codebox:~$ docker port adoring_stonebraker 5000 127.0.0.1:5001
포트 매핑은 docker를 다른 컨테이너에 연결하는 유일한 방법이 아닙니다.
docker는 여러 컨테이너를 연결하여 연결 정보를 공유할 수 있는 연결 시스템을 제공합니다.
docker 연결은 부모 컨테이너가 자식 컨테이너의 정보를 볼 수 있는 부모자식 관계를 형성합니다.
컨테이너를 생성할 때 docker는 자동으로 그 이름을 부여합니다. 또한, 다음과 같이 사용할 수도 있습니다 --이름 지정된 이름으로 컨테이너를 명명하는 예를 들어:
w3codebox@w3codebox:~$ docker run -d -P --이름 w3codebox training/webapp python app.py 43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441
사용할 수 있습니다 docker ps 명령어를 사용하여 컨테이너 이름을 확인할 수 있습니다.
w3codebox@w3codebox:~$ docker ps -l CONTAINER ID IMAGE COMMAND ... PORTS NAMES 43780a6eabaa training/webapp "python app.py" ... 0.0.0.0:32769->5000/tcp w3codebox
먼저 새로운 Docker 네트워크를 생성합니다。
$ docker network create -d bridge test-net
参数说明:
-d:파라미터는 Docker 네트워크 유형을 지정합니다. bridge, overlay가 있습니다.
overlay 네트워크 유형은 Swarm 모드에서 사용됩니다. 이 섹션에서는 무시할 수 있습니다。
새로운 test에 컨테이너를 실행하고 연결합니다-net 네트워크:
$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
새로운 터미널을 열고, test에 새로운 컨테이너를 실행하여 추가합니다-net 네트워크:
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash
点击图片查看大图:
ping을 통해 test를 통해 증명하겠습니다1 컨테이너와 test2 컨테이너 간의 연결이 설정되었습니다。
만약 test1、test2 컨테이너 내부에 ping 명령어가 없다면 컨테이너 내에서 다음 명령어를 실행하여 ping를 설치합니다(즉시 사용 가능: 하나의 컨테이너에서 설치하고, 컨테이너를 이미지로 커밋한 후, 새로운 이미지로 위의 두 컨테이너를 다시 실행할 수 있습니다)。
apt-get update apt install iputils-ping
test1 컨테이너에 다음 명령어를 입력합니다:
点击图片查看大图:
동일한 방식으로 test2 컨테이너도 성공적으로 연결됩니다:
点击图片查看大图:
이렇게 하면 test1 컨테이너와 test2 컨테이너 간의 연결이 설정되었습니다。
여러 컨테이너 간에 상호 연결이 필요하다면 Docker Compose를 추천합니다. 나중에 설명할 것입니다。
호스트 컴퓨터에서 /etc/docker/daemon.json 파일에 다음 내용을 추가하여 모든 컨테이너의 DNS를 설정합니다:
{ "dns" : [ "114.114.114.114", "8.8.8.8" ] }
설정이 완료되면 컨테이너의 DNS는 자동으로 설정됩니다 114.114.114.114 和 8.8.8.8。
설정이 완료되면 docker를 재시작해야 설정이 적용됩니다。
컨테이너의 DNS가 정상적으로 작동하는지 확인하려면 다음 명령어를 사용할 수 있습니다. 이 명령어는 컨테이너의 DNS 정보를 출력합니다:
$ docker run -it --rm ubuntu cat etc/resolv.conf
点击图片查看大图:
컨테이너의 설정을 수동으로 지정합니다
만약 지정된 컨테이너에 DNS를 설정하고 싶다면 다음 명령어를 사용할 수 있습니다:
$ docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
参数说明:
--rm:容器退出时自动清理容器内部的文件系统。
-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。
--dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
--dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。
点击图片查看大图:
如果在容器启动时没有指定 --dns 和 --dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS。