수업 65일차

galoo·2023년 10월 4일
0

HelloVision Dx Data School

목록 보기
59/72

✔ Docker Hub, Image, Container

Image

  • Docker에서 사용하는 애플리케이션의 개념
  • 컨테이너를 만들어내느 설계도 역할을 수행
  • 하나만 있으면 여러 개의 컨테이너를 생성할 수 있음
  • 컨테이너로부터 이미지를 생성하는 것도 가능함

종류

  • 운영체제와 유사한 형태
    - 실제 운영체제를 학습하는 용도로는 사용하기 어려움
  • 하나의 소프트웨어를 포함한 이미지
    - python, go, C, Java 등을 포함한 이미지
  • 소프트웨어 여러 개를 포함한 이미지
    - OS, Language, DB 등을 복합적으로 하나로 묶어서 하용하는 경우
    - 개발 환경을 설정하거나, 애플리케이션을 배포할 때 사용합니다.

Docker Hub

  • 이미지들을 배포하고 자유롭게 다운로드 할 수 있는 웹 저장소

Container

  • 이미지를 이용해서 실행되는 하나의 프로세스의 개념
  • 일반적으로는 하나의 컨테이너에 하나의 프로그램만 사용하는 것을 권장하지만, 애플리케이션을 배포할 때는 이 원칙을 지키지 않는 경우도 존재합니다.
  • Docker Container는 쓰고 버리는 일회용품
  • Container에 저장한 데이터는 원칙적으로 Container가 폐기된다면 소멸된다.
    - 대신, Container에 물리적 서버의 디스크를 마운트해서 데이터를 저장하는 것이 가능함

✔ 성질

  • 환경을 격리

독립된 환경

  • 여러 개의 애플리케이션을 실행할 수 있음
  • 동일한 애플리케이션을 여러 개 실행할 수 있음

이미지를 만들 수 있음

  • 이동이 편리함
  • 동일한 컨테이너를 쉽게 만들 수 있음
    - 환경 이동이 쉬움
    - 개발 환경을 배포하기가 쉬움
  • Docker Registry
    - 이미지를 내려받는게 수월해짐 (이미지를 직접 만들지 않아도 됨)
    - 이미지 교체하기도 수월해짐 (업데이트가 쉽고 SW 교체가 수월)

커널이 없음

  • 커널이 없음 == 운영체제를 직접 설치하지 않음
  • 가벼움
  • 배포판을 바꾸는게 수월함

단점

  • 운영체제의 동작을 완전히 재현하지는 못하기 때문에 운영체제를 세밀하게 조작하는 작업에는 맞지 않는다
  • 리눅스 환경에서만 사용이 가능하다

주 용도

  • PaaS 서비스를 가능하게 하는 소프트웨어 개발 환경을 제공
  • 기존 IaaS(AWS, GCE, Azure, NHN, OCI, Open Stack 등)
    \rarr LXC/Docker 기술
    \rarr 컨테이너로 구동되는 애플리케이션

구성 요소

Docker Engine

  • Docker를 이용한 애플리케이션 실행 환경 제공을 위한 핵심 요소

Docker Hub

  • 컨테이너 이미지를 공유하는 클라우드 서비스

Docker Compose

  • 의존성있는 독립된 컨테이너에 대한 구성 정보를 yaml 코드로 작성하여 일원화된 애플리케이션 관리를 가능하게 하는 도구 (Dockerfile도 여기에 해당)

Docker Registry

  • Docker Container 이미지를 push/pull 할 수 있는 레지스트리 구축에 사용하는 도구

Docker Machine

  • Docker 실행 환경을 생성하기 위한 도구 (Docker Desktop)

Docker Swarm

  • 여러 Docker 호스트를 클러스터로 구축하여 관리할 수 있는 Docker 오케스트레이션 도구로, 쿠버네이스토 있음

Docker Engine 설치

  • Docker Hub에서 회원가입 진행
  • Windows의 경우에는 Linux 커널을 다운로드 받아서 설치를 해야 한다.
    - wsl --install
    - wsl --set-default-version 2
  • Docker Desktop 다운로드 받고 설치하기

