[Docker] 기본적인 도커 클라이언트 명령어 알아보기

밀크야살빼자·2023년 10월 22일
0
post-thumbnail

도커 이미지 내부 파일 구조 보기

ex) docker run alpine ls

1. Alpine 이미지를 이용해서 컨테이너를 생성한다.
2. 생성할 때는 Alpine 이미지 안에 들어있던 파일 스냅샷들 (bin, dev, etc 등등..)이 컨테이너 안에 있는 하드 디스크로 다운로드 된다.
3. 이미지 이름 뒤에 다른 명령어를 더 붙여서 원래 이미지 안에 들어있는 기본 커맨드는 무시가 되고 ls 명령어가 실행된다.

Alpine 이미지를 이용해서 ls를 사용할 수 있는 이유

Alpine 이미지 파일 스냅샷 안에 이미 ls를 사용 가능하게 하는 파일이 있다.

hello-world 이미지로 ls 명령어 사용 불가능한 이유


executable file not found -> 실행할 수 있는 파일을 찾지 못함
hello-world는 몇가지 문장만 표출해주기 위한 이미지여서 ls를 실행할 수 있는 파일들이 존재하지 않아서 에러가 발생한다.

컨테이너들 나열하기

현재 실행중인 컨테이너 나열


1. 2개의 Terminal을 작동시킨다.
2. 첫번재 Terminal에서 container 하나를 실행한다.
(이때 컨테이너를 바로 켰다가 바로 끄면 3번을 할 때 이미 프로세스가 꺼져있기 때문에 리스트에서 볼 수 없다.)
3. 두번재 Terminal에서 docker ps로 확인한다.
4. 꺼져있는 container도 확인하고 싶다면

이미지 설명

  1. container id : 컨테이너의 고유한 아이디 해쉬 값(실제로는 더욱 길지만 일부분만 표출)
  2. image : 컨테이너 생성시 사용한 도커 이미지
  3. command : 컨테이너 시작시 실행될 명령어
                   (대부분 이미지에 내장되어 있어서 별도 설정이 필요 없다)
  4. created : 컨테이너가 생성된 시간
  5. status : 컨테이너의 상태(실행중은 up, 종료는 exit, 일시정지 pause)
  6. ports : 컨테이너가 개방한 포트와 호스트에 연결한 포트
              특별한 설정을 하지 않은 경우 출력되지 않는다.
  7. names : 컨테이너 고유한 이름
               컨테이너 생성시 --name 옵션으로 이름을 설정하지 않으면 도커 엔진이 임의로            형용사와 명사를 조합해 설정한다.
               id와 마찬가지로 중복이 안되고 docker rename 명령어로 이름을 변경할 수 있다.
               docker rename original-name changed-name

원하는 항목만 보기

명령어 : docker ps --format 'table{{.names}}]\table{{.image}}

모든 컨테이너 나열

명령어 : docker ps -a

도커 컨테이너의 생명주기

도커 생성부터 삭제까지가 도커 컨테이너의 생명주기이다.

  • docker run<이미지 이름>을 docker create와 docker run으로 쪼갬

  • 도커 컨테이너 생성

    명령어 : docker create<이미지 이름>

    위 명령어를 쳐서 나오는 결과가 도커 컨테이너 아이디이다.

  • 도커 컨테이너 아이디 이용해서 시작하기

    명령어 : docker start<컨테이너 아이디/이름>

    컨테이너 아이디 앞부분 조금만 넣어도 Id를 찾아 실행이 된다.

    -a(attach) : 컨테이너가 실행된 후 나오는 output들을 화면에 표출해준다

Docker Stop vs Docker kill

Stop과 Kill의 공통점

실행중인 컨테이너를 중지시킨다.

Stop과 Kill의 차이점

  • stop

    gracefully하게 중지 시킨다.
    자비롭게 그동안 하던 작업들을(메시지를 보내고 있었다면 보내고 있던 메시지) 완료하고 컨테이너를 중지 시킨다.
    sigterm이라는 것을 날려서 정리 하는 시간(=grace period)을 준다.
  • kill

    어떠한 것도 기다리지 않고 바로 컨테이너를 중지 시킨다.

컨테이너 삭제하기

  • 중지된 컨테이너 삭제하기

    명령어 : docker rm<아이디/이름>

    실행중인 컨테이너는 먼저 중지한 후에 삭제 가능
  • 모든 컨테이너 삭제하기

    명령어 : docker rm `docker ps -a -q`

  • 이미지 삭제하기

    명령어 : docker rmi <이미지 id>

  • 한번에 컨테이너, 이미지, 네트워크 모두 삭제하기

    명령어 : docker system prune

    - 도커를 쓰지 않거나 모두 정리하고 싶을때 사용하면 좋다.
       => 도커를 사용하지 않아도 메모리를 많이 잡아먹기 때문
    - 실행중인 컨테이너에는 영향을 주지 않는다.

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

이미 실행중인 컨테이너에 명령어 전달하기

명령어 : docker exec <컨테이너 ID>

1. 터미널 2개를 실행한다.
2. 첫번재 터미널에서 컨테이너 하나를 실행한다.(docker run alpine ping localhost)
3. 두번재 터미널에서 컨테이너가 잘 작동하고 있는지 확인하고 다른 명령어를 전달한다.
   ex) docker exec<컨테이너 id> ls

docker run vs docker exec

  • 공통점

    똑같은 결과를 준다
  • 차이점

    docker run은 새로운 컨테이너를 만들어서 실행한다.

    docker exec은 이미 실행중인 컨테이너에 명령어를 전달한다.

레디스를 이용한 컨테이너 이해

레디스 이용 방법과 작동 흐름

먼저 레디스 서버를 실행 한 후, 레디스 클라이언트를 통해서 서버에 명령어를 전달해 줘야한다.
1. 첫번째 터미널을 실행 후, 레디스 서버를 작동 시킨다. docker run redis
2. 두번째 터미널을 켜서 레디스 클라이언트를 작동 시킨다. redis-cli
3. 에러 발생

에러 발생하는 이유(레디스 클라이언트와 서버 상황)

레디스 클라이언트가 레디스 서버가 있는 컨테이너 밖에서 실행을 하려고 해서 레디스 서버에 접근할 수가 없기 때문에 레디스 클라이언트를 작동하려 할 때 에러가 발생한다.

컨테이너 안에서 실행하는 방법

  1. 이전과 똑같이 첫번째 터미널을 킨 후, 레디스 서버를 작동시킨다.
    docker run redis
  2. redis 서버가 실행 중인 컨테이너에 exec를 이용하여 redis 클라이언트도 실행한다.
    docker exec -it <컨테이너 아이디> redis-cli

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

명령어 하나 입력할 때마다 많은 것들을 쳐야하는데 이것을 해결하기 위한 방법이 sh이다.

컨테이너를 쉘 환경으로 접근하기

1. 첫번째 터미널을 실행 한 후, alpine 이미지를 이용해서 컨테이너를 실행한다.
    docker run alpine
2. 두번째 터미널에서 마지막 명령어 부분에 sh를 입력후 컨테이너 안에서 터미널 환경을 구축
    docker exec -it 컨테이너 아이디 sh
3. 그 안에서 여러가지 터미널에서 원래 할 수 있는 작동들
   - ls : 컨테이너 디렉토리에 있는 내용(디렉토리, 파일) 확인
   - touch new-file : 파일 생성    - export hello=hi echo $hello : 변수 생성 출력

📜 참고 자료

profile
기록기록기록기록기록

0개의 댓글