[Docker] 도커 컨테이너 다루기

배현호·2021년 8월 19일
1

시작하기 전에 이 글을 한 번 확인 부탁드립니다.

시작하기에 앞서 도커를 편하게 쓰기 위해 GUI를 지원하는 Kitematic이라는 도구가 있지만, 여기서는 CLI(Command Line Interface)를 기준으로 사용한다.
윈도우, 맥 OS, Linux 등 운영체제에 상관없이 도커의 CLI를 사용하는 방법은 전부 동일하다.

도커 컨테이너 명령어

컨테이너 생성하기

도커 이미지 관리

도커 허브에서 이미지를 내려받을 때는 pull이라는 명령어를 사용한다.

docker pull [이미지이름]:[이미지 버전]

이는 컨테이너를 실행시킬때와 마찬가지로 버전을 명시하지 않으면 자동으로 latest로 지정된다.

이미지를 정상적으로 pull 받게 되면 다음 명령어로 내려 받은 이미지 목록을 확인할 수 있다.

docker images

위 명령어를 치게 되면 현재 내려받은 이미지들을 확인할 수 있다.

도커 컨테이너 버전 확인

도커를 사용하기에 앞서서 도커 엔진의 버전을 확인한다.

docker -v

도커는 다양한 기능이 빠르게 업데이트 되고 새로운 버전이 배포되기에 설치된 버전을 확인하는 것은 중요하다.
사소한 버전 차이로 도커의 기능을 사용 못할 수도 있기 때문이다.

도커 컨테이너 생성하기

도커 이미지로 컨테이너를 생성할 때 create 명령어를 사용할 수 있다.

docker create -i -t --name [컨테이너 이름] [이미지 이름]:[이미지 버전]

여기서 -i옵션으로 상호 입출력을, -t 옵션으로 tty를 활성화하여 bash 셸을 사용하도록 컨테이너에서 설정한다.
이 명령어를 안써도 되지만 이 두 옵션 중 하나라도 안쓴다면 셸을 사용할 수 없다.

--name 옵션은 컨테이너의 이름을 명시해준다.
위 명령어를 사용하지 않으면 고유값으로 무작위 16진수 해시값이 지정이 된다.
그러나 너무 길기에 앞의 12자리만 보통 사용하고는 한다.

docker inspect

위 명령어를 통해 도커 컨테이너의 ID를 확인할 수 있다.

도커 컨테이너 실행하기

생성된 도커 컨테이너를 실행하기 위해서는 start명령어를 사용한다.

docker start [컨테이너 이름]

start 명령어는 단순 컨테이너를 실행하는 역할을 한다.
만일 컨테이너를 실행하고 접속하려면 attach 명령어를 사용한다.

docker attach [컨테이너 이름]

도커 컨테이너 생성 및 실행

첫 컨테이너를 생성하고 바로 실행하기 위해서는 docker run이라는 명령어를 사용한다.

docker run -i -t [이미지 이름]:[이미지 버전]

이미지가 로컬 도커 엔진에 없을 경우 도커 허브에서 자동으로 이미지를 내려받아서 실행한다.
이미지 버전을 입력하지 않으면 자동으로 latest로 지정된다.

이미지를 docker run 명령어로 컨테이너를 생성 및 실행하면 자동으로 컨테이너 내부에 들어가게 된다.
컨테이너에서 기본 사용자는 root이며 호스트 이름은 무작위의 16진수 해시값이다.
예시 : root@@f4c5b82c03f:/#
컨테이너와 호스트의 파일 시스템은 서로 독립적이므로 ls 명령어로 파일시스템을 확인해볼 수 있다.

컨테이너 내부에서 빠져나오기

컨테이너 내부에서 도커 환경으로 빠져나오는 방법에는 셸에서 exit를 입력하거나 Ctrl + D를 동시에 입력하는 방법이다.
그러나 위 방법들은 컨테이너 내부를 빠져 나오면서 컨테이너를 정지시킨다.

컨테이너를 정지하지 않고 빠져나오는 방법으로는 Ctrl + P, Q를 입력하는 것이다.
위 방법은 exit와는 달리 컨테이너의 셸에서만 빠져나오기에 컨테이너 애플리케이션을 개발하는 목적으로 컨테이너를 사용할 때는 이 방법을 많이 쓴다.

run과 create 차이

컨테이너를 생성하는 명령어로 run, create, start가 있었는데, run 명령어는 pull, create, start 명령어를 일관적으로 실행한 후 attach가 가능한 컨테이너라면 컨테이너 내부에 접속한다.

