티스토리 뷰
Docker Image란?
An image is a read-only template with instructions for creating a Docker container. Often, an image is based on another image, with some additional customization. For example, you may build an image which is based on the ubuntu image, but installs the Apache web server and your application, as well as the configuration details needed to make your application run
- Docker Container를 만들기 위한 명령이 있는 읽기 전용 템플릿.
- 어떤 이미지의 경우 다른 이미지 기반 + 추가적인 사용자의 정의 으로 되어있다.
- 공개 Docker image는 Docker Hub에 있어서 여기서 관련 공개 이미지를 찾는다.
ex.ubuntu image+aphache webserver + application + application을 실행하는데 필요한 세부정보
Docker Container
Docker Image를 통해 application을 실행하기 위해 모든것(코드,런타임,시스템 도구,시스템 라이브러리 설정등)을 포함하고 있는 기술인데, 이 기술을 통해 어느 환경에서나 일관된 방식으로 실행할수 있다.
Docker Container VS Docker Image
Docker Container | Docker Image |
Docker Image를 기반으로 실행되는 각각 컨테이너가 그 이미지의 “실행버전” (인스턴스화) (이미지의 상태를 복제하여 실행함) |
Docker Image는 Docker Container의 소스 코드 |
Docker Image는 Docker Container의 전제조건 (Dockerfile로부터 이미지를 빌드한 이미지를 기반으로 컨테이너를 실행) |
Dockerfile은 Docker Image의 필수 구성요소 (Dockerfile로부터 이미지를 빌드) |
Docker Container는 유저들끼리 공유할수 없다. (컨테이너는 실행 중인 이미지 인스턴스여서 동적이고 일시적이라 공유X) |
Docker Image는 Docker Hub를 통해 사용자간에 공유 가능 |
Docker Container는 컨테이너가 실행중일때 사용자가 컨테이너 내부에 들어가 바로 수정 가능하다. (docker exec 명령어 사용) |
Docker Image를 수정하기 위해서는 Dockerfile를 수정해야한다. |
Docker Image 특징
- 이미지는 상태값을 가지지 않고 변하지 않는다.
- 하나의 이미지는 여러 컨테이너를 생성할 수 있고, 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.
- 도커 이미지들은 Docker Hub를 통해 버전 관리 및 배포(push & pull)가 가능하다
- 다양한 API가 제공되어 원하는 만큼 자동화가 가능하다
- 도커는 Dockerfile이란 파일로 이미지를 만든다. 이 파일엔 소스와 함께 의존성 패키지등 사용했던 설정 파일을 버전 관리하기 쉽게 명시되어 누구나 이미지 생성과정을 확인,수정이 가능하다.
- 도커 이미지는 플랫폼에 독립적이다
Docker Image 구성
ex.ubuntu image+aphache webserver + application + application을 실행하는데 필요한 세부정보
Base Image | Dockerfile을 작성시 시작점이 되는 이미지(최소한의 운영체제,필수 구성 요소 포함) ex. base image: ubuntu |
Parent Image | base image기반으로 새로운 image를 만드는데 이것을 parent Image라고 한다. 여기서 parent imagesms dockerfile에서 “FROM” 명령어를 사용해서 지정된다 FROM python:3.8 → Python 3.8이 설치된 이미지를 부모 이미지로 사용하겠다는 것을 의미 ex. 만약 Ubuntu image + Apache webserver + Application + Application의 세부 정보를 기반으로 다른 이미지를 만들 경우 Ubuntu image + Apache webserver + Application + Application가 parent Image 만약 다른 이미지를 만드는 기반으로 사용된다면, 그때 그 이미지는 "parent image" |
Layers | 레이어란 기존 이미지에 추가적은 파일이 필요할때 해당 파일을 추가하는 개념이다. (다시 다운로드 x)
ex.
|
Docker Registry | Docker image를 저장/배포함(ex.Docker Hub) layer 저장 : Docker image를 Docker registry에 push하면 각 layer는 개별적으로 업로드,저장됨 → 필요한 layer만 다운로드해서 이미지를 재구성 가능하게 한다. layer 공유 : 재사용성을 높이기 위해 같은 베이스 이미지 사용시 서로 다른 이미지들을 해당 베이스 레이어를 공유 → 중복 다운로드 방지,저장 공간 절약 |
의 경우
Base Image
웹 서버용 Dockerfile : FROM nginx:latest : 여기서 "nginx:latest"
데이터베이스 서버용 Dockerfile : FROM mysql:5.7 : 여기서 "mysql:5.7"
백그라운드 작업용 Dockerfile : FROM alpine:latest : 여기서 "alpine:latest
Parent Image
각 Dockerfile에서 지정된 FROM 명령어의 이미지("nginx:latest", "mysql:5.7", "alpine:latest")는 각각의 Dockerfile로 만들어지는 이미지의 "부모 이미지"
여기서 "부모 이미지"는 기본적으로 "베이스 이미지"와 같은 의미로 사용되고 있다.
Layers
웹 서버용 Dockerfile → COPY ./default.conf /etc/nginx/conf.d/default.conf
: 설정 파일을 nginx 설정 디렉토리로 복사하는 레이어
데이터베이스 서버용 Dockerfile → ENV MYSQL_ROOT_PASSWORD=my-secret-pw ,ENV MYSQL_DATABASE=mydatabase
: 환경 변수를 설정하는 레이어
백그라운드 작업용 Dockerfile →
RUN apk add --no-cache dcron : Alpine Linux에 cron 작업 관리자를 설치하는 레이어
COPY crontab.txt /etc/crontabs/root : 크론 작업을 위한 스케줄 파일을 컨테이너에 복사하는 레이어
Docker Image -> Container 순서
1. Dokcerfile 작성
2. Docker build (이미지 생성)
% docker build -t dockertest:latest .
[+] Building 0.0s (5/5) FINISHED docker:desktop-linux
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from dockerfile 0.0s
=> => transferring dockerfile: 283B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 0.0s
=> CACHED [1/1] FROM docker.io/library/alpine 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:0f2a33b340f39b5580c51c388037157d5596c555aade4f9eb6c9c99e3cb47eac 0.0s
=> => naming to docker.io/library/dockertest:latest 0.0s
What's Next?
View a summary of image vulnerabilities and recommendations → docker scout quickview
- "docker build -t dockertest:latest ." -t는 태그로 dockertest 라는 이름으로 tag하겠다는 뜻이다. 맨마지막에 . 을 찍는걸 실수하지 말자 -> 나중에 해당 이미지를 run돌릴때 tag로 호출하면 편하기 때문
- 만약 아래와 같이 출력하게 하고싶다면 DOCKER_BUILDKIT=0 로 비활성화를 한다.
- BuildKit : Docker 18.09버전부터 새로운 이미지 빌드 시스템 도입
% DOCKER_BUILDKIT=0 docker build .
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
BuildKit is currently disabled; enable it by removing the DOCKER_BUILDKIT=0
environment-variable.
Sending build context to Docker daemon 6.144kB
Step 1/2 : FROM alpine
---> 1dc785547989
Step 2/2 : CMD ["echo","hello"]
---> Running in cb16c68a65a8
Removing intermediate container cb16c68a65a8
---> ce94e625b2bf
Successfully built ce94e625b2bf
What's Next?
View a summary of image vulnerabilities and recommendations → docker scout quickview
3. Docker run (이미지로 부터 컨테이너 생성 및 실행) : 이때 컨테이너는 이미지의 상태를 실시간으로 반영
% docker run dockertest:latest
hello
- 만약 백그라운드로 실행하고 싶다면 -d
질문1. 왜 백그라운드로 컨테이너를 실행하려는 걸까?
- 멀티테스킹 : 터미널,콘솔이 해당 컨테이너에 계속 연결되어 있지 않아도 된다 -> 사용자가 다른 작업 계속 할 수 있다.
- 서비스 유지 : 웹서버,DB와 같이 중단없이 백그라운드에서 계속 실행이 필요한 서비스,application의 경우 지속적으로 서비스 제공 가능
- 환경 분리 : 사용자의 현재 터미널,콘솔세션이 독립적으로 실행되어 다중 작업 수행이 가능하다.(동일한 터미널이나 다른 터미널에서 다른 작업 가능)
- 로그관리 : 백그라운드 모드의 경우 Docker의 로깅시스템으로 직접 관리됨 (docker logs)
% docker run -d dockertest:latest
5182fd2a20064c2319e222657e648e1a5f616818cbcf164498a3b3baf2ec8b0d
4. Container 확인
% docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5182fd2a2006 dockertest:latest "echo hello" About a minute ago Exited (0) About a minute ago competent_davinci
도커 이미지 명령어
images list 확인
$ docker ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0d9c6c5575f5 4 days ago 126MB
ubuntu 18.04 47b199b0cb85 2 weeks ago 64.2MB
registry에서 image pull하기
$ docker pull alpine:3.11
3.11: Pulling from library/alpine
Digest: sha256:9f11a34ef1c67e073069f13b09fb76dc8f1a16f7067eebafc68a5049bb0a072f
Status: Downloaded newer image for alpine:3.11
Docker에서 image 삭제하기
$ docker rmi <image_id>
Untagged: <image_id>
Deleted: sha256:<image_id>
Docker Host의 image VS Registry의 image
- Docker Host image
로컬에 저장되며, 해당 시스템에서 직접 사용가능
- Registry image
원격 이미지 저장소(Docker Hub)에 저장되며, 공유와 재사용
참고자료
https://docs.docker.com/get-started/overview/
https://www.geeksforgeeks.org/what-is-docker-images/
따라하며 배우는 도커와 CI환경 강의
'DOCKER' 카테고리의 다른 글
[DOCKER] Docker Compose (0) | 2024.01.08 |
---|---|
[Docker] Docker Volume (2) | 2024.01.02 |
[Docker] Docker 최적화 (0) | 2023.12.28 |
[Docker] Docker Container2 - 코드로 보는 개념 (0) | 2023.12.26 |
[Docker] Docker Container1 - 기본 개념 (0) | 2023.12.21 |