728x90

Docker 설치 완료 후 Docker를 사용한 웹 서버 구축을 테스트해보자

 

# 1. 이미지 다운로드

 

hjk@hjk-VirtualBox:~$ sudo docker pull nginx



Using default tag: latest

latest: Pulling from library/nginx

69692152171a: Pull complete 

30afc0b18f67: Pull complete 

596b1d696923: Pull complete 

febe5bd23e98: Pull complete 

8283eee92e2f: Pull complete 

351ad75a6cfa: Pull complete 

Digest: sha256:6d75c99af15565a301e48297fa2d121e15d80ad526f8369c526324f0f7ccb750

Status: Downloaded newer image for nginx:latest

docker.io/library/nginx:latest

 

 

# 2. 이미지 확인

 

# 클라이언트 PC로 다운로드가 제대로 되었는지 확인

 

hjk@hjk-VirtualBox:~$ sudo docker image ls



REPOSITORY   TAG       IMAGE ID       CREATED       SIZE

ubuntu       latest    9873176a8ff5   3 days ago    72.7MB

nginx        latest    d1a364dc548d   3 weeks ago   133MB

 

 

# 3. 이미지를 사용하여 nginx 서버 실행

 

# 명령어 실행 후 웹 브라우저 주소창에서 http://[가상머신 IP 주소]:80 입력 

 

hjk@hjk-VirtualBox:~$ sudo docker container run --name webserver -d -p 80:80 nginx



3e64d7145e5aa9d6921bfed62d9ef28da9f882f2d9e2dfa5b2c9775910a04596

 

 

 

# 4. nginx 서버 상태 확인

 

# ‘webserver’라는 이름의 docker 컨테이너에서 nginx 서버 프로세스가 시작되어, 컨테이너 80 포트를 전송하고 있다는 것을 알 수 있음

 

hjk@hjk-VirtualBox:~$ sudo docker container ps



[sudo] hjk의 암호: 

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                     NAMES

3e64d7145e5a   nginx     "/docker-entrypoint.…"   22 minutes ago   Up 22 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   webserver

 

 

# 5. 컨테이너 가동 확인

 

# 컨테이너 상세 내용

 

hjk@hjk-VirtualBox:~$ sudo docker container stats webserver



CONTAINER ID   NAME        CPU %     MEM USAGE / LIMIT    MEM %     NET I/O          BLOCK I/O     PIDS

3e64d7145e5a   webserver   0.00%     5.48MiB / 7.775GiB   0.07%     6.02kB / 2.6kB   0B / 8.19kB   5

 

 

# 6. 컨테이너 정지 및 시작

 

hjk@hjk-VirtualBox:~$ sudo docker stop webserver

webserver

hjk@hjk-VirtualBox:~$ sudo docker start webserver

webserver

 

# 컨테이너 정지 후 nginx 서버에 액세스를 할 수 없음

 

 

728x90
728x90

[이론] 개념 정리

 

# 1. VirtualBox Network

 

  • Bridge (VMnet0): 공유기에서 직접 가상머신으로 IP 할당 => 인터넷 연결 O
  • NAT (VMnet8, enp0s3): 외부와 통신 => 인터넷 연결 O
  • Host-only (VMnet1, enp0s8): 호스트 PC와 외부 통신 X => 인터넷 연결 X

 

# 2. 패키지 설치

 

$ apt-tranport-https : 패키지 관리자가 https를 통해 데이터 및 패키지에 접근할 수 있도록 함

 

$ ca-certificates : certificate authority에서 발행되는 디지털 서명, SSL 인증서의 PEM 파일이 포함되어 있어 SSL 기반 앱이 SSL 연결이 되어 있는지 확인할 수 있음, curl은 기본적으로 https 사이트의 SSL 인증서를 검증함

 

$ curl : URL을 사용하여 데이터를 전송하기 위한 명령줄 도구 및 라이브러리, 특정 웹사이트에서 데이터 다운로드할 때 사용

 

$ software-properties-common : 리포지토리의 추상화, 소프트웨어 소스 관리, PPA를 추가하거나 제거할 때 사용

 

 