✔ 기본 명령어

이미지 다운로드

  • docker pull hello-world
  • 이미지 이름이 틀리지 않아서 다른 운영체제에서는 다운로드가 되는데 Mac M1 이상 프로세서에서 안된다면 --platform linux/amd64 추가하기

이미지 확인

  • docker images
  • desktop 설치하였다면 images 탭을 확인하자

컨테이너 생성

  • docker run hello-world , run 이미지 이름

컨테이너 확인

  • docker ps -a
  • desktop있다면 containers 탭에서 확인하자

docker 버전 확인

  • docker version
  • 도커는 client, server 버전 총 두개 (shell, kernel과 같은) 존재함
  • client는 사용자로부터 도커 명령을 받고 결과를 출력하는 역할
    - docker 명령을 수행하는 Command Line을 제공함
    - 명령을 도커 데몬에게 전달하고 도커 데놈이 수행한 결과를 출력함
  • server는 도커 엔진(도커 데몬)을 이용해서 컨테이너를 시작하고 운영하고 정지 등을 수행

도커 구성 정보 확인

  • docker info
  • 커널의 정보나 현재 컨테이너 수 등의 정보가 출력됩니다.

디스크 사용량 확인

  • docker system df

도커 관련 이벤트 정보를 표시

  • docker system events
  • 롤링 로그이며, 한 번에 최대 1,000개의 이벤트를 보유
  • 하나의 터미널에서 docker system events 명령을 수행
  • 다른 터미널에서 docker run -dit -p 80:80 --name=webapp nginx 명령을 수행
  • 이전 터미널에 이미지 다운로드 및 컨테이너 생성 로그가 기록된다.
  • filter 옵션 사용 가능
    - type, event, container 등의 옵션 사용 가능
    - docker system events --filter 'type=image' : 이미지 관련 로그만 출력
    - docker system events --filter 'event=stop' : stop 관련 이벤트 로그만 출력
    - docker system events --filter 'container=webapp' : webapp이라는 컨테이너의 이벤트 로그만 출력
  • 시간 설정 가능
    - docker system events --since 12h : 12시간 전 부터의 로그
  • 로그를 JSON 형태로 출력 가능
    - docker system events --format='{{json .}'
    - windows powershell은 가능, cmd에서는 "{{json .}" 으로 해야함
  • 로그를 출력하는 경우는 모니터링을 위해서인데, 일반적으로 PaaS 서비스에서 도커를 제공하는 경우, 어떤 명령들을 수행했는지 확인하기 위한 용도로 사용

Docker Registry

  • Image를 배포하는 장소
  • Docker Hub는 도커 제작사의 공식 도커 레지스트리

✔ Container Service

도커 컨테이너를 이용하는 애플리케이션 서비스 개발 과정

애플리케이션 코드 개발
\rarr 기본 이미지를 이용한 Dockerfile 작성
\rarr Dockerfile 빌드를 통한 새로운 이미지 생성
\rarr 생성된 이미지를 이용해서 컨테이너 실행(도커 컴포즈를 이용한 다중 컨테이너 실행 \rarr Micro Service 테스트)
\rarr 컨테이너 애플리케이션 서비스 테스트
\rarr 로컬 및 원격 저장소에 이미지를 저장
\rarr Git Hub 등을 활용한 Dockerfile 관리
\rarr 동일한 환경에서의 지속적 애플리케이션 개발 수행

Dockerfile?

  • 하나의 컨테이너를 생성하기 위한 설정

Dockercompose?

  • 두 개 이상의 컨테이너를 생성하기 위한 설정

Dockerswarm?

  • 여러 개의(동일한 모양) 컨테이너를 관리하기 위한 설정
  • 복제본 만들어서 관리하는, 쿠버네티스

IaC(Infrastructure as Code)

  • 컨테이너 동작에 필요한 모든 내용을 사전에 코드로 작성해서 Ansible, Vagrant와 같은 Infra Provisioning 도구로 자동화하게 되면, 필요할 때 마다 애플리케이션 및 서버 환경을 적은 비용으로 빠르게 개발하고 배포하고 확장할 수 있는데, 이를 IaC라고 한다.

