[Docker] 공식 튜토리얼로 배우는 Docker 3일차

Yungsang Hwang·2022년 7월 20일
0

docker

목록 보기
2/2

공식 튜토리얼로 배우는 Docker 3일차


🚩12강 바인드마운트의 개념

  • 현재 동일한 볼륨을 가지는 두 개의 컨테이너가 변경사항을 실시간으로 반영함
  • 그렇다면 이 데이터는 현재 어디에 있는 건가?
    • virtual marchine 상에 존재
docker volume ls
#언제 만들어졌는지 어디있는지 확인할 수 있음
docker volume inspect todo-db
  • inpect를 통해서 어디 위치에 있는지 알 수 있음
  • 그러나 이 것을 cd메서드로 들어가보려고 하면 접근이 불가능함
  • 왜냐하면 버추얼 머신에 위치하기 때문에!
  • 초반에 이미지를 업데이트 했던 적이 있음
  • 그때 한글화를 진행, 이미지 저장하고 이미지 빌드, 컨테이너 띄운 과정을 함
  • 소스코드 자체를 볼륨처럼 쓴다면 수정한다면 바로 적용이 되겠지? —> 바인드마운트
  • 네임드 볼륨 : 이름을 지어줘서 쓰는 것
  • 바인드 마운트 : 로컬 폴더를 지정해줘서 쓰는 것

🚩13강 바인드마운트 실제로 해보기

  • 바인드마운트란?

    • 도커 내부에서 데이터베이스가 아닌 소스코드들도 실시간으로 변경한 것을 추적할 수 있도록 해주는 것!
    • 바인드마운트를 해주는 것으로 소스코드를 변경해도 도커가 추적하기 때문에, 브라우저에서 걸려있는 포트번호에 접속해서 새로고침하면 변경내용을 매번 이미지 빌딩을 하지 않아도 바로바로 확인할 수 있다!
    • 바인드마운트의 장점은 이렇게 실시간으로 작업을 지속하면서 한 번 코드 적고 이미지를 빌드하는 것이 아닌, 개발자가 원하는 분기에 여러 작업을 하고 마친 뒤 빌드할 수 있게 한다!
    • 왜 굳이 IDE에서 확인 다 하고 빌딩하는 것이 아니라 도커 바인드마운트를 통해서 확인하느냐? → IDE에서 작업을 마치고 도커로 옮겨줘도 되고, 도커에서 시작하면서 바인드 마운트로 작업할 수도 있다!(추가 수정)
  • 실행되고 있는 컨테이너 꺼주고 도커파일 있는 데까지 감 (cd App)

  • IDE 터미널에서 자신이 실행한 터미널을 확인하기!(윈도우의 경우 파워쉘)

  • 컨테이너 node 잘 실행되는거 확인
# log 값
docker logs {컨테이너ID}

# 실시간 log값 follow
docker logs -f {컨테이너ID}

# 설치가 완료된 후 여기서 벗어나려면 ctrl+c
# 3000번 포트에서 잘 돌아가는 거 확인
#app.js
"No items ----""아이템이 아직 없습니다!" 로 변경하면 바로 수정됨

바인드 마운트의 장점

  1. 다양한 컨테이너를 띄워두고 버전 확인이 가능하다!
    • 파이썬 3.8, 3.7, 3.10 등등 다양한 버전마다 컨테이너를 만들어 띄워서 작업해볼 수 있다.

🚩14강 멀티컨테이너가 필요한 이유

  • 하나의 도커 컨테이너에 하나의 앱을 가지는 것이 원칙

🚩15강 mysql 컨테이너 띄우기

docker network create todo-app

docker run -d \
> --network todo-app --network-alias mysql \ 
> -v todo-mysql-data:/var/lib/mysql \
> -e MYSQL_ROOT_PASSWORD=secret \
> -e MYSQL_DATABASE=todos \
> mysql:5.7
  • 환경변수 설정(임시)
    1. -e MYSQL_ROOT_PASSWORD=secret \
    2. -e MYSQL_DATABASE=todos \
# Mac OS M1 사용자

docker run -d \
--network todo-app --network-alias mysql --platform linux/amd64  \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
docker exec -it {컨테이너ID} mysql -p

SHOW DATABASES;

🚩16강 멀티컨테이너 연결하기

  • 특수한이미지 니꼴라카이를 사용하여 제대로 돌아가는지 네트워크 상태 파악 위해
  • dig mysql 을 씀으로써 마치 DNS 주소를 이용하듯 연결?
docker run -it --network todo-app nicolaka/netshoot

dig mysql

exit
  • 니꼴라카이 컨테이너 삭제, 현재 실행 중인 우리 node컨테이너 중단
  • 네트워크에 탑재하여 mysql과 연결하여 실행되게끔 할 것임
  • 포트는 꼭 3000번이어야 한다!
    • 멀티컨테이너는 하나의 포트에서 여러 개의 컨테이너가 돌아가게 하는 것에 의미가 있다
    • 서버 & 데이터베이스가 하나의 포트를 공유할 수 있도록 떼는 의미를 다시 생각해보자
docker run -dp 3000:3000 \
-w /app -v "S(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "yarn install && yarn run dev"

docker ps
docker logs {컨테이너ID}
# 이 컨테이너ID는 mysql과 연결된 컨테이너
# 설정한 패스워드 입력
docker exec -it {컨테이너ID} mysql -p todos

#한글은 글씨가 깨져 ?로 보일 수 있음
select * from todo_items;

🚩17강 mysql 한글화(선택사항)

  • vscode 익스텐션 docker 설치
    • etc 폴더 - my.cnf 파일
# etc폴더 > my.cnf 파일에 추가
[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
skip-character-set-client-handshake

🚩18강 docker compose

The Official YAML Web Site

대망의 도커 컴포즈

docker compose version
# docker-compose.yml
version: "3.8"

services:
	app:
		image: node:12-alpine
		command: sh -c "yarn install && yarn run dev"
		ports:
		 - 3000:3000
		working_dir: /app
		volumes:
		 - ./:/app
		environment:
		 MYSQL_HOST: mysql
		 MYSQL_USER: root
		 MYSQL_PASSWORD: secret
		 MYSQL_DB: todos
	mysql:
		image: mysql:5.7
		volumes:
			- todo-mysql-data:/var/lib/mysql
		environment:
			MYSQL_ROOT_PASSWORD: secret
			MYSQL_DATABASE: todos
	
volumes:
	todo-mysql-data:
		# 써도되고 안써도 됨
		name: todo-mysql-data

docker-compose up -d

docker-compose logs

docker-compose logs -f

🐳 그래서 도커는 어떻게 동작하는데?

👩‍🚀드림코딩 유튜브 영상

profile
하루종일 몽상가

0개의 댓글