English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Docker 容器连接

먼저 우리는 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 연결은 부모 컨테이너가 자식 컨테이너의 정보를 볼 수 있는 부모자식 관계를 형성합니다.

컨테이너 명명

컨테이너를 생성할 때 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를 추천합니다. 나중에 설명할 것입니다。

DNS 설정

호스트 컴퓨터에서 /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。