[Docker] Compose

2023. 2. 27. 02:11Tools/Docker

 

0. Compose?

 

 

 

 

 

사랑합니다. 이고잉님

 

솔직히 docker run 명령어를 사용할 때마다 너무 복잡하다고 느낀다.

 

혹시 옵션이 하나라도 누락되었을까 걱정되기도 한다.

 

또 도커를 모르는 친구들과 협업할 때 저 docker run 명령어의 옵션을 하나하나 설명하는 것은 ... 좀 그렇다.

 

compose가 이런 걱정을 덜어줄 수 있다.

 


1. Compose!

 

 

이런 상황을 가정하자

 

 

docker-compose.md

GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

가. 명령어만 사용하기!

 

만약 정직하게 명령어를 입력한다면…

 

docker network create wordpress_net

 

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
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
  • -v : bind mount했다. 호스트의 파일 시스템과 연결한다.
  • -e : 또는 --env로 환경 변수를 설정한다. DB 사용을 위한 id와 passwd를 설정했다.
  • docker network create wordpress_net + --network wordpress_net : db와 app 컨테이너를 wordpress_net이라는 동일한 네트워크로 연결시켰다. ip, 포트와 같은 정보 없이 서로의 컨테이너 이름만으로 쉽게 통신할 수 있다.

 

나. 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-compose.yml 파일에 있는 디렉토리에서
docker-compose up
  • version: "3.7" : https://docs.docker.com/compose/compose-file/
  • app 컨테이너에서 데이터베이스에 접속하기 위해 필요한 정보를 환경변수로 입력한다. (보안상 문제가 될 수 있다. 실제 프로덕트에는 사용하지 말자.)
  • restart: always : 재시작 정책. 컨테이너가 실행되는 순간부터 감시하며 꺼지면 재시작한다.
  • depends_on: - db : 의존성 명시다. app은 db에 의존하고 있으므로 db 이미지부터 실행한다.
  • ports: - "8080:80" : host의 8080번 포트에 app 컨테이너의 80번 포트를 포트포워딩한다.
  • WORDPRESS_DB_HOST: db:3306 : mysql 기본 포트번호는 3306이다. db 컨테이너의 3306 포트에 데이터베이스가 있음을 알려준다. 3306 안 넣어도 돌아간다.
  • docker compose로 같이 생성된 컨테이너들끼리는 자동으로 하나의 네트워크에 연결된다.

 

# docker-compose.yml 파일에 있는 디렉토리에서
docker-compose down 
  • Docker Compose에 정의되어 있는 모든 서비스 컨테이너를 한 번에 정지시키고 삭제합니다.

 

 

부가적으로 효과로 우리는 복잡한 컨테이너들 간의 관계를 문서화할 수 있게 되었다.

 


2. M1이 또~

 

M1 맥북의 경우 mysql을 설치할 때 다음과 같은 에러가 생길 수 있다

# error
no matching manifest for linux/arm64/v8 in the manifest list entries. 

터미널 환경에서는 --platform linux/amd64 \를 추가한다.

 

yml 파일에는 platform: linux/amd64을 추가한다.

 

# docker-compose.yml

version: "3.7"

services:
  db:
    image: mysql:5.7
        platform: linux/amd64        <- 여기!
    volumes:
      - ./db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: 123456
 ...

 


출처 : https://youtu.be/EK6iYRCIjYs

출처 : https://darrengwon.tistory.com/793

출처 : https://velog.io/@sujeongim/오류-천국-Docker편-Mac-M1-no-matching-manifest-for-linuxarm64v8

'Tools > Docker' 카테고리의 다른 글

[Docker] Github와의 연동  (0) 2023.02.28
[Docker] 연습하기  (2) 2023.02.27
[Docker] 가상화된 Docker host에 접근하기  (0) 2023.02.27
[Docker] 이미지 배포  (0) 2023.02.27
[Docker] Commit & Dockerfile  (2) 2023.02.27