본문 바로가기
Study/Cloud,Docker,Kubernetes

Docker(1)

by 왕방개 2024. 4. 2.

1.CI/CD

1)개요

=>CI/CD 의 개념은 Continuous Integration(지속적인 통합),Continous Delivery(지속적인 서비스 제공),Continuous Deployment(지속적인 배포)

=>애플리케이션 개발 단계를 자동화해서 애플리케이션을 보다 짧은 주기로 고객에 전달하기 위한 방법

=>새로운 코드 통합으로 인해 개발 및 운영 팀에 발생하는 문제(Integration Hell)를 해결하는 방법

=>지속적인 통합이 제대로 구현되면 애플리케이션 코드의 새로운 변경 사항이 정기적으로 빌드 및 테스트를 거쳐 공유 레포지토리에 병합되므로 여러 명의 개발자가 동시에 애플리케이션 개발과 관련된 코드를 작업할 경우 서로 충돌하는 문제를 해결 

 

 

2)지속적인 통합

=>개발 팀이 작은 변경 사항을 구현하고 코드를 버전제어 레포지토리에 자주 체크인 하도록 하는 코딩 철학이자 일련의 관행

 

=>coding ->코드 리뷰 후 Merge -> Build -> Test -> Report =>Release (Deployment)

 

3)지속적인 제공

=>개발자들이 애플리케이션에 적용한 변경 사항이 버그 테스트를 거쳐 레포지토리에 자동으로 업로드 되는 것

=>여기까지 레포지토리 등록

 

4)지속적인 배포

=레포지토리에서 고객이 사용가능한 프로덕션 환경까지 자동으로 릴리스 하는 것

 

5)CI/CD

=>코드의 변경 사항이 생겼을 때 레포지토리에 코드를 push만 하면 테스트 와 빌드를 자동으로 수행해서 배포하는 것

개발자가 git push 을 해서 git hub 에 업로드 하면 git hub의 action(wb book)이 JenKins와 같은 빌드도구에 빌드를 요청하고 빌드를 요청하고 빌드가 끝나면 docker 이미지를 만들어서 docker hub와 이미지 레포지토리에 업로드를 하고 이미지를 다운로드 받아서 kubenetes 와 같은 오케스트레이션 도구 와 HELM 같은 배포 도구를 이용해서 운영환경에 자동으로 배포

 

=>기술 요소

도커

쿠버네티스

젠킨스와 같은 빌드 도구

프로메테우스나 그라파나 같은 모니터링 도구

 

6)지속적 인도

=>전통적인 방식:고객의 요청을 정의 하는 것으로 시작해서 제품을 릴리스 함으로써 종료

 

고객 요청 -> 개발 (분석, 계획, 구현, 단위 테스트,시연) -> 품질 보증(통합 테스트, 인수 테스트, 비기능 분석)  -> 운영(릴리스,모니터링)

 

인도 기간이 느리고 피드백 주기도 느리고 자동화가 미비하고 의사 소통 부족 등의 문제가 발생

 

7)자동 배포 파이프라인

=>코드 레포지토리에 변경이 발생할 때 마다 실행되는 일련의 스크립트로 프로세스가 성공하면 프로덕션 환경으로 배포가 되는 것 - 대표적인 서비스가  git hub action

 

=>과정

-지속적 통합: 여러 개발자가 작성한 코드가 통합되었는지 확인

-자동 인수 테스트

인수 테스트(자동): 비즈니스 관점에서 기능적 요구 사항을 검증하는 테스트로 고객이 요구한 기능이 전부 구현되었는지 확인

 

단위 테스트(자동):버그를 최소화하고 소프트웨어의 품질을 향상하도록 개발자를 지원하는 테스트

 

탐색적 테스트(수동): 수동으로 하는 블랙박스 테스트를 경험을 바탕으로 시스템의 문제를 찾아내거나 개선하는 테스트

 

비기능 테스트(자동): 성능, 확장성, 보안 등과 관련된 시스템 속성을 검증

 

통합 테스트

 

- 구성 관리: 수동 운영 단계를 대체하는 환경을 구성

최근에는 이 작업을 코드로 작성하도록 권장

모니터링도 필수

 

2.Container 와 Virtualization

1)Virtualization(가상화)

=>서버,스토리지,네트워크 및 물리적 시스템에 대한 가상 표현을 생성하는데 사용할 수 있는 기술

=>가상 소프트웨어는 물리적 하드웨어 기능을 모방해서 하나의 물리적 컴퓨터에서 여러 가상 시스템을 동시에 실행하는 것이 가능하도록 합니다

