본문 바로가기
devops/Docker 강좌📌인프런

생활코딩 도커강좌 #4 - Docker compose

by IMSfromSeoul 2022. 3. 8.

📌 도입

왼쪽처럼 명령어를 다발로 줘야 실행되지만, 우측처럼 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/ )

- ( https://velog.io/@m0ai/M1-%EB%A7%A5%EC%97%90%EC%84%9C-x8664-%EB%8F%84%EC%BB%A4-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B9%8C%EB%93%9C-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0 )

 

🪧 설치된 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 )

댓글