Computer Science/DevOps

<그림으로 익히는 도커&쿠버네티스(오가사와라 시게타카, 2022)>

토마토. 2023. 6. 23. 00:10

그림과 실습으로 배우는 도커 & 쿠버네티스

태그: 개발, 인프라

1. 도커란 무엇인가?

1) 도커란 무엇인가?

#도커란

  • 도커란
    • 도커는 데이터 또는 프로그램을 격리시키는 기능을 제공하는 소프트웨어
    • 주로 서버에 사용된다.
    • 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능을 제공. 운영체제 비슷한 것을 통째로 격리함
  • 컨데이터와 도커
    • 독립된 창고 = 컨테이너에 데이터나 프로그램을 두는 것
    • 도커는 컨테이너를 다루는 기능을 제공하는 소프트웨어
    • 도커 엔진을 사용하여 컨테이너를 생성하고 구동시킬 수 있다
  • 컨테이너, 이미지
    • 컨테이너를 만들려면 도커 엔진 외에도 컨테이너의 빵틀과도 같은 역할을 하는 이미지가 필요하다
    • 이미지를 활용하면 컨테이너를 여러 개 만들 수 있다.
  • 리눅스 컴퓨터
    • 도커는 종류와 상관없이 리눅스 운영체제가 필요하다
    • 컨테이너 안에서 동작시킬 프로그램도 리눅스용 프로그램이다

#필요성

  • 독립된 환경에 격리해야 하는 이유
    • 대부분의 프로그램은 어떤 실행 환경이나 라이브러리, 다른 프로그램을 이용해 동작한다
    • 소프트웨어 역시 단일 프로그램이 아니라 여러 개의 프로그램으로 구성된 경우가 많다.
    • 프로그램 하나를 업데이트하면 다른 프로그램에도 영향을 미치게 된다.
    • 서버에서는 여러 프로그램이 함께 동작하므로 서버를 처음 구축할 때부터 신중하게 따져보아야 한다.
  • 프로그램의 격리란?
    • 도커 컨테이너는 다른 컨테이너와는 완전히 분리된 환경
    • 따로 격리하여 운영하면 된다
    • 도커 컨테이너는 완전히 독립된 환경이므로, 여러 컨테이너에서 같은 프로그램을 실행할 수 있다. 버전이 완전히 동일해도 상관없다.

2) 서버와 도커

  • 도커와 연관되는 부분을 중심으로 서버가 무엇인지 설명
    • 서버에서 사용하는 것이 도커의 주 목적

서버란

  • 서버의 의미
    • 서버란 어떤 서비스를 제공하는 것을 의미한다
      • 물리적 컴퓨터로서의 서버
        • 웹 서버, 메일 서버가 죽었다.
        • 서버는 데스크톱 컴퓨터와 같이 어딘가에 물리적으로 존재하는 컴퓨터
        • 물리적 컴퓨터로서의 서버에 여러 개의 기능적 의미의 서버를 함께 둘 수 있다
        • 서버는 여러 사람이 원격으로 접근해 사용하는 컴퓨터
        • 운영체제 위 소프트웨어를 실행함
      • 한 가지는 기능적 의미의 서버
  • 서버의 대표적인 예
    • 웹 서버, 메일 서버, 데이터베이스 서버, 파일 서버, dns 서버, dhcp 서버, ftp 서버, 프록시 서버, 인증 서버
    • 프록시 서버 → 통신을 중재하는 서버의 통칭
  • 서버의 특징
    • 서버의 운영체제로는 주로 리눅스가 사용된다

도커란

  • 도커 환경에서 컨테이너를 사용하면, 프로그램을 완전히 격리시킬 수 있다
    • 예산이 부족해서 한 대의 서버에서 웹 서버, 메일 서버, 시스템 서버, DB 서버를 운용할 때, 도커를 활용하면 각 서버를 독립적인 환경에서 안전하게 운용할 수 있을 것이다.
    • 물리 서버의 수를 줄일 수 있다. 두 웹 서버를 하나의 물리 서버를 함께 올릴 수 있다.
  • 컨테이너는 그저 격리된 환경이 아니라 쉽게 옮길 수 있다는 특징이 있다.
    • 실제로는 컨테이너 자체를 옮기는 것 X
    • 컨테이너의 정보를 내보내기 하고, 다른 도커 엔진에서 복원하는 형태
    • 똑같은 상태로 튜닝한 컨테이너를 팀원 전원에게 배포해 모두가 동일한 개발환경을 사용할 수 있다
    • 도커를 통해 물리적 환경의 차이, 서버 구성의 차이를 무시할 수 있음
  • 도커와 가상화 기술의 차이
    • 가상화 기술 → VirtualBox, VMware, 가상의 물리 서버를 만드는 것과 같음
      • 메인보드, CPU, 메모리 등 물리적인 부품을 소프트웨어로 구현
    • 도커 → 실행 환경을 독립적으로 격리한 컨테이너
      • 컨테이너에서 리눅수가 동작하는 것’처럼’ 보임
      • 컨테이너는 운영체제의 일부 기능을 호스트 컴퓨터에 의존한다
    • 도커, AWS EC2
      • EC2 → 가상화 기술, 각각의 인스턴스가 독립된 컴퓨터처럼 동작한다