=>하드웨어 리소스를 효율적으로 사용해서 투자 대비 이익을 더 많이 얻을 수 있고 클라우드 컴퓨팅 서비스를 지원해서 조직의

 

2)장점

=>효율적인 리소스 사용

=>자동화된 IT 관리

=>신속한 재해 복구

 

3)가상화 서비스

=>서버 가상화

=>스토리지 가상화

=>네트워크 가상화

-네트워크 기능 가상화

-SDN(Software Defined Networking)

물리적 환경의 데이터 라우터에서 라우팅 관리를 인수해서 트래픽 라우팅을 제어

여러 종류의 트래픽이 있을 떄 특정 종류에 우선권을 부여할 수 있습니다.

=>데이터 가상화

=>애플리케이션 가상화

=>데스크톱 가상화

 

4)가상화 방식

=>호스트 운영체제 가상화

-물리적 하드웨어 위에 설치된 HOST OS 위에 가상화 소프트웨어와 가상 머신이 설치된 GUEST OS 을 움직이는 방식

-가상의 하드웨어를 에뮬레이팅 하기 때문에 호스트 운영체제에 크게 제약 사항이 없음

-운영체제 위에 운영체제가 얹히는 방식이라서 오버헤드가 큼

-가상화 소프트웨어

VM Ware

Virtual Box

Virtual PC

UTM(Mac)

 

=>하이퍼바이저 가상화

- HOST OS 없이 하드웨어에 하이퍼바이저를 설치해서 사용하는 가상화 방식

- 호스트 운영체제 와 별도로 개별 시스템처럼 동작하기 떄문에 처리 오버헤드가 존재하지 않음

- 자체적으로 머신에 대한 관리 기능이 없기 때문에 관리를 위한 컴퓨터나 콘솔이 필요

- 서버가상화에서는 주류

-하드웨어 와 운영체제 사이에서 물리적 시스템의 하드웨어에 직접 설치되는 경우를 베어메탈 하이퍼바이저라고 합니다

-구현 방식

전 가상화(Full Virtualization):하드웨어를 완전히 가상화하는 방식으로 VMWare 의 ESX Server 나 MS의 Hyper V가 대표적인 소프트웨어

 

반 가상화(Para Virtualization): 전 가상화가 모든 작업을 하이퍼바이저에게 전송해서 사용하기 떄문에 성능이 저하되는 경우가 있어서 하이퍼바이저가 다른 작업을 수행하지 않고 명령만 처리하는 형태로 수정한 방식으로 Xen이나 KVM이 대표적인 반 가상화 소프트웨어

 

=>Container 가상화

HOST OS 위에 Container 관리 소프트웨어를 설치하고 논리적으로 Container 를 나누어서 사용하는 방식

-각 Container 는 애플리케이션 동작을 위한 라이브러리와 애플리케이션 그리고 데이터를 구성되고 이를 개별 컴퓨터처럼 사용

-장점: 오버헤드가 적어서 가볍고 빠름

-단점:다양한 OS 을 활용할 수 없고 보안적으로는 완전히 격리되지는 않음

-가상화 소프트웨어

Open VZ

LXC

Linux VServer

Docker

Oracle Solaris Zones

 

-하드웨어 위에 컨테이너 관리 소프트웨어가 위치하고 각 가상환경이 위치하는 구조

 

=>애플리케이션 배포 환경이 운영체제에 직접 배포하던 방식에서 hypervisor 을 이용하는 방식으로 넘어갔다가 최근에는 Container 가상화 방식으로 이전

5)Container

=>각 애플리케이션에는 운영체제가 아닌 의존성 요소만 포함됨

=>애플리케이션은 HOST OS 와 직접 통신하기 떄문에 기존의 가상화 방식보다 성능이 향상되고 리소스 낭비도 발생하지 않고 Image 크기도 작음

=>Docker Engine에서는 Container 용 Linux NameSpace 와 Control Group을 생성해서 처리하는데 이렇게 되면 운영체제를 격리하는 것 보다는 덜 안전

 

3.Docker

1)개요

=>Container 형 가상화 기술을 구현하기 위한 애플리케이션(Docker Engine) 과 이 애플리케이션을 조작하기 위한 명령행 도구로 구성되는 애플리케이션

=>같이 사용하는 프로그램 데이터를 다른 컨테이너 와 격리시키는 기능을 제공하는 애플리케이션

 

2)특징

=>Micro Service 전환은 물론 DevOps, Testing 등 다양한 분야에서 활용

