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 |