하지만 create 명령어는 도커 이미지를 pull한 뒤에 컨테이너를 create할 뿐 start나 attach를 실행하지 않는다.

그래서 보통 컨테이너를 생성과 실행을 함께하는 run 명령어를 더 많이 사용한다.


컨테이너를 대상으로하는 모든 명령어에는 컨테이너 이름 대신 컨테이너 ID를 쓸 수 있다.
너무 길 때는 적절하게 컨테이너의 ID의 3~4자를 입력해도 된다.

컨테이너 목록 확인

도커 컨테이너에서 현재 실행중인 컨테이너 목록을 확인하기 위해서는 docker ps명령어를 사용한다.

docker ps

docker ps 명령어는 실행중인 컨테이너만을 보여주기 때문에 정지되어 있는 컨테이너를 포함한 모든 컨테이너를 확인하려면 뒤에 -a 옵션을 추가하면 된다.

docker ps -a

도커 ps명령어를 치면 다음과 같은 타이틀(?) 들이 나오게 된다.

설명은 다음과 같다.

  • CONTAINER ID
    • 컨테이너에게 자동으로 할당되는 고유한 ID
    • 출력은 고유 ID의 12자리만 나오지만, 전체 정보를 확인하기 위해서 docker inspect를 사용하면 전체 ID를 확인할 수 있다.
  • IMAGE
    • 컨테이너를 생성할 때 사용된 이미지 이름
    • [이미지 이름]:[이미지 버전] 형식으로 출력됨
  • COMMAND
    • 컨테이너가 시작될 때 실행되는 명령어
    • 대부분 이미지에 미리 내장돼있어 별도로 설정할 필요는 없음
    • 이미지에 내장된 커맨드는 docker run이나 create 명령어의 맨 끝에 입력해서 컨테이너를 생성할 때 덮어쓸 수 있음
  • CREATED
    • 컨테이너가 실행되고 난 뒤 흐른 시간을 나타냄
  • STATUS
    • 컨테이너의 상태를 나타냄
    • 실행중이면 "Up", 종료된 상태면 "Exited", 일시 중지된 상태면 "Pause" 등을 나타냄
  • PORTS
    • 컨테이너가 개뱅한 포트와 호스트에 연결된 포트를 나열함
    • 컨테이너를 생성할 때 외부에 노출하도록 설정하지 않으면 ps에서 나타나지 않음
  • NAMES
    • 컨테이너의 고유한 이름
    • --name 옵션으로 이름을 설정하지 않으면 도커 엔진이 임의로 형용사와 명사를 무작위로 조합해 이름을 설정함
    • 컨테이너의 이름은 중복될 수는 없지만 docker rename 명령어로 이름을 변경할 수 있음

추가적으로 --format 옵션에 {{.ID}}\t{{.Status}}와 같은 Go 템플릿을 입력해서 원하는 정보만 출력하게 할 수 있다.
\t는 탭을 의미하여 출력 결과를 좀 더 깔끔하게 보여줄 수 있도록 해준다.

컨테이너 삭제

더이상 사용하지 않는 컨테이너는 삭제할 때는 docker rm 명령어를 사용한다.
한 번 삭제한 컨테이너는 복구할 수 없기에 삭제할 때는 신중하게 해야 한다.

docker rm [컨테이너 이름]

컨테이너가 정상적으로 삭제 됐는지 확인하려면 docker ps -a명령어를 통해 확인하면 된다.

그러나 docker rm명령어는 실행이 중단된 명령어만 삭제가 가능하고, 실행중인 컨테이너는 삭제가 불가능하다.
실행중인 컨테이너를 삭제하기 위해서는 docker stop명령어를 사용해 컨테이너를 멈추로 삭제해야 한다.

docker stop [컨테이너 이름]
docker rm [컨테이너 이름]

실행중인 컨테이너를 삭제하는 다른 방법으로 강제로 삭제하는 옵션인 -f를 추가하는 것이다.

docker rm -f [컨테이너 이름]

도커를 사용하다 보면 연습용으로 생성한 컨테이너가 너무 많아 일일이 삭제하기 귀찮은 경우가 발생할 수도 있다.
이런 경우 prune 명령어를 통해 모든 컨테이너를 삭제할 수 있다.

docker container prune

위 명령어를 입력하면 다음과 같이 나오게 된다.

위 같이 나왔을 때 y를 입력하면 모든 컨테이너가 삭제된다.

docker ps 명령어에 -a 옵션과 -q 옵션을 조합해서 컨테이너를 삭제할 수도 있다.
-q 명령어는 컨테이너의 ID만을 출력하기 때문에 이를 이용하면 모든 컨테이너를 간단하게 삭제할 수 있다.

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

