Docker - 컨테이너 링킹
컨테이너 링킹 소개
안녕하세요, Docker에 대한 열정을 가진 친구들! 오늘 우리는 컨테이너 링킹의 흥미로운 세상으로 뛰어들어 보겠습니다. 네가 코드를 한 줄도 적지 않았더라도, 너의 친절한 이웃 컴퓨터 선생님이 이 여정을 안내해 줄 거예요. 그럼 벨트를 고정하고 컨테이너의 바다로 출발해 보겠습니다!
컨테이너 링킹은 파티에서 두 친구를 소개하는 것과 같아요. 컨테이너가 서로 소통하고 정보와 자원을 공유할 수 있게 해줍니다. 상상해봅시다. 모여먹는 식사(그것이 우리의 Docker 호스트)에서 각 요리(컨테이너)가 다른 요리들이 무엇이 있는지 알아야 하는 것처럼. 그게 바로 컨테이너 링킹의 핵심입니다!
컨테이너 링킹의 중요성
"왜 컨테이너 링킹에 대해 신경 쓰어야 하나요?"라고 궁금해할 수도 있습니다. 그럼 작은 이야기를 들려드리겠습니다. 오래 전, 먼 곳의 데이터 센터에 있었던 어플리케이션들은 고립 상태로 살아갔습니다. 그들은 서로 소통하거나 데이터를 공유하거나 협력할 수 없었습니다. 그들의 존재는 외롭게만 했습니다. 그러나 컨테이너 링킹이 등장하면서 모든 것이 바뀌었습니다!
컨테이너 링킹은 다음과 같은 것을 가능하게 합니다:
- 복잡한 다컨테이너 어플리케이션을 만들 수 있음
- 컨테이너 간 데이터 공유
- 서비스를 고립시켜 보안 향상
- 어플리케이션을 더 쉽게 확장할 수 있음
기본 컨테이너 링킹
간단한 예제로 시작해 보겠습니다. 우리는 웹 서버와 데이터베이스를 두 개의 컨테이너로 만들고 이를 연결해 보겠습니다.
단계 1: 데이터베이스 컨테이너 생성
먼저 우리는 데이터베이스 컨테이너를 만듭니다. 이 예제에서는 MySQL을 사용하겠습니다.
docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=secret mysql:latest
이 명령어를 분해해 보겠습니다:
-
-d
: 컨테이너를 배경에서 실행 -
--name mydb
: 컨테이너에 이름을 지정 -
-e MYSQL_ROOT_PASSWORD=secret
: 루트 비밀번호를 설정하는 환경 변수 -
mysql:latest
: 최신 MySQL 이미지 사용
단계 2: 웹 서버 컨테이너 생성
이제 웹 서버 컨테이너를 만들고 데이터베이스와 연결해 보겠습니다.
docker run -d --name myweb --link mydb:db -p 80:80 nginx:latest
이 명령어에서 일어나는 일:
-
--link mydb:db
:mydb
컨테이너를 연결하고db
로 불림 -
-p 80:80
: 호스트의 포트 80을 컨테이너의 포트 80으로 매핑
링크 이해
--link
옵션을 사용할 때 Docker는 여러 가지 작업을 수행합니다:
- 웹 컨테이너의
/etc/hosts
파일에 항목 추가 - 웹 컨테이너에 환경 변수 설정
- 웹 컨테이너가 데이터베이스 컨테이너에 연결할 수 있게 함
우리는 웹 컨테이너 내부를 들여다보아 보겠습니다:
docker exec -it myweb bash
들어가면 /etc/hosts
파일을 확인할 수 있습니다:
cat /etc/hosts
db
컨테이너의 IP 주소 항목을 볼 수 있어야 합니다.
환경 변수
Docker는 또한 환경 변수를 설정합니다. 환경 변수를 목록에 보이겠습니다:
env | grep DB_
DB_PORT
, DB_NAME
등과 같은 변수를 볼 수 있을 것입니다. 이러한 변수는 어플리케이션이 데이터베이스에 연결하는 데 도움이 됩니다.
레거시 링킹 대신 사용자 정의 네트워크
지금까지 사용한 --link
플래그는 Docker에서 레거시로 간주됩니다. 그것은 flip 폰 시대에 스마트폰을 사용하는 것과 같아요 – 작동하지만, 더 나은 옵션이 있습니다.
컨테이너를 연결하는 현대적인 방법은 사용자 정의 네트워크를 사용하는 것입니다. 그럼 어떻게 작동하는지 보겠습니다:
단계 1: 네트워크 생성
docker network create mynetwork
단계 2: 네트워크에서 컨테이너 실행
docker run -d --name mydb --network mynetwork -e MYSQL_ROOT_PASSWORD=secret mysql:latest
docker run -d --name myweb --network mynetwork -p 80:80 nginx:latest
이제 우리의 컨테이너는 이름을 사용하여 소통할 수 있어도록 설정되었습니다!
사용자 정의 네트워크의 장점
사용자 정의 네트워크는 다음과 같은 이점을 제공합니다:
- 더 나은 고립
- 자동 DNS 해결
- 컨테이너를 네트워크에 연결/분리할 수 있는 능력
실제 예제: WordPress와 MySQL
지식을 실제로 적용해 보겠습니다: WordPress와 MySQL을 설정하는 것입니다.
단계 1: 네트워크 생성
docker network create wordpress-network
단계 2: MySQL 컨테이너 실행
docker run -d --name wordpress-db --network wordpress-network -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpresspassword mysql:5.7
단계 3: WordPress 컨테이너 실행
docker run -d --name wordpress-site --network wordpress-network -e WORDPRESS_DB_HOST=wordpress-db -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpresspassword -e WORDPRESS_DB_NAME=wordpress -p 8080:80 wordpress:latest
이제 브라우저에서 http://localhost:8080
를 방문하면 WordPress 설정 페이지를 볼 수 있어야 합니다!
결론
축하합니다! 컨테이너 링킹의 세계로 첫 걸음을 뗐습니다. 우리는 기본 링킹에서 사용자 정의 네트워크까지, 심지어 컨테이너를 사용하여 실제 WordPress 사이트를 설정하는 것까지 다루었습니다.
컨테이너 링킹은 우리의 어플리케이션이 조화를 이루며 함께 작동할 수 있게 해줍니다. 그것은 오케스트라 지휘자처럼 – 각 컨테이너는 악기이며, 올바르게 링크되면 아름다운 음악을 만듭니다.
Docker 여정을 계속하면서 다양한 컨테이너와 네트워킹 옵션을 실험해 보세요. 더 많이 연습할수록 이 개념에 익숙해질 것입니다.
행복하게 컨테이너화 하세요, Docker 이미지가 항상 성공적으로 빌드되기를 바랍니다!
방법 | 설명 | 예제 |
---|---|---|
레거시 링킹 |
--link 플래그를 사용하여 컨테이너 연결 |
docker run --name myweb --link mydb:db nginx:latest |
사용자 정의 네트워크 | 컨테이너 간 소통을 위한 커스텀 네트워크 생성 | docker network create mynetwork |
환경 변수 | Docker가 링크할 때 자동으로 설정된 환경 변수 |
DB_PORT , DB_NAME , 등 |
DNS 해결 | 컨테이너 이름을 사용하여 소통 | mysql://wordpress-db:3306 |
포트 매핑 | 컨테이너 포트를 호스트에 노출 | -p 8080:80 |
Credits: Image by storyset