42서울/Inception

Docker 명령어, 포트번호, 컨테이너 디버깅 [42 inception 과제 개념 4]

뜨거운 개발자 2023. 6. 24. 17:57

이번 게시물에서는 도커 이미지 이용해서 컨테이너로 띄우는데 사용 되는 명령어에 대해 정리해보고자 합니다.

시작 하기 전 잠깐 복습을 하자면 도커 이미지는 도커 컨테이너를 만들기 위한 틀이고, 이미지를 이용해서 컨테이너를 실행할 수 있습니다.

그럼 도커 명령어들에 대해서 정리하겠습니다.

docker 명령어

docker images

내 컴퓨터에 있는 모든 이미지를 확인할 수 있는 명령

이 명령을 사용해보면 어떤 이미지가 있는지 자세한 정보를 보여줍니다.

docker run 이미지이름

이전에 말했든 컨테이너는 이미지의 실행환경입니다. 이렇게 run을 해보면, 이미지가 컨테이너 내부에서 실행이 됩니다.

docker run -d : 컨테이너를 detatch(분리) 모드로 실행합니다. docker run하고 있는 상태에서 ctrl +c 를 입력해서 redis app을 중단시키면 동시에 컨테이너도 중단되는 것을 볼 수가 있습니다. 그것을 해결하기 위해서 -d 옵션을 사용할 수 있습니다. 즉 서비스를 실행하는 동안 계속 터미널을 못 쓰게 하는게 아니라 background에서 실행하도록 합니다.

docker run -p6000:6379 (-p호스트포트번호:컨테이너 포트번호) 포트번호를 지정해 줄 수 있습니다.

docker ps

옵션이 없으면 실행중인 컨테이너를 확인하는 명령으로 컨테이너의 정보들이 있습니다.

docker ps -a : 중단된 컨테이너도 볼 수 있는 명령입니다.

docker pull

이미지를 다운로드 받을 때 사용하는 명령입니다.

이전에 설명했던 이미지가 layer형태로 있다는 것을 잘 볼수가 있습니다.

이미 따라서 버전이 다를 때 이미 있는 layer는 다운 받지 않고 없는 버전만 다운받습니다.

docker stop

  • 컨테이너를 stop시키는 명령
  • docker stop container id 이렇게 해주면 detach 한 컨테이너도 중단이 가능합니다.

docker start

  • stop해둔 컨테이너를 다시 시작하는 명령
  • stop할 때 중단 했던 container id를 다시 입력해주면 실행중이던 컨테이너를 다시 살려서 실행합니다.

docker run 과 docker start 간의 차이점.

docker run은 이미지에서 새로운 컨테이너를 만드는 것이지만 docker start는 이미 중단한 컨테이너를 다시 시작한다는 점이 가장 큰 차이점입니다.

docker run 은 특정 버전의 이미지 또는 가장 최신의 이미지를 가져오고 바로 start해서 컨테이너에서 작업할 수 있도록 합니다.

docker start docker run에서 정의한 속성이 컨테이너에 유지가 됩니다.

혹시나 헷갈릴까봐 말하자면, 우리는 이미지에서 작업하는게 아니라 컨테이너에서 작업하는 것입니다.

컨테이너의 포트 번호

만약 동일한 서비스를 도커에서 실행해보면 동일한 PORTS를 사용하는 것을 볼 수가 있습니다.

즉 각기 다른 컨테이너지만 같은 서비스를 실행했을 때 포트 번호가 같은 경우가 발생합니다.

예를 들어서 redis:4.0 버전과 최신버전을 둘 다 동시에 docker run을 한 경우를 생각해보겠습니다.

이후 docker ps 명령을 사용해서 port에 둘 다 동일하게 6379/tcp로 나와있는 것을 볼 수가 있습니다.

이것은 컨테이너가 독립된 실행환경이기 때문에 같은 포트를 사용할 수 있는 것 입니다.

