Docker #3

임상규·2023년 10월 20일
1

Docker

목록 보기
3/3
post-thumbnail

컨테이너 이미지 빌드

  1. 샘플 애플리케이션 복제
git clone https://github.com/docker/getting-started.git
  1. 경로 이동
cd /path/to/app
  1. Dockerfile 생성
touch Dockerfile / vi Dockerfile …
  1. Docker file 작성
 # syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install -production  
CMD ["node", "src/index.js"] : 
EXPOSE 3000 

➡️ FROM node:18-alpine : 베이스 이미지
WORKDIR /app : 작업 디렉토리 지정(없을경우 생성)
COPY . . : 호스트 파일이나 폴더를 이미지로 가져옴
(add명령어는 압축파일이나 네트워크 파일도 사용 가능)
RUN yarn install -production
CMD ["node", "src/index.js"] : 컨테이너를 생성하고 실행
EXPOSE 3000 : 도커파일의 빌드로 생성된 이미지에서 열어줄 포트

  1. 컨테이너 이미지 빌드
docker build -t getting-started .

➡️ docker build -t getting-started . : ‘-t’는 이미지에 태그 지정 / ‘.’은 현재 디렉토리 의미

  1. Docker run 명령어를 통해 컨테이너를 실행하고, 방금 만든 이미지의 이름을 지정
docker run -dp 3000:3000 getting-started
  1. Localhost:3000 접속하여 확인

볼륨 마운트 vs 바인드 마운트

볼륨 마운트

  1. 볼륨은 컨테이너의 특정 파일 시스템 경로를 호스팅 시스템에 다시 연결하는 기능을 제공
docker volume create todo-db
  1. /etc/todos 볼륨에 이름을 지정하고 경로에 생성된 모든 파일을 캡처하는 컨테이너에 볼륨을 마운트
docker run -dp 3000:3000 —mount type=volume, src=todo-
db,target=/etc/todos getting-started

바인드 마운트

  1. 바인드 마운트는 호스트의 파일 시스템에서 컨테이너로 디렉토리를 공유할 수 있는
    또 다른 유형의 마운트
docker run -dp 3000:3000 \
	-w /app --mount type=bind,src="$(pwd)",target=/app \
	node:18-alpine \
	sh -c "yarn install && yarn run dev"

➡️ -w : 작업 디렉토리, 현재 앱이 실행되는 경로
mount type: 볼륨 or 바인드
src: 현재 디렉토리를
target: app 디렉토리에 mount 시킨다.
node: 18-alpine: 사용할 이미지
sh ~: yarn을 통해 개발서버 실행

다중 컨테이너 앱

각 컨테이너는 한 가지 일을 잘 수행해야 한다.

  • 데이터베이스와 다르게 API 및 프론트 엔드를 확장해야할 가능성이 높음
  • 별도의 컨테이너를 사용하면 독립적으로 버전을 관리하고 업데이트
  • 로컬에서 데이터베이스용 컨테이너를 사용할 수 있지만 프로덕션에서는 데이터베이스용 관리 서비스를 사용
  • 여러 프로세스를 실행하려면 프로세스 관리자가 필요하므로 (컨테이너 하나의 프로세스만 시작함) 컨테이너 시작/종료에 복잡성이 추가됨

한 컨테이너가 다른 컨테이너와 통신하는 방법: 네트워킹

MySQL 시작

컨테이너를 네트워크에 배치하는 방법
1. 시작할 때 할당
2. 기존 컨테이너를 연결

시작할 떄 할당

  1. 네트워크 만들기
docker network create todo-app
  1. MySQL 컨테이너를 시작하고 네트워크에 연결
    ➡️ 데이터가 데이터베이스를 초기화하는데 사용할 몇 가지 환경 변수를 정의
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:8.0 

➡️ 도커를 백그라운드에서 실행하고
‘todo-app’ 라는 Docker 네트워크에 컨테이너를 연결, 후에는 컨테이너끼리 통신 가능
‘mysql’이라고 네트워크 별칭 설정
‘-v’는 볼륨 마운트 옵션으로 호스트의 데이터 볼륨 ’todo-mysql-data’를 컨테이너 내의
‘var/lib/mysql’ 디렉토리에 마운트
‘-e’는 환경 변수 설정 옵션으로 MYSQL 루트 사용자의 암호를 ‘secret’으로 설정
MYSQL 데이터 베이스의 이름을 ‘todos’로 설정
mysql:8.0 : 실행할 컨테이너 이미지로 MySQL 8.0 이미지 사용

  1. 데이터베이스 연결
    ➡️ 암호 프롬포트가 나타나면 secret을 입력
docker exec -it <mysql-container-id> mysql -u root -p : ‘docker exec’는 Docker 컨테이너 내에서 명령을 실행하는데 사용 / ‘-i’는 input / ’-t’는 tty 표준출력 (터미널 연결)
  1. MySQL 셸에서 데이터베이스를 나열하고 todos 데이터베이스가 보이는지 확인
mysql> SHOW DATABASES;
  1. MySQLL 셸을 종료하여 시스템의 셸로 복귀
mysql> exit

기존 컨테이너에 할당

MySQL에 연결하기

  1. nicolaka/netshoot 이미지를 사용하여 새 컨테이너를 시작
    ➡️ 동일한 네트워크에 연결하기
docker run -it —network todo-app nicolaka/netshoot
  1. dig 도구를 사용하여 mysql hostname에 대한 IP 주소를 조회
dig mysql

MySQL로 앱 실행

  1. MySQL 버전 8.0 이상일 경우 다음 명령을 실행
mysql> ALTER USER 'root' IDENTIFIED WITH 'mysql_native_password' BY 'secret';
mysql> flush privileges;
  1. 각 환경 변수를 지정하고 컨테이너를 앱 네트워크에 연결
docker run -dp 3000:3000 \ 
	-w /app -v “$(pwd):/app” \
	--network todo-app \
	-e MYSQL_HOST=mysql \
	-e MYSQL_USER=root \
	-e MYSQL_PASSWORD=secret \
	-e MYSQL_DB=todos \
	node:18-alpine \
	sh -c “yarn install && yarn run dev”

Docker 패키징

Docker compose

Docker compose는 다중 컨테이너 애플리케이션을 정의하고 공유하는데 도움이 되도록 개발된 도구

앱 서비스 정의

  1. 앱 프로젝트의 루트에서 docker-compose.yml 생성하고 서비스 항목과 이미지를 정의
services:
  app:
    image: node:18-alpine
  1. -p 3000:3000 서비스에 대해 정의하여 ports 명령의 일부를 마이그레이션
services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
  1. 작업 디렉토리(-w /app)와 볼륨 매핑(-v “$(pwd):/app”)을 모두 마이그레이션
services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
  1. environment키를 사용하여 환경 변수 정의를 마이그레이션
services:
  app:
    image: node:18-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 서비스 정의

  1. 먼저 새 서비스를 정의하고 mysql 이름을 지정

  2. 볼륨 매핑을 정의

  mysql:
    image: mysql:8.0
    volumes:
      - todo-mysql-data:/var/lib/mysql

volumes:
  todo-mysql-data:
  1. 환경변수 지정
  mysql:
    image: mysql:8.0
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

애플리케이션 스택 실행

  1. docker compose up 명령을 사용하여 애플리케이션 스택을 시작
docker compose up -d
  1. Docker compose log -f 명령을 통해 로그를 확인
profile
Junior DevOps Engineer

0개의 댓글