소개
도커는 소프트웨어 애플리케이션이 실행되는 데 필요한 모든 것을 포함하는 파일 시스템을 제공하는 인기있는 컨테이너화 도구입니다. 도커 컨테이너를 사용하면 소프트웨어가 배포되는 위치에 관계없이 동일한 방식으로 작동할 것으로 보장됩니다. 왜냐하면 실행 환경이 엄격하게 일관되기 때문입니다.
이 튜토리얼에서는 도커 이미지와 도커 컨테이너 간의 관계에 대한 간단한 개요를 제공하고, 그런 다음 컨테이너를 실행, 시작, 중지 및 제거하는 방법에 대해 자세히 살펴보겠습니다.
개요
우리는 도커 이미지를 도커 컨테이너를 만들기 위한 비활성 템플릿으로 생각할 수 있습니다. 이미지는 일반적으로 루트 파일 시스템으로 시작하여 순서대로 정렬된 읽기 전용 레이어에 파일 시스템 변경 사항과 해당 실행 매개변수를 추가합니다. 전형적인 리눅스 배포와 달리 도커 이미지에는 일반적으로 응용 프로그램을 실행하는 데 필요한 기본 사항만 포함됩니다. 이미지는 상태가 없으며 변경되지 않습니다. 대신, 이것들은 도커 컨테이너의 시작점을 형성합니다.
이미지는 docker run
명령으로 실제로 현실로 만들어집니다. 이 명령은 이미지 위에 읽기-쓰기 레이어를 추가하여 컨테이너를 생성합니다. 읽기 전용 레이어가 읽기-쓰기 레이어 위에 올려진 이 조합을 연합 파일 시스템이라고 합니다. 실행 중인 컨테이너의 기존 파일을 변경하면 해당 파일이 읽기 전용 공간에서 읽기-쓰기 레이어로 복사되어 변경 사항이 적용됩니다. 읽기-쓰기 레이어의 버전은 원본 파일을 숨기지만 삭제하지는 않습니다. 읽기-쓰기 레이어의 변경 사항은 개별 컨테이너 인스턴스 내에서만 존재합니다. 컨테이너가 삭제되면 변경 사항이 보존되지 않으며 보존하려면 조치를 취해야 합니다.
Docker 컨테이너 사용 방법
컨테이너 작업
각각 docker run
명령을 사용할 때마다 지정한 이미지로부터 새로운 컨테이너가 생성됩니다. 이는 혼란의 원인이 될 수 있으므로 몇 가지 예시를 통해 살펴보겠습니다:
단계 1: 두 개의 컨테이너 생성
다음 docker run
명령은 기본 ubuntu
이미지를 사용하여 새로운 컨테이너를 생성합니다. -t
는 터미널을 제공하고 -i
는 상호작용할 수 있도록 합니다. 우리는 Ubuntu 기본 이미지의 Docker 파일에서의 기본 명령인 bash
를 사용하여 셸로 들어갈 것입니다.
명령 줄 프롬프트는 루트 사용자로 컨테이너 내부에 있다는 것을 나타내며, 그 뒤에 12자리 컨테이너 ID가 옵니다.
우리는 컨테이너의 /tmp
디렉터리에 몇 가지 텍스트를 에코하여 변경을 만들 것이고, 그것이 성공적으로 저장되었는지를 확인하기 위해 cat
을 사용할 것입니다.
OutputExample1
이제 컨테이너에서 나옵시다.
도커 컨테이너는 명령이 완료되는 즉시 중지되므로 우리 컨테이너는 bash 쉘을 종료했을 때 중지되었습니다. docker ps
명령을 실행하면 실행 중인 컨테이너 목록이 표시되며 우리 것은 보이지 않습니다.
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
-a
플래그를 추가하면 중지되었거나 실행 중인 모든 컨테이너를 표시하므로 우리 컨테이너가 목록에 표시됩니다:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11cc47339ee1 ubuntu "/bin/bash" 6 minutes ago Exited (127) 8 seconds ago small_sinoussi
컨테이너가 생성될 때 컨테이너 ID와 무작위로 생성된 이름이 지정되었습니다. 이 경우 11cc47339ee1은 컨테이너 ID이고 small_sinoussi
는 무작위로 생성된 이름입니다. ps -a
명령은 해당 값을 표시하며 컨테이너가 생성된 이미지(ubuntu
), 컨테이너가 생성된 시간(6분 전
), 그리고 컨테이너에서 실행된 명령(/bin/bash
)도 표시합니다. 출력은 또한 컨테이너의 상태(Exited
)와 해당 상태에 들어간 지 얼마나 오래되었는지(6초 전
)를 제공합니다. 컨테이너가 여전히 실행 중이라면 “Up” 상태가 표시되고 실행 중인 기간이 표시됩니다.
같은 명령을 다시 실행하면 완전히 새로운 컨테이너가 생성됩니다:
명령 프롬프트의 ID가 다르고 Example1 파일을 찾을 수 없는 것으로 보아 새 컨테이너임을 알 수 있습니다:
Outputcat: /tmp/Example1: No such file or directory
이는 데이터가 사라간 것처럼 보일 수 있지만 사실은 그렇지 않습니다. 두 번째 컨테이너를 종료하여 생성한 파일이 있는 첫 번째 컨테이너도 시스템에 있는지 확인하겠습니다.
컨테이너 목록을 다시 나열하면 두 개가 모두 표시됩니다:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e4341887b69 ubuntu "/bin/bash" About a minute ago Exited (1) 6 seconds ago kickass_borg
11cc47339ee1 ubuntu "/bin/bash" 13 minutes ago Exited (127) 6 minutes ago small_sinoussi
단계 2: 첫 번째 컨테이너 다시 시작하기
기존 컨테이너를 다시 시작하려면 -a
플래그와 함께 start
명령을 사용하여 해당 컨테이너에 연결하고 -i
플래그를 사용하여 대화형으로 만든 다음, 컨테이너 ID 또는 이름을 사용합니다. 아래 명령어에서 컨테이너의 ID로 교체하십시오:
우리는 다시 컨테이너의 bash 프롬프트에서 자신을 찾게 되며 이전에 생성한 파일을 cat
으로 확인하면 여전히 그대로 남아 있습니다.
OutputExample1
이제 컨테이너를 종료할 수 있습니다:
이 출력에서 볼 수 있듯이 컨테이너 내에서 만든 변경 사항은 중지하고 다시 시작함으로써 유지됩니다. 컨테이너를 제거할 때만 내용이 삭제됩니다. 이 예제는 변경 사항이 개별 컨테이너로 제한되었음을 보여줍니다. 두 번째 컨테이너를 시작했을 때 이미지의 원래 상태를 반영합니다.
단계 3: 두 컨테이너 모두 삭제하기
두 개의 컨테이너를 생성했으며, 간단한 튜토리얼을 삭제하여 마무리하겠습니다. 중지된 컨테이너에서만 작동하는 docker rm
명령은 하나 이상의 컨테이너의 이름 또는 ID를 지정할 수 있으므로 다음과 같이 두 개를 모두 삭제할 수 있습니다:
Output11cc47339ee1
kickass_borg
두 컨테이너와 그 안에서 한 모든 변경 사항이 이제 없어졌습니다.
결론
docker run
명령어를 자세히 살펴보았습니다. 이 명령어는 실행될 때마다 자동으로 새로운 컨테이너를 생성하는 방법을 확인했습니다. 또한 중지된 컨테이너를 찾고, 시작하고, 연결하는 방법을 살펴보았습니다. 컨테이너 관리에 대해 더 알고 싶다면, 초보자를 위한 가이드인 Docker 컨테이너에 이름 지정: 초보자를 위한 3가지 팁에 관심이 있을 것입니다.
Source:
https://www.digitalocean.com/community/tutorials/working-with-docker-containers