728x90
  • 컨테이너의 중지와 재시작
docker ps

 

docker ps를 입력하면 현재 실행 중인 도커 컨테이너들을 확인할 수 있다.

 

만약 현재 실행 중인 컨테이너 외에도 중지된 컨테이너까지 확인하기 위해서는 다음 명령어를 사용하면 된다.

docker ps -a

 

이러면 현재 종료되어 있는 컨테이너도 확인할 수 있다.

 

이 종료되어 있는 컨테이너를 다시 재시작할 수도 있다.

docker run은 이미지를 기반으로 새 컨테이너를 만들지만, 변경사항이 없어서 컨테이너를 재실행하고 싶다면 docker ps -a로 컨테이너를 검색한 후

docker start {container ID || container name}

 

이렇게 종료된 컨테이너를 재실행한 것을 볼 수 있다.

 

  • Attached, Detached

방금 해보았던 docker start로 컨테이너를 실행하면, 외부에서 docker ps로 상태만 확인할 수 있었고 내부에서 작업은 하지 않았었다.

분명히 실행 중인데도 말이다.

이 전의 docker run으로 컨테이너를 실행하면, 해당 터미널에서 컨테이너가 실행되고 다른 터미널에서 상태를 확인할 수 있었다.

이제 여기서 자유롭게 attached, detached를 설정하여 작업해 보도록 하자.

우선 docker start는 detached 모드가 디폴트이며, docker run은 attached 모드가 디폴트이다.

 

docker run을 확인해보자.

이렇게 콘솔에 컨테이너의 결과가 출력되는 것을 볼 수 있다.

 

이 컨테이너를 콘솔과 연결되지 않는 detached 모드로 실행하기 위해서는, -d 옵션을 넣어주면 된다.

 

이렇게 -d 옵션을 넣어주면, 이전과는 다르게 바로 컨테이너가 실행되었다고 나오고 터미널과는 분리되는 것을 볼 수 있다.

 

분리된 컨테이너와 터미널을 다시 연결하고 싶다면, attach 명령어를 사용하면 된다.

 

docker attach {container ID || container name}

 

 

이렇게 다시 연결되어 결과가 출력되는 것을 볼 수 있다.

 

터미널과 연결시키지 않고 로그만 가져오고 싶다면, logs 명령어를 사용하면 된다.

 

이렇게 바로 출력의 결과만 가져오는 것을 볼 수 있다.

 

  • 인터렉티브 모드로 작업하기

웹서버뿐만 아니라 짠 코드를 직접 실행시킬 수도 있다.

 

작성한 파이썬 코드를 실행해보도록 하겠다.

Dockerfile은 다음과 같이 작성했다.

FROM python

WORKDIR /python

COPY . /python

CMD ["python", "rng.py"]

 

해당 Dockerfile을 바탕으로 이미지를 생성하고, 컨테이너를 실행한다.

 

그리고는 run -it를 사용하여, 인터렉티브하게 컨테이너를 실행한다.

docker run -it {image ID || image name}

 

이러면 해당 컨테이너와 상호작용하며 실행할 수 있다.

 

run이 아닌 start의 상황에서는 -ai 옵션을 사용하여 인터렉티브하게 재실행한다.

 

  • 이미지와 컨테이너 삭제하기

그 동안 생성했던 많은 이미지와 컨테이너들을 삭제해보도록 하자.

 

컨테이너를 제거할 때는 rm 명령어를 사용한다.

docker rm {container ID || container name}

당연히 실행 중인 컨테이너는 삭제할 수 없고, 현재 종료된 컨테이너만 제거가 가능하다.

 

이번에는 이미지를 삭제해보자.

이미지를 삭제할 때는 rmi 명령어를 사용한다.

docker rmi {image ID || image name}

 

 

이렇게 이미지가 삭제되는 것을 볼 수 있다.

여기서도 이미지는 해당 이미지를 사용하여 실행 중인 컨테이너가 존재하지 않을 때만 삭제가 가능하다.

 

해당 명령어를 사용하면, 삭제 가능한 모든 이미를 삭제한다.

docker image prune

 

만약 컨테이너를 종료 후 해당 컨테이너를 자동으로 제거하고 싶다면, run을 하면서 --rm 옵션을 넣어주면 된다.

docker run --rm {image ID || image name}

 

 

이렇게 종료하자마자 자동으로 삭제되는 것을 볼 수 있다.

 

  • 컨테이너에서의 파일 복사

실행 중인 컨테이너로 또는 실행 중인 컨테이너 밖으로 파일 또는 폴더를 복사할 수 있다.

해당 과정에서는 cp 명령어를 사용한다.

 

docker cp {복사하려는 파일 혹은 폴더} {container name}:{복사하려는 경로}

 

 

당연히 반대로 컨테이너에서 가져올 수도 있다.

cp 명령어를 사용하여 경로의 순서를 바꾸면 된다.

 