wget vs curl

  • 공통점: 웹 사이트에서 데이터를 다운로드할 수 있음
  • curl이 wget보다 다양한 프로토콜 지원, 다양한 플랫폼에서 빌드/작동 가능, 자동 압축해제 지원

 

PPA

  • Personal Package Archive, 개인 패키지 저장소.
  • 개발자가 소스코드를 업로드하면 자동으로 패키지화 함.
  • 사용자가 다운로드받아 설치할 수 있게 해주는 소프트웨어 저장소.

 

# 3. GPG 키

GPG란

  • 강력한 암호화 프로그램
  • RSA 방식 사용
  • 나의 이메일을 암호화하는 데 사용
  • 대부분의 리눅스 배포판에는 패키지 저장소 인증을 위해 gpg1.x버전이 포함되어 있음

 

# 4. 리포지토리 등록

  • 저장소 설정
  • $ lsb_release -cs : Ubuntu 배포판 이름 반환
728x90
728x90

[실습 II] Docker 설치 실행

 

# 1. ssh 접속

 

MacBook-Pro:~ user$ ssh hjk@192.168.56.102

hjk@192.168.56.102's password: [해당 사용자 계정 비밀번호 입력]



Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-42-generic x86_64)

…

 

 

# 2. apt 업데이트

 

hjk@hjk-VirtualBox:~$ sudo apt-get update

 

 

# 3. 패키지 설치

 

hjk@hjk-VirtualBox:~$ sudo apt-get install -y \
> apt-transport-https \
> ca-certificates \
> curl \
> software-properties-common

 

 

# 4. GPG 키 추가

 

hjk@hjk-VirtualBox:~$ sudo  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -



OK

 

 

# 5. GPG 키 확인

 

hjk@hjk-VirtualBox:~$ sudo apt-key fingerprint 0EBFCD88



pub   rsa4096 2017-02-22 [SCEA]

      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88

uid           [ unknown] Docker Release (CE deb) <docker@docker.com>

sub   rsa4096 2017-02-22 [S]

 

 

# 6. 리포지토리 등록

 

hjk@hjk-VirtualBox:~$ sudo add-apt-repository \
> "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
> $(lsb_release -cs) \
> stable"

[sudo] hjk의 암호: [해당 사용자 계정 비밀번호 입력]



hjk@hjk-VirtualBox:~$ sudo apt-get update

 

 

# 7. Docker 설치하기

 

hjk@hjk-VirtualBox:~$ sudo apt-get install docker-ce

[sudo] hjk의 암호: [해당 사용자 계정 비밀번호 입력]

 

 

# 8. Docker 작동 확인 - Hello world 실행

 

# Docker 이미지가 로컬 환경에 없을 경우, 이미지 다운로드 시간 소요

 

hjk@hjk-VirtualBox:~$ sudo docker container run ubuntu:latest /bin/echo 'Hello world'

[sudo] hjk의 암호: 



Unable to find image 'ubuntu:latest' locally

latest: Pulling from library/ubuntu

c549ccf8d472: Pull complete 

Digest: sha256:aba80b77e27148d99c034a987e7da3a287ed455390352663418c0f2ed40417fe

Status: Downloaded newer image for ubuntu:latest

Hello world

 

 

# Docker 이미지가 로컬 환경에 있을 경우(로컬 캐시), 빠른 속도로 실행되는 컨테이너 확인

 

hjk@hjk-VirtualBox:~$ sudo docker container run ubuntu:latest /bin/echo 'Hello world'



Hello world

 

 

# 9. Docker 버전 확인

 

hjk@hjk-VirtualBox:~$ sudo docker version



Client: Docker Engine - Community
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        f0df350
 Built:             Wed Jun  2 11:56:40 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.7
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       b0f5bc3
  Built:            Wed Jun  2 11:54:48 2021
  OS/Arch:          linux/amd64
  Experimental:     false

 containerd:
  Version:          1.4.6
  GitCommit:        d71fcd7d8303cbf684402823e425e9dd2e99285d

