본문 바로가기
카테고리 없음

Docker Compose 사용 방법(with Wordpress, MySQL)

2022. 8. 21.

지난 글에서 도커 컨테이너를 만드는 방법에 대해 알아보았습니다. 관련하여 명령어를 직접 입력해보신 분은 아시겠지만, 복잡한 명령어를 매번 실행해야 한다면 매우 귀찮을 것입니다. 또한 혼자 하는 프로젝트가 아닌 여러 명의 팀원과 함께하는 프로젝트라면 이런 복잡한 명령어를 입력하는 것에 많은 부담을 가질 것입니다.

 

이런 상황에서 docker-compose.yml이라는 파일을 만들고 도커 컨테이너를 만드는 명령어를 작성해 놓습니다. 콘솔에서 docker-compose up이라는 명령어 입력으로 컨테이너를 만들 수 있다면 협업을 하는 데 있어서 훨씬 편할 것입니다.

 

도커에 대해 아직 이해가 부족하거나, 너무 오래전에 해서 기억이 나지 않는다면 저의 이전 글을 참고 바랍니다. 도커의 설치부터 컨테이너 생성, 바인딩까지 실습과 함께 따라해보시면 도커 컴포즈에 대해 좀 더 이해가 쉬울 것입니다.

 

도커란 무엇이고 왜 사용해야할까?(Docker 개념)

Docker가 무엇인지 알아보고 왜 사용해야 하는지 알아봅시다. 도커에 대해서는 실습을 직접 해보는 것이 좋지만 그 전에 도커란 무엇인지 짧게 알아보는 것도 앞으로 진행될 실습에 도움이 될 것

ssonny.tistory.com

Docker Compose 실습 시나리오

만약 워드 프레스 도커이미지를 이용하여 본인의 블로그를 구축하고 싶다고 합시다. 워드 프레스 도커 이미지는 MySQL 컨테이너가 추가로 필요합니다. 이 두 컨테이너를 만들고 워드 프레스 컨테이너와 MySQL 컨테이너를 만들고 연결시키면 다음과 같이 활용할 수 있습니다.

 

웹 브라우저를 통해 워드프레스에 접속하면 워드프레스 컨테이너가 MySQL 컨테이너에 접속하여 여러 작업을 하고, 작업한 결과를 워드프레스에서 가져온 후 다시 웹브라우저에게 결과를 반환해줄 수 있습니다.

 

위 시나리오의 환경을 도커 컴포즈를 활용하여 만들어 보도록 합시다.

 

Docker Compose 실습

먼저 아래와 같이 명령어를 입력해봅시다. 워드 프레스 닷넷 네트워크를 생성합니다. 어떤 의미인지는 아직 모르셔도 됩니다.

docker network create wordpress_net

DB이름을 가진 MySQL 이미지를 컨테이너를 만들어 봅시다. 아래의 명령어를 입력하세요.

docker run --name "db" -v "$(pwd)/db_data:/var/lib/mysql" -e "MYSQL_ROOT_PASSWORD=123456" -e "MYSQL_DATABASE=wordpress" -e "MYSQL_USER=wordpress_user" -e "MYSQL_PASSWORD=123456" --network wordpress_net mysql:5.7

실행을 시키면 db_data라는 폴더가 생기고, 해당 폴더에는 mysql 데이터가 저장되는 파일들이 생깁니다. db를 껐다가 다시 실행시켜도 데이터가 보관하기 위함입니다.

 

그 다음은 워드프레스 컨테이너를 만들어 봅시다. 아래의 명령어를 입력하세요.

docker run --name app -v "$(pwd)/app_data:/var/www/html" -e "WORDPRESS_DB_HOST=db" -e "WORDPRESS_DB_USER=wordpress_user" -e "WORDPRESS_DB_NAME=wordpress" -e "WORDPRESS_DB_PASSWORD=123456" -e "WORDPRESS_DEBUG=1" -p 8080:80 --network wordpress_net wordpress:latest

이제 MySQL과 WordPress가 실행됐고, 두 컨테이너는 wordpress_net이라는 네트워크에 연결된 상태입니다. 워드프레스도 마찬가지로 폴더 내 app_data라는 폴더로 만들어진 것이 보이실 겁니다.

 

이제 워드 프레스에 접속해봅시다. 워드프레스 컨테이너 실행 명령어를 입력하면서 보셨겠지만, 8080번 포트로 워드프레스를 실행시켰습니다. 접속을 위해 localhost:8080 포트로 접속해봅시다. 아래와 같이 워드프레스 설치 화면을 볼 수 있습니다.

워드프레스
워드프레스 설치 화면