docker cp {container name}:{복사하려는 경로} {복사하려는 파일 혹은 폴더}

 

 

  • 컨테이너와 이미지에 이름 혹은 태그 지정하기

지금까지는 자동으로 도커에서 생성된 이름만을 사용했다.

당연히 이런 이름들도 우리가 직접 지정할 수 있다.

직접 지정하는 방법을 알아보도록 하자.

--name 옵션에 이름을 지정해주면 된다.

docker run --name {container name} {image ID || image name}

 

myapp이라는 이름이 지정된 것을 볼 수 있다.

 

이번에는 이미지에 이름을 지정해보자.

이미지의 이름을 태그라고 하며 2개로 구분할 수 있다.

이미지의 리포지토리 : 이미지의 태그 이렇게 구성이 되어 있는 데, 이렇게 만든 이유는 여러개의 특정화된 이미지 그룹을 만들 수 있기 때문이다.

이미지를 가져올 때도 태그를 지정할 수 있으며, 보통은 특정 버전의 이미지를 가져올 때 사용한다.

 

이미지의 이름을 생성할 때는 -t 옵션을 사용한다.

docker build -t {이미지의 이름}:{이미지의 태그} .

 

 

'백엔드 > Docker' 카테고리의 다른 글

Docker에서 볼륨과 바인드 마운트 관리하기  (0) 2024.02.12
Docker에서의 볼륨과 바인드 마운트  (0) 2024.02.12
DockerHub 사용하기  (0) 2024.02.11
Docker 이미지와 컨테이너  (0) 2024.02.03
Docker란?  (0) 2024.02.01
728x90
  • 도커란?

도커는 컨테이너 기술입니다.

컨테이너를 생성하고 관리하기 위한 도구입니다.

 

이렇게 말하면 쉽게 이해가 되지 않으며, 왜 써야 하는 지도 잘 모르겠다.

 

우선 소프트웨어 개발에서 컨테이너는 표준화된 소프트웨어 유닛입니다.

아래는 구글 클라우드에서 말하는 컨테이란?입니다.

https://cloud.google.com/learn/what-are-containers?hl=ko

컨터이너는 스프링부트를 사용해 봐서 알겠지만, 해당 코드와 종속성, 코드들이 포함되어 있다.

 

도커는 결국 이러한 컨테이너의 생성 및 관리 프로세스를 도와주는 도구이다.

결국 도커로 이 컨테이너를 만들고 관리하는 것이 목표가 될 것이다.

 

  • 컨테이너가 필요한 이유

왜 이렇게 개발에서 독립적인 표준화된 애플리케이션 패키지를 원하는 것일까?

이렇게 직접 작업한 로컬의 환경과 배포에서의 환경이 다른 경우가 생긴다.

Java 11에서는 사용하지 못하는 코드들이 있다면 문제가 될 것이다.

 

이러한 문제가 있기에 같은 개발 환경을 갖는 것은 상당히 중요한 문제이다.

이것을 도커의 컨테이너로 해결하는 것이다.

 

특정 버전을 도커 컨테이너에 Lock 할 수 있으므로, 코드가 항상 정확한 버전으로 실행되도록 할 수 있다.

애플리케이션이 자체적으로 필요한 버전을 제공하는 컨테이너에서 실행되게 된다.

 

또한 팀에서 작업을 하게 된다면

팀원 간에 작업 환경이 다르게 될 수도 있다.

그런 경우에도 문제가 생기지 않도록 같은 환경에서 실행될 수 있도록 한다.

 

또한, 혼자 작업을 하는 경우에도 문제가 될 수 있다.

이렇게 가지고 있는 프로젝트마다 버전이 다른 경우이다.

 

이런 상황에서도 컨테이너에 모든 환경이 속해있기 때문에 컨테이너만 바꾸면 문제없이 동작할 수 있게 된다.

 

  • 가상 머신 VS 도커

옛날에 가상머신으로 네트워크 공부했던 거 처럼, 그냥 가상머신에 각각의 환경을 만들어서 배포를 해도 독립된 환경을 만들어 줄 수 있기는 하다.

하지만 보통은 도커를 사용하게 되는 데, 이유에 대해 알아보자.

리눅스의 가상머신을 이용한다고 해보자.

 

이렇게 각 App마다 VM을 사용하게 되고, 이 Virtual OS는 메모리, CPU등의 사용량이 높다.

때문에 VM을 많이 사용할 수록 큰 오버헤드가 발생하게 된다.

 

도커를 사용할 때를 보자.

이 컨테이너에는 중요한 도구, 런타임이 추가되어 있지만 오버헤드가 큰 운영체제 등은 들어가 있지 않다.

컨테이너 내부에 작은 레이어가 포함되어 있을 수는 있지만, VM을 설치하는 것과는 비교도 안되게 가벼울 것이다.

또한 도커를 사용하면 이미지를 만들어 다른 사람과 공유하며, 모든 사람이 자신의 시스템에서 사용한 것과 같은 환경을 제공해 줄 수 있다.

+ Recent posts