1. Docker
1) 개요
- Container 형 가상화 기술을 구현하기 위한 애플리케이션(Docker Engine) 과 이 애플리케이션을 조작하기 위한 명령행 도구(Docker CLI)로 구성되는 애플리케이션
- 같이 사용하는 프로그램 데이터를 다른 컨테이너 와 격리시키는 기능을 제공하는 애플리케이션
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
- chroot(change root)
- 특정 디렉토리를 최상위 디렉토리인 root로 인식하게끔 설정하는 Linux 명령
- cgroups
5) 데이터나 프로그램을 격리시켜야 하는 이유
- 대부분의 프로그램은 프로그램 단독으로 동작하는 것이 아니라 어떤 실행 환경이나 라이브러리 또는 다른 프로그램을 이용해서 동작
- 이러한 프로그램을 하나의 운영체제에 설치해서 사용하는 경우 한 프로그램의 변경이 다른 프로그램에 영향을 줄 수 있어서 각각의 프로그램을 격리시켜서 영향을 미치지 못하도록 하기 위해서
6) 동작 원리
- 일반적인 리눅스가 설치된 컴퓨터
- 하드웨어 > 커널 > 주변 부분 > 소프트웨어
- 도커가 설치된 경우
- 하드웨어 > 커널 > 도커 엔진 > 소프트웨어
- Window 와 Mac Os에서 Docker 구동
- Linux 운영체제를 끌어들여 사용
- Windows 에서는 WSL2라는 프로그램을 이용하여 Linux 사용
7) Image와 Container
- 하나의 이미지로 여러 컨테이너를 생성할 수 있으며 이미지가 없으면 컨테이너를 생성할 수 없음
- 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 Engin 및 CLI 설치
- Windows와 Mac은 Docker 사이트에서 회원가입 후 Docker Desktop을 다운답다 설치
- Windows는 wsl2도 함께 설치해야함
13) 기본 사용
- 이미지 다운로드 : docker pull hello-world

- 도커 이미지 확인 : docker images

- 이미지로 컨테이너 생성 : docker run hello-world


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

14) 정보 확인
- 도커의 버전 확인 : docker version
- 버전만 확인 : docker -v
- 도커의 구성 정보 및 현재 상태 확인 : docker info
- 도커의 디스크 사용량 확인 : docker system df
- 도커 관련 이벤트 정보를 표시 : docker system events
2. Container
1) Docker Container 기반의 애플리케이션 개발 과정
- 애플리케이션 코드 개발
- Base Image를 이용한 Dockerfile 작성
- Dockerfile Build를 이용한 이미지 생성
- 생성된 이미지를 이용해 컨테이너 실행 후 애플리케이션 서비스 테스트
- 여러 컨테이너를 가지고 개발한 경우 Docker-Compose를 이용해 다중 컨테이너를 실행하여 테스트
- 마이크로 서비스를 만들 때 기능 위주로 만드는 경우도 있고 동일한 환경을 사용하는 서비스로 만드는 경우도 있음
- 로컬 및 원격 저장소에 Image 저장 (push)
- Code Repository를 이용해 Dockerfile 관리
- 동일한 환경에서 지속적 애플리케이션 개발 수행
2) Docker 명령어 사용
- 거의 모든 명령어는 docker로 시작
- 터미널에서 docker로 시작하는 명령어를 입력하면 docker cli 해석을 하여 수행함
- 기본 형식
- docker 명렁어 옵션 대상 인지
- penguin 이미지 다운로드 받기
- docker image pull penguin
- penguin 컨테이너를 penguin 이미지를 활용해 백그라운드에서 실행
- docker container run -d penguin
- penguin 이미지 다운로드 받기
- docker 명렁어 옵션 대상 인지
3) 컨테이너 관련 명령어
- docker container 로 시작
- start : 실행
- stop : 중지
- create : 생성
- run : 실행
- rm : 삭제
- exec : 실행중인 컨테이너 속에서 프로그램을 실행
- ls : 목록 출력
- cp : 컨테이너와 호스트 간 복사
- commit : 도커 컨테이너를 이미지로 변환
- 대부분의 명령이 container를 생략해도 된다.
4) 이미지 관련 명령
- docker image로 시작
- pull : 이미지 다운로드
- rm : 이미지 삭제
- ls : 이미지 확인
- build : 도커 이미지를 생성하는 것으로 t 옵션을 종종 이용
5) 볼륨 조작을 위한 명령
- 볼륨 : 데이터를 저장하기 위한 기능
- docker volume 으로 시작
- create :생성 ( --name 을 이용해 이름 생성)
- inspect : 상세 정보 출력
- ls : 목록 출력
- prune : 현재 마운트 되지 않은 모든 볼륨 삭제
- rm : 특정 볼륨 삭제
6) 네트워크 조작을 위한 명령
- 여러 개의 컨테이너가 통신을 하기 위한 기능이 네트워크 (network)
- docker netwokr 로 시작
- 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] 검색 키워드
- 동일한 이미지가 여러 개 있는 경우 stars 순으로 출력
- 공식 이미지는 네임스페이거 생략될 수 있음
- mysql 이미지 검색
- 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 버전이 다운로드 됨
- docker [image] pull [OPTIONS] 이미지이름[:TAG|@IMAGE_DIGEST]
- 결과 확인
- 하나의 이미지는 여러 개의 layer로 구성될 수 있어서 다운로드 될 때 레이어의 구성을 출력하면 다운로도 된다.
- 분산 해시 값 (Digest - 이미지의 고유한 이름)이나 버전 등이 표시
- Jenkins / Jenkins:lts 버전을 옵션 없이 다운로드
- 옵션
- -a, --all-tags : 저장소에 태그로 지정된 여러 Image를 전부 다운로드
- --disable-content-trust : 이미지를 다운로드 할 때 이미지를 검증하는데 이 옵션을 사용하면 이미지 검증을 생략
- --platform : 플랫폼을 지정하는 것으로 --platform=linux 의 형태로 지정하며 Mac에서 이미지를 다운받아 구동할 때 지정하는 경우가 많음
- -q, --quiet : 이미지 다운로드 과정에서 나타나는 상세 출력을 숨김
- 실습
- debian 리눅스의 최신버전 다운로드
- docker pull debian
- gcr.io/google-samples/hello-app:1.0 이미지를 다운로드
- docker pull gcr.io/google-samples/hello-app:1.0
- debian 리눅스의 최신버전 다운로드

