
4. Dockerfile과 Image *미완성*
Dockerfile과 이미지에 대해서 알아봅시다.
2024년 10월 15일
Jisoo.
기술블로그
Container에 대해서 알아봅시다.
컨테이너는 하나의 기술로써, 간단히 별도의 운영 환경을 가지는 공간입니다.
하나의 휴대전화에서 여러 개의 앱이 서로 영향을 받지 않고 실행이 가능한 것과 비슷합니다.
Docker는 필요한 모든 코드 및 종속성이 패키징 된 Container를 생성하여 한 번에 애플리케이션의 실행에 관련된 모든 동작을 수행할 수 있습니다.
Docker Container 역시 별도의 운영 환경을 가지는 공간입니다.
따라서 각 컨테이너는 호스트 컴퓨터의 OS 자원을 공유하면서도 별도의 IP, 메모리 공간 등을 가질 수 있습니다.
호스트 컴퓨터의 자원을 공유하므로 기존의 OS를 따로 설치하던 가상화 방식에 비해 리소스 소모가 적고, 독립적인 환경에서 실행되므로 우수한 보안을 제공합니다.
독립적 환경을 가지되, 호스트 자원을 공유하므로 반 가상화 방식이라고 볼 수 있습니다.
컨테이너는 다음의 상태(Status)를 가질 수 있습니다.
상태 | 설명 | 명령어 |
---|---|---|
created | 생성 후, 한 번도 시작되지 않은 컨테이너 | docker create |
running | 실행 중인 컨테이너 | docker start 또는docker run |
paused | 일시 정지된 컨테이너 | docker pause |
restarting | 재시작 중인 컨테이너 | docker restart 또는 docker run --restart |
exited | 완료되거나 실행되지 않는 컨테이너 | docker stop |
removing | 제거 과정에 있는 컨테이너 | docker rm |
dead | 오류로 인해 더 이상 사용 불가능한 컨테이너 |
컨테이너를 생성하고 실행하려면 다음 명령어를 터미널에 입력해야 합니다.
1# 컨테이너 생성만 하고 실행은 하지 않음 2docker container create 이미지명 3 4# 컨테이너 생성과 동시에 실행 5docker container run 이미지명 6 7# 이미 생성된 컨테이너의 실행 8docker container start 컨테이너ID
컨테이너 삭제 방법은 다음과 같습니다.
실행 중인 컨테이너를 삭제 시도할 경우 에러가 발생하며 -force, -f
옵션을 통해 삭제할 수 있습니다.
1# 종료된 컨테이너 삭제 2docker container rm 컨테이너ID 3 4# 컨테이너 강제로 삭제 5docker container rm -f 컨테이너ID
생성한 컨테이너의 리스트를 출력하기 위해서는 다음의 명령어를 입력합니다.
1# 실행 중인 컨테이너 리스트 출력 2docker ps 3docker container ls 4 5# 모든 컨테이너 리스트 출력 6docker container ls -a
특정 컨테이너의 프로세스 정보, 로그, 상세 정보 등을 Docker CLI를 통해 획득할 수 있습니다.
1# 해당 컨테이너의 실행 중인 프로세스 목록 2docker container top 컨테이너ID 3 4# 해당 컨테이너의 수집된 모든 로그 5docker container logs 컨테이너ID 6 7# 해당 컨테이너의 상세 정보 8docker container inspect 컨테이너ID
해당 명령어를 통해 컨테이너의 로그, 가상 파일 시스템의 경로, ID, 실행 중인 명령, 네트워크 정보 등 애플리케이션에 발생한 문제 추적에 유용한 정보를 얻을 수 있습니다.
Docker Container 실행 시 --interactive --tty
또는 -it
옵션을 추가하여 해당 컨테이너의 터미널에 접근할 수 있습니다.
1docker container run -it 이미지명 [실행 파일]
Docker로 ubuntu 컨테이너를 생성하고 bash
를 실행하여 리눅스 명령어를 입력할 수 있는 것을 확인할 수 있습니다.
컨테이너는 기본적으로 스크립트 실행이 종료되면 같이 종료되지만 --detach
또는 -d
명령어를 통해 백그라운드로 계속해서 동작할 수 있습니다.
이를 통해 웹 사이트와 같은 서버 애플리케이션을 실행할 수 있습니다.
컨테이너로 웹 사이트를 호스팅하기 위해서는 2가지 옵션이 필요합니다.
--detach
, -d
: 컨테이너를 백그라운드에서 실행합니다.
--publish
, -p
: 컨테이너의 Port를 호스트 컴퓨터에 공개합니다.
컨테이너는 고유한 IP 주소를 갖지만, 그 IP는 Docker에서 생성한 가상 네트워크이므로 물리적으로 존재하지 않습니다.
따라서 외부 네트워크에서 일반적으로 접근이 불가능합니다.
이때 --publish
명령어를 통해 호스트 컴퓨터의 포트와 컨테이너의 포트를 연결할 수 있습니다.
1docker container run --detach --publish 8080:80 이미지명
해당 명령어는 호스트의 8080 포트와 컨테이너의 80 포트를 연결하라는 것을 의미합니다.
Docker는 호스트 컴퓨터의 네트워크 계층에 접근할 수 있는데, 필요한 네트워크 트래픽을 가로채어 해당 컨테이너로 전달 할 수 있습니다.
그림처럼 호스트 컴퓨터에서 localhost:8080
요청 시 컨테이너의 80포트로 HTTP GET
요청을 보낼 수 있습니다.
만약 컨테이너에 Apache
와 같은 웹 서버가 있고 index.html
이 존재한다면 해당 페이지가 출력됩니다.
참고로 80 포트는 HTTP 서버 기본 포트입니다.
일반적으로 컨테이너의 포트는 숨겨져 있어 --publish
로 컨테이너의 포트를 공개해야만 해당 포트로 접근이 가능합니다.
Docker Container
에 대하여 간단히 알아보았습니다.
다음에는 Image
에 대해 알아보겠습니다.
1