0. 개요
프로젝트에서, Jenkins와 Frontend, Backend, DB를 도커로 실행시켰었다.
하지만, 문제가 발생했다.
바로, 도커 컨테이너 끼리는 소통을 기본적으론 못한다는 것.
1. 기본 환경
"도커 컨테이너 끼리의 소통" 을 설명하기 위해, 아래처럼 두개의 컨테이너를 만들었다.
C:\Users\A> docker run -d -p 8080:8080 -p 50000:50000 jenkins/jenkins
054232dce4aad83b1fb0e5d26eeae666582edaa66c17910c2bb01372e59b1e8e
C:\Users\A> docker run -d -p 80:80 nginx
f02cf55a548ff1dfbcea0a539a72f73c07f7e5a9acabfe3909d06e0532047cb8
C:\Users\A>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f02cf55a548f nginx "/docker-entrypoint.…" Less than a second ago Up 9 seconds 0.0.0.0:80->80/tcp vigorous_bose
054232dce4aa jenkins/jenkins "/usr/bin/tini -- /u…" About a minute ago Up 2 minutes 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp naughty_knuthC
그럼 여기서, 만약
젠킨스 컨테이너가 nginx 컨테이너에 접근하려면 어떻게 해야할까?
2. 로컬에서 시도
우선, 도커가 아닌, cmd에서 nginx를 대상으로 curl을 날렸을 때 다음과 같이 결과가 출력된다.
curl이란, URL을 통해 웹 요청을 보내고 응답을 확인할 수 있는 명령줄 도구다!
C:\Users\A>curl 127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
~~ 기타 내용 ~~
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
로컬과 도커는 서로 127.0.0.1을 통해 소통이 가능하다!
는 결론을 얻을 수 있다.
3. 젠킨스에서 시도
이제, 주제 내용인
"젠킨스 컨테이너"에서 "nginx 컨테이너"로 소통을 시도해보자.
C:\Users\A>docker exec -it -u root 05 bash
root@054232dce4aa:/# curl 127.0.0.1:80
curl: (7) Failed to connect to 127.0.0.1 port 80 after 0 ms: Couldn't connect to server
명령어를 해석해보자면,
docker 05 컨테이너(젠킨스)를 root 권한으로 들어가서,
curl 127.0.0.1:80을 날려보았다.
즉 이걸 그림으로 그려보자면,
이런 식이다.
분명 내 컴퓨터(호스트 컴퓨터)에서는 localhost:80으로 연결이 되는데,
어째서 젠킨스에서 nginx, 즉 컨테이너끼리는 연결이 안되는 걸까?
4. 해결 방법
컨테이너는 컨테이너끼리 소통하기 위해, 아래 스킬을 써야한다.
- 도커 네트워크를 만들고
- 그 네트워크에 가입시키고
- 컨테이너명 또는 할당된 ip로 호출해야한다.
말로해서는 어려우니, 아래 realworld 프로젝트 당시 썼던 docker-compose 파일을 보면서 이해하면 쉬울 것 같다.
networks: #(1. 네트워크 만들기!) realworld-network: external: false driver: bridge ipam: config: - subnet: 172.25.0.0/16 gateway: 172.25.0.1 services: realworld_db: #"""설정들""" networks: #(2. 네트워크에 가입시키기!) realworld-network: ipv4_address: 172.25.0.10 realworld_backend: build: ./backend #"""설정들""" networks: #(2. 네트워크에 가입시키기!) realworld-network: ipv4_address: 172.25.0.20 realworld_frontend: #"""설정들""" networks: #(2. 네트워크에 가입시키기!) realworld-network: ipv4_address: 172.25.0.30
1. 이런 식으로,realworld-network라는 네트워크를 만들고,
2. 그 네트워크에 가입시키고,
3. 컨테이너명 또는 할당된 아이피로 호출해야한다.
이 중, 컨테이너명을 종종 헷갈리곤 해서 IP를 할당하고 이를 호출하는 방식으로 도커 네트워크 내부 연결을 성공시킨 경험이 있다.
위 이미지처럼, 172.25.0.x 으로 네트워크로 묶어 연결을 성공했다.
5. 연결 해보기
그럼, 주제였던 젠킨스와 nginx 연결에 대입해보자.
이를 위해 sample이라는 이름으로 네트워크를 만들었다.
C:\Users\A>docker network create --subnet=172.25.0.0/16 --gateway=172.25.0.1 sample
0835b83943be2d58f77e17f80970dac57bc247e6408f86c3e798bf81774e36e7
C:\Users\A>docker network inspect sample
[
{
"Name": "sample",
#내용 생략
"Config": [
{
"Subnet": "172.25.0.0/16",
"Gateway": "172.25.0.1"
}
]
},
}
]
명령어를 간단히 설명하자면, sample이라는 네트워크를 만들고 inspect를 통해 네트워크 정보를 본다.
유심히 봐야할 건, 172.25.0.x 이다.
아까 네트워크도 그랬듯, 마지막 숫자를 바꿔가며 사설 IP를 할당할 수 있다.
이제,
C:\Users\A>docker run -d --name jenkins --net sample --ip 172.25.0.10 -p 8080:8080 -p 50000:50000 jenkins/jenkins
083b022e148568171500f627408b381ed694c8a9f414a8d18536239ccf89a473
C:\Users\A>docker run -d --name nginx --net sample --ip 172.25.0.20 -p 80:80 nginx
231509c08197e9df734c53b81e78429b2995151c25afd496039d582b47106623
젠킨스와 nginx를 다시 sample 네트워크의 ip에 할당해서 실행했다.
이후,
C:\Users\A>docker exec -it -u root 08 bash
root@083b022e1485:/# curl 172.25.0.20:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
~~ 기타 내용 ~~
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
이렇게 curl을 사설 IP인 172.25.0.20으로 던졌을 때 응답이 오는 것을 확인할 수 있다.
root@083b022e1485:/# curl nginx:80
물론, 172.25.0.20 대신 nginx라는 컨테이너 이름을 명시해도 좋다. 더 깔끔하기 때문에 선호되는 방식이라고 한다.
6. 마무리
이 사실을 알고 모르는건 천지차이였다.
위에 언급된 realworld 프로젝트 당시, 컨테이너 간 연결이 되지 않아 문제 해결을 위해 엉뚱한 원인 추정으로 무려 3일이라는 긴 시간을 썼다.
GPT는 당연히 내가 이러한 사실을 간과했다는 것 조차 몰랐기에 함께 삽질을 대차게 해버렸다!
하지만 3일이나 삽질을 한 결과, 도커를 자유자재로 다룰 수 있는 초능력자가 되어버렸다 ^ㅇ^
어떻게 보면 3일이나 걸릴 문제는 아니라고 생각도 하는데, gui가 아닌 cli만으로는 문제 추정이 어렵다는걸 느꼈다..
'Docker' 카테고리의 다른 글
[Docker] 인프런 - 도커 기초🐋[完] #003 (0) | 2025.04.16 |
---|---|
[Docker] 인프런 - 도커 기초🐋 #002 (0) | 2025.04.15 |
[Docker] 인프런 - 도커 기초🐋 #001 (2) | 2025.04.14 |