3) Image 정보 확인
- 형식
- docker image ls
- docker images
- 정보
- REPOSITORY : 이미지 이름
- TAG : 버전 정보, 다운로드 받을 때 지정하지 않으면 latest
- IMAGE ID : 이미지의 고유한 이름으로 원래는 64글자지만 편의상 앞 12글자만 표시
- CREATED : 이미지가 생성된 날짜
- SIZE : 이미지 용량
4) 이미지의 세부 정보 확인
- docker imgae 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
- 이미지를 만들기 위해 수행할 명령어 확인 가능
- 각 명령어를 레이어라고 하기도 하는데 용량이 있으면 레이어, 그렇지 않으면 명령어와 환경 설정이라고 함
- docker image history httpd
6) 이미지 업로드
- docker hub에 만든 이미지를 업로드 하는 것
- 로그인 관련 명령어
- docker login
- docker logout
- 이미지 이름과 태그
- docker에서는 레지스트리에 업로드 할 때 사용하는 이름을 Tag라고 한다.
- 형식
- 레지스트리주소/레포지토리이름:버전 형태로 Tag가 생성
- Tag 이름 부여
- docker tag 원본이미지이름[:버전] 변경할이미지이름 [:버전]
- docker hub에 업로드
- docker push 이름
- 이미지 확인 : docker images
- 기존 httpd 이미지를 이용해 myhttpd:1.0으로 생성
- docker tag ac45b24b92cc myhttpd:1.0
- ac45b24b92cc는 기존 httpd 의 image 이름
- docker tag ac45b24b92cc myhttpd:1.0
- 기존 httpd 이미지를 이용해서 myhttpd:2.0 으로 생성
- docker tag httpd:latest myhttpd:2.0
- 업로드를 위한 이미지 이름 생성: 이미지 앞에 DockerHub의아이디/ 가 추가되어야 함
- docker tag httpd:latest DockerHub아이디/myhttpd:3.0
- docker hub에 이미지 업로드
- 이미지의 이름이 dockerhub아이디/이미지이름:버전 의 형태여야 함
- Docker Hub를 이용해서 CI/CD를 구축하고자 할 때는 버전을 변경해가면서 적용
- 이미지가 없으면 docker pull httpd 로 httpd 라는 이미지를 다운로드
- 업로드할 이미지를 생성: 지금은 기존 이미지를 복사해서 만들지만 대부분은 Dockerfile을 이용해서 생성
- docker image tag httpd:latest dxjh/myhttpd:3.0
- 업로드
- docker image push dxjh/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
- 이미지를 확인

-
- 이미지를 압축 (444MB)
- docker image save eclipse/mysql > test-mysql57.tar
- 기존 이미지 삭제
- docker image rm eclipse/mysql
- 이미지를 압축 (444MB)

-
- 이미지를 확인
- docker images
- 이미지를 확인

-
- 이미지 로드
- docker image load < test-mysql57.tar
- 이미지 로드
- 이미지를 압축할 때 뒤에 .gz를 추가하면 용량이 줄어든다.
- 모든 이미지를 저장
- docker image save -o 파일명 $(docker image ls -q)
8) 이미지 삭제
- 형식
- docker imgae rm(docker rmi) [옵션] {이미지이름[:태그] | 이미지아이디}
- 삭제할 때 latest 버전은 태그명을 생략해도 되지만 그 이외 버전은 생략 불가
- 관련된 모든 이미지를 삭제할 때는 -f 옵션을 추가한다.
- 셀 스크립트 변수 활용 (Windows에서는 불가)
- 이미지 전체 삭제 : docker rmi $(docker -images -q)
- 특정 이미지 이름을 포함한 이미지만 삭제 : docker rmi $(docker images | grep 이미지명)
- 특정 이미지 이름을 포함하지 않은 이미지만 삭제 docker rmi $(docker images | grep -v 이미지명)
- 컨테이너로 사용하지 않은 이미지를 삭제
- docker image prune -a
- 48시간 이전의 모든 이미지를 삭제
- docker image prune -a -f --filter "until=48h"
#비전공자 #성장기 #DX #AI #빅데이터 #개발자 #김제이 #LG #LG헬로비전 #dxdataschool #2기
#부트캠프 #데이터분석 #Docker
'DX Data School' 카테고리의 다른 글
쿠버네티스 (Kubernetes) (0) | 2024.04.08 |
---|---|
Docker 2 (0) | 2024.04.08 |
Container 와 Virtualization (0) | 2024.04.05 |
CI/CD (0) | 2024.04.05 |
MSA 구성 요소 및 MSA 패턴 (1) | 2024.04.01 |