이 글은 인프런의 개발자를 위한 쉬운도커(데브위키) 강의를 수강하고 개인적으로 정리하는 글임을 알립니다.
도커 이미지
이미지는 애플리케이션을 실행하기 위한 모든 파일, 라이브러리, 설정을 미리 포함한 패키지라고 생각하면 된다. 이미지는 변하지 않는 읽기 전용 파일 시스템으로 구성되며, 이를 기반으로 컨테이너를 생성하고 실행한다.
- 도커의 이미지는 애플리케이션과 그 실행에 필요한 모든 요소를 포함한 애플리케이션 실행 패키지이다.
- 이미지는 읽기 전용으로 유지되며, 컨테이너를 생성할 때 이 이미지를 기반으로 애플리케이션을 실행한다.
- 여러 계층으로 구성되어 있어 효율적으로 관리할 수 있으며, 이미지를 공유하고 재사용할 수 있다.
애플리케이션 패키지
- 이미지에는 특정 애플리케이션을 실행하기 위해 필요한 모든 것이 들어 있다. 예를 들어, 애플리케이션 코드, 라이브러리, 환경 설정 파일, OS 파일 등이 포함된다.
- 예시: 이미지에는 파이썬 애플리케이션을 실행하기 위해 파이썬 해석기와 해당 애플리케이션 코드가 포함될 수 있다.
읽기 전용
- 도커 이미지는 읽기 전용(Read-Only)이다. 이미지를 기반으로 컨테이너가 생성되면, 컨테이너는 해당 이미지를 복사하여 실행하지만, 이미 자체는 변경되지 않는다.
계층 구조
- 도커 이미지는 여러 계층(layer)으로 구성되어 있으며, 각 계층은 이전 계층 위에 덧붙여진다. 이 덕분에 이미지에서 수정이 필요한 경우 전체를 새로 만드는 것이 아니라 일부 계층만 변경하여 효율적으로 이미지를 관리할 수 있다.
- 예시: 우분투 기반 이미지 위에 Nginx 웹 서버를 추가하면, 우분투는 이미 있는 계층으로 남아있고, Nginx는 그 위에 새로운 계층으로 추가된다.
컨테이너 생성의 기반
- 이미지를 사용하면 컨테이너를 쉽게 생성할 수 있다. 이미지를 기반으로 컨테이너를 생성할 때, 컨테이너는 해당 이미지의 사본을 가지고 실행되며, 그 안에서 애플리케이션이 동작한다.
- 예시: docker run 명령어로 특정 이미지를 사용하여 컨테이너를 실행할 수 있다. 실행된 컨테이너는 이미지의 내용을 그대로 따라가며 동작한다.
공유와 재사용
- 이미지는 누구나 만들 수 있고, 도커 허브(Docker Hub)와 같은 중앙 저장소에 올려서 다른 사람과 공유할 수 있다. 이미지를 공유하면 모든 사람이 동일한 환경에서 애플리케이션을 실행할 수 있다.
- 예시: 도커 허브에서 ‘nginx’ 이미지를 내려받아 웹 서버를 실행할 수 있다.
이미지 메타데이터
도커 이미지의 메타데이터는 이미지에 대한 정보를 포함하는 데이터로, 이미지의 구성 요소, 생성 방법, 버전 정보 등을 포함한다. 이 메타데이터는 도커가 이미지와 컨테이너를 효율적으로 관리하고 추적할 수 있도록 도와준다.
Env (Environment Variables, 환경 변수)
Env 필드는 컨테이너 내에서 사용할 환경 변수를 설정하는 데 사용된다. 환경 변수는 애플리케이션이 실행되는 동안 필요한 설정값을 외부에서 유연하게 전달할 수 있도록 도와준다.
- 사용 목적: 환경 변수를 사용하여 애플리케이션의 설정을 코드 변경 없이 변경할 수 있다. 예를 들어, 데이터베이스 URL, API 키, 포트 번호 등의 값을 환경 변수로 설정하여 컨테이너 실행 시 해당 값을 사용할 수 있다.
- 설정 방법: Dockerfile에서 ENV 명령어를 사용해 환경 변수를 설정할 수 있다.
# Dockerfile에 환경 변수 설정
ENV APP_ENV=production
ENV DATABASE_URL=mysql://localhost:3306/mydb
위의 예시에서는 APP_ENV와 DATABASE_URL이라는 환경 변수가 설정되며, 해당 값들은 컨테이너가 실행되는 동안 참조될 수 있다.
또한 도커 명령어로 컨테이너를 실행할 때 -e 플래그를 사용하여 환경 변수를 지정할 수도 있다.
docker run -e APP_ENV=production myimage
Cmd (Command, 기본 실행 명령어)
Cmd 필드는 컨테이너가 시작될 때 기본적으로 실행할 명령어를 정의한다. Cmd는 주로 실행할 애플리케이션이나 스크립트를 지정하는데 사용된다.
- 사용 목적: 도커 이미지는 여러 명령을 실행할 수 있지만, Cmd를 통해 컨테이너가 시작될 때 기본으로 실행해야 할 명령어를 지정한다. 예를 들어, 웹 서버 컨테이너라면 Cmd 필드에 Nginx나 Apache와 같은 서버 실행 명령어를 넣을 수 있다.
- 설정 방법: Dockerfile에서 CMD 명령어로 설정할 수 있다.
# Dockerfile에서 기본 실행 명령어 설정
CMD ["nginx", "-g", "daemon off;"]
위의 예시에서는 Nginx 웹 서버를 데몬 모드로 실행하지 않고, 포그라운드에서 실행하는 명령어가 설정되어 있다. 컨테이너가 시작되면 Nginx가 기본적으로 실행된다.
Cmd와 Entrypoint의 차이
Cmd는 컨테이너가 시작될 때 기본으로 실행될 명령어를 지정하지만, 도커 명령어로 다른 명령어를 실행하면 Cmd는 무시된다.
Entrypoint는 Cmd보다 더 강력한 역할을 하며, Entrypoint에 의해 설정된 명령은 덮어쓸 수 없다. 대신 Cmd는 Entrypoint 명령의 인자로 사용될 수 있다.
요약
-Env 필드는 컨테이너 실행 시 환경 변수를 설정하여 애플리케이션이 유연하게 환경에 따라 동작할 수 있게 한다.
-Cmd 필드는 컨테이너가 시작될 때 기본으로 실행할 명령을 지정하며, 특정 명령어가 따로 지정되지 않으면 Cmd에 정의된 명령이 실행된다.
컨테이너
컨테이너는 애플리케이션을 실행하기 위한 가벼운 독립적인 환경이다. 컨테이너는 애플리케이션과 그 애플리케이션이 제대로 실행되기 위한 모든 요소(라이브러리, 설정 파일 등)를 함께 묶어서 제공한다. 쉽게 말해, 컨테이너는 애플리케이션과 실행 환경을 함께 담은 상자라고 생각할 수 있다.
- 컨테이너는 애플리케이션과 그 실행 환경을 묶어서 제공하는 작은 독립된 공간이다.
- 다른 애플리케이션과 격리된 상태에서 실행되며, 어디서나 동일한 환경을 제공한다.
- 가상 머신보다 가볍고 빠르게 실행되며, 리소스 사용 효율이 높다.
애플리케이션을 위한 작은 독립 공간
- 컨테이너는 애플리케이션이 실행되는 별도의 공간을 제공한다. 이 공간은 다른 애플리케이션과 격리되어 있어, 각각의 애플리케이션이 서로에게 영향을 주지 않고 독립적으로 실행될 수 있다.
- 예를 들어, A라는 애플리케이션이 필요한 환경과 B라는 애플리케이션이 필요한 환경이 달라도, 각각의 컨테이너에서 서로 독립적으로 실행되기 때문에 문제없이 동작한다.
모든 것을 포함하는 패키지
- 컨테이너는 해당 애플리케이션이 동작하는 데 필요한 모든 파일(라이브러리, 의존성, 설정 파일 등)을 하나로 묶어서 제공한다. 이를 통해, 어느 환경에서든 동일하게 동작할 수 있다.
- 예를 들어, 개발자가 로컬 컴퓨터에서 만든 애플리케이션을 컨테이너로 패키징한 후 서버에 옮겨도, 컨테이너는 동일한 환경을 유지하므로 그대로 실행할 수 있다.
가벼운 가상화 기술
- 컨테이너는 기존의 가상 머신보다 훨씬 가벼운 가상화 기술이다. 가상 머신처럼 전체 운영체제를 설치하지 않고, 호스트 운영체제의 커널을 공유하면서도 각 컨테이너는 격리된 공간에서 실행된다. 덕분에 더 적은 리소스로 더 많은 애플리케이션을 실행할 수 있다.
어디서나 동일한 환경 제공
- 컨테이너는 한 번 패키징되면 어디서든 실행할 수 있다. 로컬 컴퓨터, 클라우드 서버, 테스트 환경 등 어떤 환경에서도 동일한 컨테이너를 실행할 수 있어 배포와 관리가 매우 편리하다.
- 예를 들어, 로컬에서 개발한 애플리케이션을 컨테이너로 묶어서 서버에 배포하면, 로컬에서 실행한 것과 같은 환경에서 애플리케이션이 실행된다.
빠른 시작과 종료
- 컨테이너는 매우 빠르게 시작하고 종료할 수 있다. 가상 머신처럼 운영체제를 부팅하는 시간이 필요하지 않기 때문에, 애플리케이션 실행 속도가 빠르다. 이는 빠른 배포와 롤백에 큰 장점을 제공한다.
컨테이너 라이프 사이클
- 생성(Created): 컨테이너가 생성되었으나 실행되지 않은 상태.
- 시작(start): 생성된(Created) 컨테이너를 실행(Running) 상태로 전환하는 명령.
- 실행 중(Running): 컨테이너가 실행 중인 상태.
- 일시 정지(Paused): 컨테이너가 일시적으로 중단된 상태.
- 종료(Stopped): 컨테이너가 종료된 상태.
- 삭제(Deleted): 컨테이너가 완전히 삭제된 상태.
- docker run 명령어는 create 와 start 명령어가 합쳐진 것이다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] SpringBoot + MySQL 컨테이너화 (1) | 2024.09.08 |
---|---|
[Docker] 이미지 레지스트리 (3) | 2024.09.07 |
[Docker] 하이퍼바이저 및 컨테이너 가상화와 도커 아키텍쳐 (0) | 2024.09.05 |
[Docker] Docker를 이용한 AWS EC2에 배포 (0) | 2024.08.27 |
[Docker] Docker Compose를 이용한 SpringBoot + MySQL + Redis 컨테이너 동시에 띄우기 (0) | 2024.08.26 |