Docker
Docker - cmd, Dockerfile, docker-compose.yml
foxlee
2022. 2. 2. 23:15
도커 sudo 그룹에 추가하기
- ls -al /var/run/docker.sock 으로 해당 소켓파일의 소유그룹 확인
- sudo usermod -a -G docker $USER (위 소켓파일이 docker 그룹이라면) - 현재 접속한 유저를 docker 그룹에 추가
Dockerfile - https://docs.docker.com/engine/reference/builder/
# 이미지 버전 꼭 명시 # 버전 없으면 latest 태그가 적용되는데
# latest는 다운로드 속도가 느려지고, 불필요한 라이브러리, 툴까지 설치됨
# 사이즈가 작은 도커 이미지 선택하고
FROM node:16
# RUN cd ./~~ 로 반복하지 말고 WORKDIR 로 한번에 현재 디렉토리 변경
WORKDIR /usr/src/app
# 필요한 파일만 복사하기
COPY package*.json ./
RUN npm install
COPY src ./src
COPY .env.production ./.env.production
COPY tsconfig.json ./tsconfig.json
RUN npm run build
# 이미지가 빌드되고 컨테이터가 생성될때 한번 실행되는 명령어
CMD [ "npm", "run", "start" ]
docker-compose.yml - https://docs.docker.com/compose/compose-file/compose-file-v3
#test/docker-compose.yml
version: "3"
services:
proxy: # image name => test_proxy (test는 현재 부모 디렉토리의 이름)
build:
context: ./proxy # test/proxy/Dockerfile 을 보고 이미지 빌드
container_name: proxy # 이미지 빌드 후 컨테이너 이름
ports:
- "16610:80" ("Host:Container") 192.168.0.25:16610 접속하면 컨테이너:80으로 바인딩
volumes:
- ./proxy/nginx.conf:/etc/nginx/nginx.conf
- ./proxy/log:/var/log/nginx
restart: "unless-stopped"
express: # image name => test_express (test는 현재 부모 디렉토리의 이름)
build:
context: ./server # test/server/Dockerfile 을 보고 이미지 빌드
container_name: express # 이미지 빌드 후 컨테이너 이름
expose:
- "16620" # nginx conf에서 express:16620 로 접근 가능(컨테이너 내부 express의 포트가 16620이며, expose는 internal port임)
restart: "unless-stopped"
# resatart: "no", always, on-failure - exit code가 실패 에러인 경우, unless-stopped - 컨테이너가 멈춘 경우가 아니면 항상 재시작
# build/context 대신 image로 pull 가능
restart
- no : 재시작하지 않는다.(기본값)
- on-failure : 에러로 인해 종료될 시 재시작
- always : 항상 재시작/ 수동으로 종료한 경우, Docker가 재시작되면 같이 재시작
- unless-stopped : 컨테이너가 종료되지 않는다면, 항상 재시작한다. 종료되었다면, 직접 시작하기 전까지는 Docker가 재시작되도 컨테이너는 재시작되지 않음
명령어 정리(자주 사용했던 순서로) - https://docs.docker.com/engine/reference/commandline/docker/
- docker ps
- 현재 실행중인 도커 컨테이너 리스트로 컨테이너 아이디, 이미지, 상태, 포트 등의 정보 확인 가능
- docker tag 선택한이미지이름 새로운이미지이름
- 기존 이미지를 참조하는 새로운 이름을 가진 이미지 생성
- docker logs 컨테이너아이디
- 해당 컨테이너 로그를 출력함
- docker exec 컨테이너아이디 실행커맨드
- 컨테이너 안에서 명령어 실행
- 보통 docker exec -it(-i: keep stdin, -t: 가상 터미널) 컨테이너아이디 실행프로그램(bash/python/node 등)
- docker stop/rm/rmi/kill containerId
- 가끔 컨테이너를 재실행할때 컨테이너 이름이 이미 사용중이라고 뜬다. docker ps으로는 안보이나 docker ps -a로 해서 보이면 docker rm -f [컨테이너이름] 으로 제거
- docker image pull/inspect ImageId
- docker images
- docker build/pull 후 사용되지 않는(아무도 참조하지 않는 이름 없는, 일시적인 컨테이너) 이미지는 none으로 남아있는다. -> dangling image라고 하고, 이런 이미지들은 수동으로 지워주어야 함
- docker system prune(docker container prune+docker image prune)은 멈춘 컨에티너들, 사용되지 않는 네트워크, dangling images, dangling build cache들을 삭제함.
- docker-compose
- up -d --build --force-recreate