2. 도커의 동작 원리

  • 도커의 동작 원리

1) 도커의 동작 원리

  • 도커, 컨테이너는 서버에서 사용된다
    • 믈리 서버 → 운영체제 → 프로그램, 데이터
    • 물리 서버 → 운영체제 → 도커 엔진 → 컨테이너 → 프로그램, 데이터
  • 컨테이너 안에는 운영체제 ‘비슷한 것’이 들어있다
    • 최소한의 컨테이너에도 ‘리눅스 운영체제 비슷한 무언가’가 딸려 나온다.
    • cf) 운영체제가 하는 일
      • 소프트웨어나 프로그램의 명령을 하드웨어에 전달하는 역할을 한다
    • 도커 엔진 아래에도 리눅스 운영체제가 있는데, 컨테이너 속에 또 리눅스 운영체제가 있다.
    • 본래 운영체제는 커널과 그 외 주변 부분으로 구성된다.
      • 주변 부분 → 명령을 전달받거나 커널이 실행한 결과를 프로그램에 다시 전달하는 역할
    • 컨테이너가 완전히 분리되어 있어서 밑바탕이 되는 리눅스 운영체제의 주변 부분이 컨테이너 속 프로그램 명령을 전달받을 수 없다.
    • → 컨테이너 속에는 운영체제의 주변 부분이 들어있어 프로그램의 명령을 전달받고 이를 밑바탕이 되는 커널에 전달하는 구조로 되어 있음
    • 결과 ⇒ 가벼움
  • 도커는 기본적으로 ‘리눅스용’이다
    • 밑바탕에서 리눅스 운영체제가 동작하는 것을 전제로 한다
    • 컨테이너에서 실행할 소프트웨어 역시 리눅스용 소프트웨어임
    • 리눅스 컴퓨터에 독립된 격리 환경을 만드는 것이다
    • → 근데 어떻게 윈도우에 도커 데스크탑이 있는거지..?
      • 도커 데스크톱은 도커를 실행하는 데 필요한 리눅스 운영체제를 포함하고 있다.
    • 워드, 엑셀 등은 도커에서 실행 불가능함

2) 도커 허브와 이미지, 그리고 컨테이너

  • 이미지 → 컨테이너를 만드는 ‘빵틀’
  • 허브 → 도커 이미지를 모아놓은 인터넷 상의 공간

이미지

  • 이미지는 컨테이너를 만드는 데 사용한다. 빵틀 같은 역할임.
    • 컨테이너의 설계도
    • 실제 사용하는 대상 → 컨테이너(like 로봇 장난감)
  • 하나만 있으면 똑같은 것을 여러 개 만들 수 있다.
    • 도커 파일을 빌드하여 이미지를 만든다
  • 컨테이너로도 이미지를 만들 수 있다
    • 컨테이너로부터 이미지를 만들 수 있기 때문에
    • 새로 만든 이미지를 사용해서 개조된, 준비된 이미지를 만들기 쉬워진다
  • (이를 통해) 도커 엔진 간에 이동이 가능하다
    • 동일한 컨테이너를 여러 개 만들지 않더라도 이러한 특성을 이용해서 다른 물리 서버에 설치된 도커 엔진으로 컨테이너를 이동시킬 수 있다.
    • 즉, 컨테이너로부터 만든 이미지를 이용해서 다른 환경에서 원래의 컨테이너를 복원할 수 있다.

허브

  • 도커 허브 → 공식적으로 운영되는 도커 레지스트리의 이름
  • 공개된 컨테이너 이미지가 모여있는 곳
  • 운영체제 비슷한 것 / 소프트웨어가 포함된 이미지 / 여러 개 포함된 이미지 등
  • 안전한 이미지를 고르는 법
    • 공식 이미지를 사용한 것
    • 커스텀 이미지를 직접 만들어 사용한다
  • 다양한 조합
    • 도커 사용 원칙 중 하나 → 한 컨테이너에 한 프로그램
    • 보안 및 유지 관리 측면에서 유리하다
    • ex) 워드프레스 구축
      • 아파치, MySQL, 워드프레스 세 가지 필요
      • 별도의 컨테이너로 구성하는 것을 추천함 → 유지보수, 도커의 장점을 누릴 수 있음

