thumbnail

서론

<img src="https://static.podo-dev.com/blogs/images/2020/12/09/origin/73392bcf-16e8-46dc-9978-94b983965de1.jpg" alt="800x0.jpg" style="width:360px;">

시작하세요 도커/쿠버네티스를 리딩 후,
실습하며 작성한 두서없는 공부글 정리입니다 :)..

Docker

docker run, create

## image pull, create, start
docker run -it nginx:latest
## image pull, create
docker create nginx
  • -i: stdin/stdout 연결
  • -t: 터미널을 사용할 수 있게함
  • -d: detached run
  • -e : 환경변수
  • -p : port
  • --link:
    • A컨테이너에서 B컨테이너로 접근하려면, 가장쉬운 방법은 NAT할당받은 IP를 사용하는 것
    • 이는 컨테이너를 시작할때 재 할당 받게도되서, 매번 변경되어 유효하지않음.
    • --link 옵션은 내부 ip를 알 필요없이 alias로 접근할 수 있음.
  • -v: 볼륨마운트
    • 컨테이너 볼륨이, 호스트 볼륨을 덮어씀
    • 컨테이너 볼륨이, docker volume을 덮어씀
    • -v ${hostDirOrFile}:${containerDirOrFile}
    • -v ${dockerVolume}:${contaienrDir}
    • -v ${containerDir}: // docker volume 자동 생성
  • --volumes-from: -v 또는 --volume옵션을 적용한 컨테이터의 볼륨 디렉터리를 공유
    • --volumes-from ${anothorContainerName}

sample

docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=abc1234 \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
docker run -d \
-e WORDPRESS_DB_PASSWORD=abc1234 \
--name workdpress \
--link workdpressdb:mysql \
-p 80 \ ## container 80 port, host random port
wordpress

docker logs

docker logs -f -n 500 ${container}
  • -f: attach
  • -n: line count

컨테이너를 식별하기 위해서 id의 앞자리 2~3자리만 입력해도 됩니다.

docker ps

<img src="https://static.podo-dev.com/blogs/images/2020/12/07/origin/1392b526-7a2b-4ffc-9692-859e78e39c24.png" alt="base64.png" style="width:720px;">

## container 목록 확인
docker ps
  • COMMAND : 컨테이너 시작 시에 수행되는 명령어
    • run, create 끝에 입력해서, 덮어 쓸수 있다
    • docker run -it ubuntu:14.04 echo hello world!
  • STATUS: Up, Exited, Pause
  • PORTS: port binding
  • NAMES : container name
    • 컨테이너 이름을 바꿀 수 있다.
    • docker rename origin_name change_name
  • -q: docker container id만 출력

docker inspect

docker container inspect ${containerName}

docker rm

## 컨테이너 정지
docker stop ${contaienrName}
## 정지된 컨테이너 삭제
docker rm ${containerName}
## 실행중인 컨테이너 삭제
docker rm -f ${containerName}
## 모든 컨테이너 삭제
docker contaeinr prune
## 모든 컨테이너 삭제
docker rm $(docker ps -a -q)

docker volume

docker volume create
docker volume ls
docker volume --name ${volumeName}
## 실제 volume 위치를 확인 할 수 있다.
docker inspect ${volumeName}
### 볼륨 모두 삭제
docker volume prune

docker network

<img src="https://static.podo-dev.com/blogs/images/2020/12/08/origin/3d765bf2-5335-4c89-bc30-f37ead3a9c22.png" alt="base64.png" style="width:540px;">

nas는 veth 시작하지 않는듯 싶다.

docker container의 내부 ip는 순차적으로 할당됩니다.
이 ip는 컨테이너를 재시작할때 변경 될 수 있습니다.
이 내부 ip는 docker 설치된 호스트, 즉 내부망에서만 쓸 수 있는 ip이므로 외부와 연결을 필요가 있습니다.
이 과정은 컨테이너를 실행할 때 마다, 호스트에 veth** 이라는 네트워크 인터페이스를 생성함으로써 이루어집니다.
도커는 각 컨테이너에 외부와의 네트워크를 제공하기 위해 컨테이너마다 가상 네트워크 인터페이스를 호스트에 생성하며 이 인터페이스의 이름을 veth로 시작합니다.
veth는 사용자가 직접생성할 필요 없으며 컨테이너가 생성될때 자동 생성됩니다.

## network list 확인
docker network ls
## network detail, 속해있는 container, default 여부 등
docker network inpect ${network}

bridge network

