Docker 명령어

CHAN LIM·2022년 7월 1일
0

Docker

목록 보기
3/8

명령어를 시작하기 전에,

Docker 이미지 복습

>> docker run hello-world

1. docker 클라이언트에 명령어 입력 후 docker 서버로 보냅니다.
2. docker 서버에서 컨테이너를 위한 이미지가 이미 cache가 되어 있는지 확인합니다.
3. 이미지가 없으면 docker hub에서 다운로드 받아오고, 있다면 가지고 있던 이미지로 컨테이너를 생성합니다.

1. 먼저 파일 스냅샷을 컨테이너의 하드디스크 부분에 올립니다.
2. 시작 커맨드를 이용하여 애플리케이션을 실행합니다.


1. 이미지 내부 파일 시스템 구조 보기

>>> docker run 이미지 이름 ls 
  • docker : 도커 클라이언트 언급
  • run : 컨테이너 생성 및 실행
  • 이미지 이름 : 이 컨테이너를 위한 이미지
  • ls : 이 자리는 원래 이미지가 가지고 있는 시작 명령어를 무시하고 여기에 있는 명령어를 실행하게 합니다.
    - ls : 현재 디렉토리의 파일 리스트를 표출합니다.
  1. Alpine 이미지를 이용해서 컨테이너를 생성합니다.
  2. 컨테이너를 생성할 때 Alpine 이미지 안에 들어있던 파일 스냅샷들 (bin, dev, etc 등등...)이 컨테이너 안에 있는 하드 디스크로 다운로드됩니다.
  3. 이미지 이름 뒤에 다른 명령어를 추가하여 원래 이미지 안에 들어있는 기본 커맨드는 무시가 되고 ls 명령어가 실행됩니다.

2. 컨테이너들 나열하기

  • CONTAINER ID : 컨테이너의 고유한 아이디 해시값, 실제로는 더욱 길지만 일부분만 표출합니다.
  • IMAGE : 컨테이너를 생성 시 사용한 도커 이미지.
  • COMMAND : 컨테이너 시작 시 실행될 명령어. (대부분 이미지에 내장되어 있습니다.)
  • CREATED : 컨테이너가 생성된 시간.
  • STATUS : 컨테이너의 상태.
    • Up : 실행 중
    • Exited : 종료
    • Pause : 일시정지
  • PORTS
    : 컨테이너가 개방한 포트와 호스트에 연결한 포트.
    : 특별한 설정을 하지 않은 경우, 출력되지 않습니다.
  • NAMES
    : 컨테이너의 고유한 이름.
    : 컨테이너 생성 시 --name 옵션으로 이름을 설정하지 않으면 도커 엔진이 임의로 형용사와 명사를 조합하여 설정합니다.
    : id와 마찬가지로 중복되지 않고 docker rename명령어로 이름을 변경할 수 있습니다.
ex) docker rename original-name changed-name

원하는 항목만 보기

>>> docker ps --format 'table {{.Names}} \t table{{.Image}}'
  • docker : 도커 클라이언트 언급
  • ps : process status의 약자
  • --format : 원하는 항목만 보기
  • 'table{{.Names}} : 컨테이너의 고유한 이름
  • \t : 탭
  • table{{.Image}}' : 도커 이미지

모든 컨테이너 나열

>>> docker ps -a
  • docker : 도커 클라이언트 언급
  • ps : process status의 약자
  • -a : all

3. 도커 컨테이너 생명주기 / 중단시키기 / 삭제

docker run <이미지 이름> = docker create <이미지 이름> + docker start <컨테이너 아이디/이름>

>>> docker create <이미지 이름>

: 명령어를 실행하면 이미지 안의 파일 스냅샷이 컨테이너의 하드 디스크로 들어갑니다.

>>> docker start -a <컨테이너 아이디/이름>

: 명령어를 실행하면 컨테이너 ID가 실행 중인 프로세스 들어가서 컨테이너가 실행합니다.
: -a : attach

Stop과 Kill의 공통점과 차이점?

>>> docker stop <컨테이너 아이디/이름>
>>> docker kill <컨테이너 아이디/이름>
  • 공통점 : 둘 다 실행중인 컨테이너를 중지시킵니다.
  • 차이점
    • Stop
      : Gracefully하게 중지시킵니다.
      : 자비롭게 그동안 하던 작업들을 완료하고 컨테이너를 중지시킵니다.
    • Kill
      : 어떠한 것도 기다리지 않고 바로 컨테이너를 중지시킵니다.