컨테이너를 외부에 노출

컨테이너는 vm과 마찬가지로 가상 IP주소를 부여받는다.
기본적으로 도커 컨테이너에 172.17.0.x의 IP를 순차적으로 할당한다.

컨테이너를 생성할 때 다른 설정을 하지 않았으면 외부에서 컨테이너에 접근할 수 없으며, 도커가 설치된 호스트에서만 접근할 수 있다.(예외로 Docker Desktop for Mac에서는 호스트에서 컨테이너 IP로의 접근이 불가능하다.)
외부에 컨테이너의 애플리케이션을 노출하기 위해서는 eth0의 IP와 포트를 호스트의 IP와 포트에 바인딩해야 한다.

포트 바인딩 하는 방법은 컨테이너를 실행할 때 -p 옵션으로 IP와 포트를 바인딩 해 연결할 수 있게 설정한다.

docker run -i -t -p [호스트의 포트]:[컨테이너의 포트] [이미지 이름]:[이미지 버전]

호스트의 7777번 포트를 컨테이너의 80번 포트와 연결하려면 -p 7777:80과 같이 입력한다.
특정 IP를 사용하려면 -p 192.168.0.100:7777:80과 같이 바인딩할 IP와 포트를 명시한다.

docker run -i -t -p 3306:3306 -p 192.168.0.100:7777:80 ubuntu:14.04

위와 같이 -p 옵션은 여러번 사용이 가능하다.

-p 80과 같이 입력하면 컨테이너의 80번 포트를 쓸 수 있는 호스트의 포트 중 하나와 연결한다.
그러나 이와 같이 입력하면 컨테이너를 생성하는 시점에서 호스트의 어느 포트와 연결됐는지 알 수 없으므로 docker ps 명령어를 통해 포트 항목을 확인해야 한다.

정리

  • 이미지 관련 명령어
    • docker pull [이미지 이름]:[이미지 버전] : 이미지 내려받기
    • docker images : 도커 이미지 확인
  • 컨테이너 실행
    • docker create [이미지 이름]:[이미지 버전] : 컨테이너 생성
    • docker start [컨테이너 이름] : 컨테이너 실행
    • docker attach [컨테이너 이름] : 컨테이너 접속
    • docker run -i -t [이미지 이름]:[이미지 버전] : 컨테이너를 생성 및 실행 후 접속
      • -i : 상호 입출력
      • -t : tty활성화 하여 bash 셸 사용
      • --name [컨테이너 이름] : 컨테이너 이름 지정
      • -p : 컨테이너 IP 및 포트 지정
  • 컨테이너 관리
    • docker -v : 도커 버전 확인
    • docker ps : 실행중인 컨테이너 확인
      • -a : 실행중이지 않은 컨테이너도 확인
      • -q : 컨테이너의 ID 가져오기
  • 컨테이너 삭제
    • docker stop [컨테이너 이름] : 해당 컨테이너 실행 중단
    • docker rm [컨테이너 이름] : 실행중이지 않은 컨테이너 삭제
      - -f : 컨테이너 강제 삭제
    • docker container prune : 모든 컨테이너 삭제
profile
Spring Boot 공부하고 있는 고등학생입니다.

1개의 댓글

comment-user-thumbnail
2023년 2월 22일

안녕하세요 운영자님
인카토스입니다.
먼저, 댓글로 인사를 드리게 된 점 양해 부탁 드립니다.
이렇게 연락 드린 이유는 이번에 저희가 제작한 도커 각티슈케이스 제품 협찬을 제안드리고 싶어서 연락 드렸습니다.
개발자들에게 많은 사랑은 받은 각티슈케이스입니다.
저희 상품 블로그 포스팅이 가능하실지 여쭙고자 연락드렸습니다.
아니면 클리앙,서버포럼, okky,2cpu,그누보드 등 가입되어 있으신 개발자 커뮤니티가 있으시다면 해당 커뮤니티에 아래와 비슷하게 게시글을 올려주실수 있을까요?

클리앙 : https://www.clien.net/service/board/park/17797443

연락드릴수 있는방법이 댓글밖에 보이지 않아 이렇게 먼저 연락드립니다.

협찬제안에 긍정적인 검토 부탁드리고 제안이 마음에 드신다면 하기 메일로 메일주시면 제품 보내드리도록 하겠습니다.

sungjh0726@naver.com

협찬제품 링크 : https://incatos.shop/surl/P/11

답글 달기