그다음부터 Continue를 눌러 실행하면 워드프레스를 설치할 수 있게 됩니다. 위의 명령어를 직접 입력해보면서 아시겠지만, 이런 복잡한 명령어를 기억하고 입력하기가 쉽지 않습니다. 만약 여러 번 사용해야 한다면 어딘가 메모를 해두고 복사를 한 뒤 붙여 넣기를 하여 사용해야 합니다.

 

그러기엔 너무 복잡하고, 이런 명령어가 한두 개면 괜찮겠지만, 몇십 개가 된다면 메모해둔 명령어를 다시 찾는 것도 일이 되겠죠. 간단하게 도커 컴포즈 업이라는 명령어로 이 두 명령어를 한 번에 실행할 수 있도록 해봅시다.

 

다시 한번 wordpress 컨테이너와 mysql 컨테이너를 설치해야 하기 때문에 기존에 설치했던 컨테이너는 삭제합시다. 그리고 폴더 내 설치된 db_data, app_data폴더도 삭제합시다.

docker rm --froce app
docker rm --froce db
docker network rm wordpress_net

삭제가 완료되었다면, 폴더 내 "docker-compose.yml"이라는 파일을 만들고 여기에 아래와 같이 입력해봅시다. 이 파일의 이름은 약속된 파일명이니 그대로 만드시면 됩니다.

#docker-compose.yml

version: "3.7"

services:
	db:
    	image: mysql:5.7
        volumes:
        	- ./db_data:/var/lib/mysql
        restart: always
        environment:
        	MYSQL_ROOT_PASSWORD: 123456
            MYSQL_DATABASE: wordpress
            MYSQL_USER: wordpress_user
            MYSQL_PASSWORD: 123456
        
    app:
    	depends_on:
        	- db
        image: wordpress:latest
    	volumes:
        	- ./app_data:/var/www/html
        ports:
        	- "8080:80"
        restart: always
        environment:
        	WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_NAME: wordpress
            WORDPRESS_DB_USER: wordpress_user
            WORDPRESS_DB_PASSWORD: 123456

코드를 잘 보시면 아시겠지만, 아까 실행했던 코드와 동일한 명령어입니다. 그럼 이제 터미널로 돌아가 아래와 같이 명령어를 입력하면 복잡한 명령어를 직접 입력할 필요가 없게 됩니다.

docker-compse up

그리고 다시 localhost:8080으로 접속해봅시다. 역시 wordpress 설치 화면을 볼 수 있습니다. 만약 실행된 컨테이너들을 끄고 싶다면 docker-compse down을 입력하면 됩니다.

 

Docker compose 실습 내용 정리(Shell과 docker compose 비교)

MySQL 컨테이너 비교

맨 처음 MySQL 서버를 만들었고, MySQL 서버 컨테이너를 만들면 /var/lib/mysql 폴더에 데이터가 저장됩니다. MySQL 서버는 3306 포트로 리스닝하고 있습니다.

 

쉘에서 MySQL 서버 컨테이너를 만들기 위해 docker run이라는 명령어를 입력하고 mysql:5.7을 입력하여 mysql 컨테이너를 생성했습니다.

 

docker compose파일에서는 맨 처음 docker-compse.yml 파일의 버전을 작성합니다. 예시는 "3.7"이라고 작성했습니다. 그리고 "services"라는 지시어를 만들고 그 안에는 만들고 싶은 컨테이너들이 들어가면 됩니다. "image: mysql:5.7"명령어를 통하여 MySQL 5.7 버전을 설치할 수 있습니다.

 

만든 컨테이너의 이름을 지정할 때 명령어로 입력할 경우 "--name "db""와 같이 name 옵션을 입력하여 이름을 지정할 수 있고, docker compose에서는 "db"라는 지시어가 컨테이너의 이름이 됩니다.

 

컨테이너 내 데이터를 저장하게 되면 컨테이너가 삭제될 경우 데이터가 유실될 우려가 있습니다. 따라서 데이터는 컨테이너 내 저장하는 것이 아닌 컨테이너 밖, 즉 HOST에 저장할 필요가 있습니다. 그렇게 되면 컨테이너가 삭제되어도 데이터는 삭제되지 않겠죠. 이를 위해 HOST에 db_data 폴더를 만들고 이 폴더를 db컨테이너의 /var/lib/mysql과 연결하면 됩니다.

 

쉘에서는 "-e $(pwd)/db_data:/var/lib/mysql"을 입력하여 구현했습니다. docker-compose.yml 에서는 volumes라는 지시어에 "./db_data:/var/lib/mysql"을 입력하여 연결시키면 됩니다.

 

