<강의 정리>따라하며 배우는 도커와 CI 환경(John Ahn) 2 - 도커 명령어
1. 기본적인 도커 클라이언트 명령어 이미지 생성 docker create <이미지 이름> docker build -> Dockerfile을 이용하여 이미지 생성 docker build -t <이미지 이름 지정> 이미지 실행 docker run <이미지 이름> <명령어> docker run hello-docker ls docker run -p <포트지정> docker run -f <dockerfile 지정> docker run은 아래와 같음 docker create <이미지 이름> + docker start <컨테이너 아이디 또는 이름> 컨테이너에 명령어 전달 -> 컨테이너란 이미지를 실행한 상태를 일컬음 docker exec <이미지 아이디> <명령어> 레디스를 이용한 예시 docker run redis -> 레디스 서버 실행 docker exec -it <컨테이너 아이디> redis-cli -> 레디스 클라이언트 실행 -it 는 interactive와 terminal 옵션 -> 계속해서 명령어 적용 유지시켜줌 docker exec -it <컨테이너 아이디> sh 해서 터미널 환경에 들어가서 명령어 사용하면 간단 나올 때는 ctrl + D 이미지 중지 docker stop <이미지 이름> -> 실행중이던 것 완료하고 중지 docker kill <이미지 이름> -> 바로 중지 컨테이너 확인 docker ps -> 실행 중인 컨테이너 docker ps -a (중지된) 컨테이너 삭제 docker rm <이미지 이름> -> 중지된 컨테이너 삭제 docker rm 'docker ps -a -q' -> 모든 중지된 컨테이너 삭제 docker rmi <이미지 아이디> docker system prune -> 중지된 컨테이너, 이미지, 네트워크 모두 삭제 도커 컴포즈 명령어 - docker compose yml 설정 파일 필요? docker-compose up docker-compose down 2. Dockerfile 생성하기 dockerfile 설정파일을 통해 도커 서버가 이미지를 생성함 도커 이미지가 필요한 것; 이미지는 여러 레이어로 구성 베이스 이미지 -> 이미지의 기반(OS) 파일 스냅샷 -> 필요한 파일을 다운로드할 명령어 시작 시 실행될 명령어 Dockerfile 예시 # 베이스 이미지FROM <이미지 이름>:<태그> -> 태그 안 붙이면 자동으로 최신 버전예시 FROM node:10 # 파일 다운로드RUN <명령어>예시 RUN npm install # 컨테이너 시작 시 실행될 명령어(1회 한정)CMD ["node", "server.js"] Dockerfile로 이미지 생성하기 docker build ./ 또는 docker build . docker build -t <자신의 도커 아이디> <저장소;프로젝트 이름> : <버전> ./ docker build -t example1234/hello:latest ./ -> docker run -it example1234/hello 로 실행 가능 파일 못 찾는 현상 -> 파일 스냅샷 안에 넣어줘야 참고하는 파일이 컨테이너 안에 생성됨 FROM 다음에 COPY ./ ./ 로 복사 이미지 실행 시 포트 매핑 docker run -p <브라우저에서 사용할 포트>:<컨테이너 포트> <이미지 이름> working directory 명시해주기 FROM 다음에 WORKDIR /usr/src/app -> 이미지 안에서 어플리케이션 소스를 갖고 있을 디렉터리를 생성 root에 접근하려면 쉘에 들어가서 cd로 이동하면 됨 어플리케이션 소스 변경 시 효율적으로 재빌드하기 COPY package.json ./ RUN npm install COPY ./ ./ -> 디팬던시가 변경되지 않는 한 디팬던시를 항상 받지 않고 캐시된 것을 이용하기 때문에 소스 변경 반영이 효율적이게 된다. 3. Docker Volumn COPY 대신 Docker Volumn을 이용해 로컬 파일을 참조 docker run -p ... -v 호스트경로:참조할 도커 디렉터리 지정예시) docker run -v /usr/src/app/node_modules -v $(pwd):/usr/src/app 참조하지 않을 디렉터리는 호스트 경로($pwd)없이 경로 지정하면 참조 안 하고 컨테이너 내에서 찾아서 사용함$(pwd)는 현재 디렉터리; print working directory -> 빌드 없이 stop과 run으로 소스코드 반영이 가능하다.