3) 도커 컨테이너의 생애주기와 데이터 저장

  • 컨테이너의 수명 / 생애주기
    • 컨테이너는 그때 그때 쓰고 버리는 일회용품에 가깝다
    • 컨테이너는 쉽게 만들 수 있다.
    • 컨테이너를 업데이트하기보다는 새로운 컨테이너를 사용하는 것이 좋다
    • 컨테이너는 여러 개를 동시 가동하는 전제로 한다. → 하나하나 업데이트하기보다는 새로운 이미지에서 새로운 컨테이너를 만들어 갈아타는 방식을 더 사용한다
  • 데이터 저장 → 호옹 이해 안감
    • 컨테이너를 폐기하면, 해당 컨테이너 안에서 편집했던 파일은 사라진다
    • 도커가 설치된 물리적 서버의 디스크를 마운트해 이 디스크에 데이터를 저장한다
    • 컨테이너가 폐기되더라도 데이터는 컨테이너 외부에 안전하게 저장되어 사라지지 않는다
    • 데이터는 다른 곳에 저장해두고 같은 것을 계속 사용함. 설정 파일도 삭제되지 않을 곳에 저장한다.

4) 도커의 장점과 단점

장점

  • 환경을 격리할 수 있다
    • 독립된 환경
    • 이미지를 만들 수 있다
    • 컨테이너에 커널을 포함시키지 않아도 된다(커널 포함 → 가상 머신, 주변 부분만 포함 → 도커)

단점

  • 리눅스만 지원
  • 물리 서버에 문제 생기면 모든 컨테이너에 영향

용도

  • 팀원 모두에게 동일한 개발 환경 제공하기
  • 새로운 버전의 테스트
  • 동일한 서버가 여러 대 필요한 경우

3. 도커를 사용해보자

1) 도커를 사용하려면

도커 설치하기

  • 도커를 설치, 기본적인 조작 방법을 익힌다
  • 도커는 기본적으로 리눅스용이지만 윈도우와 macOS에서도 사용할 수 있다
  • 도커 환경 구축 방법
    • 리눅스 컴퓨터에서 사용하기
    • 가상 머신에 도커 설치하기
    • 윈도우용 / macOS용 도커 설치하기
  • 윈도우용 macOS 도커 사용하기
    • 리눅스 운영체제가 들어있는 패키지를 사용한다 → 도커 데스크톱
    • 실행 환경이 추가로 필요함 → 도커 엔진 + 리눅스 운영체제 + 가상환경(Hyper-V)
    • 도커 데스크톱은 가상화 환경, 리눅스 운영체제를 신경쓰지 않고도 도커를 사용할 수 있다
  • 일반적인 소프트웨어처럼 사용한다
    • 설치가 간편함
    • 가상화 소프트웨어, 리눅스 운영체제의 존재를 신경쓰지 않아도 된다

QNA

  • 운영체제가 두 개라니 괜찮을까?
    • 도커가 전용으로 사용하는 숨겨진 운영체제이다
  • 도커 데스크톱을 사용하기 위한 조건
    • 윈도우에서는 Hyper-V가 활성 상태여야 한다.
  • 도커 데스크톱과 툴박스 버전의 차이
    • 도커 데스크톱에서는 Hyper-V를 사용하는데, 툴박스에서는 VirtualBox를 사용한다
  • WSL2는 무엇일까?
    • 도커 제작사에서 만든 리눅스 운영체제를 사용하는 버전
    • 마이크로소프트에서 만든 WSL2를 사용하는 버전

2) 도커 설치

  • 설치 조건 → 64비트 운영체제
  • 도커 데스크탑 설치 완료

3) 도커의 조작 방법과 명령 프롬프트 및 터미널 실행

  • 명령 히스토리 찾기 → 커서 Up
  • 명령 프롬프트를 종료해도 도커는 종료되지 않는다
    • 도커 엔진과 터미널 소프트웨어는 완전히 별개의 소프트웨어
$ date
현재 날짜: 2023-06-17

$ exit
종료됨

4. 컨테이너를 실행해보자

  • 실습을 통해 컨테이너 생성하고 삭제해보기

1) 도커 엔진 시작하기/종료하기

  • 도커 엔진 → 컨테이너를 실행 중인 것이 아니라면 컴퓨터의 리소스를 거의 차지하지 않는다.

  • 도커 엔진은 컴퓨터를 켰을 때 함께 자동으로 실행할 수 있지만, 컨테이너는 그렇지 않다(도커 엔진이 종료되면 모든 컨테이너는 정지 상태가 된다)

  • 윈도우에서

    • 자동 실행 설정 가능
  • 리눅스

      도커 엔진 시작
      $ sudo systemctl start docker
    
      도커 엔진 종료
      $ sudo systemctl stop docker
    
      자동 실행 설정
      $ sudo systemctl enable docker

