Run The Bridge

docker 1일차 본문

Cloud/docker

docker 1일차

anfrhrl5555 2021. 7. 18. 22:15
728x90

0. 교재 및 참고자료

(2021. 07. 16. 금)


1. 도커란?

솔로몬 하익스라는 사람이 프랑스에서 Paas 기업인 '닷클라우드' 안에 내부 프로젝트로서 도커를 시작
도커는 2013년 3월 Docker, lnc에서 출시한 오픈 소스 컨테이너 프로젝트
현재 전세계적으로 큰 인기를 끌고있다.
AWS, GCP, Azure 등의 클라우드 서비스에서 공식 지원
Go 언어로 작성된 "The future of linux Containers"


2. 가상머신과 docker Container

  • 기존의 가상화 기술은 HyperVisor를 이용해 여러개의 운영체제를 하나의 호스트에서 생성 🡪 다른 Guest OS 간 완전히 독립된 공간과 자원을 할당하였다.
  • Guest OS가 생성될 때 반드시 하이퍼바이저를 거치기 때문에 성능 손실 발생
  • Guest OS는 라이브러리, 커널 등을 전부 포함 🡪 이미지 사이즈가 크다
  • 도커 컨테이너는 리눅스 자체 기능인 chroot, namespace, cgroup을 사용하여 프로세스 단위의 격리 환경 생성 🡪 성능 손실이 거의 없다
  • 커널은 호스트의 커널을 공유해 사용
  • 애플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재 🡪 이미지 사이즈 대폭 축소

 

2.1 도커를 시작해야 하는 이유

자유로운 배포

개발환경, 통합환경, 운영환경 어디든 사용할 수 있고, rollback 또한 쉽게 할 수 있다.

서버 한대로 가상 환경을 구축

베어메탈 서버 구성만으로 가상화 서버처럼 구성할 수 있다.

이식성

Docker Container images는 physical, virtual, public cloud 등 쉽게 배포가 가능하다

마이크로 서비스

Docker Container를 통해 표준화된 코드 배포를 활용하여 분산 application Architecture를 구축하고 확장 가능하다.

 

2.2 개발자는 왜 도커를 사용하는가?

  • 이식 가능한 런타임 환경을 손쉽게 만들 수 있다.
  • 각 앱마다 다양한 버전의 라이브러리 및 기타 종속성을 실행할 수 있다.
  • Microservices, DevOps, CI/CD 를 관리하기 쉽다.
  • 특정 플랫폼과의 호환성에 대한 우려를 줄일 수 있다.

3. 리눅스 도커 엔진 설치

설정 사양

[root@docker ~]# cat /etc/*release
CentOS Linux release 7.9.2009 (Core)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

CentOS Linux release 7.9.2009 (Core)
CentOS Linux release 7.9.2009 (Core)
# yum-config-manager 명령어를 사용하기 위해 yum utils 설치
$ yum install -y yum-utils

# yum 설정에 docker repository 추가
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 설치 가능한 docker-ce 버전 확인
$ yum --showduplicates list docker-ce

# 최신 버전 설치
$ yum install -y docker-ce

# 교재와 동일한 버전 설치
$ yum install -y docker-ce-20.10.5 docker-ce-cli-20.10.5 docker-ce-rootless-extras-20.10.5

# docker daemon 시작 및 등록
systemctl start docker
systemctl enable docker

# docker daemon running 확인
systemctl status docker
[root@docker ~]# docker -v Docker
version 20.10.7, build f0df350

 

3.1 Docker image

  • 컨테이너를 생성할 때 필요한 요소
  • iso 이미지 파일과 비슷한 개념
  • 여러 개의 레이어로 된 바이너리 파일로 존재
  • 읽기 전용으로 사용
  • 저장소 이름 : 이미지가 저장된 저장소(registry) 이름. 이름이 없으면 Docker  Hub의 공식 이미지를 뜻함
  • 이미지 이름 : 이미지의 역할을 나타냄
  • 태그 : 이미지 버전관리에 사용

 

3.1.1 Docker Registry vs Doceker Repository

