도커를 활용해 가장 기본적인 2-Tier 아키텍처인 웹 서버와 데이터베이스를 구축하고 연동하는 과정을 알아보자.
프론트엔드 역할을 할 WordPress 컨테이너와 백엔드 데이터베이스 역할을 할 MySQL 컨테이너를 생성하고, 이 둘을 연결(Link)하여 블로그 서비스를 띄워본다.
1. 아키텍처 및 개념
우리가 구축할 구조는 클라이언트(브라우저)가 워드프레스 웹 서버에 접속하고, 워드프레스는 내부적으로 MySQL 데이터베이스에 접속하여 데이터를 저장하거나 불러오는 구조다.
컨테이너 환경에서 이 구조를 만들 때 가장 중요한 고려 사항은 상태(State)와 설정(Configuration)의 분리다.
- 이미지와 데이터: 도커 이미지는 불변(Immutable)이다. 이미지 자체에 비밀번호나 설정값을 하드코딩하면 보안상 위험하며 유연성이 떨어진다.
환경 변수(-e): 따라서 컨테이너를 실행(Run)하는 시점에 -e 옵션을 통해 필요한 환경변수(비밀번호, DB 이름 등)를 주입하는 방식을 사용한다.

2. Backend: MySQL 데이터베이스 구축
먼저 데이터를 저장할 데이터베이스 컨테이너를 띄운다.
루트 비밀번호와 초기 데이터베이스 이름을 설정한다.
docker run -d --name db_container \
-e MYSQL_ROOT_PASSWORD=1234 \
-e MYSQL_DATABASE=word_db \
mysql:5.7
- --name db_container: 컨테이너의 이름을 db_container로 지정한다. 이 이름은 나중에 워드프레스 컨테이너가 이 DB를 찾을 때 사용된다. ->네트워크(서버) 주소 역할
- -e MYSQL_ROOT_PASSWORD=1234: MySQL의 root 계정 비밀번호를 '1234'로 설정한다.
- -e MYSQL_DATABASE=word_db: 컨테이너 시작 시 'word_db'라는 이름의 데이터베이스를 자동으로 생성한다.
- mysql:5.7: 사용할 이미지와 태그(버전).
동작 확인
명령어 실행 후 긴 해시값(컨테이너 ID)이 출력된다면 정상적으로 실행된 것이다.
3. Frontend: WordPress 웹 서버 구축 및 연동
이제 웹 애플리케이션인 워드프레스를 실행한다. 이 단계의 핵심은 앞서 만든 db_container 컨테이너와 워드프레스 컨테이너를 연결하는 것이다.
docker run -d \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=1234 \
-e WORDPRESS_DB_NAME=word_db \
--name word_container \
--link db_container:mysql \
-p 80 \
wordpress:latest
여기서 --link db_container:mysql 옵션이 가장 중요하다.

- 이 옵션은 word_container 컨테이너의 /etc/hosts 파일에 db_container 컨테이너의 IP 주소를 mysql이라는 alias로 등록한다.
- 결과: 워드프레스 내부에서 mysql이라는 호스트 이름으로 ping을 날리거나 접속을 시도하면, 자동으로 db_container 컨테이너로 연결된다.
- 주의점: --link 옵션은 레거시 기능으로, 컨테이너가 재시작되어 IP가 바뀌면 연결이 끊어질 수 있는 등 취약점이 있다. 최신 도커 환경에서는 Docker Bridge Network를 생성하여 연결하는 것이 더 안정적이지만, 간단한 구조 이해를 위해 여기서는 링크를 사용한다.
- -e WORDPRESS_DB_HOST=mysql: DB 접속 호스트를 mysql로 지정한다. 이는 --link 옵션에서 지정한 alias와 일치해야 한다.
- -e WORDPRESS_DB_...: 접속할 DB 유저, 패스워드, DB명을 설정한다. MySQL 컨테이너 생성 시 설정한 값과 일치해야 한다.
- -e WORDPRESS_DB_NAME=word_db: 테이블을 만들 데이터베이스를 지정
- -p 80: 호스트의 (랜덤)할당된 포트를 컨테이너의 80번 포트와 연결한다.
4. 상태 확인 및 검증
컨테이너가 정상적으로 떠 있는지, 그리고 네트워크 연결이 잘 되었는지 확인한다.
4-1. 프로세스 확인 (docker ps)
docker ps
- word_container: 0.0.0.0:32771->80/tcp → 호스트의 32771 포트로 접속하면 워드프레스(80)로 연결된다.
- db_container: 3306/tcp → 데이터베이스가 정상 구동 중이다.
4-2. 네트워크 연결 테스트 (curl)
워드프레스 컨테이너 안에서 MySQL 컨테이너로 통신이 되는지 확인한다.
docker exec word_container curl mysql:3306 --silent
이 명령어는 word_container 컨테이너 내부에서 mysql이라는 호스트명의 3306 포트로 요청을 보낸다. 에러 없이 종료되거나 바이너리 응답이 있다면 네트워크 연결이 정상이라는 뜻이다.
4-3. 데이터베이스 내부 확인
실제로 DB가 생성되었는지 MySQL 컨테이너 내부로 진입해 확인해 본다.
# 1. 컨테이너 내부 쉘 진입
docker exec -it db_container bash
# 2. MySQL 접속
bash-4.2# mysql -u root -p
Enter password: (1234 입력)
# 3. 데이터베이스 목록 확인
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| word_db | <-- 생성 요청한 DB
...
+--------------------+
# 4. 테이블 확인
mysql> use word_db;
mysql> show tables;
Empty set (0.00 sec)
초기 상태이므로 word_db는 존재하지만, 아직 워드프레스 설치 마법사를 진행하지 않았기 때문에 테이블은 비어 있는 상태(Empty set)다. (정상)
5. 서비스 접속 (브라우저)
마지막으로 호스트 머신의 브라우저를 열어 실제 서비스에 접속한다.
- 접속 주소: http://localhost:[도커가 할당한 포트]
브라우저에 워드프레스 언어 선택 화면이나 설치 마법사가 뜬다면 성공이다.
이 화면이 뜬다는 것은 웹 서버가 작동 중이며, 데이터베이스 연결 설정이 올바르다는 것을 의미한다.
만약 DB 연결 정보가 틀렸다면 워드프레스는 "Error establishing a database connection" 에러를 뱉는다.
'AI Journey > 클라우드' 카테고리의 다른 글
| [Docker] 바인드 마운트(Bind Mount)를 활용한 데이터 동기화 (0) | 2026.01.01 |
|---|---|
| [Docker] 컨테이너의 네트워크 구조: docker0과 veth (0) | 2026.01.01 |
| [Kubernetese] Nginx 파드(Pod) 생성하고 포트 포워딩(port forwarding)하기 (0) | 2025.12.31 |
| [Docker] 포트 포워딩(port forwarding) (feat. Nginx) (0) | 2025.12.30 |
| [Docker] commit을 활용한 커스텀 이미지 생성 (0) | 2025.12.30 |