2) 컨테이너의 기본적인 사용 방법

  • 컨테이너 사용의 기본은 도커 명령어

    • docker ~

    • 명령어와 대상

        docker container[상위 커맨드] run[하위 커맨드] penguin[대상]
    • 옵션과 인자

        docker container[상위 커맨드] run[하위 커맨드] -d[옵션] penguin[대상] 
        --mode=1[인자]
    • 기본적인 명령어

        docker 커맨드 [옵션] 대상 [인자]
  • 실습

    • 간단한 명령어 실행해보기

    • 도커의 버전 확인하기

      > docker version
      Client:
      Cloud integration: v1.0.33
      Version:           24.0.2
      API version:       1.43
      Go version:        go1.20.4
      Git commit:        cb74dfc
      Built:             Thu May 25 21:53:15 2023
      OS/Arch:           windows/amd64
      Context:           default
      
      Server: Docker Desktop 4.20.1 (110738)
      Engine:
      Version:          24.0.2
      API version:      1.43 (minimum version 1.12)
      Go version:       go1.20.4
      Git commit:       659604f
      Built:            Thu May 25 21:52:17 2023
      OS/Arch:          linux/amd64
      Experimental:     false
      containerd:
      Version:          1.6.21
      GitCommit:        3dce8eb055cbb6872793272b4f20ed16117344f8
      runc:
      Version:          1.1.7
      GitCommit:        v1.1.7-0-g860f061
      docker-init:
      Version:          0.19.0
      GitCommit:        de40ad0
  • 컨테이너 조작 관련 커맨드 (상위 커맨드 container)

    • start
    • stop
    • create
    • run
    • rm → 컨테이너 삭제
    • exec → 프로그램 실행
    • ls → 컨테이너 목록
    • cp → 파일 복사
    • commit → 이미지로 변환
  • 이미지 조작 관련 커맨드 (상위 커맨드 image)

    • pull → 이미지를 내려받음
    • rm → 이미지 삭제
    • ls → 목록 출력
    • build → 이미지 생성 (ex. dockerfile에서 이미지 생성)
  • 볼륨 조작 관련 커맨드 (상위 커맨드 volume)

    • 컨테이너는 휘발성 프로세스이기 때문에 컨테이너 내부의 데이터를 영구적으로 저장할 수가 없다

    • 컨테이너에서 생성된 데이터를 영구적으로 보관하기 위해서 도커 볼륨을 사용하며 이를 통해 데이터를 보존하고 컨테이너 간에 파일 시스템을 쉽게 공유할 수 있다

    • 도커 볼륨 / Docker Volume : 네이버 블로그 (naver.com)

    • create → 볼륨 생성

    • inspect → 상세 정보 출력

    • ls → 목록 출력

    • prune → 볼륨 삭제

    • rm → 지정 볼륨 삭제

  • 네트워크 조작 커맨드 (상위 커맨드 network)

    • connect → 연결
    • disconnect → 해제
    • create → 네트워크 생성
    • inspect → 상세 정보 출력
    • ls → 목록 출력
    • prune → 접속하지 않은 네트워크 삭제
    • rm → 지정한 네트워크 삭제
  • 기타 등등

3) 컨테이너의 생성과 삭제, 실행, 정지

  • 컨테이너 실행하기 → docker run

    • 한꺼번에 수행하는 것이 docker run

    • 컨테이너 생성 → docker create

    • 컨테이너 실행 → docker start

    • 이미지 내려받기 → docker pull

  • 컨테이너 중지하기 → docker stop

  • 컨테이너 삭제하기 → docker rm

  • docker ps → 컨테이너 목록 출력하기

  • 실습

      아파치 컨테이너 이미지를 받아서 실행하고 종료, 삭제하기
      > docker run --name apa000ex1 -d httpd
      -d: 백그라운드 실행
      httpd: 아파치 이미지 이름(default가 latest)
    
      > docker ps
      CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS     NAMES
      607b9425a68f   httpd     "httpd-foreground"   24 seconds ago   Up 23 seconds   80/tcp    apa000ex1
    
      > docker stop apa000ex1
      apa000ex1
    
      > docker ps
      CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    
      > docker rm apa000ex1
      apa000ex1