Docker Container 관련 명령

  • 명령어는 무조건 docker로 시작
  • 명령어는 상위 커맨드와 하위 커맨드로 분류하는데, 상위 커맨드는 생략 가능

상위 커맨드

  • container : 컨테이너 관련 명령 - 생략 가능
    - start(실행), stop(정지), create(생성), run(이미지 다운로드 및 생성과 실행), rm(삭제), exec(컨테이너 안에서 프로그램을 실행), ls(컨테이너 목록 출력), cp(컨테이너와 호스트 간에 파일을 복사), commit(컨테이너를 이미지로 만듦)
  • image : 이미지 관련 명령 - 생략 가능
    - pull(다운로드), rm(삭제), ls(목록 출력), build(이미지 생성)
  • volume : 데이터를 저장하기 위한 명령
    - create(생성), inspect(상세 정보를 출력), ls, prune(마운트 되지 않은 볼륨을 삭제), rm
  • network : 여러 개의 애플리케이션을 하나로 묶기 위한 명령
    - connect(컨테이너를 연결), disconnect, create, inspect, ls, prune, rm

  • 상위 커맨드 없이 사용하는 커맨드
    - checkpoint
    - node
    - plugin
    - secret : 비밀값 정보를 관리
    - service : 도커 스웜의 서비스를 관리하는 기능
    - stack : 여러 도커 스웜 또는 쿠버네티스에서 여러 서비스를 합쳐 구성한 스택 관리
    - swarm : 도커 스웜 관리
    - system : 도커 엔진의 정보를 확인
    - login
    - logout
    - search : 도커 레지스트리 검색
    - version
  • 프로그램 실행 도중에는 변경되지 않지만, 환경이 변경되는 경우에 수정해야 하는 문자열이나 숫자가 있다면, 이런 코드는 하드코딩을 하지 말고 별도의 설정파일을 만들어서 설정 파일에서 읽어오는 방식을 취하는 것이 좋습니다.

Image 관련 명령

  • docker search [--limit 개수] 이미지이름
    - 이미지 조회
    - 이미지는 stars 순으로 조회
  • docker image pull [옵션] 이미지이름[:TAG|@IMAGE_DIGEST]
    - 이미지 다운로드
    - pull 명령은 image에만 존재하는 명령이기에 image를 생략해도 된다.
    - 이미지 이름 뒤에는 TAG가 사용되는데, 가장 최근(마지막) 버전은 latest태그가 자동 부여
    - TAG를 생략하면 latest 태그가 붙은 버전을 의미
    - IMAGE_DIGEST는 거의 사용하지 안흔ㄴ데, 이 값은 Docker Hub내에서 구분하기 위해 만든 해시 값
  • 옵션
    - 옵션이 한 글자인 경우는 - 이고, 여러 글자인 경우는 --가 앞에 붙는다.
    - 파라미터를 옵션에 대입할 때는 =을 이용
    - 파라미터가 없는 한 글자 옵션은 여러 개를 하나로 묶어서 사용 가능함
    - -a, --all-tags이 두 태그는 같은 의미
    - --platform=linux/amd64 이렇게 옵션에 파라미터 대입 가능
    - -i와 -p, -d는 -dpi 이렇게 쓸 수 있음
    - -a, -all-tags : 저장소에 태그로 지정된 여러 image를 한번에 다운로드
    - --disable-content-trust : 이미지 검증 작업을 수행하지 않습니다.
    - --platform=플랫폼 : 플랫폼에 해당하는 이미지를 가져옵니다.
    - -q, --quiet : 이미지 다운로드 과정에서 나타나는 상세 출력을 숨김
  • 별도의 옵션 없이 jenkins/jenkins:lts 다운로드 해보기
  • 별도의 옵션 없이 debian 다운로드 해보기
  • 확인은 docker desktop에서 images 탭이나 cmd docker images
  • 도커 이미지 확인 : docker images(docker image ls)
  • 이미지 세부 정보 확인
    - docker image inspect 이미지이름
  • 이미지의 레이어 정보 확인
    - docker image history 이미지이름
    - 하나의 명령어가 아니고, 여러 개의 명령어로 구성된 경우가 많은데, 하나의 명령어를 레이어 라고 합니다.
  • 여기서 보면, pull 이 한 번만 있는게 아닌 것을 알 수 있다.
  • 이 명령어 하나하나를 레이어라고 한다.
  • 나오는 정보 중에서 사이즈를 가진 것만 레이어 라고 하기도 합니다.
  • 이러한 레이어와 CMD, EXPOSE, ENV, WORKDIR 등의 명령어가 조합이 되어서 하나의 이미지를 생성합니다.

