Docker의 명령어들을 실제로 사용해보며 docker의 작동 메커니즘, 특징 등을 자세히 살펴보는 포스팅을 해보려고 한다.
최대한 비슷한 카테고리로 개념을 분류하여 포스팅하겠지만
내용에 따라 이해에 필요한 부가적인 설명은 구분 없이 정리하여 내용이 복잡해질 것 같다 ㅎㅎ...
1. 가상 환경에 docker 설치하기
* 사전 준비
-linux(red_hat)(운영체제) / VirtualBox(가상 환경 지원) / putty or xshell (가상 환경 접근방법)
*docker에 대한 사전 지식 (이전 포스팅 참고)
1)도커 설치하기 (root계정으로 실행)
-yum 패키지 업데이트 및 업그레이드
yum -y update
yum -y upgrade
* yum(Yellodog Update Modified)란?
yum이란 레드햇 계열의 리눅스 배포판에서 사용하는 프로그램(패키지) 설치 관리 도구입니다. yum은 패키지 의존성 문제를 해결한 관리 툴로 yum 명령어를 이용하면 기존 패키지 의존성 (c패키지 설치를 위해 a, b패키지를 먼저 설치해야 하는 문제를 자동으로 처리하면서 설치, 업데이트, 삭제를 진행할 수 있습니다.
2) Docker 설치 및 삭제 / 원하는 version 설치
yum - y install docker
2-1) 기존 버전 삭제
yum remove -y docker-common
2-2) 업그레이드에 필요한 툴 설치
yum install -y yum-utils device-mapper-persistent-data lvm2
2-3) Docker 공식 Repository 추가 (그대로 복붙 해서 사용하세요.)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2-4) 레포지토리에서 설치 가능한 버전 리스트 확인
yum list docker-ce --showduplicates | sort -r
2-5) 최신 버전으로 설치
yum install -y docker-ce
2-6) 기존 도커 버전을 삭제 (특정 버전으로 다시 재설치하기 위해서)
yum install -y docker-ce
2-7) 원하는 버전 선택 (docker-ce-버전 검색)
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-18.09.9
2-8) 만약 잘못 설치된 docker를 완전히 삭제하고 다시 새로운 docker를 설치하고 싶다면?
*순서
1. docker container를 모두 중지하고 삭제한다.
2. local local에 저장된image를 모두 삭제한다.
3. docker service, containerd service를 중지한다.
4. docker package(여기에서는 docker-ce package)를 삭제한다.
5. /var/lib/docker 아래의 모든 파일, 디렉토리를 삭제한다.
6. /var/run 아래에서 docker.sock, docker.pid 파일과 docker 디렉토리를 삭제한다.
실행 중인 docker 중지
systemctl stop docker
실행중인 containerd 중지
systemctl stop
설치된 docker package
yum list installed | grep docker
패키지 삭제 (tap을 사용하여 자동완성을 사용하면 쉽게 삭제 가능)
yum remove -y containerd.io.x86_64
yum remove -y docker-ce.x86_64
yum remove -y docker-ce-cli.x86_64
도커 관련 파일과 디렉터리 수동 삭제
[root@cent1 ~]# cd /var/lib/docker
[root@cent1 docker]# rm -rf *
[root@cent1 docker]# cd /var/run
[root@cent1 run]# rm -f docker.sock docker.pid
[root@cent1 run]# rm -rf docker
도커 선택 버전을 재 설치하기
* docker 패키지를 삭제할 때는 위처럼 containerd, cli, docker-ce를 따로따로 삭제해줘야 했다. 하지만 설치시는 docker-ce패키지만 설치하면 모두 자동으로 설치가 된다.
yum install -y docker-ce-18.09.9
3). Docker 실행 및 자동실행 서비스 등록
systemctl enable docker (도커 서비스 자동시작 설정)
systemctl start docker (도커 서비스 시작)
4) Docker 정보 확인
docker version
5) Docker 실행 환경 확인
docker info
-----------------------------------
아래 정보 확인
-----------------------------------
1. 구성된 컨테이너 수
2. 스토리지 드라이브 종류
3. 로깅 드라이버
4. 네트워크 드라이버 종류
5. 런타임 종류
ex)
2. 도커 사용 방법
1) docker hub에서 이미지 검색하기 (docker search 명령어)
*https://registry.hub.docker.com/
docker search 이미지명
docker search ubuntu:latest
2) 이미지 받기 (docker pull)
1. docker pull <이미지 이름>:<태그>
2. 태그에 latest를 설정하면 최신 버전을 받는다. 태그를 생략하면 기본 latest를 사용한다.
3. docker.io/hewon16/image1:1처럼 태그를 지정해 줄 수도 있다.
4. 이미지 이름에서 hewon16/image1:1처럼 / 앞에 사용자명을 지정하면 Docker Hub에서 해당 사용자가 올린 이미지를 받는다. 공식 이미지는 사용자명이 붙지 않는다.
5. docker image pull 명령어 = docker pull 명령어
docker pull ubuntu
3) 이미지 목록 출력 (docker images)
1. docker images <옵션> <이미지 이름>
2. -a, --all=false: 부모 이미지까지 모두 표시
3. -f, --filter=[]: 출력 결과 필터를 설정합니다. “dangling=true”를 설정하면 이름이 없는 이미지만 출력
4. --no-trunc=false: 내용이 길어서 생략된 부분을 모두 출력
5. -q, --quiet=false: 이미지 ID만 출력
docker images : 이미지 모두 출력
docker images -q: 이미지 id만 출력
4) 컨테이너 생성과 실행 (docker run)
1. docker container run = docker run
2. docker run <옵션> <이미지 이름> <실행할 파일>
3. -i(interactive), -t(Pseudo-tty) 옵션: 명령어 라인에서 원하는 명령어들을 입력 및 출력을 할 수 있다.
4. --name 옵션으로 컨테이너의 이름을 지정, 이름을 지정하지 않으면 Docker가 자동으로 이름을 생성한다.
docker run -it --name testcon1 ubuntu /bin/bash
ubuntu 이미지를 컨테이너로 생성, 명령어 해석기인 쉘 /bin/bash를 실행한다.
이미지 이름 대신 이미지 ID 사용도 가능하다.
컨테이너 종료(stop)를 원하면 exit명령어 사용
*명령어 해석기 종류
/bin/sh : 본 쉘 (표준, 원시적) shell programming 용도로 주로 사용
/bin/bash: 본쉘 호환, 편리함, 기능이좋다.
/bin/csh : 독자적, c언어와 비슷
/bin/ksh: 콘쉘, 본쉘과 호환 , 편리함, 보안취약
컨테이너 접속한 채로 명령어 실행 (컨테이너 내 명령어 테스트)
uname -a
hostname
id
df -h
exit
*exit : 컨테이너를 stop 시킨 채 빠져나온다. 만약 컨테이너를 실행된 상태로 유지하고 터미널로 나오고 싶다면 <컨트롤+p, 컨트롤+q>를 순서대로 눌러서 빠져나온다. 빠져나온 후 docker ps -a 명령를 통해 실행 또는 중지되어 있는 컨트롤 리스트를 확인한다.
5) 컨테이너 목록 확인 (docker ps) 또는 (docker container ls)
docker ps
docker ps -a (정지된 컨테이너까지 모두 보여줌)
docker container ls
docker container ls -a
6) 컨테이너 시작 ( docker start & restart )
docker start 컨테이너명
docker restart 컨테이너명
7) 컨테이너 재 접속하기 (docker attach)
1. docker attach <컨테이너 이름> 또는 <컨테이너 ID>
2. 우리는 /bin/bash를 실행했기 때문에 명령을 자유롭게 입력할 수 있지만, DB나 서버 애플리케이션을 실행하면 입력은 할 수 없고 출력만 보인다.
3. Bash 셸에서 exit 또는 Ctrl+D를 입력하면 컨테이너가 정지된다.
4. Ctrl+P, Ctrl+Q를 차례대로 입력하여 컨테이너를 정지하지 않고, 컨테이너에서 빠져만 나온다.
docker attach testcon1
8) 실행 중인 컨테이너에 외부(터미널)로부터 명령 실행 (docker exec)
1. docker exec <컨테이너 이름> 또는 <컨테이너 ID> <명령> <매개 변수>
2. 컨테이너가 실행되고 있는 상태에서만 사용할 수 있으며 정지된 상태에서는 사용할 수 없다.
3. 이미 실행된 컨테이너에 apt-get, yum 명령으로 패키지를 설치하거나, 각종 데몬을 실행할 때 활용할 수 있다.
docker exec testcon1 hostname
docker exec testcon1 id
docker exec testcon1 date
9) 컨테이너 정지 (docker stop)
docker stop testcon1
docker ps 명령어로 확인 목록이 출력되지 않으면 stop 된 것이다.
10) 컨테이너 삭제 (docker rm)
-docker rm <컨테이너 이름> or <컨테이너 id>
- -f 옵션: 강제로 docker 컨테이너를 삭제
docker rm testcon1
docker ps -a (중지된 컨테이너까지 모두 확인 but 목록에는 아무것도 없다 삭제하였기 때문이다.)
3. Dokcerfile설명 & 이미지 만들기 (중요)
(1). Docker file이란?
- Dockerfile은 Docker 이미지 생성을 위한 구성 설정 파일이다. Dockerfile에 설정된 내용대로 이미지를 생성한다.
- Dockerfile이 구성된 작업 디렉터리에 있는 파일들을 콘텍스트(context)라고 한다.
- docker build 명령어를 사용하여 이미지를 생성할 때 컨텍스트 디렉터리 내 모든 파일과 디렉터리를 도커 데몬에 전송하기 때문에 root의 기본 디렉터리에 Dockerfile을 생성하면 시스템 처리 속도가 느려질 수 있다. 따라서 Dockerfile은 별도의 디렉터리에서 작업 하기를 권장한다.
- 콘텍스트에서 파일이나 디렉터리를 제외할 때 Dockerfile과 같은 경로에 .dockerignore 파일을 생성하여 제외하고 싶은 파일이나 디렉토리를 지정한다. 쉘 특수문자 와일드카드(*?)를 사용할 수 있다.! 는 예외로 해석한다.
- docker build -t <이미지 이름>. :현재 작업 디렉터리(콘텍스트)에서 빌드 반드시 뒤에. 를 입력하여 현재 디렉터리에 생성 해주자
- docker build -t <이미지 이름> -f <도커 파일명 지정> <작업 디렉토리명>
- -t 옵션에서 이미지 이름만 설정하면 태그는 latest로 설정된다.
- -t 옵션에서 이미지 이름을 주지 않을 경우 none으로 이름 없는 이미지 생성
- Dockerfile의 명령어들은 대소문자를 구분하지 않는다. (보통 대문자로 표현)
- #은 주석처리
- Dockerfile의 명령어들은 순차적으로 처리한다.
- 각 명령어들은 독립적이므로 뒤에 나오는 명령어에 영향을 주지 않는다. 예) RUN cd /tmp로 명령어가 실행되어도 뒤에 명령어에서는 이 디렉터리가 영향을 주지 않는다.
- 주의: 쉘 프로그램을 사용할 경우 쉘프로그램 파일에 반드시 첫 번째 라인에 쉘을 지정한다. #!/bin/bash처럼 설정한다. 만약 지정하지 않을 경우 이미지 구성은 잘 되지만 컨테이너 실행 시 오류가 발생하는 경우가 많다.
- 예) standard_init_linux.go:211: exec user process caused "exec format error"처럼
(2). 이미지 레이어란?
- 각 레이어는 이전 레이어와의 차이점 집합일 뿐이다. 파일을 추가하고 제거하면 새 레이어가 생성된다
- 레이어는 서로의 위에 쌓인다. 새 컨테이너를 만들 때 기본 레이어 위에 쓰기 가능한 새 레이어를 추가한다. "컨테이너 레이어"라고 한다. 새 파일 쓰기, 기존 파일 수정 및 파일 삭제와 같이 실행 중인 컨테이너에 대한 모든 변경 사항은 쓰기 가능한 얇은 컨테이너 계층에 기록된다.
- 도커는 유니온 파일 시스템(UFS)에 의해 여러 개의 파일 시스템을 하나의 파일 시스템에 마운트 할 수 있다. UFS를 통해 여러 파일 시스템을 하나로 결합하여 중복되는 파일이 있으면 나중에 마운트 된 파일로 Overlay 한다.
- UFS에서는 기존 레이어 위에 새로운 레이어가 쌓일 경우, 하위 레이어는 읽기 전용 상태(Read Only)가 된다. 상위 레이어에서 하위 레이어에 쓰기 작업을 수행할 경우, 하위 레이어를 복사하여 사용(CoW: Copy on Write) 하기 때문에 상위 레이어에서는 하위 레이어에 아무런 영향을 주지 않는다.
- 도커는 컨테이너 레이어(상위)와 이미지 레이어(하위)로 나뉜다. 컨테이너가 파일 시스템에 쓰기 작업을 수행할 경우 하위 레이어의 복사본에 해당 작업을 수행하기 때문에 서로 다른 여러 개의 컨테이너가 하위 레이어를 공유해도 독립적인 시스템 운용이 가능하다.
- 핵심: 컨테이너를 생성할 때 기존의 이미지 레이어(하위) 위에 Read-Write(R/W) 레이어를 추가한다. 이미지 레이어(하위)를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일, 추가되는 내용들은 R/W레어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용한다.
1) 이미지 만들기
- 디렉터리 생성 & Dockerfile 만들기
mkdir lab1
cd lab1
vi Dockerfile #도커 파일 만들기 아래 내용 입력 후 저장
FROM ubuntu:14.04 #베이스 이미지 레이어를 만든다.
RUN mkdir -p /lab #RUN명령이 실행할 명령어 mkdir을 사용하고 새 계층에 쓴다.
RUN touch /lab/file1 #RUN명령이 실행할 명령어 touch를 사용하고 새 계층에 쓴다.
-이미지 빌드하기 (docker build)
docker build -t testimage:1.1. #이미지 명은 testimage로 하고 :<태그>를 달아 버전 관리 그리고 마지막에 . 을 찍어 현재 디렉터리 내에 build 한다.
-생성된 이미지 확인
docker images
- 이미지 히스토리 보기
1. docker history <이미지 이름>:<태그> 또는 <이미지 ID>
2. Dockefile에 설정한 내용들이 히스토리로 생성됨
docker history testimage:1.1
2) 생성된 이미지로 컨테이너 실행하기 (docker run)
docker run -it --name testcon1 testimage:1.1
root@2e89f743b5c8:/# id
uid=0(root) gid=0(root) groups=0(root)
root@2e89f743b5c8:/# date
Sat Apr 2 07:23:24 UTC 2022
root@2e89f743b5c8:/# hostname
2e89f743b5c8
root@2e89f743b5c8:/# exit
exit
3)Dockerfile의 구조 살펴보기 (*중요)
- FROM
FROM <이미지> 또는 FROM <이미지>:<태그> 사용한다.
1. FROM은 base 이미지를 설정한다. Dockerfile로 이미지를 생성할 때는 항상 기존에 있는 이미지를 기반으로 생성하기 때문에 FROM은 반드시 설정한다.
2. 이미지 이름을 설정하거나 이미지 이름과 태그를 함께 설정할 수도 있다. 이미지 이름만 설정하면 latest를 사용한다.
3. FROM은 항상 맨 처음에 사용해야 하고 생략할 수 없다. 이미지를 생성할 때 FROM에 설정한 이미지가 로컬에 있으면 사용되고, 없으면 Docker Hub에서 내려 받는다.
4. Dockerfile 파일 하나에 FROM을 여러 개 설정 가능하다. FROM을 여러 개 설정했다면 이미지가 여러 개 생성된다.
- MAINTAINER (생략가능)
1. MAINTAINER <작성자 정보>
2. MAINTAINER는 생략할 수 있다.
3. MAINTAINER는 이미지를 생성한 사람의 정보를 설정한다. 형식은 자유이며 보통 이름과 이메일을 입력한다.
4. 형식은 자유롭다.
- LABEL
1. 컨테이너 이미지에 컨테이너의 정보를 저장
2. 라이센스 정보를 기록하여 자동화에 도움이
3. 각 라벨에는 LABEL로 시작하고 하나 이상의 키-값 쌍이 뒤에 붙는다.
4. 공백을 사용하는 문자열은 큰따옴표(쿼팅문자)로 묶는다.
5. 한 이미지안에 여러 개의 라벨을 사용할 수 있다.
6. LABEL 명령어 하나에 여러 개의 라벨을 묶어 사용할 수 있다.
7. docker inspect 명령어로 라벨 값을 확인할 수 있다.
- RUN
1. 쉘을 사용해 실행하기: RUN <명령> 또는 쉘 없이 바로 실행하기: RUN ["<실행 파일>", "<매개 변수1>", "<매개 변수2>"]
2. FROM으로 설정한 이미지에 실행하기 위한 스크립트나 명령어 파일이 없으면 사용할 수 없다.
즉, RUN은 FROM에서 설정한 이미지 위에서 실행할 명령어를 설정한다.
3. RUN으로 실행한 결과가 새 이미지로 생성되고, 실행 내역은 이미지의 히스토리에 기록된다.
4. RUN으로 실행한 결과는 캐시 되며 다음 빌드 때 재사용한다.(중요한 개념) 캐시 된 결과를 사용하지 않으려면 docker build 명령에서 --no-cache 옵션을 사용하면 된다.
5. 여러 줄로 구성된 RUN 문장을 쿼팅문자인 \를 이용해 여러 줄로 나누는 것은 Dockerfile을 간단하고 해석하기 편하게 한다.
- CMD
1. 쉘 기반으로 실행 : CMD <명령> 또는 쉘 없이 실행 : CMD ["<실행 파일>", "<매개 변수1>", "<매개 변수2>"]
2. FROM으로 설정한 이미지에 포함된 쉘 실행 파일을 사용하게 되며 쉘 실행 파일이 없으면 사용할 수 없다.
3. CMD는 컨테이너가 시작되었을 때 명령 또는 쉘스크립트을 실행한다. 즉 docker run 명령으로 컨테이너를 생성하면서 실행될 때, docker start 명령으로 정지된 컨테이너를 시작할 때 실행된다.
4. CMD는 컨테이너를 시작할 때 한 번 실행되고 RUN은 이미지를 빌드할 때 실행된다.
5. CMD는 Dockerfile에서 한 번만 사용할 수 있다. 여러 개 사용될 경우 마지막 CMD만 실행된다.
6. RUN은 어플리케이션 업데이트 및 배치에 사용하고, CMD는 어플리케이션 자체를 실행하는 명령어라고 볼 수 있다.
- ENTRYPOINT
1. 쉘로 명령 실행: ENTRYPOINT <명령> 또는 쉘 없이 바로 실행: ENTRYPOINT ["<실행 파일>", "<매개 변수1>", "<매개 변수2>"]
2. ENTRYPOINT는 컨테이너가 시작되었을 때 스크립트 혹은 명령을 실행한다. 즉 docker run 명령으로 컨테이너를 생성하거나, docker start 명령으로 정지된 컨테이너를 시작할 때 실행된다. ENTRYPOINT는 Dockerfile에서 단 한 번만 사용할 수 있다.
3. CMD는 ENTRYPOINT에 설정한 명령에 매개 변수를 전달만 한다. 명령어 실행은 ENTRYPOINT가 담당하고 CMD는 단순한 인자나 변수만 전달한다.
*ENTRYPOINT 사용 예시
[root@cent1 ~]# mkdir lab2
[root@cent1 ~]# cd lab2
[root@cent1 lab2]# cat Dockerfile (vi Dockerfile로 먼저 만들어준다.)
FROM ubuntu:14.04
ENTRYPOINT ["echo"]
CMD ["hello"]
[root@cent1 lab2]# docker build -t ex1 .
Sending build context to Docker daemon 2.048 kB
[root@cent1 lab2]# docker run ex1
hello
- ENV
1. ENV <환경 변수> <값>
2. $변수명 : 변수값 대체
3. ENV는 환경 변수 설정 ENV로 설정한 환경 변수는 RUN, CMD, ENTRYPOINT에 적용된다.
*ENV 사용 예시
[root@cent1 ~]# mkdir lab6
[root@cent1 ~]# cd lab6
[root@cent1 lab6]# cat Dockerfile
FROM ubuntu:14.04
ENV COLOR1 "blue white"
CMD echo $COLOR1
[root@cent1 lab6]# docker build -t testimage:1.1 .
컨테이너 실행 후 자동으로 삭제하기 --rm
[root@cent1 lab6]# docker run --rm testimage:1.1
blue white
*docker run 명령에서 직접 환경변수 설정하기
-e 환경변수 = 값 or --env 환경변수 = 값
[root@cent1 lab6]# docker run -e COLOR1="black yellow pink" --rm testimage:1.1
black yellow pink
- COPY (*중요)
- COPY는 파일을 이미지에 추가한다.
- COPY <복사할 파일 경로> <이미지에서 파일이 위치할 경로>
- COPY는 압축 파일을 추가할 때 압축을 해제하지 않는다.
- COPY는 URL을 사용할 수 없다.
- <복사할 파일 경로>는 Dockerfile이 있는 작업디렉토리인 컨텍스트 아래를 기준으로 한다. 컨텍스트 상위 디렉토리를 지정하거나 절대 경로를 지정할 수 없다.
- <이미지에서 파일이 위치할 경로>는 항상 절대 경로만 사용한다.
- 이름의 마지막이 /로 끝나면 디렉토리가 자동으로 이미지에 생성되고 파일이 복사된다.
- 디렉토리명 뒤에 /를 붙이지 않을 경우엔 파일명으로 간주되어 지정 이름으로 파일이 복사된다.
- COPY로 추가되는 파일은 소유자(UID) 0, 그룹(GID) 0으로 설정되고 퍼미션은 기존 파일 것을 따른다.
COPY실습
[root@cent1 ~]# mkdir lab7
[root@cent1 ~]# cd lab7
[root@cent1 lab7]# cat Dockerfile
FROM ubuntu:14.04
COPY test.sh /dir1/ #/dir디렉토리에 test.sh파일 복사 #경로는 / / 로 감싸주자
COPY test.sh /dir2 #test.sh 파일을 /dir2파일로 복사
COPY *.sh /dir3/ #/dir3디렉토리에 *.sh로 끝나는 모든파일 복사
COPY shell.tar.gz /dir4/ #/dir4 디렉토리에 shell.tar.gz파일 복사
[root@cent1 lab7]# touch test.sh test2.sh test3.sh
[root@cent1 lab7]# tar cvf shell.tar *.sh
[root@cent1 lab7]# gzip shell.tar
[root@cent1 lab7]# ls
Dockerfile shell.tar.gz test.sh test2.sh test3.sh
[root@cent1 lab7]# docker build -t testimage:1.1 . #Dockerfile build하기
[root@cent1 lab7]# docker run -it testimage:1.1 /bin/bash
root@fa6338b31b92:/# ls -F
dir2 dir4/ dir1/ dir3/ #dir2는 파일인것을 확인할 수 있다.
root@fa6338b31b92:/# ls dir1 #각 디렉터리에 복사된 파일 확인하기
test.sh
root@fa6338b31b92:/# ls dir3
test.sh test2.sh test3.sh
root@fa6338b31b92:/# ls dir4
shell.tar.gz
*
특이점: 압축파일이 복사될 때 그대로 압축된 상태이다. (ADD를 이용하면 자동으로 압축과 tar가 해지되어 복사된다.)
eixt로 나오자
- ADD
1. ADD는 파일을 이미지에 추가한다.
2. ADD <복사할 파일 경로> <이미지에서 파일이 위치할 경로>
<복사할 파일 경로>는 Dockerfile이 있는 작업디렉토리인 컨텍스트 아래를 기준으로 하며 컨텍스트 디렉토리의 상위 디렉토리를 지정할 수 없다. 절대 경로는 사용할 수 없다. (copy랑 똑같구먼~)
<이미지에서 파일이 위치할 경로>는 항상 절대 경로만 사용한다. 마지막이 /로 끝나면 디렉토리가 생성되고 파일은 그 아래에 복사된다.
예) ADD ../../myfile /myfile.out
(복사할 파일의 경로는 상대 경로를 이용해 상위나 다른 위치의 디렉토리에 있는 파일을 경로로 사용할 수 없다.)
예) ADD /etc/hosts /myhosts
(복사할 파일의 경로는 절대 경로를 사용할 수 없다.)
예) ADD *.out /lab/
(와일드카드를 사용 가능하다.)
예) ADD lab/ /labdir/
(현재 작업디렉토리(컨텍스트)에 있는 디렉토리를 지정하면 디렉토리의 모든 파일을 복사)
예) ADD http://foosys.com/myfile /lab/
(복사할 파일 경로에 인터넷 URL을 사용 가능하다.)
이미지에서 파일이 위치할 경로의 마지막에 /가 있으면 디렉토리가 생성되고 파일은
그 아래에 복사된다. 결과: URL경로의 파일인 myfile이 /lab/myfile로 복사된다.
예) ADD shell.tar.gz /lab/
(로컬에 있는 압축 파일은 압축을 해제하고 tar를 풀어서 추가된다.)
예) ADD http://foosys.com/shell.tar.gz /lab/
(인터넷에 있는 URL은 압축만 해제한 뒤 tar 파일을 추가한다.
단 파일 내용은 tar 아카이브 파일 이지만 파일 이름은 shell.tar.gz처럼 .gz가 붙어있다.)
예) ADD ./ /lab/
(현재 작업 디렉토리 [컨텍스트]를 지정할 경우 .dockerignore 파일에 설정한 파일과
디렉토리는 제외된다.)
- VOLUME
1. VOLUME은 데이터를 컨테이너에 저장하지 않고 호스트에 저장한다.
2. VOLUME은 컨테이너끼리 데이터를 공유할 수 있다.
3. VOLUME <컨테이너 디렉토리> 또는 VOLUME ["컨테이너 디렉토리1", "컨테이너 디렉토리2"]
4. VOLUME으로는 호스트서버의 특정 디렉토리와 연결하도록 설정하는 기능이 없다. 만약 컨테이너의 데이터 볼륨을 호스트의 특정 디렉토리와 연결하려면 docker run -v 옵션을 사용해야한다.
docker run -v <컨테이너 디렉토리> 또는 docker run -v <호스트 디렉토리>:<컨테이너 디렉토리>
5. docker volume ls : 볼륨 리스트 확인
6. docker volume prune : 사용하지 않는 모든 볼륨 삭제
이번 포스팅에서는 docker설치방법 / docker 사용방법 / dockerfile & dockerfile의
구조 와 이미지레이어에 대해 포스팅 해보았다.
dockerfile의 구조에서 volume에 대한 내용은 중요하기 때문에 다음 포스팅에 이어서
실습을 기반으로 더 자세한 설명을 해보겠다.
댓글