Docker Registry: 도커 이미지를 저장하는 서비스, 예를들어 도커 허브, Quay, ECR 등 실제 이미지를 저장하고 관리하는 서비스

Docker Repository: 이름이 같지만 태그가 다른 도커 이미지의 논리적 모음

 

3.1.2 컨테이너 생성

도커 버전 확인: docker -v
우분투 컨테이너 생성: docker run -i -t ubuntu:18.04

exit로 빠져나오기
ctrl + p + q로 빠져나오기

 

exit로 빠져나오면 docker container가 종료되버려서 'docker start [CONTAINER ID]'를 넣어줘야 한다.

 

ctrl + p + q로 빠져나오면 docker container는 종료되지않고 살아있어서 start 를 따로 해줄 필요가 없다.

 

docker에서 이미지를 다운받을려면 'docker pull' 명령어를 사용하면 된다.

docker pull centos:7  # centos 7 이미지 다운로드

 

docker images  # 다운받는 이미지 목록

 

docker create  # 컨테이너 생성
docker start  # 컨테이너 실행
docker attach  # 컨테이너 접속

 

docker rm  # 컨테이너 삭제

→ 작동중인 컨테이너는 삭제되지 않는다. '-f: focre' 옵션을 주어서 강제삭제

docker container prune  # stop 된 컨테이너 전부 삭제

 

docker stop $(docker ps -a -q)  # docker ps에 있는 모든 컨테이너 작동정지
docker rm $(docker ps -a -q)  # docker ps에 있는 모든 작동정지 컨테이너 삭제

 

3.1.3 컨테이너를 외부에 노출

컨테이너는 가상 머신과 마찬가지로 가상 IP주소를 할당받습니다. 기본적으로 docker는 컨테이너에서 172.17.0.x의 IP를 순차적으로 할당합니다.

 

이 컨테이너에 아무런 설정을 하지 않는다면 외부에서 접근할 수 없으며, 도커가 설치된 호스트에서만 접근할 수 있습니다.

 

외부에 컨테이너의 application을 노출하기 위해서는 eth0의 IP와 port를 host의 IP와 port에 binding 해야합니다.

docker run -i -t --name network_test -p 80:80 ubuntu:14.04

 

(실습)컨테이너에 apache 웹 서버 설치 후 apache 서비스 포트를 호스트에 연결하기

apt-get update
apt-get install apache2 -y
service apache2 start
netstat -an | grep 80 | grep LISTEN

http:192.168.100.150  # 컨테이너의 IP말고 VM의 IP를 입력한다.

※ 컨테이너 포트와 웹 서버 포트는 일치 시켜야한다 → 80번

 

 

※ 한 컨테이너에 프로세스 하나만 실행하는 것이 도커의 철학

 

(실습) wordpresss 서비스 구축, mysql DB 컨테이너 구성, Wordpress 컨테이너 구성

docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e  MYSQL_DATABASE=wordpress mysql:5.7  # MYSQL DB 컨테이너 기동
docker run -d --name wordpress -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=password --link wordpressdb:mysql -p 10000:80 wordpress  # wordpress 컨테이너 기동

-d: detached 모드로 컨테이너 실행

-e: 컨테이너 내부의 환경변수 설정

--link(deprecated): 컨테이너간 연결을 컨테이너 이름(별명, alias)으로 접근하도록 설정

 

http://192.168.100.150:10000/wp-admin/install.php

wordpress 접속완료

※ 앞에서 우분투, CentOS 컨테이너를 생성한 것처럼 -t, -t 옵션으로 run을 실행하묜 표준 입출력이 활성화된 상호작용이 가능한 셸 환경을 사용할 수 있습니다. docker ps 명령어로 컨테이너 목록을 확인할 떄 command에 표시되는 /bin/bash가 바로 여기에 해당합니다.

 

그러나 -d 옵션으로 run을 실행하면 입출력이 없는 상태로 컨테이너를 실행합니다. 컨테이너 내부에서 프로그램이 터미널을 차지하는 포그라운드로 실행돼 사용자의 입력을 받지 않습니다. Detached 모드인 컨테이너는 반드시 컨테이너에서 프로그램이 실행돼야 하며, 포그라운드 프로그램이 실행되지 않으면 컨테이너는 종료됩니다.

 

