도커 컨테이너 관련 내용을 알아봅니다.
목차
Toggle도커를 알아야 하는 이유
- 파드는 쿠버네티스를 이루는 기본 오브젝트입니다.
- 파드는 컨테이너들로 이루어져 있습니다.
- 도커는 컨테이너를 만들고 관리하는 도구입니다.
파드, 컨테이너, 도커, 쿠버네티스의 관계
- 파드들은 워커 노드라는 노드 단위로 관리됩니다.
- 워커 노드와 마스터 노드가 모여 쿠버네티스 클러스터가 됩니다.
- 파드
- 1개 이상의 컨테이너로 구성됩니다.
- 파드는 쿠버네티스로부터 IP를 받아 컨테이너가 외부와 통신할 수 있는 경로를 제공합니다.
- 컨테이너들이 정상적으로 작동하는지 확인하고 네트워크나 저장 공간을 서로 공유하게 됩니다.
- 컨테이너를 관리하는 것이 파드, 파드를 관리하는 것이 쿠버네티스 워커 노드, 워커 노드를 관리하는 것이 쿠버네티스 마스터입니다.
- 컨테이너 : 하나의 운영체제 안에서 커널을 공유하며 개별적인 실행환경을 제공하는 격리된 공간입니다.
- 유닉스나 리눅스는 하나의 호스트 운영 체제 안에서 자원을 분리해 할당, 실행되는 프로세스를 격리해서 관리하는 방법을 제공 → 이 복잡한 과정을 쉽게 만들어 주는 도구가 도커입니다.
컨테이너 이미지 알아보기
- 이미지 검색하고 내려받기
- registry
docker search nginx
docker pull nginx
- 이미지 태그
- 이미지의 레이어 구조
docker pull nginx:stable
docker images nginx
docker history nginx:stable
docker history nginx:latest
컨테이너 실행하기
- run Container
- -d 백그라운드 실행
- –restart always 오류시 자동재시작
docker run -d --restart always nginx
docker ps
docker ps -f id=cec7
# error
curl 127.0.0.1
- -p(–publish) 외부에서 호스트로 보낸 요청을 컨테이너 내부로 전달하는 옵션 -p<요청 받을 호스트>:<연결한 컨테이너 포트>
docker run -d -p 8080:80 nginx-exposed --restart always nginx
docker ps -f name=nginx-exposed
컨테이너 내부 파일 변경하기
- docker cp
- Dockerfile ADD
- 바인트 마운트
- 볼륨
- 컨테이너 내부에 연결할 디렉토리를 호스트에 생성
mkdir -p /root/html
docker run -d -p 8081:80 \\
-v /root/html:/usr/share/nginx/html --restart --name nginx-bind-mounts nginx
xxxxxxxxxxx
docker ps -f name=nginx-bind-mounts
cp ~/xxx/index-BindMount.html /root/html/index.html
docker exec e7ca ls /usr/share/nginx/html
#볼륨 생성
docker volume create nginx-volume
#볼륜 조회
docker volume inspect nginx-volume
#볼륨 연결
docker run -d -p 8082:80 \\
-v nginx-volume:/usr/share/nginx/html --restart --name nginx-volume nginx
xxxxxxxxxxx
- 볼륨을 사용하면 컨테이너에 존재하는 파일을 그대로 보존할 수 있고, 필요할 때 변경해서 사용할 수 있음. 사용 중인 볼륨을 docker volume ls 명령으로 조회할 수 있음. docker volume rm 명령으로 삭제할 수 있음.
사용하지 않는 컨테이너 정리하기
# 조회
docker ps -f ancestor=nginx
# 중지
docker stop tender_snyder
# nginx 모두 중지
docker ps -q -f ancestor=nginx
docker stop $(docker ps -q -f ancestor=nginx)
# 컨테이너 삭제
docker rm $(docker ps -aq -f ancestor=nginx)
# 이미지 삭제
docker rmi $(docker images -q nginx)
4가지 방법으로 컨테이너 이미지 만들기
기본 방법으로 빌드하기
# 빌드
chmod 700 mvnw
./mvnw clean package
docker build -t basic-img .
# 확인
docker images basic-img
# -t(tag) 1.0, 2.0 태그 이미지 생성
docker build -t basic-img:1.0 -t basic-img:2.0 .
컨테이너 용량 줄이기
chmod 700 mvnw
./build-in-host.sh
docker images | head -n 3
컨테이너 내부에서 컨테이너 빌드하기
# Build
docker build -t nohost-img .
# Run Container
docker run -d -p 60433:80 --name nohost-run --restart always nohost-img
# Check
curl 127.0.0.1:60433
# Remove Container
docker rm -f nohost-run
최적화해 컨테이너 빌드하기
- Multi-Stage Build : 최종 이미지의 용량을 줄이고 호스트에 빌드 도구 설치 없음.
- docker-ce 17.06 지원
# Docker Version Check
kubectl get nodes -o wide
# Delete Virtual Machine
cd xxx/ch3/3.1.3
vagrant destory -f
# Install k8s
cd xxx/k8s-SingleMaster-18.9_9_w_auto-coml
vagrant up
# Check Docker Version
kubectl get nodes -o wide
# Check Dockerfile
cd xxx/ch4/4.3.4
cat Dockerfile
# build
docker build -t multistage-img .
# Check
docker images | head -n 3
# Delete dangling images (<none> images)
docker rmi $(docker images -f dangling=true -q)
# run Container
docker run -d -p 60434:80 --name multistage-run --restart always multistage-img
# Check
curl 127.0.0.1:60434
# Remove
docker rm -f multistage-run
- Dockerfile
FROM openjdk:8 AS int-build
LABEL description="Java Application builder"
RUN git clone <https://github.com/iac-source/inbuilder.git>
WORKDIR inbuilder
RUN chmod 700 mvnw
RUN ./mvnw clean package
FROM gcr.io/distroless/java:8
LABEL description="Echo IP Java Application"
EXPOSE 60434
COPY --from=int-build inbuilder/target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt
쿠버네티스에서 직접 만든 컨테이너 사용하기
쿠버네티스에서 도커 이미지 구동하기
docker images multistage-img
# Create Deployment name : failure1
kubectl create deployment failure1 --image=multistage-img
# Check -> ErrImagePull
kubectl get pods -w
# 실행 결과를 yaml로 추출
kubectl create deployment failure2 --dry-run=client -o yaml \\ --image=multistage-img > failure2.yaml
vi failure2.yaml
# 추가 imagePullPolicy: Never
kubectl apply -f failure.yaml
# Check -> ErrImageNeverPull
kubectl get pods
kubectl delete deployment failure1
kubectl delete deployment failure2
- 수퍼푸티로 워커노드 3번 w3-k8s 접속
# 깃허브에서 올려 둔 Dockerfile을 받아 와 컨테이너 이미지 생성
curl -0 \\
https:xxx/Dockerfile
# build
docker build -t multistage-img .
cp failure2.yaml success1.yaml
sed -i 's/replicas: 1/replicas: 3/' success1.yaml
sed -i 's/failure2/success1/' success1.yaml
kubectl apply -f success1.yaml
kubectl get pods - o wide
kubectl delete -f success1.yaml
docker rmi multistage-img
docker rmi($docker images -f dangling=true -q)
레지스트리 구성하기
- 사설 도커 레지스트리
- Docker Registry : 개인, 테스트 용
- HARBOR
- Nexus Repository : 가장 많이 사용
- Quay
create-registry.sh
docker ps -f name=registry
# multistage-image의 사본 192.168.1.10:8443/multistage-img ****만듬****
docker tag multistage-image 192.168.1.10:8443/multistage-img
docker images 192.168.1.10:8443/multistage-img
# 사설 도커 레지스트리에 등록
docker push 192.168.1.10:8443/multistage-img
# Check -k 보안 검증 생략
curl <https://192.168.1.10:8443/multistage-img> -k
docker images | grep multi
# Delete Host image
docker rmi -f aa23
docker images | grep multistage
직접 만든 이미지로 컨테이너 구동하기
cp success1.yaml success2.yaml
vi success2.yaml
# 삭제 imagePullPolicy: Never
sed -i 's/success1/success2/' success2.yaml
kubectl apply -f success2.yaml
kubectl get pods -o wide
curl 172.16.132.5
kubectl delete -f success2.yaml
도커 컨테이너란 무엇이고 사용법에 대해 알아봤습니다.
관련 명령어가 많이 있기 때문에 필요한 명령어는 숙지하시기 바랍니다.
그럼 다음 포스팅에서 뵙겠습니다.