4) 컨테이너의 통신

  • 컨테이너를 생성하고 생성한 컨테이너에 접근하기

    • 아파치는 웹 서버를 제공하는 소프트웨어
    • 아파치가 동작 중인 서버에 파일을 두면, 이 파일을 웹 사이트 형태로 볼 수 있다.
    • 웹 브라우저를 통해 컨테이너에 접근이 가능하게 하려면 설정이 필요하다
    • docker run
  • 웹 브라우저를 통해 컨테이너에 접근하려면 외부에 접근하기 위한 설정이 필요하다 → 이를 위해 포트를 설정한다.

    • 아파치는 서버에서 정해둔 포트에서 웹 사이트에 대한 접근을 기다리다가 사용자가 이 포트를 통해 접근해오면 요청에 따라 웹 사이트의 페이지를 제공한다.
    • 컨테이너 속에서 실행 중인 아파치는 외부와 직접 연결되지 않았기 때문에 외부에서 접근할 수 없다.
    • 컨테이너를 사용하면 여러 개의 웹 서버를 함께 실행할 수도 있다.
  • 실습 - 통신이 가능한 컨테이너 생성하기

    • step 1. run 커맨드 실행하기

        > docker run --name apa000ex2 -d -p 8080:80 httpd
        ea1a1b2c3e7a741385680775b25c3d592eebc7c0f67803fc82873b3609c48a4e
    • step 2. 컨테이너 실행 중인지 확인하기

        > docker ps
        CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS                  NAMES
        ea1a1b2c3e7a   httpd     "httpd-foreground"   26 seconds ago   Up 25 seconds   0.0.0.0:8080->80/tcp   apa000ex2
    • step 3. 웹 브라우저를 통해 아파치에 접근할 수 있는지 확인

      Untitled

    • step 4. stop 커맨드를 통해 컨테이너 종료하기

        > docker stop apa000ex2
    • step 5. rm 커맨드를 통해 컨테이너 삭제하기

        > docker rm apa000ex2
    • step 6. ps 커맨드와 인자를 사용해 컨테이너가 삭제되었는지 확인

        > docker ps -a

5) 컨테이너 생성에 익숙해지기

  • 다양한 유형의 컨테이너 → 컨테이너 종류 매우 다양함

  • 실습 → 아파치 컨테이너 여러 개 실행하기

    • 호스트 컴퓨터의 포트 번호가 중복되어서는 안되지만

    • 컨테이너 포트는 중복되어도 무방하므로 모두 80번으로 설정한다

    • step 1. run 커맨드 실행하기

      > docker run --name apa000ex3 -d -p 8081:80 httpd
      b3895d717cc7190d8d14a266decf1514c720a0a7a811ea22c4995584926766f8
      
      > docker run --name apa000ex4 -d -p 8082:80 httpd
      1a1acb7a6392d8f02f5a0c728c1e02b885b0e24e6afb2a50fc8e1e5cfcf3f8bd
      
      > docker run --name apa000ex5 -d -p 8083:80 httpd
      8c66b3d4ba324c956851a372825ead58c6a9a62c4f0f54218d59c0ac114fd151
    • step 2. ps 커맨드를 통해 컨테이너 실행 중인지 확인하기

      > docker ps
    • step 3. localhost에서 접근하기

    • step 4. stop 커맨드로 컨테이너 종료하기

        > docker stop apa000ex3
    • step 5. rm 커맨드로 컨테이너 삭제하기

        > docker rm apa000ex3
    • step 6. ps 커맨드로 컨테이너 삭제되었는지 확인하기

        > docker ps -a
  • 실습 → Nginx 컨테이너 실행하기

    • step 1. run 커맨드 실행

        > docker run --name nginx000ex6 -d -p 8084:80 nginx
        Unable to find image 'nginx:latest' locally
    • step 2. ps 명령어를 사용해서 컨테이너 실행 중인지 확인하기

        > docker ps
        0.0.0.0:8084(브라우저에 적는 주소)->80/tcp(서버에 접근하는 포트)
        CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                  NAMES
        913f951a1a35   nginx     "/docker-entrypoint.…"   12 seconds ago   Up 11 seconds   0.0.0.0:8084->80/tcp   nginx000ex6
    • step 3. 웹 브라우저로 nginx에 접근할 수 있는지 확인하기

    • step 4. stop 커맨드를 활용해서 컨테이너 종료하기

        > docker stop nginx000ex6
        nginx000ex6
    • step 5. rm 커맨드를 활용해서 컨테이너 삭제하기

        > docker rm nginx000ex6
    • step 6. ps 커맨드로 컨테이너 삭제되었는지 확인하기

        > docker ps -a
  • 실습 → MySQL 컨테이너 실행하기

    • step 1. run command 실행하기

      • -dit 백그라운드에서 실행 및 키보드를 통해 컨테이너 내부의 파일 시스템 조작하기

      • -e MYSQL_ROOT_PASSWORD 비밀번호 설정

        > docker run --name mysql000ex7 -dit -e MYSQL_ROOT_PASSWORD=myrootpass mysql
        Unable to find image 'mysql:latest' locally
    • step 2. ps 커맨드를 사용해서 컨테이너 실행 중인지 확인하기

      • docker ps
    • step 3. mysql 서버에 접속하기

        > docker exec -it mysql000ex7 bash
        bash-4.4# mysql -u root -p
        Enter password:
        Welcome to the MySQL monitor.  Commands end with ; or \g.
        Your MySQL connection id is 8
        Server version: 8.0.33 MySQL Community Server - GPL
      
        Copyright (c) 2000, 2023, Oracle and/or its affiliates.
      
        Oracle is a registered trademark of Oracle Corporation and/or its
        affiliates. Other names may be trademarks of their respective
        owners.
      
        Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
      
        mysql>
    • step 4. docker stop mysql000ex7

    • step 5. docker rm mysql000ex7

    • step 6. docker ps -a