컨테이너를 생성하면 기본저긍로 docker0 브리지를 통해 외부와 통신할 수 있느 환경을 사용 할 수 있지만,
다른 네트워크 드라이버를 사용 할 수 있다.

## 유동적으로 네트워크 맺기 끊기
## 논네트워크, 호스트 네트워크는 불가
docker network connect mybridge mycontainer;
docker network disconnect mybridge mycontainer;
## Sample Create Custom Bridge
docker network create --drive bridge mybridge;
docker run -it  --name my_container --net mybridge ubuntu:latest;

bridge network && alias

--link랑 유사함.
--link는 default bridge의 DNS라는 점에서 다릅니다.
도커는 기본 브릿지가 아닌 사용자가 정의한 브리지 네트워크에 사용되는 내장 DNS 서버를 가지며,
해당 DNS에서 --net-alias를 통해 host를 등록할 수 있습니다.

## --net-alias를 통해 다른 컨테이너에서 myhost 호스트로 접근하여, 이 컨테이너로 접근 할 수 있음
docker run -it --name container_1 --net mybridge --net-alias myhost ubuntu:latest;
docker run -it --name container_2 --net mybridge --net-alias myhost ubuntu:latest;
docker run -it --name container_3 --net mybridge --net-alias myhost ubuntu:latest;

## Client Container를 생성하여 접근,
docker run -it --name client_container --net mybridge ubuntu:latest;
> ping -c myhost

host network

네트워크를 호스트로 서정하면, 호스트의 네트워크 환경을 그대로 사용합니다.

## Sample
docker run -it --name network_host --net host ubuntu:latest

non network

말 그래도 아무 네트워크도 쓰지 않는 것을 뜻합니다.

## Sample
docker run -it --name network_host --net none ubuntu:latest

container Network

--net 옵션으로 container를 입력하면, 다른 컨테이트어의 네트워크 네임스페이스 환경을 공유할수 있습니다.
공유하는항목으로는 ip,mac addr입니다.

## Sample, 두개의 IP, MAC 어드레스가 동일
docker run -it --name network_container_1 ubuntu:latest;
docker run -it --name network_container --net container:network_container_1 ubuntu:latest;

docker logs

도커는 컨테이너의 표준 출력, 에러로그를 별도의 메타데이터 파일로 저장하여 이를 확인하는 명령어를 제공합니다.

docker logs ${containerName}
  • --tail $n : 마지막 n줄 조회
  • --sinsce $unixTime : unix 시간 이후에 로그
  • -t: 타임스탬프 표시
  • -f: log attach
docker run --log-opt max-size=10k --log-opt max-file=3 --name log-test ubuntu:14.04
  • --log-opt max-size=$size : 로그파일 max 크기
  • --log-opt max-file=$count : 로그파일 max 개수

docker images

# 도커 허브에서 이미지를 찾는다.
docker search ubuntu

docker image commit

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TEG]]
docker run -it --name commt_test ubuntu:14.04
> echo first!!!!!!!!!!! > fisrt
## commit 하여 새로운 이미지를 생성
docker commit \
-a "podo" \
-m "first commit" \
commit_test \
commit_test:first

image를 inpect하면 새로운 커밋이 추가 된것을 확인 할 수 있습니다.

docker inspect ubuntu:14.04
<img src="https://static.podo-dev.com/blogs/images/2020/12/08/origin/1fa0325e-2c50-4fd2-b8ca-cb50105cec82.png" alt="base64.png" style="width:620px;">

docker inspect commit_test:first
<img src="https://static.podo-dev.com/blogs/images/2020/12/08/origin/8b988c5e-7da2-4043-83a2-95cb6c40ebf9.png" alt="base64.png" style="width:601px;">

비록 commit_test:first:, ubuntu:14.04의 두 이미지가 용량이 똑같이 조회되더라도,
commit_test:first:ubuntu:14.04의 변동사항만을 새로운 레이어로 저장한 것입니다.
commit_test:first의 이미지를 삭제하면 새롭게 추가된 레이어만 삭제되는것입니다.

Untagged: 이미지에 부여된 이름 삭제
Deleted : 이미지의 레이어 삭제
<img src="https://static.podo-dev.com/blogs/images/2020/12/08/origin/82d2abee-1b4a-47b3-9a63-96d2b3bb2a17.png" alt="base64.png" style="width:569px;">

docker image save, load (export, import)

save, load는 이미지 변동사항, 이미지이름, 태그들도 모두 추출합니다.

