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