runc:
  Version:          1.0.0-rc95
  GitCommit:        b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7

 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

 

# 10. Docker 실행 환경 확인

 

# docker 실행 환경의 상세 설정 표시

 

hjk@hjk-VirtualBox:~$ sudo docker system info



Server:

 Containers: 2 # 컨테이너 수
  Running: 0
  Paused: 0
  Stopped: 2
  
 Images: 1

 Server Version: 20.10.7 # Docker 버전

 Storage Driver: overlay2 # 스토리지 드라이버 종류

…

 OSType: linux # OS 종류

 Architecture: x86_64 # 아키텍처

…

 

 

# 11. Docker 디스크 이용 상황

 

# Docker가 사용하고 있는 디스크의 이용 상황 표시

 

hjk@hjk-VirtualBox:~$ sudo docker system df



TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE

Images          1         1         72.75MB   0B (0%)

Containers      2         0         0B        0B

Local Volumes   0         0         0B        0B

Build Cache     0         0         0B        0B

 

 

# 상세 내용 확인 시 -v 옵션 사용

 

hjk@hjk-VirtualBox:~$ sudo docker system df -v



Images space usage:



REPOSITORY   TAG       IMAGE ID       CREATED      SIZE      SHARED SIZE   UNIQUE SIZE   CONTAINERS

ubuntu       latest    9873176a8ff5   3 days ago   72.75MB   0B            72.75MB       2



Containers space usage:



CONTAINER ID   IMAGE           COMMAND                  LOCAL VOLUMES   SIZE      CREATED             STATUS                         NAMES

23397a442583   ubuntu:latest   "/bin/echo 'Hello wo…"   0               0B        About an hour ago   Exited (0) About an hour ago   confident_davinci

a8e81469bebc   ubuntu:latest   "/bin/echo 'Hello wo…"   0               0B        About an hour ago   Exited (0) About an hour ago   interesting_wilson



Local Volumes space usage:



VOLUME NAME   LINKS     SIZE



Build cache usage: 0B



CACHE ID   CACHE TYPE   SIZE      CREATED   LAST USED   USAGE     SHARED
728x90
728x90

[실습 I] Docker 설치  실행

 

실습 환경

 

 

우분투 설치

 

가상 머신 이름 입력

 

메모리 크기 입력 (8GB)

 

가상 하드 디스크 파일 형식 선택 (VDI)

 

동적 할당: 생성 속도가 빠름, 호스트 PC의 스토리지를 절약할 수 있음

고정 크기: 디스크 속도가 빠름, 다른 가상 서버와 공유할 수 있음

가상 하드 디스크 할당 형식 선택 (동적 할당)

 

가상 하드 디스크 크기 설정 (100GB)

 

가상 머신 생성을 마친 후 시스템 설정 창 열기

 

시스템 탭 > 마더보드 > 메모리 크기 확인

 

시스템 탭 > 프로세서 > 프로세서 개수: 4 변경

 

저장소 탭 > ios 파일 삽입

 

다운로드 받은 ios 파일 선택

 

오디오 해제

 

USB 컨트롤러 해제

 

네트워크 > 어댑터 1 > NAT

 

네트워크 > 어댑터 2 > 호스트 전용 어댑터

 

Download updates while installing Ubuntu 체크 해제

 

사용자 이름 및 비밀번호 입력

 

설치 완료 후 검은 창이 뜬다면 시스템 전원을 강제로 종료하고 재시작 수행

 

* windows에서 docker 설치 시 설정해주어야 함. (그러나 hyper-v 사용 시 가상 머신 사용 불가)
* windows에서 docker 사용은 권장하지 않음.

제어판 > 프로그램 > Windows 기능 켜기/끄기 > Hyper-V 체크 해제

 

Ubuntu 설치 후 외부 SSH 원격 접근 설정

 

~$ sudo su - 									# root로 변경(암호는 jeff)
root@docker-host1~# ifconfig 						# not command
root@docker-host1~# apt-get update 					# apt는 무조건 업데이트 먼저 실행
root@docker-host1~# apt-get -y install net-tools