삭제

>>> docker rm <아이디/이름>

: 중지된 컨테이너를 삭제할 시

>>> docker rm 'docker ps -a -q'

: 모든 컨테이너를 삭제하고 싶을 시

>>> docker rm <이미지 id>

: 이미지를 삭제하고 싶을 시

>>> docker system prune

: 한번에 사용하지 않는 컨테이너, 이미지, 네트워크 모두를 삭제하고 싶을 시


4. 실행 중인 컨테이너에 명령어 전달

>>> docker exec <컨테이너 id>

: docker run <이미지 이름> 과 똑같은 결과

  1. docker run 은 새로운 컨테이너를 만들어서 실행
  2. docker exec 은 이미 실행 중인 컨테이너에 명령어를 전달

활용 예시) Redis를 이용한 컨테이너 이해

  • Redis? - Remote Dictionary Server : 빠른 오픈 소스 인 메모리 키 값 데이터 스토어

: 하나의 터미널에서 Redis run.

: 두번째 터미널에서 Redis-cli 명령어를 시도하지만 실패합니다. 그 이유는,

: Redis 클라이언트가 Redis 서버가 있는 컨테이너 밖에서 실행을 하려 하니 Redis 서버에 접근을 할 수 없어 Redis 클라이언트를 작동하려 할 때 에러가 발생합니다.

어떻게 해결하나요?
-> Redis 클라이언트도 컨테이너 안에서 실행을 시켜야 합니다.

  1. exec 명령어를 실행하기 위해서 docker ps 를 실행하여 redis의 컨테이너 ID를 알아냅니다.

>>> docker exec -it <컨테이너 id> redis-cli 

실행합니다.

  • 여기서 -it ?
    • 명령어를 실행한 후 계속 명령어를 적을 수 있습니다.
    • -i : interactive
    • -t : terminal
  1. 실행 중인 터미널에서 나오려면 ctrl + d 이다.

실행 중인 컨테이너에서 터미널 생활


5. 컨테이너 정보

컨테이너 상세정보 확인

>>> docker inspect <컨테이너 id> 

: 컨테이너 상세정보를 확인합니다.
: 상세정보에는 네트워크, 볼륨 등이 포함되어 있습니다.

컨테이너 로깅

>>> docker logs <컨테이너 id> 

: 컨테이너의 로그를 확인합니다.
: -f(follow output) 옵션을 사용하면 로그가 생성되는 것을 실시간으로 확인할 수 있습니다.

컨테이너와 호스트간 파일 복사

>>> docker cp <HOST_PATH> <CONTAINER_ID>:<CONTAINER_PATH> 

: 컨테이너와 호스트간 파일을 복사하여 주고 받을 수 있습니다.


6. 이미지 관련

이미지 태그 삽입

>>> docker tag <OLD_NAME>:<TAG> <NEW_NAME>:<TAG>

: 기존에 존재하는 이미지에 태그를 부여함으로써 새로운 이름을 줄 수 있습니다.

이미지 확인

>>> docker images

: 원격 저장소에서 다운로드하여 로컬에 저장된 이미지 목록을 확인합니다.

이미지 업로드

>>> docker push <USERNAME>/<IMAGE_NAME>

: 로컬에 있는 이미지를 로그인한 도커 허브의 원격 저장소에 업로드합니다.

이미지 다운로드

>>> docker pull <IMAGE_NAME>

: 원격 저장소에 있는 이미지를 다운로드합니다.
: 앞에서 'docker run'을 통해 컨테이너를 실행할 때 로컬에 이미지가 없으면 원격 저장소에서 받아온다고 했습니다.
: 'docker pull' 명령어를 사용하면 컨테이너 생성은 하지 않고 이미지 다운로드만 수행할 수 있습니다.

이미지 삭제

>>> docker rmi <IMAGE_NAME>

: 로컬에 있는 이미지를 삭제합니다.


Reference

따라하며 배우는 도커와 CI환경
Docker Documentation

profile
클라우드, 데이터, DevOps 엔지니어 지향 || 글보단 사진 지향

0개의 댓글