728x90
Docker - Docker Compose
저번 포스트에 이어서 docker compose에 대해서도 이해해 보자.
1. docker compose를 실행할 수 있는 환경 세팅
- apt: Advanced Package Tool, 패키지 의존성을 자동으로 해결해 주기 때문에 매우 편리하게 사용할 수 있음.
sudo apt-get update
sudo apt-get install docker-compose
2. docker-compose.yml 파일 생성
- 경로: /home/ubuntu/docker 디렉토리 내부
- 참고로 명령어 실행은 docker-compose.yml 파일이 있는 곳에서 실행
docker-compose.yml 예시 1
version: "3.7"
services:
db:
images: 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: 123455
app:
depends_on:
- db
images: workpress: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
1. services: services 안에는 만들고 싶은 컨테이너 작성
2. db: 컨테이너 명
3. volumes: 데이터베이스 컨테이너 안에 파일이 저장되어야 하는데 컨테이너를 새로 만들게 되면 데이터를 유실하게 됨. 그래서 데이터베이스 컨테이너 안에 저장될 파일은 host에 저장하게 된다면 컨테이너로부터 데이터는 안전하게 유지 가능.
- host 경로: ./db_data
- container 내부 경로: /var/lib/mysql
4. ports: 호스트 port : 컨테이너 내부 포트
- 8080: 80
- localhost:8080 로 접속하면 80 포트로 리스닝하고 있던 web server가 접속받을 수 있음
5. environment: wordpress 입장에서 DB 접속할 때 DB의 주소를 WORDPRESS_DB_HOST에 지정하는데, ip 이름 같은 걸 적는 게 아니라 접속하려는 DB 컨테이너의 이름(여기서는 ‘db’)을 적으면 접속 가능
※ docker-compose.yml을 사용하면 네트워크를 생성하고 네트워크를 연결하는 작업 필요 없음!
docker-compose를 만드는 순간, 자동으로 네트워크가 만들어지고, 내가 생성한 컨테이너들은 네트워크에 자동으로 연결됨
but, docker-compose.yml을 사용하지 않을 땐,
- 위에가 가능하게 하기 위해선 네트워크를 생성해야함 (docker network create 네트워크명)
- (여기서는 workpress_net으로 생성하려함)
- docker network create wordpress_net
- 컨테이너 생성할때 —network wordpress_net 옵션 추가해야함
6. depends_on: wordpress 이미지 같은 경우에는 mysql이 먼저 설치되어야 하기 때문에 선행/후행 순서를 정할 때 아래 예시 코드 방법으로 사용
docker-compose.yml 예시 2
version: '3'
services:
db:
image: mysql:8.0
container_name: mysql-meetup # 이 컨테이너 이름은 내가 하고싶은대로 해도된다.
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Seoul
ports:
- 3306:3306
volumes:
- ./mysql-init-files/:/docker-entrypoint-initdb.d
# mysql폴더를 마운트해줘야 database 정보들이 docker-compose down/up 할때마다 초기화되지 않는다.
- ./data:/var/lib/mysql
platform: linux/x86_64
# httpd: apache 추가
httpd:
image: httpd:2.4
ports:
- 80:80
volumes:
- ./html:/usr/local/apache2/htdocs
- ./conf:/etc/httpd/conf.d
3. docker-compose 실행 명령어
- 자동 실행
sudo docker-compose up -d
- 종료
sudo docker-compose down
- 일시정지
sudo docker-compose stop
4. MSA환경 - 하나의 인스턴스에 Docker-compose 이용해서 4개의 mysql 생성
version: '3'
services:
db_instance_user:
image: mysql:8.0
container_name: mysql-user-container
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Seoul
ports:
- "3306:3306" # 외부 포트 3306을 컨테이너 내부의 3306 포트와 연결
volumes:
- ./mysql-init-files/:/docker-entrypoint-initdb.d
- ./db_instance_user:/var/lib/mysql # 데이터베이스 파일을 컨테이너 내부의 다른 경로로 마운트
db_instance_recipe:
image: mysql:8.0
container_name: mysql-recipe-container
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Seoul
ports:
- "3307:3306"
volumes:
- ./mysql-init-files/:/docker-entrypoint-initdb.d
- ./db_instance_recipe:/var/lib/mysql
db_instance_wriggle:
image: mysql:8.0
container_name: mysql-wriggle-container
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Seoul
ports:
- "3308:3306"
volumes:
- ./mysql-init-files/:/docker-entrypoint-initdb.d
- ./db_instance_wriggle:/var/lib/mysql
db_instance_chat:
image: mysql:8.0
container_name: mysql-chat-container
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Seoul
ports:
- "3309:3306"
volumes:
- ./mysql-init-files/:/docker-entrypoint-initdb.d
- ./db_instance_chat:/var/lib/mysql
출처: https://youtu.be/Ps8HDIAyPD0?si=kDviapN0s1-TOOd3
'Docker' 카테고리의 다른 글
[Docker] docker run httpd 명령어 쳤을때 AH00558 경고 나올때 (0) | 2023.10.22 |
---|---|
[Docker] Docker의 이해 - Docker hub로 이미지 공유하기 (push) (2) | 2023.10.22 |
[Docker] Docker의 이해 - Docker image 만들기 (Dockerfile & build) (2) | 2023.10.21 |
[Docker] Docker의 이해 - Docker image 만들기 (commit 명령어 사용) (0) | 2023.10.21 |
[Docker] Docker의 이해 - CLI 명령어 (2) | 2023.10.20 |