=>Linux Container  구현체의 사실상(de-facto) 표준

 

3)Docker 는 Linux 를 사용

=>Docker 는 Linux 를 필요로 함

=>Windows 나 Mac OS 에서는 Docker 를 구동할 수 있는지만 이 경우 내부적으로 Linux 가 사용되며 Container 에서 동작하는 프로그램도 Linux 용 프로그램

 

4)LXC(Linux Container)

=>운영체제 수준의 가상화:단일 Linux 커널을 사용하는 제어 호스트에서 여러 개의 격리된 Linux 시스템 실행

=>Linux 커널에서 컨테이너 단위로 격리할 수 있도록 해주는 기능

-cgroups:자원을 제한하고 격리시키는 Linux 커널 기능

-Namespace

-chrrot(change root):특정 디렉토리를 최상위 디렉토리인 root로 인식하게끔 설정하는 Linux 명령

 

5)데이터나 프로그램을 격리시켜야 하는 이유

=>대부분의프로그램은 프로그램 단독으로 동작하는 것이 아니라 어떤 실행 환경이나 라이브러리 또는 다른 프로그램을 이용해서 동작

이러한 프로그램을 하나의 운영체제에 설치해서 사용하는 경우 한 프로그램의 변경이 다른 프로그램에 영향을 줄 수 있어서 각각의 프로그램을 격리시켜서 영향을 미치지 못하도록 하기 위해서

  

6)동작 원리

=>일반적인 리눅스가 설치된 컴퓨터

하드웨어 -> 커널 ->주변 부분 ->소프트웨어

 

=>도커가 설치된 경우

하드웨어 -> 커널 -> 도커 엔진 -> 소프트웨어

 

=>Windows와 Mac OS 에서 Docker 구동

-Linux 운영체제 를 끌어들여서 사용

-Windows 에서는 WSL2 라는 프로그램을 이용해서 리눅스를 사용

 

7)Image 와 Container

=>Image ->Class

=>Container -> Instance라고 생각하면 편함

하나의 이미지를 가지고 여러 개의 컨터에너를 생성할 수 있으며 이미지가 없으면 컨테이너가 생성할 수 없음

=>Docker Hub

-공식적으로 운영되는 Docker Registry(이미지를 배포하는 저장소)

-https://hub.docker.com

 

=>이미지 종류

-운영체제와 유사한 이미지

-운영체제에 하나의 소프트웨어가 포함된 이미지

-운영체제에 여러 개의 소프트웨어가 포함된 이미지

=>Container 의 다양한 조합

-일반적으로는 하나의 소프트웨어 또는 하나의 이미지를 가지고 생성

-여러 개의 이미지를 하나의 Container로 묶어서 배포하는 것도 가능

-WordPress 를 사용하려면 Apache , MySQL , WordPress  3가지 소프트웨어가 필요한데 이 경우 3개의 컨테이너를 만들어서 사용해도 되고 하나의 컨테이너에 3개를 묶어서 사용하는 것도 가능

=>컨테이너를 폐기하면 안에 존재하는 데이터도 같이 소멸되는데 데이터를 보존하고자 하면 Docker 나 물리적 하드 디스크를 마운트 해서 저장하는 것이 가능

 

8)장점

=>가상화 소프트웨어보다 더 가볍게 동작

=>다른 컴퓨터에서 동작하는 이미지를 가져와서 사용할 수 있기 때문에 개발 환경과 운영 환경을 거의 동등하게 재현하는 것이 가능

=>거의 모든 클라우드 플랫폼에서 서비스 제공

 

9)단점

=>Container 는 운영체제의 동작을 완전하게 재현하지는 못하기 때문에 조금 더 엄밀한 Linux 계열 운영체제의 동작이 요구되는 경우에는 가상화 소프트웨어를 이용

=>Docker는 Linux 만 지원하므로 운영체제에 제한이 있음

 

10)주요 도구

=>containerd

- LXC 를 이용한 Container 를 구동시켜주는 도구

- Image 전송 및 스토리지에서 Container 실행 및 감독, 네트워크 연결 까지 Container 의 life Cycle 을 관리하는 도구

 

=>Buildkit

-Dockerfile의 설정 정보를 이용해서 Docker image 를 빌드하는 도구

 

=>Docker CLI

-Docker 명령을 수행하는 명령행 도구

-터미널에 명령을 입력하면 CLI 가 명령을 받아서 해석한 후 containerd 에게 명령을 전달해서 수행

 

11)용도

=>PaaS 서비스를 가능하게 하는 개발 환경을 제공하는 것

 

