본문 바로가기
Web hacking/개념 정리 & 심화

[#1] 도커 환경 설정과 구축 실습

by m_.9m 2022. 2. 7.

1) 도커와 마이크로 서비스 이해

-도커 

컨테이너 기술을 지원하는 다양한 프로젝트중에 하나로 사실상 표준으로 사용되어지고 있다. 다양한 운영체제에서 사용가능하며 애플리케이션에 국한되지 않고 의존성 및 파일 시스템까지 패키징하여 빌드, 배포, 실행을 단순화. 

리눅스의 네임 스페이스와 cgroup와 같은 커널 기능을 사용하여 가능함(윈도우 불가)

 

-모놀리식 라이프 사이클과 마이크로 서비스 라이프 사이클 비교

모놀리식) 전부 개발 후 빌드-테스트-배포

마이크로 서비스) 각기 빌드-테스트-배포 후 조립

 

-마이크로 서비스의 장점

서비스 단위 고효율 저비용 Scale-Out(트래픽 관리기술) 구조

서비스 단위로 스케일링이 가능하여 불필요한 서비스는 줄이고 더 많은 자원이 필요한 서비스는 확정가능.

라이브러리 종속성 문제 X

 

-이미지, 컨테이너, 도커와 쿠버네티스

컨테이너는 가상머신을 사용해 각 마이크로 서비스를 격리하는 기술

컨테이너는 가상머신처럼 하드웨어를 전부 구현하지 않기 때문에 매우 빠른 실행 가능

프로세스의 문제가 발생할 경우 컨테이너 전체를 조정하기 때문에 컨테이너에 하나의 프로세스를 실행하도록 하는 것이 좋다.

 

그림 출처: https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/

-VM과 컨테이너 사용시 CPU 사용량 차이는 컨테이너가 확연히 적다.

-컨테이너 격리

리눅스 네임 스페이스

: 각 프로세스가 파일 시스템 마운트, 네트워크, 유저, 호스트 네임 등에 대해 시스템에 독립 뷰를 제공.

리눅스 컨트롤 그룹

: 프로세스로 소비할 수 있는 리소스 양(CPU, 메모리, I/O, 네트워크 대역대, device 노드 등)을 제한 가능.

 

2) 도커 레지스트리

도커 레지스트리에는 사용자가 사용할 수 있도록 데이터 베이스를 통해 이미지를 제공.

누구나 이미지를 만들어 푸시할 수 있으며 푸시된 이미지는 다른사람에게 공유 가능.

 

 

3) 도커 환경 설정

*실습은 리눅스 내 가상 환경이면 가능(칼리 - 우분투 - 데비안 등등)

우분투)

sudo apt-get update

sudo apt install docker.io (4:22 문제시)

sudo docker

sudo docker version

sudo docker system info

sudo docker system df

sudo docker pull nginx (docker hub내에서 다운)

sudo docker images

sudo docker system df

도커 허브 가입/ 오피셜임을 확인하고 다운할 것.

sudo docker search nginx

sudo docker search --filter=stars=1000 nginx

sudo docker search --limit=0 nginx

sudo docker images

sudo docker container run --name nginx_web -d -p 80:80 nginx //-d 설치 백그라운드 -p 포트 80

sudo docker ps

sudo ip addr 두번째 33

인터넷 열어 외부 접속 시도

sudo docker image inspect nginx

도커 설정파일 위치 확인 /var/lib/docker/containers

sudo docker container stats nginx_web

sudo docker ps

sudo docker stop nginx_web

sudo docker ps

sudo docker start nginx_web

 

4) 도커 컨테이너 두개 동작 및 활용

docker pull: 도커 이미지 다운로드

docker start: 컨테이너 인스턴스를 시작

docker run: 다운+시작

docker stop / docker restart

docker inspect: 컨테이너 상태에 대한 자세한 정보를 표시

docker attach: 사용자가 실행 중인 Docker 컨테이너 인스턴스의 기본 프로세스에 대한 엑세스 권한을 얻거나 연결

docker exec: 실행중인 컨테이너 내에서 명령을 실행합니다.

docker rm: 중지 된 컨테이너를 삭제

docker rmi: 컨테이너 이미지를 삭제

 

sudo docker exec -it nginx_web /bin/bash

cd /var/

cd /var/log/

cd /var/log/nginx/

ls -al

exit

sudo docker run -i -t -d --name ubuntn01 ubuntu:18.04

sudo docker ps 

sudo docker run -i -t -d --name ubuntn02 ubuntu:18.04

sudo docker ps

sudo docker exec -it ubuntu01 /bin/bash

ls

cd tmp/

cat > test01.txt

ls

exit

sudo docker ps

sudo docker exec -it ubuntu01 cat /tmp/test01.txt

sudo docker exec -it ubuntu02 /bin/bash

cd tmp/

cat > test02.txt

exit

sudo docker exec -it ubuntu02 cat /tmp/test02.txt

(resize 에러 종종 뜸)

sudo docker stop ubuntu01

sudo docker stop ubuntu02

sudo docker rm ubuntu01

sudo docker rm ubuntu02

sudo docker ps

sudo docker images

sudo docker rmi [imageID]

sudo docker images -all

(가끔 불필요한 이미지 자동 다운로드 됨.)

 

5) 도커 파일

도커 컨테이너 이미지에서 작동시킬 컨테이너의 구성 정보를 기술한 파일

