도커 컨테이너

728x90

도커 컨테이너에 대해 알아보자...

alpine 으로 localhost 로 ping 을 보내는 아주 간단한 docker 컨테이너를 실행시켰다.

docker ps 를 이용하면 현재 실행되고 있는 컨테이너들을 확인할 수 있다.

현재 alpine 과 rabbitmq 컨테이너가 실행되고 있는 것을 확인할 수 있다.

 


CONTAINER ID : 컨테이너의 고유한 id 해쉬값, 실제로는 더 길지만 일부분만 표출.

IMAGE : 컨테이너 생성 시 사용한 도커 이미지

COMMAND : 컨테이너 시작 시 실행 될 명령어, 대부분 이미지에 내장되어 있으므로 별도 설정이 필요 없다.

CREATED : 컨테이너가 생성된 시간

STATUS : 컨테이너의 상태, 실행 중은 Up, 종료는 Exited, 일시정지 Pause

PORTS : 컨테이너가 개방한 포트와 호스트에 연결한 포트. 특별한 설정을 하지 않은 경우 출력되지 않는다.

NAMES : 컨테이너 고유한 이름. 컨테이너 생성시 —name 옵션으로 이름을 설정하지 않으면 도커 엔진이 임의로 형용사와 명사를 조합해 설정. id 와 마찬가지로 중복이 안되고 docker rename 명령어로 이름을 변경할 수 있다.

ex) docker rename original-name changer-name

위처럼 원하는 항목만 볼수도 있으며, 모든 컨테이너를 나열하는 명령어도 존재한다.

도커 컨테이너의 생명 주기

도커도 다른 프로그램들과 다를 바 없이 생명주기가 존재한다.

지금까지 docker run <이미지 이름> 으로 컨테이너 생성하고 실행했는데, docker create 와 docker start 으로 쪼개서 생성과 시작으로 나눌 수 있다.

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

생성된 컨테이너의 아이디가 출력된다.

docker start -a <컨테이너 아이디> (맨 앞 6글자만 넣어도 실행이 된다.)
-a 는 attach 의 줄임말로 -a 옵션 없이 실행하면 start 가 되지 않는다.
-a 옵션의 역할은 도커 컨테이너가 실행이 될 때 컨테이너에 붙어있는 다음 출력으로 나오는 아웃풋들을 화면에 표출해주는 역할을 한다.

Docker stop VS Docker kill

stop 은 Gracefully 하게 중지를 시킨다

자비롭게 그동안 하던 작업들을 (메시지를 보내고 있었다면 보내고 있던 메시지) 를 완료하고 컨테이너를 중지 시킨다.

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

도커 컨테이너 삭제

중지된 컨테이너를 삭제하고 싶다면 docker rm <아이디 / 이름> (실행 중인 컨테이너는 먼저 중지한 후에 삭제 가능)

모든 컨테이너를 삭제하고 싶다면 docker rm docker ps -a -q

이미지를 삭제하고 싶다면 docker rmi <이미지 id>

한 번에 사용하지 않는 컨테이너, 이미지, 네트워크 모두 삭제하고 싶다면 docker system prune (도커를 쓰지 않을 때 모두 정리하고 싶을 때 사용하면 좋고, 실행중인 컨테이너에는 영향을 주지 않는다.)

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

Redis 를 이용한 컨테이너 이해

  1. docker run redis
  2. 새 터미널을 열고 redis-cli 를 입력 -> 오류가 발생

컨테이너 안에서 redis server 에 접근하는 것이 아닌 컨테이너 바깥에서 실행을 하기 때문에 서버에 접근을 할 수가 없어서 redis-cli 작동 시 오류가 발생한다. 즉, redis-cli 도 컨테이너 안에서 실행해야 한다.

해결법

  1. 이전과 똑같이 터미널을 켜고 docker run redis
  2. 이미 실행 중인 컨테이너에 명령어를 전달할 때 exec 를 사용한다. 그러니 redis 서버가 실행 중인 컨테이너에 exec 를 사용하여 redis-cli 도 실행시킨다.
    ex) docker exec -it <컨테이너 아이디> redis-cli
    -it?? -it 가 없다면 redis-cli 를 켜기만 하고 bash 쉘에서 나와버린다, -it 를 붙여줘야 명령어를 실행한 후에 계속 명령어를 적을 수 있다.

컨테이너 밖에서는 접근을 할 수 없다. 서버에 접근을 하기 위해서는 컨테이너 안에 들어와야 하고, 이미 실행 중인 컨테이너 안으로 들어오기 위해서는 docker exec 로 실행중인 컨테이너에 명령어를 전달해야 한다!

실행 중인 컨테이너에 명령어를 전달할 때는 docker exec -it 컨테이너 아이디 명령어

위와 같은 식으로 명령어 하나 입력해야 할 때 마다 모든 것을 계속 입력해줬어야 했다.

하지만 이러한 문제점을 해결하기 위해 컨테이너 안에 쉘이나 터미널 환경으로 접속을 할 수 있다.
마지막 명령어를 sh 로 주면된다.

docker exec -it <컨테이너 아이디> sh/bash/zsh/powershell

ex) docker exec -it 컨테이너id sh/bash/zsh/powershell

맥에서는 zsh / bash 를 사용하는 데 보편적으로 사용할 수 있는 것은 sh 이다.

사용하는 base 이미지에 따라서 변경가능하다.

컨트롤 d 로 터미널 환경에서 빠져 나올 수 있다.

728x90