6) 이미지 삭제

컨테이너는 삭제해도 이미지는 남는다

  • docker image rm
  • docker image rm image_1 image_2 image_3
  • docker image ls → 이미지 목록 확인하기
> docker image rm mysql
Untagged: mysql:latest
Untagged: mysql@sha256:15f069202c46cf861ce429423ae3f8dfa6423306fbf399eaef36094ce30dd75c
Deleted: sha256:91b53e2624b431e562ed9076a9a506c5e78387f2cb4dad5968fd51ade839baa1
Deleted: sha256:29fe1268c0126fd9958677211dc48660a1b1ab4ad95560a0974950feddafb488
Deleted: sha256:f271de7413df4881b2d3607b62453c1c06dd9064fc1d93c5b1d3608381b4b94d
Deleted: sha256:974dc031751c2282d328963dc22bfc52cc1cfca840091207026c3218d1b6dff0
Deleted: sha256:504a7a1d5454b3a4f46f81e2e25219d130302ffbdfe0f1cd0a161715f1926285
Deleted: sha256:cbfdbb307419ced9a481e2076c692a1e3ecb1da3e4069a8ea6486c2829e7d65d
Deleted: sha256:0cc534805f7a13b6a3e1c8853fc8e483c8805e8cfe7de93da140364f20627cb6
Deleted: sha256:6e01ff5e5d41ba0fdd448cef4d4acb3ca236ff967f93e14088232d6423ff8cd4
Deleted: sha256:c3e4c2eacde3a513df33b165fe0e0ee5a2b278c70f9e30545c6525891c116915
Deleted: sha256:3d55a06407299c38dc4b3ab7d5c9aeb050c7538121f9617fa3fb5fd3bc2af277
Deleted: sha256:91c495d5f32a501a8b966be1b97fbfc1df2810f7198de113b9b0d661c5e7714c
Deleted: sha256:fa499cc7379fed2c60f59713f71ddda8a68227be84f612f6c1d197e3da1bf4ae

> docker image rm httpd
Untagged: httpd:latest
Untagged: httpd@sha256:f499227681dff576d6ae8c49550c57f11970b358ee720bb8557b9fa7daf3a06d
Deleted: sha256:ad303d7f80f968a856f91e6216f8af2376d8b173f3d1d07ea11e2f810430c1af
Deleted: sha256:1f46fbfbddbded628a11bb9956b2ad6ffb7f1057a26a8db8cdab70aafa4e9711
Deleted: sha256:85584c93b7bc91601fd8721abf8c3be01bad5f59d7dcc6e1cb6c6d0f255c485f
Deleted: sha256:2d165a240b04629fb8b84078dc3a0dfcc80ac73ec697b881a2e54a1078e24c35
Deleted: sha256:e68a90e9f5b4315834c814466c5f26b24606d24fdc55d7e406e844c5bc3efe03

> docker image rm nginx
Untagged: nginx:latest
Untagged: nginx@sha256:593dac25b7733ffb7afe1a72649a43e574778bf025ad60514ef40f6b5d606247
Deleted: sha256:eb4a57159180767450cb8426e6367f11b999653d8f185b5e3b78a9ca30c2c31d
Deleted: sha256:387c6708d068d261ce5b1fe3e67323cbf64d8a37901f3d9742557f4abb830baf
Deleted: sha256:2946620cb422511c62ba67d12b1c16bbf6b85e6ce42e93a4dace94b4a70160b3
Deleted: sha256:f2545115e362a40e5b3fe057ad159aa9824f40a0e9341f4743b4d0c4f5322435
Deleted: sha256:9b3ff8c6f07faac480afaeecc0388a387f8cf92832de656a2d35e890340ac59a
Deleted: sha256:77366f15e73eef5c23ff7bd0be0c09f1b280c9586863232392c2d500eed148e7
Deleted: sha256:7447c8c6be248218804380a22d47c130f7efc16f31550cb446fc3cc91f98a54c
Deleted: sha256:ac4d164fef90ff58466b67e23deb79a47b5abd30af9ebf1735b57da6e4af1323

