git clone https://github.com/docker/getting-started.git
cd /path/to/app
touch Dockerfile / vi Dockerfile …
# 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 : 도커파일의 빌드로 생성된 이미지에서 열어줄 포트
docker build -t getting-started .
➡️ docker build -t getting-started . : ‘-t’는 이미지에 태그 지정 / ‘.’은 현재 디렉토리 의미
docker run -dp 3000:3000 getting-started
docker volume create todo-db
docker run -dp 3000:3000 —mount type=volume, src=todo-
db,target=/etc/todos getting-started
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을 통해 개발서버 실행
각 컨테이너는 한 가지 일을 잘 수행해야 한다.
한 컨테이너가 다른 컨테이너와 통신하는 방법: 네트워킹
컨테이너를 네트워크에 배치하는 방법
1. 시작할 때 할당
2. 기존 컨테이너를 연결
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:8.0
➡️ 도커를 백그라운드에서 실행하고
‘todo-app’ 라는 Docker 네트워크에 컨테이너를 연결, 후에는 컨테이너끼리 통신 가능
‘mysql’이라고 네트워크 별칭 설정
‘-v’는 볼륨 마운트 옵션으로 호스트의 데이터 볼륨 ’todo-mysql-data’를 컨테이너 내의
‘var/lib/mysql’ 디렉토리에 마운트
‘-e’는 환경 변수 설정 옵션으로 MYSQL 루트 사용자의 암호를 ‘secret’으로 설정
MYSQL 데이터 베이스의 이름을 ‘todos’로 설정
mysql:8.0 : 실행할 컨테이너 이미지로 MySQL 8.0 이미지 사용
docker exec -it <mysql-container-id> mysql -u root -p : ‘docker exec’는 Docker 컨테이너 내에서 명령을 실행하는데 사용 / ‘-i’는 input / ’-t’는 tty 표준출력 (터미널 연결)
mysql> SHOW DATABASES;
mysql> exit
docker run -it —network todo-app nicolaka/netshoot
dig mysql
mysql> ALTER USER 'root' IDENTIFIED WITH 'mysql_native_password' BY 'secret';
mysql> flush privileges;
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 compose는 다중 컨테이너 애플리케이션을 정의하고 공유하는데 도움이 되도록 개발된 도구
services:
app:
image: node:18-alpine
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
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 이름을 지정
볼륨 매핑을 정의
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
volumes:
todo-mysql-data:
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
docker compose up -d