👨🏻‍💻
사실 컨테이너에서 나오는 포트번호는 실제 포트가 아닙니다. 호스트에 실제 PORT가 있고, 컨테이너 내부에서 port 사용하려면 호스트의 port컨테이너에 바인딩을 해줘야 사용이 가능합니다.

현재 상황은 컨테이너가 저 포트를 컨테이너 공간에서 사용하겠다는 상황이고 따로 호스트에서 실제 포트번호를 바인딩 해야 사용이 가능합니다.

👨🏻‍💻
컨테이너 내부에서 간단한 리눅스 환경 구현을 해줬기 때문에 포트 인터페이스는 같을 수 있지만 실제 호스트 포트번호는 컨테이너의 포트와 다를 수 있습니다.

실행만 해주면 자동으로 포트가 바인딩 되면 좋겠지만 도커는 그런 방법보다 직접 설정해주는 것을 원합니다. 그렇기에 일반적으로 run 명령에 포트바인딩을 지정해주는 방법을 많이 사용합니다.

docker run -p6000:6379 redis 명령을 실행해보면 다음과 같이 포트가 바인딩 된 것을 볼 수있습니다.

이미 호스트에서 사용중인 포트를 바인딩하려고 하면 에러가 발생합니다.

docker run -p6001:6379 redis:4.0이 명령을 수행 해주면 실제 컨테이너는 6379번 포트에 연결이 되었지만, 사실 호스트 포트 6000번과 6001번에 연결 되어있습니다.

컨테이너 디버깅

👨🏻‍💻
사용하지 않는 도커 이미지를 지우거나, 더이상 필요하지 않은 도커 컨테이너에 대해서 삭제를 수행할 필요성이 생겼습니다.

그와 비슷하게, 컨테이너에서 문제가 발생하면 로그를 띄우거나, 실제 컨테이너의 내부에서 터미널을 띄우고 싶을 수 있습니다.

docker logs

docker logs [컨테이너 아이디/컨테이너 이름] : 컨테이너 아이디 또는 이름에 해당하는 로그가 표시됩니다.

여기서 컨테이너 이름이라는 개념이 등장하게 되는데 기본적으로 설정해주지 않는다면 random하게 이름이 설정 됩니다.

docker run --name

하지만 docker run --name 원하는 컨테이너 이름 해주게 된다면, 컨테이너 이름을 지정해줄 수 있습니다.

다만 실행 전에 반드시 컨테이너를 중지 시켜야 합니다.

도커 터미널 실행하기

중요!!

docker exec -it [컨테이너 아이디/컨테이너 이름] /bin/bash

이 명령을 사용하면 실행중인 컨테이너의 터미널을 얻을 수 있습니다.

만약 /bin/bash가 안되면 /bin/sh를 실행 해보세요. 가끔 bash가 안 깔려있는 시스템도 있어서 본쉘로 해야하는 경우도 있어요!

이렇게 쉘을 켜주게 되면 사용자로써 컨테이너 내부에 들어올 수 있습니다. 내부에 들어오면 컨테이너 내부에 가상 파일시스템이 있고, 여기에서 다른 디렉토리를 탐색 할 수 있고 내용을 확인 할 수 있습니다.

그리고 환경변수를 확인하거나 파일이 제대로 만들어졌는지 등을 쉽게 확인 할 수가 있습니다.

이 터미널을 빠져나오는 방법은 exit을 해주면 됩니다.

대부분의 컨테이너는 경량화 된 리눅스를 사용하기 때문에 내부에 없는 쉘 명령이 많이 있습니다.

docker rmi 이미지아이디

이미지 삭제 명령입니다.

다만 이미지를 지우려면 먼저 컨테이너를 삭제해야만 합니다.

docker rm 컨테이너 아이디

컨테이너 삭제 명령을 다음과 같이 컨테이너를 찾아서 수행합니다.

그렇게 이미지에 기반한 컨테이너가 사라지면 이제 이미지를 삭제할 수 있습니다.

이미지를 만드는 방법에 대해서는 Docker compose와 Dockerfile 게시물에서 다루도록 하겠습니다.


Uploaded by N2T

728x90