Docker - 컨테이너 링킹

컨테이너 링킹 소개

안녕하세요, Docker에 대한 열정을 가진 친구들! 오늘 우리는 컨테이너 링킹의 흥미로운 세상으로 뛰어들어 보겠습니다. 네가 코드를 한 줄도 적지 않았더라도, 너의 친절한 이웃 컴퓨터 선생님이 이 여정을 안내해 줄 거예요. 그럼 벨트를 고정하고 컨테이너의 바다로 출발해 보겠습니다!

Docker - Container Linking

컨테이너 링킹은 파티에서 두 친구를 소개하는 것과 같아요. 컨테이너가 서로 소통하고 정보와 자원을 공유할 수 있게 해줍니다. 상상해봅시다. 모여먹는 식사(그것이 우리의 Docker 호스트)에서 각 요리(컨테이너)가 다른 요리들이 무엇이 있는지 알아야 하는 것처럼. 그게 바로 컨테이너 링킹의 핵심입니다!

컨테이너 링킹의 중요성

"왜 컨테이너 링킹에 대해 신경 쓰어야 하나요?"라고 궁금해할 수도 있습니다. 그럼 작은 이야기를 들려드리겠습니다. 오래 전, 먼 곳의 데이터 센터에 있었던 어플리케이션들은 고립 상태로 살아갔습니다. 그들은 서로 소통하거나 데이터를 공유하거나 협력할 수 없었습니다. 그들의 존재는 외롭게만 했습니다. 그러나 컨테이너 링킹이 등장하면서 모든 것이 바뀌었습니다!

컨테이너 링킹은 다음과 같은 것을 가능하게 합니다:

  1. 복잡한 다컨테이너 어플리케이션을 만들 수 있음
  2. 컨테이너 간 데이터 공유
  3. 서비스를 고립시켜 보안 향상
  4. 어플리케이션을 더 쉽게 확장할 수 있음

기본 컨테이너 링킹

간단한 예제로 시작해 보겠습니다. 우리는 웹 서버와 데이터베이스를 두 개의 컨테이너로 만들고 이를 연결해 보겠습니다.

단계 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는 여러 가지 작업을 수행합니다:

  1. 웹 컨테이너의 /etc/hosts 파일에 항목 추가
  2. 웹 컨테이너에 환경 변수 설정
  3. 웹 컨테이너가 데이터베이스 컨테이너에 연결할 수 있게 함

우리는 웹 컨테이너 내부를 들여다보아 보겠습니다:

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

이제 우리의 컨테이너는 이름을 사용하여 소통할 수 있어도록 설정되었습니다!

사용자 정의 네트워크의 장점

사용자 정의 네트워크는 다음과 같은 이점을 제공합니다:

  1. 더 나은 고립
  2. 자동 DNS 해결
  3. 컨테이너를 네트워크에 연결/분리할 수 있는 능력

실제 예제: 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