12)Docker Engine 및 CLI 설치

=>windows와 mac은 docker 사이트에서 회원가입하고 다운로드 받아서 설치

=>windows 는 wsl2 를 설치해야 합니다

 

 

13)기본 사용

=>이미지 다운로드: docker pull hello-world

 

=>도커 이미지 확인:docker images (docker image ls)

 

=>이미지를 가지고 컨테이너 생성:docker run hello-world

 

=>컨테이너 확인:docker ps (실행중인것만 나옴)

 

=>모든 컨테이너 확인:docker ps -a (모든 컨테이너 출력)

 

 

14)정보 확인

=>docker version:도커의 버전확인

docker -v:버전만 확인

 

=>docker info:도커의 구성 정보 및 현재 상태 확인

 

=>docker system df:도커의 디스크 사용량 확인

 

=>docker system events:도커 관련 이벤트 정보를 표시하는 명령

-하나의 터미널에서 docker system events 명령을 수행

 

-다른 터미널에서 명령을 수행

docker run -dit -p 80:80 --name=webapp nginx

이 명령은 모니터링하는 명령어

 

4.Container

1)Docker Container 기반의 애플리케이션을 개발 과정

=>애플리케이션 코드를 개발

 

=>Base Image 을 이용한 Dockerfile을 작성

 

=>Dockerfile Build 을 이용한 이미지 생성

 

=>생성된 이미지를 이용해서 컨테이너를 실행하고 컨테이너 애플리케이션 서비스를 테스트

 

=>여러 개의 컨테이너를 가지고 개발하는 경우는 Docker Compose 을 이용해서 다중 컨테이너를 실행하고 마이크로 서비스를 테스트

 

마이크로서비스를 만들때 기능 위주(개발자 생각)로 만드는 경우도 있고 동일한 환경을 사용하는 서비스 위치(엔지니어 입장)로 만드는 경우도 있습니다.

 

=>로컬 및 원격 저장소에 이미지를 저장(push)

 

=>Code Repository를 이용해서 Dockerfile 관리

 

=>동일한 환경에서 지속적 애플리케이션 개발을 수행

 

2)Docker 명령어 사용법

=>거의 모든 명령어는  docker로 시작

터미널에서 docker 로 시작하는 명령어를 입력하면 이 명령은 docker cli 해석을 해서 수행

 

=>기본형식

docker 명령어 옵션 대상 인자

- penguin 이미지 다운로드 받기:docker image pull penguin

  image pull 이 명령어 이고 penguin 이 대상

 

-penguin 컨테이너를 penguin 이미지를 가지고 백그라운드에서 실행:docker container run -d penguin

 

3)컨테이너 관련 명령어

=>docker container 로 시작

start       실행    i 

stop       중지

create   생성     name d,i,t

run        실행     name,d,i,t,e,v,p

rm         삭제      f,v

exec     실행 중인 컨테이너 속에서 프로그램 실행    i,t

ls          목록출력 a

cp         컨테이너와 호스트 간에 복사

commit  도커컨테이너를 이미지로 변경

 

-대부분의 명령이 container 를 생략해도 됩니다

 

 

4)이미지 관련 명령

=>docker image 로 시작

pull    이미지 다운로드

rm      이미지 삭제

ls        이미지 확인

build     도커 이미지를 생성하는 것으로 t 옵션을 종종 이용

 

5)볼륨 조작을 위한 명령

=>볼륨:데이터를 저장하기 위한 기능

=>docker volume 으로 시작

 

create      생성하는데 --name 을 이용해서 이름을 생성

inspect    상세정보 출력

ls             목록 출력

prune       현재 마운트 되지 않은 모든 볼륨 삭제

rm            특정 볼륨 삭제

 

6)네트워크 조작을 위한 명령

=>여러 개의 컨테이너가 통신을 하기 위한 기능이 네트워크

=>docker network으로 시작

 

connect

disconnect

create

inspect

ls

prune

rm

 

7)기타 명령어

checkpoint 

 

node:도커 스웜을 위한 명령어

 

plugin

 

secret

 

service

 

stack

 

swarm

 

system

 

8)단독으로 사용되는 명령어

login

 

logout

 

search

 

version

 

5.Image 관련 명령

1)docker search:

=>이미지 검색 명령

=>Docker Hub 에서 이미지를 검색해주는 명령

=>형식

docker search [options] 검색키워드

=>동일한 이미지가 여러 개 있는 경우 start 순으로 출력

=>공식 이미지는 네임스페이스가 생략될 수 있음

