Dev/DevOps, Infra

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

HJChung 2021. 1. 27. 23:05

1. 도커 이미지 내부에 파일 시스템 구조를 보는 명령어

$ docker run [이미지 이름] ls

docker: 도커 Client 언급

run: 컨테이너 생성 및 실행

[이미지 이름]: 해당 컨테이너를 생성하기 위한 이미지

ls: 현재 디렉터리의 파일 리스트를 출력

※ 현재 ls가 있는 이 4번째 자리는 원래 이미지가 가지고 있는 시작 명령어를 무시하고 이 4번째 명령어를 실행하게 한다. 

※ 위의 명령어를 입력했을 때 excutable file not found. 라는 에러가 발생할 수도 있다. 이는 이미지 파일 스냅샷에 ls를 사용가능하게 하는 파일이 없기 때문이다. 

 

2. 현재 실행중인 컨테이너들을 나열하는 명령어

$ docker ps

docker: 도커 Client 언급

ps: process status

 

3. (실행 중이 아닌 것도) 모든 컨테이너들을 나열하는 명령어

$ docker ps -a

docker: 도커 Client 언급

ps: process status

-a: all

 

4. 도커 컨테이너의 생명 주기에 따른 명령어

1) 생성-> 시작

$ docker create [이미지 이름]

2) 시작 -> 실행

$ docker start [컨테이너 이름]

3) 생성 -> 시작 -> 실행

$ docker run [이미지 이름]

4) 실행 -> 중지

$ docker stop [컨테이너 이름]

stop은 그동안 하던 작업들(예를 들어 메시지를 보내고 있었다면 보내고 있던 메시지)를 완료하고 컨테이너를 중지시킴

$ docker kill [컨테이너 이름]

kill은 어떠한 것도 기다리지 않고 바로 중지시킴

 

5) 중지 -> 삭제

① 중지된 컨테이너 삭제

$ docker rm [컨테이너 이름]

② 모든 컨테이너 삭제

$ docker rm `docker ps -a -p`

docker ps -a -p 는 모든 컨테이너를 말함

③ 이미지 삭제

$ docker rmi [이미지 id]

④ 실행 중이지 않는 컨테이너, 이미지, 네트워크 모두 한번에 삭제

$ docker system prune

도커를 쓰지 않을 때 모두 정리하고자 하면 쓰는게 좋음. 단, 실행 중인 컨테이너에는 영향 없음

 

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

$ docker exec [컨테이너 id]

② 이런 경우를 생각해 보자. 

도커 컨테이너에서 redis 서버를 실행하고(docker run redis) -> 다른 터미널 환경에서 redis 클라이언트를 실행했다. (redis-cli) -> 여기서(즉, redis 클라이언트에서) set value 1 hello 라는 명령어를 주어서 redis 서버에서 전달받은 명령어를 실행할 수 있을까?

아니다. 이러면 connection refused라는 에러가 발생한다. 왜냐하면

redis 클라이언트는 도커 컨테이너 밖에 있는데 redis 서버는 도커 컨테이너 안에서 실행되고 있으므로 접근이 막힌 것이다. 

그래서 

-it 옵션을 통해 

이렇게 해주어야 한다

$ docker exec -it [컨테이너 id] [실행하고 싶은 명령어]

-it가 있어야 앞의 도커 명령어를 실행 한 후에 계속 명령어를 적을 수 있고, -it가 없다면 그냥 도커 명령어를 실행하기만 하고 밖으로 나와버린다. 

 

③ 비슷한 경우로 실행 중인 컨테이너에 쉘 환경으로 접속하려면?

$ docker exec -it [컨테이너 id] sh

※ 이 쉘 환경에서 나오려면 ctrl+D