docker save -o podo-dev-storage.tar podo-dev-stage:1.0
docker load -i podo-dev-storage.tar

export, import는 컨테이너의 파일시스템을 추출합니다.

docker export -ro podo-dev-storge.tar podo-dev-storage
docker import podo-dev-stroage.tar podo-dev-storage:1.0

Dockerfile

명령어

  • FROM : 생성할 이미지의 베이스가 될 이미지
  • MAINTAINER : 이미지를 생성한 개발자의 정보
  • LABEL: 이미지의 메타데이터 (key:value)
  • RUN : 이미지를 만들기 위한 컨테이너 내부 명령어
  • ADD : Dockerfile이 위치한 Context에서 파일을 추가, 외부 URL 및 tar 파일에서도 추가 가능
    • 외부의 어떤 파일인지 모르고 추가 될 수 있기 때문에, 권장하지 않음
  • COPY : Dockerfile이 위치한 Context에서 파일을 추가 (COPY의 기능이 ADD에 포함됨)
  • ENV :
  • ARG :
  • WORKDIR: 명령어를 실행할 디렉토리 (cd랑 비슷)
  • EXPOSE : Dockerfile 빌드로 생성된 이미지에서 노출될 포트, docker run 시 -P옵션과 같이 사용되어야함
  • CMD: 컨테이너가 시작될때마다 실행할 명령어, Dockerfile에서 한번만 사용할 수 있음
  • ENTRYPOINT : CMD와 유사하나 다름. 약간의 차이가 있음
    • ENTRYPOINT vs CMD : 하단에 정리
  • ONBUILD: 빌드된 이미지를 기반으로 하는 다른 이미지를 생성할때 실행되는 명령어
  • STOPSIGNAL: 컨테이너가 정지될 때 사용될 시스템 콜의 종류를 정의
    • default) SIGTERM
    • ex) STOPSIGNAL SIGKILL
  • SHEEL : Dockerfile에서 기본적으로 사용하는 쉘변경

ENTRYPOINT vs CMD

CMD 컨테이너 실행 시, default 명령어 또는 파라미터를 설정한다.

FROM ubuntu:14.04
CMD echo Helloworld
Helloworld

ENTRYPOINT를 추가한다면,
CMD는 단순히 ENTRYPOINT의 인자 역할을 하게됩니다.

FROM ubuntu:14.04
ENTRYPOINT ["echo"]
CMD echo Hello world
bin/sh -c echo Hello World

ENTRYPOINT는 스크립트를 실행할때 유용하다.

## test.sh
echo $1
FROM ubuntu:14.04
ADD test.sh test.sh
ENTRYPOINT ["/bin/bash", "test.sh"]
CMD ["helloworld"]
helloworld

컨테이너 생성 시, CMD를 주입하여 스크립트의 인자를 바꿀수 있다.

docker run -i --name test test:0.1 HELLOWORLD
HELLOWORLD

JSON 배열 형태와 일반형식의 차이점

일반형식으로 사용하면 자동으로 앞에 /bin/sh -c가 추가됩니다.

CMD echo 123
/bin/sh -c echo 123

하지만 JSON 타입은 /bin/sh -c가 추가 되지 않습니다.

CMD ["echo", "abc"]
echo abc

Dockerfile build 시 주의할 점

FROM ubuntu:14.04
RUN fallocate -l 100m /app/dumy
RUN rm /app/dummy

해당 도커 이미지의 용량은 그대로일까? 아니면 100mb 추가 됬을까?
100mb가 추가되었다.

Docker가 이미지를 레이어로 관리한다는것을 주의 하자

FROM ubuntu:14.04
RUN fallocate -l 100m /app/dumy ## Layer 1
RUN rm /app/dummy ## Layer2

Layer1이 생성되면, 해당 레이어의 변경사항을 저장한다.
해당 파일을 삭제하더라도, Layer1은 기록되었기 때문에 이미지 용량은 100mb 증가한다.

따라서 && 키워드를 사용하면 이를 방지 할 수 있다.
각 명령어를 하나로 묶어서 실행하는 것이다.

FROM ubuntu:14.04
RUN fallocate -l 100m /app/dumy  && \## Layer 1
RUN rm /app/dummy ## Layer1

.dockerignore

.dockerignore에 명시된 파일은 컨텍스트에서 제외됩니다.
.gitignore와 동일합니다.

build시의 명령의 가장 마지막 인자(path)
= Dockerfile의 위치
= .dockerignore의 위치

CommentCount 0
이전 댓글 보기
등록
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
TOP