📌 도입
왼쪽처럼 명령어를 다발로 줘야 실행되지만, 우측처럼 dokcer-compose를 이용하면 이미 작성된 yml 파일로 세팅을 한번에 실행할 수 있다.
📦 수업에서 만들어 볼 것
해당 주소에 샘플 코드들이 있다.
( https://gist.github.com/egoing/b62aa16573dd5c7c5da51fd429a5faa2)
📌 wordpress, mysql 설치
docker network create wordpress_net
docker \
run \
--name "db" \
-v "$(pwd)/db_data:/var/lib/mysql" \
--platform linux/amd64 \
-e "MYSQL_ROOT_PASSWORD=123456" \
-e "MYSQL_DATABASE=wordpress" \
-e "MYSQL_USER=wordpress_user" \
-e "MYSQL_PASSWORD=123456" \
--network wordpress_net \
mysql:5.7
📦 M1 맥북 에러
5.7: Pulling from library/mysql docker: no matching manifest for linux/arm64/v8 in the manifest list entries.
위의 명령어에서 --platform linux/amd 64 \ 를 추가해주지 않으면 에러가 난다.
- ( https://unluckyjung.github.io/develop-setting/2021/03/27/M1-Docker-Mysql-Error/ )
🪧 설치된 mysql
위처럼 mysql 파일이 폴더 안에 있기 때문에, 컨테이너를 껏다 켜도 데이터가 그대로 저장이 돼 있는 것.
📦 워드 프레스 설치
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
워드 프레스 역시 위의 폴더 안에 설치되는 것을 확인할 수 있다.
이 상태에서 localhost:8080에 접속하면 워드 프레스 설치 화면이 뜬다.
📌 docker compose 이용
version: "3.7"
services:
db:
image: mysql:5.7
platform: linux/x86_64
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 compose up 명령어 입력
📌 dokcer compose 작동 원리
최종적으로는 위와 같다.
하나하나 뜯어서 보자.
📦 Mysql container 생성
먼저 MySQL 버전과 이름을 명시해주어야 한다.
services 하위에 입력하는 이름이 해당 컨테이너의 이름이다.
컨테이너 내부의 /var/lib/mysql 안에 있는 데이터는 컨테이너를 새로 만들면 데이터가 유실된다. 그래서 db_data라는 폴더를 만들고 해당 폴더의 data를 연결시키자.
이제 환경설정과 관련된 설정을 해주자.
shell 에서는 -e option, yml에서는 environment라는 명령어로 설정이 가능하다.
📦 word press container 생성
이름이 app이라는 wordpress서버를 생성한다.
이 때, word press는 database에 의존하고 있다. 그래서 db가 선행생성 될 수 있게 depends_on 명령어를 줘서 db가 먼저 생성될 수 있게 해준다.
외부 8080포트에서 app 컨테이너의 80번 포트에 접속할 수 있게 연결시켜 준다.
🪧 network 생성
shell 환경에서, word press에 db host <- db라는 컨테이너 이름값만 줘도 세팅을 할 수 있게 해주고 싶다.
이렇게 하려면 docker network를 생성해야 한다.
docker network create wordpress_net
그러면 위와 같이 네트워크가 형성되고, wordpress 입장에서는 db라는 컨테이너값만 줘도 host에 간편히 접근할 수 있게 된다.
그런데, docker-compose.yml 환경에서는 굳이 network를 만들 필요가 없다.
왜냐하면 docker compose 환경에서는 자동으로 network가 만들어지고, 해당 네트워크 안에 있는 컨테이너들은 자동으로 연결이 되기 때문이다.
📦 동작 흐름
- 8080에 접속한다.
- 컨테이너 내부의 80번 포트와 연결돼서 wordpress의 컨테이너(이름:app)에 접근한다.
- webserver는 php서버에 요청을 넘겨주고, php 는 app_data 폴더아래 있는 코드와 연결된 /var/www/html 폴더의 코드들을 바라본다.
- app_data 폴더 안에 있는 코드가 mysql 관련된 세팅이 mysql_connect('db', user, 123456) 등으로 돼 있다고 해보자.
- 해당 여기서 맨 앞에 있는 db는 컨테이너의 이름이다.
- 그러면 해당 요청을 보고 mysql 서버로 요청을 보내고, mysql에서는 외부의 db_data 폴더에 있는 코드들을 기반으로 데이터를 반환한다.
- 사용자에게 data를 반환한다.
위 블로그의 글은 아래 생활코딩님의 강좌를 참고하여 작성하였습니다.
📚 Docker compose 를 이용해서 복잡한 도커 컨테이너를 제어하기
( https://www.youtube.com/watch?v=EK6iYRCIjYs )
'devops > Docker 강좌📌인프런' 카테고리의 다른 글
Spring Boot - Docker 예제 (0) | 2022.03.22 |
---|---|
생활코딩 도커강좌 #3 - 이미지 공유 (0) | 2022.02.28 |
생활코딩 도커 강좌 #2 -이미지 만들기 (0) | 2022.02.28 |
생활코딩 도커 강좌 #1 - 기본 (0) | 2022.02.03 |
댓글