5. 여러 개의 컨테이너를 연동해 실행해보자

1) 워드프레스 구축

  • 워드프레스 사이트 구성 및 구축

    • 워드프레스가 동작하려면 여러 개의 컨테이너를 실행하고 가상 네트워크를 통해 컨테이너끼리 통신할 수 있어야 한다
    • 워드프레스 → 웹 사이트를 만들기 위한 소프트웨어
      • 워드프레스와 MySQL 데이터베이스와 연결
  • 도커 네트워크 생성/삭제

    • 워드프레스는 워드프레스 컨테이너와 MySQL 컨테이너로 구성

    • 두 컨테이너는 가상 네트워크를 만들고 이 네트워크에 두 개의 컨테이너를 소속시켜야 한다.

    • docker network create

      # 도커 네트워크 생성하기
      docker network create network_name
      
      # 도커 네트워크 삭제하기
      docker network rm network_name
      
      # 도커 네트워크 관련 커맨드
      conenct 등
  • MySQL 컨테이너 실행 시에 필요한 옵션과 인자

  • 워드프레스 컨테이너 실행 시 필요한 옵션과 인자

2) 워드프레스 및 MySQL 컨테이너 생성과 연동

  • [네트워크 설정] network create

  • [MySQL 컨테이너 생성] docker run … mysql

      docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
  • [워드프레스 컨테이너 생성] docker run … wordpress

      docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress
  • [컨테이너 및 네트워크 확인] ps 커맨드

      > docker ps
      CONTAINER ID   IMAGE       COMMAND                   CREATED         STATUS         PORTS                  NAMES
      561d55e81288   wordpress   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   0.0.0.0:8085->80/tcp   wordpress000ex12
      5a64f9cce384   mysql       "docker-entrypoint.s…"   5 minutes ago   Up 5 minutes   3306/tcp, 33060/tcp    mysql000ex11
  • 웹 브라우저를 통해 워드프레스에 접근해서 확인하기

    • localhost:8085
  • 뒷정리

      # 컨테이너 종료
      docker stop wordpress000ex12
      docker stop mysql000ex11
    
      # 컨테이너 삭제
      docker rm wordpress000ex12
      docker rm mysql000ex11
    
      # 이미지 삭제
      docker image rm wordpress
      docker image rm mysql
    
      # 네트워크 삭제
      docker network rm wordpress000net1