root@docker-host1~# apt-get -y install openssh-server
root@docker-host1~# /etc/init.d/ssh start
root@docker-host1~# apt-get install vim 				# 일반 vi 편집기 설치
root@docker-host1~# vi /etc/ssh/sshd_config 			# 원격 root 접근 허용
	31 PermitRootLogin yes
	32 #PermitRootLogin prohibit-password
root@docker-host1~# /etc/init.d/ssh restart
root@docker-host1~# ping 192.168.56.1

 

설정 후 Putty(외 원격 접속 도구)를 이용하여 접속이 제대로 되는지 확인

ubuntu 터미널에서 ifconfig 명령어 실행 > enp0s8 IP 주소 확인
putty 연결

 

Docker 엔진 설치

 

root@docker-host1~# exit

# 설치 고려사항 리눅스 커널 정보(3.10 이상)와 64비트 확인(x86_64)

~$ uname -a
~$ sudo apt-get install -y \						# 패키지 설치
	  apt-transport-https \
	  ca-certificates \
	  curl \
	  software-properties-common
~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -	# GCP 키 추가
~$ sudo apt-key fingerprint 0EBFCD88					# GCP 키 확인

# debian 계열의 docker repository 추가 후 apt update 수행(/etc/apt/sources.list에 기록)

~$ sudo add-apt-repository \
> "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
> $(lsb_release -cs) \
> stable"

~$ cat /etc/apt/sources.list 		# repository 정보 추가 확인
... 
 deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable
~$ sudo apt-get update
[sudo password for jeff]: 
~$ apt-cache policy docker-ce
 
~$ sudo apt-get -y install docker-ce	# docker CE 버전 설치
~$ sudo docker version
~$ sudo usermod -aG docker jeff	# sudo 없이 docker 사용하기
~$ sudo systemctl enable docker
~$ sudo systemctl restart docker
~$ sudo reboot
~$ docker version (Server: Docker Engine Version: 19.03.13)

 

설정이 성공적으로 완료되었다면 Client와 Server 확인 가능

 

 

도커 허브 로그인 성공

 

728x90
728x90

[이론 II] 컨테이너 서비스 이해와 Docker 활용

 

 

가상 머신 vs 컨테이너

 

출처: https://hackaday.com/2018/09/05/intro-to-docker-why-and-how-to-use-containers-on-any-system/

 

VMs Containers
 - 가상 머신은 물리적 머신보다 속도가 느리고 성능이 떨어진다.
 - Guest OS 설치가 필수다.
 - 이미지에 OS가 포함되어 무겁다.
 - 컨테이너는 가상 머신보다 속도가 빠르고 성능이 좋다.
 - 컨테이너는 호스트 OS의 커널을 공유하여 사용한다.
 - 이미지가 가볍다.

 

 

Docker란?

 

  • 리눅스 컨테이너 기반의 오픈 소스 가상화 플랫폼이다.
  • 애플리케이션을 신속하게 구축 및 배포할 수 있다.
  • Guest OS가 없다.
  • Guest OS는 하드웨어의 의존적인 명령어를 사용하여 성능 저하를 불러온다 => 가상 머신이 컨테이너보다 성능이 떨어지는 이유

 

 

Docker Architecture

 

  • 클라이언트: 데몬과 Unix 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신한다.
  • 데몬: Docker 컨테이너를 빌드, 실행, 배포하는 작업을 수행한다.
  • 레지스트리: Docker 이미지를 저장한다. (기본적으로 Docker Hub에서 이미지를 찾도록 구성됨)
  • 객체: 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 객체

 

출처: https://docs.docker.com/get-started/overview/

 

 

이미지와 컨테이너

 

이미지(실행 파일)

  • 프로그램, 라이브러리, 소스를 설치하고 파일로 생성한 것

 

컨테이너(프로세스)

  • 이미지를 실행한 상태

 

 