docker search mysql

 

-상단의 4개의 이미지는 이미지 이름만 존재하고 나머지 이미지들은 Repository 이름/이미지 이름의 형태

Repository 이름이 없는 경우는 공식 이미지

되도록이면 Repository 이름이 없는 이미지를 사용하는 것을 권장

 

=>검색 개수 제한

--limit 개수

docker search --limit 5 mysql

 

2)docker pull

=>이미지를 다운로드 받는 명령

docker [image] pull [OPTIONS] 이미지이름 [:TAG | @IMAGE_DIGEST]

-image는 생략 가능

-태그를 생략하면 latest 버전이 다운로드

=>결과 확인

하나의 이미지는 여러 개의 layer 로 구성될 수 있어서 다운로드 될 때 layer 의 구성을 출력하면서 다운로드 됩니다.

분산 해시 값(Digest-이미지의 고유한 이)이나 버전 등이 표시

=>jenkins/jenkins:lts 버전을 옵션없이 다운로드

=>옵션

-a , --all-tags:저장소에 태그로 지정된 여러 Image를 전부 다운로드

--disable-content-trust:이미지를 다운로드 할 때 이미지를 검증하는데 이 옵션을 사용하면 이미지 검증을 하지 않을 수 있습니다. 기본값은 true

--platform: 플랫폼을 지정하는 것으로 --platform=linux 의 형태로 지정하는데 Mac 에서 이미지를 다운로드 받아서 구동할 때 지정하는 경우가 많음

 

-q,--quiet:image 다운로드 과정에서 나타나는 상세 출력 숨김

 

=>실습

-debian 리눅스의 최신버전 다운로드

             docker pull debian

-gcr.io/google-samples/hello-app:1.0 최신버전 아니면 반드시 버전을 작성해야함

             docker pull gcr.io/google-samples/hello-app:1.0

 

3)Image 정보 확인

=>형식

docker image ls

docker images

 

=>정보

REPOSITORY:이미지 이름

TAG: 버전 정보, 다운로드 받을 때 지정하지 않으면 latest

IMAGE ID: 이미지의 고유한 이름으로 원래 64글자지만 편의상 앞의 12글자만 표시

CREATED:이미지가 생성된 날짜

SIZE:이미지 용량

 

4)이미지의 세부정보 확인

=>docker image inspect [OPTIONS] 이미지이름

=>옵션으로 --format 이나 -f을 이용하면 JSON 형식의 정보 중 원하는 형식의 정보만 출력이 가능

=>세부 정보

 

=>실습

docker image pull httpd

docker image inspect httpd

docker image inspect --format="{{.Created}}" httpd

 

5)docker image 를 구성하고 있는 Layer 와 실행 정보 확인

=>docker image history 이미지이름

=>이미지를 구성하는 각 레이어와 레이어가 만들어진 날짜 및 크기를 출력

=>httpd 의 각 layer 구성을 확인

docker image history httpd

-이미지를 만들기 위해서 수행할 명령어를 확인 가능

-각 명령어를 레이어라고 하기도 하는데 용량이 있으면 레이어라는 표현을 사용하고 그렇지 않으면 명령어와 환경설정이라고 합니다.

 

6)이미지 업로드

=>docker hub에 만든 이미지를 업로드하는 것

=>관련 명령

docker login

docker logout

 

=>이미지 이름과 태그

-docker 에서는 레지스트리에 업로드 할 때 사용하는 이름을 Tag 라고 합니다.

-형식

레지스트리주소/레포지토리이름:버전 형태로 태그는 만들어집니다.

-태그 이름 부여

docker tag 원본이미지이름[:버전]변경할이미지이름[:버전]

-docker hub에 업로드

docker push 이름

 

-이미지 확인:docker images

기존의 httpd의 이미지를 이용해서 myhttpd:1.0으로 수정

docker tag  [IMAGEID] myhttpd:1.0

기존 httpd의 image 이름

 

기존의 httpd의 이미지를 이용해서 myhttpd:2.0으로 수정

docker tag httpd:latest myhttpd:2.0

 

 

-업로드를 위한 이미지 이름 생성:이미지 앞에 DockerHUb의 아이디/가 추가되어야 합니다.

docker image tag httpd:latest DockerHub아이디/이미지이름

 

=>docker hub에 이미지 업로드

-이미지의 이름이 dockerhub아이디/이미지이름:버전의 형태이어야 합니다.

-Docker Hub을 이용해서 CI/CD 를 구축하고자 할 떄는 버전을 변경해가면서 적용합니다.

