시작하세요 도커/쿠버네티스 - Docker
서론
<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, PausePORTS
: port bindingNAMES
: 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
vsCMD
: 하단에 정리
ONBUILD
: 빌드된 이미지를 기반으로 하는 다른 이미지를 생성할때 실행되는 명령어STOPSIGNAL
: 컨테이너가 정지될 때 사용될 시스템 콜의 종류를 정의- default)
SIGTERM
- ex)
STOPSIGNAL SIGKILL
- default)
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
의 위치