도커 이미지 (Docker Image)
Docker image는 파일로 어플리케이션 실행에 필요한 독립적인 환경을 포함하며, 런타임 환경을 위한 일종의 템플릿이다.
또한, 소스 코드, 라이브러리, 종속성, 도구 및 응용 프로그램을 실행하는데 필요한 기타 파일을 포함하는 불변(변경 불가) 파일이다.
도커 레지스트리, 레포지토리, 태그 (Docker Registry, Repository, Tag)
레지스트리(Registry)
- 도커 이미지를 관리하는 공간
- 도커 허브를 기본 레지스트리로 설정하고 있다.
- 레지스트리는 Docker hub, Private Dokcer Hub, 회사 내부용 등으로 나뉜다.
레포지토리(Repository)
- 레지스트리 내에 도커 이미지가 저장되는 공간
- 이미지 이름이 사용되기도 한다.
- Github의 레포지토리와 비슷한 역할
태그(Tag)
- 같은 이미지지만 버전 별로 내용이 다름
- 해당 이미지를 설명하는 버전 정보를 주로 입력
- 되도록 latest 태그가 붙은 최신 버전을 사용
도커 이미지 관리
도커 이미지 다운로드 - docker pull
도커 이미지는 내가 만들지 않는 이상 공식적인 Docker Hub등 Docker Registry로 부터 Docker 이미지를 다운로드한다.
이전에 받은 받은 적이 있다면 해당 이미지를 사용하고, 없으면 Docker Hub에서 다운로드 한다.
// 최신 ubuntu 이미지 다운로드
docker pull ubuntu:latest
이전에 다운 받은 이미지는 docker image ls / docker images 로 확인할 수 있다.
docker image ls
docker images
--no-trunc : 결과 필드 정보를 자르지 않고 모두 출력
[root@psc ~]# docker images --no-trunc
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest sha256:0e901e68141fd02f237cf63eb842529f8a9500636a9419e3cf4fb986b8fe3d5d 3 weeks ago 142MB
--quiet / -q : Docker image ID만 출력
[root@psc ~]# docker images -q
0e901e68141f
다운로드 한 이미지는 docker run 명령어로 실행시킬 수 있다.
docker run ubuntu:latest
도커 이미지를 태그로 관리 - docker image tag
이미지를 관리하기 위해 태그를 사용한다.
docker image tag nignx psc/web-server:1.0
docker image tag 이미지 레포지토리:테그
[root@psc ~]# docker image tag nginx psc/web-sever:1.0
[root@psc ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hwi/web-sever 1.0 0e901e68141f 3 weeks ago 142MB
nginx latest 0e901e68141f 3 weeks ago 142MB
원래 이미지의 IMAGE ID( 0e901e68141f) 새로운 이미지의 IMAGE ID가 동일한 것을 볼 수 있다. 다른 이미지가 아니라 동일한 이미지로 이미지에 별명만 새롭게 붙인 것이다. 그렇기 때문에 이미지 자체가 변경 된 것은 아니다.
컨테이너로부터 이미지 생성 - docker container commit, export/import, save/load
이미 생성된 컨테이너로부터 이미지를 만든다.
--author, -a : 작성자 설정 / --message, -m : 메시지를 지정
docker container commit -m "Message" [containerFrom] [REPO/IMG:TAG]
#### 사전 작업
docker run -it --name myweb01 ubuntu
> apt-get update
> apt-get -y install nginx
> useradd webuser
> cat /usr/share/nginx/html/index.html
# 기존 내용 변경
> echo 'my test web' > /usr/share/nginx/html/index.html
> Ctrl+PQ # 종료하지 말고 빠져나오기
#### 커밋으로 이미지 생성
docker commit -a "psc" -m "modify: index.html" myweb01 psc/myweb:1.0
> sha256:2fd80466d9e4dfc576a2478bfc17af4fed41461c1353da1921c109abaf27dc95
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
psc/myweb 1.0 2fd80466d9e4 19 seconds ago 168MB
ubuntu latest 27941809078c 2 weeks ago 77.8MB
psc/web-sever 1.0 0e901e68141f 3 weeks ago 142MB
만약 인터넷이 되지 않는다면 압축 파일로 전달해야한다.
이럴 때는 export / import 명령어를 사용하여 컨테이너를 압축한 파일을 다룬다.
(save / load는 이미지를 압축파일로 저장/로드 한다.)
### 인터넷이 되지 않는 폐쇄망에서 이미지를 전달하기 위해서는, USB로 압축 파일로 전달.
# 파일 시스템 형태로 아카이브
docker container export [containerName] > [tarName.tar] # container -> tar
cat [tarName.tar] | docker image import - [REPO/IMG:TAG] # tar -> image
# 이미지 레이어 형태로 아카이브
docker image save -o [tarName.tar] # image -> tar
docker image load -i save.tar # tar -> image
먼저 기존에 돌아가고 있는 컨테이너를 tar로 압축한다. (Container > tar)
[root@psc ~]# docker container export 1c82bc3e55c6 > myweb02.tar
[root@psc ~]# ls
myweb02.tar
해당 tar 파일을 가지고 다른 서버에서 이미지를 만든 후, 그 이미지를 가동시킬 수 있다. (tar > image)
[root@psc ~]# cat myweb02.tar | docker image import - psc/myweb:1.1
sha256:2bf33dae93725a82e3c88b0fe3cff013b43168001feba7e634203eb3371f9016
[root@hwi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
**psc/myweb 1.1 2bf33dae9372 6 seconds ago 168MB**
psc/myweb 1.0 2fd80466d9e4 2 hours ago 168MB
ubuntu latest 27941809078c 2 weeks ago 77.8MB
psc/web-sever 1.0 0e901e68141f 3 weeks ago 142MB
nginx latest 0e901e68141f 3 weeks ago 142MB
save / load로도 이미지를 옮길 수 있다.
Docker 이미지를 tar 파일로 저장하고 tar 이미지로부터 이미지를 다시 생성하는 과정이다.
[root@hwi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 27941809078c 2 weeks ago 77.8MB
nginx latest 0e901e68141f 3 weeks ago 142MB
[root@psc ~]# docker image save -o nginx2.tar nginx
[root@psc ~]# tar -tvf nginx2.tar | grep layer
-rw-r--r-- 0/0 3072 2022-05-28 05:41 3b5d311d2f840e0a6143c2d84801fd2377fd86a98257b76c040691bf5d83bed2/layer.tar
-rw-r--r-- 0/0 4096 2022-05-28 05:41 402f9faefe30663d398f6a1758ae88632e1a67221d8f33034df0ba07ec72bef2/layer.tar
-rw-r--r-- 0/0 3584 2022-05-28 05:41 74d7f8c7f19ae04fff1755131e41968c46d80b9741001771b23b17116162cf3c/layer.tar
-rw-r--r-- 0/0 62004736 2022-05-28 05:41 b1509af541dd9f3ea40425ba5ab3073acef7db7e7aa7ca01f98f7414f8e5e1e7/layer.tar
-rw-r--r-- 0/0 83896832 2022-05-28 05:41 b8c3926d6865a53a5b55a36e83878172f0af98ba1e9970fc32e399d57cebf890/layer.tar
-rw-r--r-- 0/0 7168 2022-05-28 05:41 da17b82cfa7b52346a642ba3488e16f7324a151dcacaab6f3c60111b13a33300/layer.tar
[root@psc ~]# docker image load -i nginx2.tar
Loaded image: nginx:latest
[root@psc ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 27941809078c 2 weeks ago 77.8MB
**nginx latest 0e901e68141f 3 weeks ago 142MB**
도커 이미지 삭제 - docker image rm
docker image rm [image]
—force, -f #이미지 강제 삭제
[root@psc ~]# docker image rm -f nginx
Untagged: nginx:latest
Untagged: nginx@sha256:2bcabc23b45489fb0885d69a06ba1d648aeda973fae7bb981bafbb884165e514
도커파일 (Dockerfile)
Dockerfile은 Docker에서 인프라 구성을 기술한 파일이다.
아래 명령어들은 필수로 들어가야한다.
FROM #운영체제 이미지
RUN #실행할 명령어
CMD #컨테이너 명령 실행
운영체제 이미지가 베이스로 여러가지 라이브러리를 가져다가 동작시키기 때문에 메모리 등도 고려하면서 작성해야할 필요가 있다. 그렇기에 실행할 명령어와 컨테이너 자체의 명령어가 필요하다.
Dockerfile 문법
명령 | 설명 | 명령 | 설명 |
FROM | 베이스 이미지 지정 | VOLUME | 볼륨 마운트 |
RUN | 명령 실행 | USER | 사용자 지정 |
CMD | 컨테이너 실행 명령 (여러 줄, 마지막 줄만 유효) |
WORKDIR | 작업 디렉토리 |
LABEL | 라벨 설정 | ARG | Dockerfile 안의 변수 (빌드 과정에서만 사용) |
EXPOSE | 포트 노출 | ONBUILD | 빌드 완료 후 실행되는 명령 |
ENV | 환경 변수 (컨테이너 내부에서 사용) |
STOPSIGNAL | 종료 시그널 설정 |
ADD | 파일/디렉토리 추가 | HEALTHCHECK | 컨테이너의 상태 체크 |
COPY | 파일 복사 | SHELL | 기본 쉘 설정 |
ENTRYPOINT | 컨테이너 실행 명령 |
Dockerfile 이미지 Build
Dockerfile을 기반으로 이미지를 생성하는 작업이다.
docker build -t <생성할 이미지명>:<태그명> <Dockerfile위치>
이렇게 생성한 이미지는 아래 docker run 명령어를 사용하여 컨테이로 띄울 수 있다.
$ docker run --name dockerC -d -p 8080:8080 -v /root/centos/data:/data dockerfile:0.1
25b6ab0e1a8f6c41fc3b09521d50ff02cea95df55a56eb1be9464f395c58a173
- --name dockerC : 컨테이너명
- -d : 백그라운드 실행
- -p 8080:8080 : 포트포워딩 (로컬포트(8080):컨테이너포트(8080))
- -v /root/centos/data:/data : 볼륨 설정 (로컬 /root/centos/data와 컨테이너 /data를 연결)
Dockerfile 이미지의 레이어 구조
docker build 시, Dockerfile 명령어 한 줄마다 이미지(Layer)가 작성된다. (그래서 한 줄에 명령어를 작성하면 이미지 크기를 줄일 수 있다.)
또한 중간에 컨테이너가 생성되었다가 삭제되는 데, 이는 Docker에서 이미지 레이어를 생성할 때 컨테이너를 임시로 생성하고, 명령어를 실행한 뒤 해당 컨테이너를 통하여 이미지를 작성 후 컨테이너를 삭제하는 것을 알 수 있다.
또한, 작성한 이미지는 다른 이미지와도 공유된다. 예를 들어 공통의 베이스 이미지를 바탕으로 여러 개의 이미지를 작성한 경우, 베이스 이미지의 레이어가 공유된다. 이와 같이 이미지를 겹침으로써 Docker에서는 디스크의 용량을 효율적으로 이용한다.
도커 컴포즈 (Docker compose)
Docker Compose는 여러 개의 컨테이너(container)로 구성된 애플리케이션을 관리하기 위한 간단한 오케스트레이션(Orchestration) 도구이다. 또한 여러 개의 컨테이너를 코드 (YAML 파일)를 통해서 통합 관리하기 위한 툴이기도 하다.
YAML 파일에 대한 참조는 아래 포스팅에서 가능하다.
[YAML] YAML 작성법 및 문법 정리
기본 문법 들여쓰기 (indent) YAML은 기본적으로 2칸 또는 4칸을 지원한다. 필자는 2칸 들여쓰기를 한다. 2칸 들여쓰기(추천) person: name: PSC job: Developer skills: - docker - spring 4칸 들여쓰기 person: name: PSC jo
sangcheon02.tistory.com
docker-compose 파일 구조
docker-compose 파일은 크게 아래 4가지의 주항목을 가지고 만들어 나간다.
- version : 지원 버전을 확인
- services : 컨테이너의 설정을 확인
- volumes : 도커 볼륨 (docker volume create)에 대한 설명
- networks : 도커 네트워크 (docker network create)에 대한 설명
docker-compose file 형식
compose 파일은 버전관리를 해서 사용할 수 있다.
Version1 (미사용)
- services에 관한 부분만 정의 ( volumes, network, build arguments 정의 불가 )합니다.
- 모든 컨테이너가 default bridge 에만 연결이 가능합니다.
- 컨테이너 사이의 통신을 위해서는 link 기능을 사용 합니다.
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
links:
- redis
redis:
image: redis
Version2
- services 아래 서비스 부분을 정의한다.
- volumes, network등의 키가 생기면서 named volume 과 같은 디테일한 설정이 가능하다.
version: "2.4"
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
redis:
image: redis
Version3
- docker compose 와 Docker Engine의 swam mode를 호환할 수 있도록 구성되어 있다.
- 버전 별로 지원하는 기능 차이가 있기 때문에 공식링크의 메뉴얼을 꼭 확인해야 한다.
docker-compose file 구조
build : build context(Dockerfile)이 위치하는 디렉토리 경로이다.
version: "3.7"
services:
webapp:
build: ./dir // dir 디렉토리에 Dockerfile 위치
or
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile:
args:
buildno: 1
image : 서비스 컨테이너를 실행 시키기 위한 이미지이다. dockerfile은 Dockerfile-alternate Dockerfile의 이름을 명시적으로 정의해야 하는 경우 사용한다.
만약 실제 build 되는 동안에 환경 변수로 사용할 값이 있다면 buildno로 기록한다.
services:
db:
image: postgres
restart: always
environm ent:
- POSTGRES_DB=testdb
- POSTGRES_USER=testuser
- POSTGRES_PASSWORD=testecret
- POSTGRES_INITDB_ARGS=-encoding=UTF-8
env_file: envfile
environment : 컨테이너 내부에서 사용할 환경 변수 , 환경변수가 많은 경우 env_file을 사용한다.
restart : 컨테이너 종료 시 재시작 횟수를 정의한다. 3가지의 옵션이 있다.
- no : 수동으로재시작
- always : 컨테이너를 수동으로 끄기 전까지 항상 재시작
- on-failure : 비정상 코드로 종료한 경우 재시작
depends_on : 컨테이너 간의 시작과 종료를 위한 의존성 정보를 적는다.
wordpress:
depends_on:
- db #db와의 의존성
image: wordpress:latest
ports:
- "8000:80"
restart : always
port : 컨테이너가 노출할 컨테이너의 포트이다. 작성은 (호스트_포트:컨테이너_포트) 식으로 작성한다. 호스트 포트를 정의하지 않으면 임의로 정의합니다. 그리고 yaml 파일은 00:00은 시간 양식으로 인식하기 때문에 “8000:80"으로 기록된다.
도커 컴포즈 명령어
반드시 docker-compose.yaml 파일이 위치한 디렉토리에서 실행해야한다.
애플리케이션 컨테이너 생성 후 시작 - docker-compose up
docker-compose up #서비스와 관련된 컨테이너 생성 그리고 시작
애플리케이션 컨테이너 종료 후 삭제 - docker-compose down
docker-compose down # 서비스와 관련된 컨테이너 종료 후 제거
애플리케이션 컨테이너 시작/종료/재시작 - docker-compose start/stop/restart
docker-compose start/stop/restart #서비스 관련 컨테이너 시작 / 종료 / 재시작
애플리케이션 컨테이너 강제 종료 - docker-compose kill
docker-compose kill #실행 중인 컨테이너에 SIGKH 시그널을 통해서 강제 종료
애플리케이션 컨테이너 정지/재가동 - docker-compose pause/unpause
docker-compose pause/ unpause #컨테이너 정지 /재가동