3) 명령어를 직접 작성하자

  • 소프트웨어와 데이터베이스의 관계

    • LAMP 조합

      • 리눅스 + 웹 서버 + 프로그래밍 언어 런타임 + 데이터베이스 조합
    • MySQL 컨테이너의 옵션 값 채워넣기

      docker run --name container_name -dit --net=network_name -e MYSQL_ROOT_PASSWORD=root_password -e MYSQL_DATABASE=database_name -e MYSQL_USER=user_name -e MYSQL_PASSWORD=user_password mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
    • 워드프레스 컨테이너 옵션 값 채워넣기

      ```bash
      docker run --name container_name

    • dit --net=network_name

    • p=8083:80

    • e WORDPRESS_DB_HOST=mysql000ex11

    • e WORDPRESS_DB_NAME=wordpress000db

    • e WORDPRESS_DB_USER=wordpress000kun

    • e WORDPRESS_DB_PASSWORD=wkunpass
      wordpress

      
      

4) 레드마인 및 MariaDB 컨테이너를 대상으로 연습하자

  • 레드마인 → 티켓(누구에게 어떤 업무를 맡길지를 나타내는 ToDo)

  • 네트워크 생성

      docker network create redmine000net2
  • MySQL 컨테이너 생성

      docker run --name mysql000ex13 -dit --net=redmine000net2 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000kun -e MYSQL_PASSWORD=rkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
  • 레드마인 컨테이너 생성

      docker run -dit --name redmine000ex15 --network redmine000net2 -p 8086:3000 -e REDMINE_DB_MYSQL=mysql000ex13 -e REDMINE_DB_DATABASE=redmine000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine 
  • 확인

    Untitled

  • 뒷정리

    • MySQL과 MariaDB는 모두 개발자 미카엘 와이드니어스의 두 딸의 이름을 붙인 것.

6. 실전 컨테이너 사용법

  • 보다 실전에 가까운 내용들

1) 내게 필요한 지식이 무엇인지 알기

  • 서버 엔지니어나 보안 엔지니어라면 도커를 깊이 공부해야 한다.
  • 나올 내용
    • 6-2 절) 컨테이너와 호스트 사이에 파일 복사하기
    • 6-3 절) 볼륨 마운트
      • 바인드 마운트 → 컨테이너와 파일을 연동하는 데 많이 사용되는 기능. 모든 사람이 익혀두는 것이 좋음
      • 볼륨 마운트 → 운영체제와 무관하게 같은 방식으로 파일을 다룰 수 있는 기능
    • 6-4 절) 컨테이너를 이미지로 만들기
    • 6-5 절) 컨테이너 개조
    • 6-6 절) 도커 허브 로그인
    • 7장) 도커 컴포즈
      • 데이터베이스, 어플리케이션 컨테이너를 함께 시작하고 싶을 때, 환경을 대량으로 생성해야 할 때 유용하다
      • 산출물이 텍스트 파일 형태로 남아 관리에 유용하다
      • 시간 단축에 도움이 된다
    • 8장) 쿠버네티스
      • 여러 대의 서버에서 컨테이너를 실행할 때 사용하는 컨테이너 오케스트레이션 도구
      • 대규모 시스템을 운영할 때 사용한다

2) 컨테이너와 호스트 간에 파일 복사하기

  • 컨테이너와 호스트 사이에 파일을 복사하는 방법

  • 파일 복사 명령어) docker container cp

      # 컨테이너로 파일을 복사하는 커맨드(호스트 -> 컨테이너)
      docker cp 호스트_경로 컨테이너_이름:컨테이너_경로
    
      # 호스트로 파일을 복사하는 커맨드(컨테이너 -> 호스트)
      docker cp 컨테이너_이름:컨테이너_경로 호스트_경로
  • 실습 1) 호스트 파일 → 컨테이너

    • step 1. 호스트의 파일을 아파치 컨테이너 속으로 복사하기

        > docker run --name apa000ex19 -d -p 8089:80 httpd
    • step 2. cp 커맨드를 실행해서 호스트 파일을 컨테이너로 복사하기

        > docker cp C:\Users\enkee\Dropbox\PC\Downloads\index.html apa000ex19:/usr/local/apache2/htdocs/
        Successfully copied 2.05kB to apa000ex19:/usr/local/apache2/htdocs/
![Untitled](%E1%84%80%E1%85%B3%E1%84%85%E1%85%B5%E1%86%B7%E1%84%80%E1%85%AA%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%89%E1%85%B3%E1%86%B8%E1%84%8B%E1%85%B3%E1%84%85%E1%85%A9%20%E1%84%87%E1%85%A2%E1%84%8B%E1%85%AE%E1%84%82%E1%85%B3%E1%86%AB%20%E1%84%83%E1%85%A9%E1%84%8F%E1%85%A5%20&%20%E1%84%8F%E1%85%AE%E1%84%87%E1%85%A5%E1%84%82%E1%85%A6%E1%84%90%E1%85%B5%E1%84%89%E1%85%B3%20dc0390dda7c14da39cca94c56b24264c/Untitled%202.png)
  • 실습 2) 컨테이너 속 파일 → 호스트

      > docker cp apa000ex19:/usr/local/apache2/htdocs/index.html C:\Users\enkee\Dropbox\PC\Downloads
      Successfully copied 2.05kB to C:\Users\enkee\Dropbox\PC\Downloads

3) 볼륨 마운트

  • 볼륨을 마운트하면 컨테이너의 일부를 호스트 컴퓨터의 일부처럼 다룰 수 있게 된다
  • 볼륨
    • 스토리지의 한 영역을 분할한 것
  • 마운트
    • 대상을 연결해 운영체제 또는 소프트웨어의 관리 하에 두는 일
    • USB를 컴퓨터에 꽂으면 USB 메모리가 컴퓨터에 마운트된 것
    • 컨테이너 내부 데이터는 휘발되기 때문에, 컨테이너 외부에 둔 데이터에 접근해 사용하는 것을 의미
  • 도커의 스토리지 마운트
    • 볼륨 마운트
      • 도커가 관리하는 영역 내에 만들어진 볼륨(부분 영역)을 컨테이너에 디스크 형태로 마운트하는 것
      • 직접 조작하기 어려워 지우면 안되는 파일을 관리할 때 사용
    • 바인드 마운트
      • 도커가 설치된 폴더 등 도커 엔진에서 관리하지 않는 영역의 기존 디렉토리를 컨테이너에 마운트하는 방식
      • 자주 사용하는 파일을 두는 데 사용한다

4) 컨테이너로 이미지 만들기

5) 컨테이너 개조

6) 도커 허브 등록 및 로그인