✔ 이미지를 docker hub에 업로드 하자

로그인 관련 명령

  • docker login, docker logout

이미지 이름과 태그

  • docker의 태그는 레지스트리에 업로드를 할 때 사용하는 이름
  • 태그를 만들 떄는 레지스트리의 주소와 버전 표기를 추가해서 정식 명칭으로 생성하는 것을 권장
    - sonicdata.com/sonic:20 의 형태를 권장
  • 이름부여
    - docker tag 태그
  • 업로드
    - docker push 태그

httpd 이미지로 해보자.

  • docker image tag httpd:latest myhttpd:lts
    - httpd:latest에 이미지를 myttpd:lts라는 이름을 부여함
    - 이름 변경 docker tag myhttpd:lst mycopyhttpd
  • docker push 계정명/myhttpd:lts
    - 도커 허브에 업로드를 해볼까?
    - 도커 허브에 repository 확인
  • 업로드 이미지 확인
    - 태그는 namespace/appname:version 으로 해야한다.
    - 생성된 이미지 없어서 이미지 다운받아 이름 변경을 하자
    - docker pull httpd로 이미지 다운완료
    - docker tag httpd:latest namespace/appname:latest 이름변경
  • 업로드
    - docker push namespace/appname:latest 해주기
  • hub에 있는 이미지 다운로드가 되는지 확인
    - 기존 로컬 이미지 삭제
    - docker pull namespace/appname:latest해보자
  • 여러 개발자와 동일한 환경에서 개발을 수행하고자 하는 경우, 이런 형태로 이미지를 만들어서 도커 허브에 업로드하고 다운롣 받아서 컨테이너를 생성해서 수행하는 것이 가능하다.

도커 이미지를 파일로 관리해보자

  • 원본 이미지 전체를 복사해서 tar 확장자를 가진 Image로 저장한다.
  • 생성한 이미지를 Docker Hub를 통해서 배포할 수 없는 경우에 주로 이용

명령어

  • 저장
    - docker image save [옵션] 이미지이름 > 파일경로
  • 로드
    - docker image load < 파일경로

실습

  • 이미지 다운로드
    - docker pull mysql:5.7
  • 확인
    - docker images
  • 이미지를 파일로 저장
    - docker image save mysql:5.7 > test-mysql57.tar
  • cmd 현 위치에서 dir 입력
    - 목록에 해당 파일이 존재해야함
  • 기존 이미지 삭제를 해보자
    - docker image rm mysql:5.7
    - docker image rm [옵션] [이미지이름[:태그] | imageID]
    - tag는 latest가 아니면 무조건 작성(tag 안쓰면 latest로 인식)
    - 관련된 이미지를 모두 삭제할 때는 -f 옵션을 이용합니다.
  • 이미지를 파일로부터 로드
    - docker image load < test-mysql57.tar
  • 이름을 변경해서 로드할 수 있습니다.(Linux)
    - cat test-mysql57.tar | docker import - mysql57:1.0
    - windows에서는 cat 명령을 이용해서 tar 파일을 출력할 수 가 없음
  • 사용중이 아닌 이미지 제거
    - 사용 중이 아닌 모든 이미지 제거(컨테이너로 만들어지지 않은 이미지)
    - docker image prune -e
    - 사용 중이 아닌 48시간 이전의 모든 이미지 제거
    - docker iamge prune -a -f --filter "until=48h"
  • 이미지가 삭제되지 않는 경우
    - 컨테이너가 사용 중인 이미지는 삭제가 안됨
    - 이런 경우에는 컨테이너를 제거하고 삭제해야 한다.

