<강의 정리>따라하며 배우는 도커와 CI 환경(John Ahn) 2 - 도커 명령어
2022.04.16
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로 이동하면 됨
- FROM 다음에 WORKDIR /usr/src/app
- 어플리케이션 소스 변경 시 효율적으로 재빌드하기
- 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으로 소스코드 반영이 가능하다.
args는 dockerfile 내 변수
env는 환경변수