-이미지가 없으면 docker pull httpd 로 httpd 라는 이미지를 다운로드

-업로드할 이미지를 생성: 지금은 기존 이미지를 복사해서 만들지만 대부분은 Dockerfile 을 이용해서 생성

docker image tag httpd:latest byeoungkwon/myhttpd:3.0

 

-업로드

docker image push byeoungkwon/myhttpd:3.0

다시 가져오는 경우는

docker image pull byeoungkwon/myhttpd:3.0

 

7)Docker Image 를 파일로 관리

=>원본 Image 를 복제를 해서 tar 확장자로 저장하는 것이 가능

=>이미지를 tar로 저장하는 이유

-Docker Hub 로 부터 내려받은 이미지를 내부망에서 사용하고자 하는 경우

=>저장 명령어

docker image save[옵션] 이미지이름 > 파일경로

=>로드 명령어

docker image load < 파일경로 

=>eclipse/mysql을 tar로 저장하고 불러오기

-이미지를 다운로드

docker pull eclipse/mysql

 

-이미지를 확인

docker images

 

-이미지를 압축

docker image save eclipse/mysql >test-mysql57.tar

 

-기존 이미지 삭제

docker image rm eclipse/mysql

-이미지를 확인

docker images

 

-이미지 로드

docker image load <test-mysql57.tar

 

=>이미지를 압축할 때 뒤에 .gz를 추가하면 용량이 줄어듭니다

layer 가 많게 되면 이게 더 유용

 

=>모든 이미지 저장

docker image save -o 파일명$(docker image ls -q)

 

8)이미지 삭제

=>형식

docker image rm(docker rmi) [옵션] [이미지이름[:태그] | 이미지아이디)

 

=>실습

-이미지 다운로드:docker pull ubuntu

-이미지 확인:docker images

-이미지 삭제:docker image rm ubuntu

-이미지 확인:docker images

 

=>삭제할 때 latest 버전은 태그명을 생략가능하지만 그 이외의 버전을 생략 불가능

=>관련된 모든 이미지를 삭제할 때는 -f 옵션을 추가

=>셸 스크립트 변수 활용:Windows 에서는 안됨

-이미지 전체 삭제:docker rmi $(docker -images -q)

-특정한 이미지 이름을 포함한 이미지만 삭제:docker rmi$(docker images | grep debian) 

debian을 포함한 모든 이미지 삭제

-특정한 이미지 이름(debian)을 포함하지 않은 이미지만 삭제: docker rmi$(docker images | grep -v debian) 

debian을 포함하지 않는것만 삭제

 

=>컨테이너로 사용하지 않는 이미지를 삭제

docker image prune -a 

 

=>48시간 이전의 모든 이미지를 삭제

docker image prune -a -f --filter "until=48h"

 

6.Container 관련 명령

1)Container로 애플리케이션을 실행

=>이미지는 읽기 전용의 불변 값으로 만들어지는데( 정적 - Class) 이러한 이미지를 바탕으로 도커 엔진은 컨테이너(동적-instance)를 생성할 수 있는데 이 때 이미지와 함께 읽고 쓰기가 가능한 레이어를 추가해서 만들어짐

 

2)Container는 Process

=>컨테이너는 이미지를 기반으로 만들어지는 snapshot

=>컴퓨터 프로그램이 실행중이면 프로세스라고 하는데 컨테이너는 격리된 공간에서 동작하는 프로세스

=>docker run 이라는 명령어로 컨테이너가 만들어지고 동작하게 되는데 이는 서버 호스트 운영체제가 독립적으로 동작하는 것과 유사

 

3)Image를 다운로드 받아서 Container 생성하고 실행 과정

=>gihyodocker/echo:latest 이미지를 다운로드

docker pull gihyodocker/echo:latest

 

=>컨테이너로 실행:하나의 애플리케이션 실행

docker container run -t -p 9000:8000 gihyodocker/echo:latest

 

=>웹 브라우저에서 localhost:9000으로 접속

 

4)Container 수동 제어

=>컨테이너 생성:docker create -it --name container-test1 ubuntu

 

=>실행중인 컨테이너 확인:docker ps

 

=>모든 컨테이너 확인:docker ps -a

 

=>컨테이너 실행:docker start container-test1

 

=>컨테이너 접속:docker attach container-test1

 

=>셸에서 exit 입력해서 빠져 나옴

 

=>컨테이너 삭제:docker rm container-test1

 

5)docker run으로 한번에 수행

docker run -it --name container-test1 ubuntu bash

 

