Dockerexec
Docker - Microsoft 실습
https://learn.microsoft.com/ko-kr/visualstudio/docker/tutorials/docker-tutorial 실습입니다.
이미지 pull & 컨테이너 실행
docker run -d -p 8080:80 docker/getting-started
-d
: 백그라운드에서 분리 모드로 컨테이너 실행-p 8080:80
: 호스트 포트 8080을 컨테이너 포트 80에 매핑docker/getting-started
: 사용할 이미지
브라우저에서 확인
http://localhost:8080/tutorial
컨테이너 삭제
# 컨테이너 확인
docker ps
# 중지 및 제거
docker stop <container-id>
docker rm <container-id>
Todo 앱 이미지 빌드
https://github.com/docker/getting-started/tree/master 이 레포지토리의 app 파일을 로컬 파일에 복사
- pakage.json
{
"name": "101-app",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"prettify": "prettier -l --write \"**/*.js\"",
"test": "jest",
"dev": "nodemon src/index.js"
},
"dependencies": {
"express": "^4.18.2",
"mysql2": "^2.3.3",
"sqlite3": "^5.1.2",
"uuid": "^9.0.0",
"wait-port": "^1.0.4"
},
"resolutions": {
"ansi-regex": "5.0.1"
},
"prettier": {
"trailingComma": "all",
"tabWidth": 4,
"useTabs": false,
"semi": true,
"singleQuote": true
},
"devDependencies": {
"jest": "^29.3.1",
"nodemon": "^2.0.20",
"prettier": "^2.7.1"
}
}
- Dockerfile
FROM node:20-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "/app/src/index.js"]
- 베이스 이미지: node:20-alpine
- 이미지 생성 시
apk add --no-cache python3 g++ make
명령 실행- python3, g++ (GNU C++ 컴파일러), make 도구를 이미지에 설치
--no-cache
옵션: 패키지 설치 후 캐시 삭제 -> 이미지 크기 줄임
- 도커 이미지 내에서 /app 디렉토리가 작업 디렉토리로 설정됨
- 현재 도커 파일이 위치한 디렉토리의 모든 파일과 디렉토리를 작업 디렉토리(/app)에 복사
RUN yarn install --production
: 애플리케이션의 종속성 설치--production
: 개발용 종속성을 제외하고 프로덕션용 종속성만 설치
CMD ["node", "/app/src/index.js"]
: 컨테이너 실행 시 기본으로 실행되는 명령- 애플리케이션의 엔트리 포인트인 /app/src/index.js을 Node.js로 실행
- 이미지 빌드
-t
: 태그.
: 현재 위치에서 Dockerfile을 찾도록
docker build -t getting-started .
컨테이너 시작
docker run -dp 3000:3000 getting-started
코드 업데이트
- src/static/js/app.js 파일에서 코드 변경
- 컨테이너 중지 후 제거
- 이미지 빌드 후 컨테이너 시작
이미지 Push
- Docker Hub에서 리포지토리 생성
- 터미널에서 도커 허브 로그인
docker login -u <user name>
- 이미지 업로드
docker tag getting-started bokyung2/getting-started
docker push bokyung2/getting-started
볼륨 사용
- 한 컨테이너에서 만들어진 파일은 다른 컨테이너에서 사용할 수 없음!
- 볼륨을 만들어 데이터를 저장하는 폴더에 연결하면 해당 데이터는 볼륨의 호스트에 유지됨
- 볼륨 생성
docker volume create todo-db
- 컨테이너 중지 후 볼륨을 연결하여 다시 시작
-v
: 탑재할 볼륨과 위치 지정
docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
- 브라우저 새로고침 후 항목 추가
- getting-started 컨테이너 제거 후 다시 새로운 컨테이너 시작
- 데이터가 남아있음!
docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
데이터가 저장되는 위치 확인
docker volume inspect todo-db
- 결과
Mountpoint
가 데이터가 저장되는 실제 위치
[
{
"CreatedAt": "2023-12-10T05:18:27Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
"Name": "todo-db",
"Options": null,
"Scope": "local"
}
]
이미지 계층 보기
docker image history --no-trunc getting-started
docker compose
다른 컨테이너와 통신할 수 있도록 네트워크 배치
# 네트워크 생성
docker network create todo-app
# MySQL 컨테이너 시작
docker run -d
--network todo-app --network-alias mysql
-v todo-mysql-data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=<pwd>
-e MYSQL_DATABASE=todos
mysql:5.7
mysql 연결 확인
docker exec -it <mysql container id> mysql -p
todo
데이터베이스 확인
docker compose 파일 생성
docker-compose.yml
version: "3.7"
services:
app:
image: node:20-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: <pwd>
MYSQL_DB: todos
mysql:
image: mysql:8.2.0
volumes:
- todo-mysql-data: /var/lib/mysql
environments:
MYSQL_ROOT_PASSWORD: <pwd>
MYSQL_DATABASE: todos
# 볼륨 매핑 정의
volumes:
todo-mysql-data:
docker compose 실행 및 제거
docker-compose up -d
docker-compose down