공개된 도커이지를 바탕으로 컨테이너를 생성 -> OS 생성, 미들웨어 설치, 파라미터의 설정, 자동 구축된 컨테이너 이미지를 기반으로 생성

 

#도커파일에 포함되는 내용

베이스가 되는 도커 이미지 정보, 수행되는 명령어, 환경변수 설정, 컨테이너 안에서 작동시켜둘 데몬(B 프로세스) 실행 등

 

#도커파일 기본

FROM: 어떤 이미지를 기반으로 이미지를 생성할지 결정

베이스 이미지인 centos와 centos7 태그로 생성된 두개의 이미지가 생성

cat Dockerfile

form centos:centos7

sudo docker bulid -t centos7

sudo docker image ls

두 번째 이후로부터는 베이스 이미지를 다운로드 받지 않고 다른 태그로 설정한 이미지를 바로 생성

sudo docker bulid -t centos7_v2

sudo docker image ls

 

6) 도커 파일 활용

칼리 리눅스) 

mk docker

cd docker/

vim Dockerfile

"FROM ubuntu:latest //허브에서 관련이미지 다운

LABEL email=admin@boanproject.com //수정한 사람 정보 기록용

CMD ["echo","Hello Dockerfile"]" :wq

원래 pull 등으로 하는데, 파일 환경을 미리 세팅하거나 웹서버를 파일안에 구축할 때 사용

도커를 넘길때, 파일로 전송 가능.

Cat Dockerfile

sudo docker bulid -t ubuntu:v1.0 .(현재 디렉토리 파일 사용)

sudo docker image list

sudo docker run ubuntu:v1.0

 

7) 도커 파일로 웹 서버와 빌더 구축

RUN: FROM에서 설정한 이미지 위에 스크립트 혹은 명령을 실행

COPY: 로컬 호스트에 있는 파일을 이미지에 추가

EXPOSE: 호스트와 연결할 포트 번호를 설정

CMD: 컨테이너가 시작되었을 때 스크립트 혹은 명령어 실행

 

우분투 실행)

sudo vim dockerfile

"FROM ubuntu:latest

RUN apt-get update && apt-get install -y -q nginx

COPY index.html /usr/share/nginx/html/

EXPOSE 80

CMD ["nginx","-g","deamon off;"]" :wq

sudo vim index.html (저장위치확인)

"<h1> Nginx Server Test </h1>":wq

sudo docker build -t nginx_v1.0 -f Dockerfile .

sudo docker images

sudo docker ps

sudo docker run -d -p 80:80 nginx_v1.0

sudo docker ps

로컬 인터넷 확인

 

#golang 프로그램 환경 만들기

sudo vum Dockerfile_golang

"FROM dolang:latest

WORKDIR /myapp

COPY helloword.go .

RUN go build -o helloworld .

ENTRYPOINT["./helloworld"]" //서비스시작(run)때 프로그램 시작

sudo docker build -t go_hello:v1 -f Dockerfile_golang

----------------------------

sudo vim helloworld.go

"package main

import "fmt"

func main(){

 fmt.Printin("Hello World")

}"

sudo docker images

sudo docker run -it go_hello:v1

 

8) 도커 파일 활용의 모범 사례

#적합한 부모 이미지 사용

-기본 이미지에 사용자 정의 파일을 설치할 경우 이미 구축된 이미지를 활용하는 방법

From Run install ~~ --> FROM openjdk //구축된 이미지 활용, 최대한 경량화된 파일로 설치

-최종 버전만에 답이 아니다. 응용 프로그램에 적합한 이미지를 선택

-최소 크기의 도커 이미지를 사용할 수 있음 //alpine(가장 경량화)

-레이어를 최소화 (명령어마다 이미지 생성 --> ~~&& 같은 명령어는 묶어 사용한다.)

-보안을 위해 루트가 아닌 사용자 권한으로 사용

 

9) 도커 파일 불필요한 이미지 정리

칼리)

mkdir alpine

cd alpine/

vim Dockerfile

"FROM alpine

RUN apk update

RUN apk add wget" :wq!

sudo docker build -t alpine_basic .

sudo docker images

sudo docker inspect [IMAGE ID]

sudo du -sh /var/lib/docker/overlay2/   //용량확인

sudo docker images -a

sudo su

docker rmi -f $(docker images -a -q)

docker images

 

10) 도커 컴포즈로 워드프레스 구축

Docker-Conpose: 다수의 컨테이너를 빠르게 쉽게 생성할 수 있게 해주는 도구.

DockerFile: 이미지를 생성하고 특정 작업까지 같이 처리해주는 도구.

 

칼리) 워드프레스 파일 검색해서 다운

docker docs 접속

docker wordpress compose 검색

vim docker-compose.yu~~

sudo apt-get update

sudo apt install docker-compose

sudo service docker service

sudo docker-compose up -d 

sudo docker ps

브라우저로 실행 :8000

한국어로 실행 후 가입, 로그인

 

11) 도커 로그 살펴보기

오류가 나거나 침해 사고가 발생했을 때 로그를 분석하게 되는데, 기본적인 로그 구조를 배운다.

docker ps

docker exec -i -t wordpress /bin/sh

ls -al

cd /var/lof

ls -al

cd apache2

ls -al

// log -> dev/stdout(외부에 통합출력)

(호스트)root@ 

docker

docker log

docker logs wordpress //요기 에러

docker inspect wordpress //설정에서 경로 볼 수 있음. 상단 이미지부분에 Logpath

경로/파일이름 그대로 복사 붙여넣기 후 보기.