6)Container 의 생명 주기

=>실행 상태

-docker run 명령의 인자로 지정된 Docker Image 를 기반으로 Container 가 생성되면 Image 를 생성했던 Dockerfile 에 포함된 CMD 그리고 ENTRY POINT 명령에 정의된 애플리케이션이 실행되고 이 애플리케이션이 실행중인 상태가 Container 가 실행중

-실행이 끝나면 정지 상태가 됨

 

=>정지상태

-실행중인 Container 를 명시적으로 정지시키거나 Container  에서 실행된 애플리케이션이 정상/오류 여부를 막론하고 종료된 경우에는 Container 가 정지가 됩니다

-Container 가 정지가 되면 더 이상 동작하지 않지만 종료되던 시점의 상태가 저장되서 남아있기 떄문에 다시 실행할 수 있습니다

 

=>파기 상태

-정지상태에 Container 는 명시적으로 파기하지 않는 이상 디스크에 그대로 남아있음

-컨테이너를 자주 생성하고 정지해야 하는 상황에서는 컨테이너가 점점 디스크의 용량을 많이 차지할 것이므로 사용하지 않는 Container 는 삭제하는것이 바람직

 

7)docker run

=>이 명령은 docker image pull, docker container create, docker container start + commend 가 합쳐진 명령

이미지가 존재하면 바로 컨테이너를 생성하지만 이미지가 존재하지 않으면 다운로드 받아서 컨테이너를 생성하는 명령

=>형식

docker run [옵션] 이미지이름 (인자)

-인자는 사용되는 이미지에 따라 달라짐

-MySQL 같은 경우는 사용할 데이터베이스, 유저 ID 및 PW , 인코딩 방식등을 인자로 받을 수 있음

 

=>옵션

--name 컨테이너이름

컨테이너 이름을 설정하는 옵션으로 생략하면 자동으로 부여

 

-p [Host Port]:[Container Port] 

컨테이너 내부 포트를 외부에 공개해서 접속할 수 있도록 해주는 port forwarding

 

-P, --publish-all = [true | false ]

컨테이너 내부의 노출된 포트를 외부의 임의의 포트에 port forwarding 

 

-v , --volume=호스트경로:컨테이너 경로

볼륨 마운트 - host 의 디렉토리를 컨테이너에 연결해서 데이터를 공유

 

--net 네트워크이름

네트워크(다른 컨테이너들에 연결할 때 사용하는 묶음)에 연결

 

-i , --interface

대화식 모드로 연결

 

-t

단말 디바이스 할당

 

-d,--detach=true

백그라운드에서 컨테이너를 실행한 후 컨테이너 아이디를 등록

계속해서 실행되고 있어야 하는 애플리케이션에 사용

 

-e,--env

환경 변수 설정 

 

--rm:컨테이너가 종료될 때 컨테이너를 자동 파기

 

--restart (no | on-failure | on-failure:횟수 | always)

재시작 옵션

 

-h:호스트이름

호스트이름 설정하는 것으로 미지정시는 컨테이너 ID가 이름으로 설정

 

--link = [container:컨테이너아이디]

다른 컨테이너와 연결할 때 사용

 

=>-d는 컨테이너를 백그라운드로 실행하는 옵션이고 -t와 -i는 컨테이너 내부에 터미널로 접속하기 위해서 사용하는 옵션

 

-d 옵션 없이 컨테이널르 실행하게 되면 실행된 컨테이너가 프로그램의 실행을 마칠 때 까지 터미널의 제어를 차지하기 때문에 그 다음 명령을 입력할 수 없는 상태가 됩니다.

 

-i 와 -t 옵션 없이 컨테이너를 실행하면 컨테이너 안에 filesystem에 접근이 불가능하므로 container 안의 설정을 변경해야 하는 경우 i와 t 옵션을 가지고 실행해야 합니다

 

=>한번만 실행되도 종료되는 애플리케이션은 d나 i그리고 t 옵션 없이 실행

 

=>현재 실행 중인 컨테이너 확인: docker ps

 

8)현재 실행중인 컨테이너 확인

=>형식

docker ps [옵션]

=>옵션

a:모든 컨테이너를 출력

=>출력항목

CONTAINER ID:컨테이너 식별자로 64글자이지만 12글자만 출력

IMAGE: 컨테이너를 만들떄 사용한 이미지 이름

COMMAND: 컨테이너 실행 시에 실행하도록 설정된 프로그램의 이름 또는 명령어

CREATED: 컨테이너 생성 후 경과된 시간