Docker Command

 

 docker build  이미지 생성
 docker pull  이미지 다운로드
 docker run  이미지 생성 > 이미지 실행 > 컨테이너 시작
 docker images  다운로드한 이미지 목록 출력
 docker ps -a  정지된 컨테이너까지 모두 출력 
 docker start  컨테이너 시작
 docker restart  컨테이너 재부팅
 docker attach  컨테이너 접속
 docker exec  컨테이너 내부에서 명령 실행
 docker stop  컨테이너 정지
 docker rm  컨테이너 삭제
 docker rmi  컨테이너 이미지 삭제

 

 

 

728x90
728x90

[이론 I] 컨테이너 서비스 이해와 Docker 활용

 

클라우드 서비스 모델

 

 

시스템 기반의 구성 요소

 

  • [하드웨어] 물리적인 요소 - 서버 장비 본체, 스토리지, 전원 장치 등
  • [네트워크] 라우터, 스위치, 방화벽, 네트워크 장비들의 연결을 위한 케이블 배선
  • [OS] 하드웨어나 네트워크 장비 제어를 위한 기본 소프트웨어
     A. 클라이언트 OS - Windows / macOS
     B. 서버 OS - Windows Server / Unix / Linux
  • [미들웨어] 서버 OS 상에서 서버가 특정 역할을 다하기 위한 기능을 갖고 있는 소프트웨어
     A. 상용
     B. 오픈 소스

 

Linux kernel

 

  • 하드웨어 제어에 관한 OS의 핵심이 되는 기능
  • [디바이스 관리]
    A. Linux 커널은 하드웨어를 디바이스 드라이버라는 소프트웨어를 이용하여 제어
    B. 하드웨어 - CPU / 메모리 / 디스크 / 입출력 장치
  • [프로세스 관리]
    A. PID라는 식별자를 붙여 관리
    B. 프로세스의 실행을 위해 필요한 CPU를 효율적으로 할당
  • [메모리 관리]
    A. 프로그램/데이터를 물리 메모리에 효율적으로 할당
    B. swap : 가상 메모리 영역
    C. 스왑아웃 : 메모리상에 전개된 이용 빈도가 낮은 데이터를 스왑으로 보냄
    D. 스왑인 : 스왑상의 데이터를 메모리로 되돌림 하드웨어 제어에 관한 OS의 핵심이 되는 기능

Linux Shell

 

  • Linux 커널을 조작할 때 이용
  • 쉘은 사용자가 내린 명령을 커맨드로 받음 > Linux 커널에 전달
  • 기능
    A. 애플리케이션 실행/정지/재실행
    B. 환경변수 관리
    C. 명령 이력 관리(명령 히스토리)
    D. 명령 실행 결과 표시 및 파일 출력
  • 쉘 스크립트
    A. 쉘에서 실행하고자 하는 명령을 모아서 텍스트 파일에 기술한 것
    B. 제어 구문 사용 가능 > 조건 분기 또는 반복 처리 수행

 

Linux File System

 

 

  • Linux에서 하드 디스크나 USB 메모리, CD, DVD 등과 같은 데이터에 액세스하기 위한 장치
  • VFS (Virtual File System) : 가상 파일 시스템
    A. 각 디바이스를 파일로 취급
    B. 다양한 파일 시스템을 일관된 형태로 인식하도록 함

 

Linux Directory

 

 

인프라 구성 관리 툴 개요

 

  • [Bootstrapping] OS의 시작을 자동화하는 툴
    A. OS 설치
    B. 가상 환경 설정
    C. 네트워크 구성 설정
    D. KickStart - Red Hat 계열 Linux 배포판에서 사용 가능
    E. Vargrant - 로컬 PC에 가상 환경을 만들기

 

  • [Configuration] OS나 미들웨어의 설정을 자동화하는 툴
    A. OS 설정 (보안/서비스 시작 등)
    B. 미들웨어 (각종 서버)의 설치 및 설정
    C. Chef, Ansible, Puppet, Itamae

 

  • [Orchestration] 여러 서버의 관리를 자동화하는 툴
    A. 애플리케이션 배포
    B. 서버군의 오케스트레이션
    C. Kubernetes - 여러 컨테이너를 통합 관리하는 툴
728x90

+ Recent posts