db컨테이너가 만들어질 때 mysql 서버의 user name, password 등 필요한 정보를 세팅해야 합니다. 쉘에서는 "-e"옵션을 활용하여 여러 환경변수를 지정해뒀습니다. 똑같은 작업을 docker-compose.yml에서는 environment 지시어를 활용하여 지정하였습니다.

 

Wordpress 컨테이너 비교

워드프레스 컨테이너에는 Apache 웹 서버가 설치되어 있고, php가 설치되어있습니다. 그리고 /var/www/html/에 소스코드가 저장됩니다. 그리고 워드프레스 컨테이너는 80번 포트로 리스닝하고 있습니다.

 

이를 위해 쉘에서는 "docker run"을 입력하고 "wordpress:latest"를 입력하여 워드프레스 최신 버전을 설치했습니다. docker compose에서는 "image: wordpress:latest"를 입력하였습니다.

 

MySQL db컨테이너와 다르게 wordpress는 mysql 서버를 이용합니다. 따라서 MySQL 서버가 먼저 만들어질 필요가 있습니다. 그렇다면 MySQL 서버가 먼저 만들어지지 않는다면 Wordpress컨테이너를 생성할 수 없습니다.

 

docker compose에서는 "depends on"이라는 지시어를 사용하여 선행되어야 하는 것을 정할 수 있습니다. 이를 위해 "depends on : -db"를 입력하여 db컨테이너가 먼저 만들어지고 wordpress 컨테이너가 만들어질 수 있도록 설정할 수 있습니다.

 

MySQL과 동일하게 Host파일을 Wordpress를 연결하기 위해 쉘에서는 "-v" 옵션, docker compose에서는 "volums" 지시어를 활용하여 연결할 수 있습니다.

 

wordpress 컨테이너인 app 컨테이너는 외부에서 접근할 수 있는 컨테이너입니다. 반면 mysql 컨테이너인 db 컨테이너는 외부에서 접근하게 될 경우 정보의 유출이 발생할 수 있기에 접근을 하면 안 되는 컨테이너이지요. db 컨테이너는 app 컨테이너만 접근할 수 있게 하는 것이 훨씬 안전합니다.

 

app 컨테이너를 외부에서 접근이 가능하도록 host의 8080 포트와 app 컨테이너(wordpress)의 80 포트를 연결합니다. 쉘에서는 "-p 8080:80", docker compose에서는 "ports: 8080:80"을 입력해주면 됩니다.

 

app 컨테이너가 db에 접근을 하기 위해서는 mysql db관련 명령어를 입력하고, docker compose에서는 environment 지시어에 관련 내용을 입력합니다.

 

쉘에서는 db와 app컨테이너를 연결하기 위해 wordpress_net이라는 네트워크를 사전에 입력하여 네트워크를 구성합니다.  그리고 db 컨테이너를 wordpress_net이라는 네트워크에 연결했죠. docker run 명령어 말미에 "--network wordpress_net" 명령어를 입력하여 네트워크를 묶을 수 있습니다.

 

반면 docker compose에서는 이 네트워크를 연결하는 행위를 할 필요가 없습니다. docker compose를 만드는 순간 자동으로 네트워크가 만들어지고, 생성한 컨테이너들은 자동으로 네트워크에 연결이 됩니다.

 

 Wordpress가 실행되는 과정

워드프레스 실행 과정
wordpress 호출 시 흐름도

웹 브라우저에서 localhost:8080 입력하고 엔터를 치면 host의 8080 포트로 들어옵니다. 80 포트에 연결되어있는 app컨테이너로 접속이 되고, 80 포트에서 리스닝하고 있는 웹서버로 접속하게 됩니다. 웹서버는 Php에게 그 정보를 넘기고 php는 /var/www/html에 위치하고 있는 php applicaion을 읽어 동작합니다.

 

코드 내 mysql connect db 명령어를 입력한다면, 이 db는 같은 네트워크의 db 컨테이너로 접속을 합니다. 3306 포트로 접속 시도하면 3306 포트로 리스닝하고 있는 mysql 서버로 접속하고, /var/lib/mysql 에 연결되어있는 db데이터를 php에게 전달해줍니다.

 

php는 웹서버에게 응답하고, 웹서버는 다시 웹 브라우저에게 결과를 알려줍니다. 그 결과 웹 브라우저에서는 워드프레스가 실행됩니다.

 

이로써 docker compose를 이용하여 복잡한 컨테이너의 관계를 문서화할 수 있고, 손쉽게 컨테이너를 운영할 수 있습니다.

반응형

댓글