실습을 해보자

  • docker image pull gihyodocker/echo:latest
  • docker run -t -p 9000:8080 gihyodocker/echo:latest
  • docker image rm gihyodocker/latest
    - 이게 안먹힐 것이다.
    - 실행 끄고 하면 될 것이다.

Static vs Dynamic

정적(Static)동적(Dynamic)
ClassInstance
Schema(Table)Instance
ProgramProcess
ImageContainer
  • 유일하게 도커만이 image \lrarr Container 가능함

✔ Container

개요

  • Image는 읽기 전용의 불변의 값
  • Container는 Image에 읽고 쓰기가 가능한 레이어를 추가해서 만든 일종의 프로세스
  • 컨테이너 명령은 대부분 서비스 실행과 운영에 관련된 명령어

이미지 다운로드 및 컨테이너 실행

  • docker image pull gihyodocker/echo:latest
    - 도커가 사용할 수 있는 gihyodocker/echo:latest 이미지가 도커 안에 저장
  • docker container run -t -p 9000:8080 gihyodocker/echo:latest
    - 이 명령은 gihyodocker/echo:latest 이미지를 가지고 격리된 프로세스 하나를 만들어서 실행하고, 내부의 8080 포트를 외부에서는 9000으로 접속할 수 있도록 해주는 것
    - 현재 IP:9000으로 접속하면 웹페이지 출력해주는 컨테이너임

컨테이너 실행 과정

  • docker run명령을 사용하면, 도커 이미지 존재 여부를 확인하고, 이미지가 존재하지 않으면 다운로드를 받고 이미지를 기반으로 Snap shot을 생성하고 그 위에 읽고 쓰기가 가능한 레이어를 추가하고 docker start 명령을 수행해서 컨테이너를 시작
  • 실행중인 컨테이너 확인
    - docker ps
    - 모든 컨테이너 확인 docker ps -a

리눅스 이미지를 다운받고 컨테이너 생성해서 셸에 접속해보기

  • 우분투 이미지 다운로드
    - docker pull ubuntu:20.04
  • 컨테이너 생성
    - docker create -it --name container-test1 ubuntu:20.04
  • 컨테이너 확인
    - docker ps -a
  • 컨테이너 실행
    - docker start container-test1
  • 컨테이너 접속
    - docker attach container-test1
    - 계정설정을 안해서 sudo는 못하지만 기본 우분투 작업 가능

  • 컨테이너 삭제
    - docker container rm container-test1
  • 이미지 다운로드 및 컨테이너 생성과 실행을 한번에 수행해보자
    - docker run -it --name container-test1 ubuntu:20.04 bash

컨테이너의 수명 주기

  • 실행 상태
    - run이나 start 명령어로 컨테이너를 실행할 수 있는데, 작업이 끝나거나 사용자가 중지를 하지 않으면 계속 유지
  • 정지 상태
    - stop 명령어나 작업이 끝난 경우로, 이전 상태를 보존하고 있기 때문에 이어서 작업이 가능한 상태
  • 파기
    - rm 명령으로 삭제한 경우로, 모든 내용이 소멸되어 이어서 작업 불가

docker run

  • docker image pull, docker container create, docker container start명령을 합친 것 과 같은 명령
  • 기본 형식
    - docker run [옵션] 이미지 [인자]
    - 인자는 이미지에 따라 달라집니다.
  • 옵션
    - --name : 컨테이너의 이름을 설정하는 옵션으로, 생략하면 임의 지정
    - -p, --publish [Host Port]:[Container Port] : 외부에서 컨테이너에 접속할 수 있도록 하고자 하는 경우에 사용하는 포트포워딩 설정
    - -P, --publish-all=true : 컨테이너 내부 모든 포트를 임의 포트로 포워딩
    - -v, --volume=호스트경로:컨테이너경로 : 볼륨 마운트
    - --net : 네트워크 연결(컨테이너 간의 네트워크 연결)
    - -i, --interface : 대화식 모드 연결
    - -t : 단말 디바이스 할당
    - -d, --detach : 백그라운드에서 실행, 데몬 형태로 동작시켜야 할 때는 -dti로 설정
    - -e : 환경 변수 설정, 이미지마다 변수가 다름
    - --rm : 컨테이너 종료 시, 자동으로 컨테이너 파기
    - -h : 컨테이너의 호스트 이름을 지정하는 옵션, 미지정 시 컨테이너 ID가 설정됨
    - -d는 컨테이너를 백그라운드로 실행하는 옵션, -i와 -t는 컨테이너 내부의 터미널로 접속하기 위해 사용하는 옵션이다.