이를 테스트하기 위해 컨테이너 내부에서 프로그램을 실행하지 않은 채로 -d 옵션을 설정해 봅시다.

docker run -d --name detach_test ubuntu:14.04  # 바로 종료된다.

docker run -d --name detach_test ubuntu:14.04


4. 도커 볼륨

  • 도커 이미지는 읽기 전용
  • 컨테이너에서는 쓰기가 가능하지만 컨테이너 삭제 후 모든 데이터도 삭제
  • 컨테이너의 데이터를 유지하는 방법으로 볼륨을 사용

도커의 컨테이너는 생성과 삭제가 매우 쉬우므로 실수로 컨테이너를 삭제하면 데이터를 복구할 수 없게 된다. 이를 방지하기 위해 컨테이너의 데이터를 영속적(Persistent) 데이터로 활용할 수 있는 방법이 몇 가지 존재하는데 그중 가장 활용하기 쉬운 방법이 바로 볼륨을 활용하는 것

 

4.1 호스트 볼륨 공유

# MYSQL DB 컨테이너 가동
docker run -d --name wordpressdb_hostvolume -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -v /home/wordpress_db:/var/lib/mysql mysql:5.7 
# wordpress 컨테이너 가동
docker run -d --name wordpress_hostvolume -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=password --link wordpressdb_hostvolume:mysql -p 10000:80 wordpress 

docker container 확인
wordpress_Db가 생성된 모습

# mysql 컨테이너 삭제
docker rm -f 'wordpressdb_hostvolume'

 

(실습) 이미 디렉토리와 파일이 호스트에도 존재하고 컨테이너에도 존재할 때, 볼륨으로 공유하면 어떻게 될까요?

docker run -i -t --name volume_dummy alicek106/volume_test

docker run -t -i --name volume_overrid -v /home/wordpress_db:/home/testdir_2 alicek106/volume_test

※ 결과: 덮어쓰기 된 것을 확인할 수 있다.

 

4.2 도커 볼륨

docker volume create --name myvolume
docker volume ls
docker run -i -t --name myvolume_1 -v myvolume:/root ubuntu:14.04 
echo hello, volume! >> /root/volume root@1ce8a47d7363
docker inspect --type volume myvolume

 

# 볼륨 상세 정보 확인
docker inspect --type volume
# 컨테이너 상세 정보 확인
docker container inspect my_volume1
# 도커 볼륨 자동 생성
docker run -i -t --name volume_auto -v /root ubuntu:14.04
# 도커 볼륨 자동 생성 정보 확인
docker container inspect volume_auto
# 도커 볼륨 삭제1
docker volume ls  → docker volume rm
# 도커 볼륨 삭제2
docker volume prune

5. 도커 네트워크 구조

  • 도커는 컨테이너에 내부 IP를 순차적으로 할당한다
  • 컨테이너의 IP는 컨테이너가 재시작될 때마다 변경될 수 있다
  • 컨테이너의 IP는 컨테이너 내부에서만 인식된다
  • 외부와 통신하기 위해서는 가상 인터페이스가 필요(veth)
  • veth는 docker0 브리지를 통해 호스트와 통신(브리지 네트워크)

 

(실습) 호스트 및 컨테이너의 인터페이스 확인, 브리지 네트워크 상태 확인, brctl 설치 명령어

# 호스트 및 컨테이너의 인터페이스 확인
ifconfig
# 브리지 네트워크 상태 확인
brctl show
# brctl 설치 명령어
yum install bridge-utils || apt-get install bridge-utils

728x90

'Cloud > docker' 카테고리의 다른 글

docker 5일차  (0) 2021.07.23
dockerfile을 이용하여 DB와 python 연동하기  (0) 2021.07.23
docker 4일차  (0) 2021.07.22
docker 3일차  (0) 2021.07.21
docker 2일차  (0) 2021.07.18
Comments