STATUS: 컨테이너의 현재 상태로 실행 중이면 UP 그리고 종료된 상태면 Exited

PORTS: 포트 포워딩
NAMES: 컨테이너 이름

 

9)컨테이너 중지와 삭제

=>중지: docker stop 컨테이너ID 또는 이름

=>전체 중지:docker stop $(docker ps -a -q)

 

=>삭제:docker rm 컨테이너ID 또는 이름

=>전체 삭제: docker rm $(docker ps -a -q)

 

10)실습

=>Apache 이미지(httpd)를 컨테이너로 실행

-컨테이너 생성 및 실행

docker run --name apa000ex1 -d httpd

 

 

-컨테이너 중지

docker stop  apa000ex1 

 

-확인

docker ps

 

-컨테이너 삭제

docker rm apa000ex1

 

-확인

docker ps -a

 

=>포트 포워딩

-port forwarding: 내부의 개방된 포트를 외부에서 접근할 수 있도록 HOST의 포트와 매핑 시키는 것

                            포트포워딩을 하게 되면 매핑된 외부 포트를 이용해서 내부 포트로 접근이 가능

-Apache 는 80번 포트을 이용해서 웹 사이트에 대한 접근을 기다렸다가 사용자가 이 포트를 통해서 접근해오면 요청을 확인하고 웹 사이트의 페이지를 제공

-포트포워딩 하는 방법

-p 호스트포트: 컨테이너 내부 포트

 

=>Apache 의 80번 포트를 외부에서 접근하도록 설정

-컨테이너 생성 및 실행

docker run --name apa000ex2 -p 8080:80 -d httpd

-웹브라우저에서 접속확인

localhost:8080

 

7.다양한 이미지

1)리눅스 운영체제가 담긴 이미지

=>Ubuntu

=>centos

 

=>debian

=>fedora

 

=>busybox

=>alpine:busybox 기반으로 가볍고 간단한 보안성을 목적으로 한 리눅스 배포판으로 일반적으로 컨테이너 환경에서 많이 이용 실제 리눅스를 사용하는게 아니라서 많이 사용

 

2)web server

=>httpd:하나의 웹 애플리케이션을 배포할 때 이용

=>nginx:여러개의 웹 애플리케이션을 하나로 접근해서 사용할 수 있도록 할 때 이용, Load Balancer 의 역할로 사용가능

 

3)Database

=>mysql: -e 옵션을 이용해서 MYSQL_ROOT_PASSWORD을 이용해서 루트 패스워드를 지정해야 함

=>mariadb: -e 옵션을 이용해서 MYSQL_ROOT_PASSWORD을 이용해서 루트 패스워드를 지정해야 함

=>postres: -e 옵션을 이용해서 POSTGRES_ROOT_PASSWORD을 이용해서 루트 패스워드를 지정해야 함

=>oracle:버전에 따라서 설정하는 옵션이 다름

=>mongodb: 

=>redis:

 

4)프로그래밍 언어의 런타임(프로그래밍 언어로 만들어진 애플리케이션을 실행할 수 있도록 해주는 소프트웨어)

=>openjdk:Java

=>python

=>php

->ruby

=>perl

=>gcc: C언어

=>node

 

5)nginx 를 컨테이너로 실행

=>80번 포트를 이용해서 사용자의 요청을 받아들임

docker run --name webserver1 -p 8001:80 -d nginx

 

=>브라우저에서 확인

localhost:8001

 

 

-리소스 사용량 확인

docker stats webserver1

 

-실행중인 프로세스 확인

docker top webserver1

 

-컨테이너의 접근 로그를 docker 명령으로 확인

docker logs -f webserver1

 

-컨테이너 중지

docker stop webserver1

 

-이전에 만든거 시작

docker start webserver1

다시 run을 하게 되면 리소스 낭비가됨

 

6)실행 중인 컨테이너 제외하고 모든 컨테이너를 제거

docker container prune

 

7)사용하지 않는 Image, Container, Volume, Network 등 모든 Docker 리소스를 삭제

docker system prune

 

8)Ubuntu설치

=>docker run --name ubuntu ubuntu

 

=>제거

docker rm ubuntu

 

=>접속

docker attach ubuntu

'Study > Cloud,Docker,Kubernetes' 카테고리의 다른 글

Kubernetes  (0) 2024.04.08
Docker(4)-DockerCompose  (0) 2024.04.06
Docker(3)-Dockerfile  (0) 2024.04.04
Docker(2)  (0) 2024.04.03
Cloud(1)-개요  (0) 2024.04.01