docker ps

  • 컨테이너 목록을 출력하는 명령
  • -a 옵션을 사용하면 모든 컨테이너 목록 출력, 안쓰면 실행중 목록만

중지 및 삭제

  • docker stop
  • docker rm

실습

  • httpd 이미지를 컨테이너로 생성해서 실행하고 중지한 뒤, 삭제를 해 보자
  • httpd는 웹서버이다
  • 웹서버, 서버 애플리케이션 그리고 db는 데몬으로 실행해야 한다.
  • docker container run --name ex01 -d httpd
  • 응답할 수 있나?
  • docker ps
  • 근데 이러면 localhost 뭐 접속하려해도 불가능함
  • docker container stop ex01
  • docker container rm ex01

  • 외부에서 컨테이너에 접근 : 포트포워딩을 하지 않으면 외부에선 내부 컨텐츠 이용 불가
    - httpd 서비스는 웹 서버 역할을 수행합니다.
    - 80번 포트에 접속하게 되면, index.html을, 혹시 없다면 자신의 기본 화면을 출력

  • 포트포워딩을 제대로 하자
  • docker container run --name ex01 -p 외부에서 사용할 포트 번호 : 내부 포트번호 -d httpd
  • docker container run --name ex01 -p 8001:80 -d httpd

다양한 이미지

OS

  • ubuntu
  • centos
  • debian
  • fedora
  • busybox
  • alpine : 경량화버전

web server, 당연히 포트포워딩 필수이다.

  • httpd
  • apache2
  • nginx

db server

  • mysql
  • mariadb
  • postgres
  • 위의 3가지 db는 실행할 때, ROOT_PASSWORD를 설정해야 한다.
  • oracle
  • mongodb
  • redis
  • DB도 포트포워딩 수행해야 외부에서 접근이 가능하다

programming language

  • openjdk
  • python
  • php
  • ruby
  • gcc
  • node
  • golang

framework

  • wordpress
  • redmine
  • 위 2개의 프레임워크는 MySQL이나 PostgreSQL과 같이 설정되어야 한다.

nginx(웹 서버) 컨테이너 실행

  • nginx는 80번 포트를 이용해서 외부 접근을 받아들입니다.
  • 웹 서버이기에 데몬으로 실행해야 하며, 외부 접근을 받아들이기 위해서 포트 포워딩을 해주어야 합니다.
  • 컨테이너 생성 시 이름 설정 안하면 이름이 임의로 생성되기 떄문에 다른 곳에서 사용할 때 불편할 수 있기에 설정하는게 좋다

오라클을 설치해서 외부에서 접속해보자

  • 이미지 이름 jaspeen/oracle-xe-11g
  • 포트는 8080과 1521번을 사용
  • 설치가 된다면 sid는 xe, 관리자 계정은 system, 비밀번호는 oracle로 지정
  • docker run --name=nginx_ex -d -p 8000:80 nginx
  • dbeaver 해보려는데 오라클 커넥션 실패한다.
  • docker run --name=oracle11g -d -p 1521:1521 -p 8080:8080 jaspeen/oracle-xe-11g
  • 8080은 웹포트이다.

  • 이게 진짜 된다.
  • MySQL 로 한다면 -d가 아니라 -dit를 다 해줘야 한다.
    - 설정 파일을 다 건드려야 하는데, mariadb를 그래서 사용하는 경우도 있다.
profile
밀가루 귀여워요

0개의 댓글