이번에는 유저 요청에따라 동적으로 데이터를 리턴해주려고한다.

 

이를 위해, DBMS를 설치해 데이터를 저장하고, 조건에 맞는 Value 값을 찾아서 회신할 것이다.


1) My sql 설치

sudo apt-get update
sudo apt-get install mysql-server

 

※ 방화벽 설정이 되어있다면, Mysql 포트를 열어주어야 한다. ( 3306 )

 

sudo ufw allow mysql

 

ㅁ 실행 및 DBMS 접속

 

service mysql service
mysql -u root -p

 

ㅁ 데이터베이스 및 유저생성

 

Mysql> CREATE DATABASE USER;
Mysql> CREATE USER 'pyadm'@'localhost' IDENTIFIED BY 'password';

 

ㅁ 권한 부여 및 확인

 

Mysql> GRANT ALL PRIVILEGES ON USER.* to pyadm@localhost;
Mysql> grant all privileges on *.* to 'pyadm'@'localhost';
root> mysql -u pyadm -ppassword

 

2) 데이터 구성

 

ㅁ ID를 KEY 값으로, 이름을 필드로 갖는 user_info 테이블 생성

CREATE table user_info( id int(10) NOT NULL, name char(20) DEFAULT NULL, PRIMARY KEY (id) );

 

ㅁ 테스트 데이터 입력

 

INSERT INTO user_info VALUES(1234,'kim');
INSERT INTO user_info VALUES(123,'Lee');
commit;

 

3) Python - Mysql 연결

 

pip3 iinstall --proxy [proxy_ip] --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --trusted-host pypi.org PyMysql

 

ㅁ 테스트 코드 작성 ( 커넥터 설정 및 커서 )

 

import pymysql

user_db = pymysql.connect (
  user='pyadm',
  passwd='password',
  host='localhost',
  db='user',
)

cursor = user_db.cursor()
sql= " select * from user_info"

cursor.execute(sql)
print(cursor.fetchall())

 

4) request 에서 조건값 가져오기

 

http://localhost:80/api/users/1234

 

ㅁ Rest_api 서버 코드 수정

 

@api.route('/api/users/<int:id>')   -- id라는 변수를 만들어 int 값 저장
class HelloWorld(Resource):
  def get(self,id):  -- 멤버 변수 파라미터로 id 설정
    return {"id": id, -- id 변수값
              "name": "kim"}

 

 

5) 가져온 조건값을 DB에 입력하여, 리턴해주도록 수정

 

@api.route('/api/users/<int:id>')
class HelloWorld(Resource):
 def get(self,id):
    cursor = user_db.cursor()
    sql = " select * from user_info where id= " + str(id)
    cursor.execute(sql)
    data=cursor.fetchall()
    return {"id": data[0][0],
              "name": data[0][1]}

 

 

Nginx는 경량 웹 서버로, 가벼움과 높은 성능을 목표로 하는 웹서버이다.

 

주로 정적 웹페이지를 리턴하는 용도나 Reverse Proxy를 통해 로드밸런서로 사용한다.


특징으로는 Event-Driven 구조로 되어있어, Apache 웹서버에 비해 더 작은용량으로 운영이 가능하다.

 ※ Apache 웹서버는 1개의 클라이언트 요청 = 1개의 쓰레드로, 동기화방식.

 

Event-Driven 에서는, 요청을 Event Handler를 통해 이벤트를 발생시키고

 

비동기로 처리하여 다량의 요청을, 효율적으로 처리할 수 있다.

 


Reverse Proxy를 사용해서 아래 그림처럼 아키텍처를 구성해보려한다.

 

1) 기존 80포트로 열려있던 python api 서버를 82포트로 변경

2) Nginx 설치 및 Reverse Proxy 설정

apt-get update
apt-get install nginx

 

/etc/nginx/conf.d/default.conf 

 

server {
 listen 80; // 80포트로 리슨하고
 
 location /api/ { //api 리퀘스트 요청이 온다면
 proxy_pass http://localhost:82; // 파이썬 rest_api 서버로 포워딩
 }
}

3) Nginx reload 및 Python 가동 후 연결

 

nginx -s reload
python3 rest_api.py

=> Nginx 에서 해당 리퀘스트 처리 페이지를 찾지 못하였다.

  => 프로세스가 안떠있는가? ( X )

  => 컨테이너 포트오픈이 안되어있는가? ( X )

 

가정1) rest_api 컨테이너 포트오픈이 안되었다?

 

Nginx 까지는 도달하였으나, rest_api 컨테이너는 오픈이 안되어있어 도달하지 못했다.

=> 같은 컨테이너에 Nginx 와 Python을 띄운거라 네트워크 이슈는 아닌 것으로 예상

 

가정2) rest_api 포트 ( 82 ) 에 대해, 컨테이너 포드 포워딩이 안되어있다.

 

현재 Nginx 포트 ( 80 )은 -p 80:80 설정으로,

Localhost:80으로 오는 리퀘스트를 컨테이너 80포트로 자동 매핑해주고있다.

 

하지만 Rest_api 포트 ( 82 )에 대해서는 매핑되는게 없어

Nginx에서 Localhost:82로 포워딩 하면, 컨테이너의 IP:82와 연결이 되지 않아 발생하지 않을까?

 

현재 컨테이너 커밋후, 포트매핑 추가하여 가동해보자.

 

sudo docker run -it -p 80:80 -p 82:82 sk007001/rest_api:python /bin/bash

=> 똑같이 404 에러가 발생한다.

 

하지만 이번에는, localhost:82 포트로는 바로 rest_api 호출이 가능하다

 

가정3) Reverse Proxy가 제대로 동작하지 않는다.

 

프론트인 Nginx도 문제없고, 백단에 Python도 제대로 리슨중이니

 

중간을 연결해주는 Reverse Proxy가 문제있지 않을까?

 

일단 스택오버플로우에서, /etc/nginx/site-enabled 의 default 링크를 지워보라는 답변을 발견했다.

 

=> 지우고 접속해보니, 80 포트로 접속한 리퀘스트가 82로 포워딩 되는것을 확인했다.

==> 그렇다면, 파이썬에서 받았는데 404 에러가 발생하는 이유는???

 

가정4) Python Rest_api 코드의 문제

 

먼저 발견한 특이점은, Nginx에 localhost:80/api/users 로 보내어도

 

Reverse Proxy를 타면 localhost:82/api/users/ 로 리퀘스트가 보내진다는 것이었다.

 

파이썬 코드를 열어보니 /api/users 로 클래스 매핑이 되어있었고, 이를 수정해준뒤 제대로 리턴해주는것을 확인하였다.

 

 

이번에는 도커위에 Python을 사용하여 Rest Api를 수신하는 서버를 만들어 볼 예정이다.

※ Rest Api에 대해서는 하기 글을 참조
2021.07.29 - [IT/아키텍처] - Rest

대략적인 아키텍쳐는 아래와 같다.

(1) 유저가 HTTP 메소드를 사용해서, 도커에 떠있는 Nginx의 api location 호출하면 ( 80 Port )
(2) Nginx Reverse Proxy를 사용하여, Python으로 Request를 포워딩 해준다 ( 82 Port )
(3) Rest Api를 구현한 Python에서 해당값을 리턴해주고
(4) Nginx는 json 타입으로 유저에게 Response 해줄 계획이다.

 


1) Python Rest Api Server 구성

 

[참조] - https://justkode.kr/python/flask-restapi-1 // Flask로 Rest API 구현하기

 

- Docker 위에 Pyhton 및 라이브러리 설치 

  ※ 이미지 생성 및 프록시 세팅부분은 생략하고 작성

 

ㅁ Python 설치

apt-get update
apt install python3

[설치확인] python3 --version

 

ㅁ Pyhton 라이브러리 설치를 위한 pip 설치

 

apt-get update
apt-get install python3-pip

=> 설치중에 커넥션 에러 발생. security.ubuntu는 접근하나, archive.ubuntu 에는 접근 못하는 것으로 추정

Get:116 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 python3-xdg all 0.25-4ubuntu1.1
[31.3 kB] Fetched 105 MB in 1min 6s (1586 kB/s)
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/i/isl/libisl19_0.19-1_amd64.deb Could not connect to XXXXX

=> ubuntu repository를 변경하자. ( mirror.kakao.com )

 

vi /etc/apt/sources.list
=> 편집창에서 :%s/archive.ubuntu.com/mirror.kakao.com

apt-get update
apt-get install python3-pip

- Flask 다운로드

 

Flask : Micro web framework로 직역하면 가볍게 사용할수 있는 웹 프레임워크다.

         간단한 rest api 서버 혹은 Web 서버 구성시에 사용한다.

 

pip3 install Flask

이제는 익숙한 프록시, SSL 오류.

 

1) 구글링하니, trusted host 옵션을 주라고 한다.

   => 동일 에러

pip3 install --trusted-host pypi.python.org flask

 

2) 블로그에 프록시 컨피그 적용 후, 수행 가이드

pip3 install --proxy your_proxy_path Flask

=> SSL 문제로 URL 접속 불가 이슈

==>VM 환경이 아닌, 로컬 환경에서는 인터넷 접속 이상없음

 

1,2 옵션을 동시에 주면된다. 

- 프록시를 통해 패키지 Install

- SSL 없이, python host에 대해서는 신뢰

 

-> Flask 및 dependency 패키지 다운로드 성공

 

같은 방법으로 Flask-restx 도 설치해준다.

 

 

- Rest Server Code 작성

 

from flask import Flask  
from flask_restx import Api, Resource 

app = Flask(__name__)  
api = Api(app)  


@api.route('/api/users')  # /api/user 에 클래스 매핑
class HelloWorld(Resource):
    def get(self):  
        return {"id": 123,
        "name": "kim"}

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=80)

 

- 컨테이너 이미지로 커밋하고, 포트 매핑해서 다시 띄워보자

 

sudo docker commit $Container_ID sk007001/rest_api:python

sudo docker run -p 80:80 sk007001/rest_api:python python3 /python/rest_api.py
[ -p ] : 호스트의 80 포트로 오는 요청을 해당 컨테이너 80포트로 연결
[ python3 /python/rest_api.py ] : 위에 만들어둔 rest api 코드 실행

 

- RestClient 를 사용하여, 리퀘스트를 던져보자

 

 

※ 보완할 점

 

- 컨테이너 수행시 명령어가 너무길다.

  이미지에 수행될 명령어를 미리 지정하여, 컨테이너만 수행해도 rest_api 서비스가 올라가도록 변경해볼 것

 

- DB 연결후, /api/users 뒤에 파라미터값에 따라 다른 값을 리턴하는 로직 구현

 

- Nginx 리버스 프록시 기능을 활용하여 위의 그림처럼 연결할 것

이번에는 Hello Wolrd를 출력하는 웹페이지를 만들어보려고 한다.

다양한 방법으로 만들어볼껀데, 아래 3가지 방식으로 구현 할 것이다.

1) front 페이지만 만들고, nginx 이미지를 받아 페이지만 적용
2) 제로 베이스에서, 우분투위에 Nginx를 올려 커스텀 이미지를 만드는 방식
3) Docker File을 통한 구현

 

1) Nginx 이미지에 home 화면만 바꾸어서 적용

 

- 홈 화면인 index.jsp 페이지 작성

 

- Nignx 이미지 다운로드 및 사용법 확인

 

나처럼 페이지 컨텐츠만 바꿔서 띄우려는 사람들이 많았는지, 설명 가장 위에 적혀있었다.

$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx

※ 옵션

--name : 컨테이너의 이름을 지정

-v : {PATH1}:{PATH2} Host의 디렉토리를 Conatiner에 마운트

 

 

여기에 Host:Conatiner 포트매핑만 해서 가동시켜보겠다.

sudo docker run --name hello-nginx -v /docker:/usr/share/nginx/html:ro -p 80:80 -d nginx

 

 

이상하게 페이지 접근시, 화면이 나오지 않고 파일 다운로드가 된다.

 

jsp 확장자를 인식못하는것 같아, html로 변경해보고 다시 접근해보려한다

 

sudo docker exec -it $Container_ID /bin/bash  
=> 해당 컨테이너에 접속

 

접속해서 해당 컨텐츠 확장자 변경하려했으나, 컨테이너 내부에서는 Mount 된 디렉토리 內 변경 불가

 

Host 에서 직접 변경 및 컨테이너 내부에서 변경된 것 확인

 

 

변경후에 잘 되는것 확인


2) 커스텀 이미지 만들기

 

우분투 기반의 Hello World2를 출력하는 커스텀 이미지를 생성하려한다.

 

 

- 베이스이미지 ( 우분투 ) pull

 

docker run -it --rm --name hello_nginx_v2 ubuntu:18.04

 

- 컨테이너 내에 nginx 설치

 

apt-get install nginx

 

nginx 패키지를 못찾았다... 패키지 인스톨시에는 저장소 업데이트를 항상 먼저해주자

 

??? 

저장소에 접근을 못하고있다. 프록시 문제로 예상된다

2021.06.30 - [IT/도커도커] - (1) Ubuntu에 도커 설치하기 - 프록시 설정 참조

 

기존 VM Host에는 프록시 설정을 해주었으나

Conatiner는 새로운 Ubuntu OS를 띄운셈이므로, 다시 적용해주어야한다.

 

그런데 우분투 컨테이너에는 기본 편집기가 없다 ( nano, vim 등등 )

그래서 귀찮지만 conf.d 파일을 Host 에서 Container로 옮겨줘야한다.

sudo docker cp /etc/apt/apt.conf.d/90curtin-aptproxy hello_nginx_v2:/etc/apt/apt.conf.d/

 

 

프록시 설정 완료후, 저장소 업데이트 및 nginx Install

 

Index.html 파일 변경

 

sudo docker cp /docker/index.html hello_nginx_v2:/usr/share/nginx/html

 

 

컨테이너 Commit 하여 이미지 생성

 

sudo docker commit hello_nginx_v2 sk007001/hello-world:v0.2

 

 

컨테이너 수행

 

sudo docker run -p 80:80 -d sk007001/hello-world:v0.2

 

 

이미지 Hub에 Push

 

정상 동작하는것을 확인했으니, Hub에 올리자

 


3) Dockerfile를 통한 구현

 

FROM ubuntu:18.04

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

ADD /docker/index.html /usr/share/nginx/html

EXPOSE 80

WORKDIR /etc/nginx

CMD ["nginx", "-g", "daemon off;"]

 

FROM : ubuntu를 베이스로 지정

 

RUN apt-get update : ubuntu 패키지 리스트를 업데이트

RUN apt-get install -y nginx: nignx 패키지를 인스톨 ( 모든것에 동의함. -y )

 

ADD : Host에 만들어둔 index 파일을 컨테이너로 복사

 

EXPOSE : 컨테이너의 80포트로 접속할 수 있게 오픈

 

WORKDIR : 커맨드 실행할 Path 지정

 

CMD : nginx를 백그라운드로 실행

 

 

- Docker Build

 

 

패키지 업데이트 실패하였다...

프록시 설정안해줘서 일텐데, 매번 설정해주기 귀찮다. 디폴트 지정하는법이 있는지 찾아봐야겠다.

 

일단 수동으로 옮겨주자.

- 프록시 컨피그 파일을 컨테이너로 수정

 

ADD /etc/apt/apt.conf.d/90curtin-aptproxy /etc/apt/apt.conf.d/

 

 

해당 파일을 못찾는다고 나온다.

/Docker 에서 빌드했는데 하위 디렉토리에서 파일을 못찾은듯 하다.

 1) /에서 빌드하고 image Path 수동지정

 2) 해당 파일들 /Docker 하위로 이동

 

2번 방법을 사용해서 진행하자

 

 

이번에는 호스트의 81포트를 열어서, 컨테이너 80포트로 연결해주자

 

sudo docker run -p 81:80 -d sk007001/hello-world:v0.3

 

 

정상적으로 컨테이너가 올라갔으나, 404 not found 발생

 

1) index.html 파일 부재

 

- sudo docker exec -it bfe /bin/bash 접속
- /usr/share/nginx/html 밑의 커스텀 index 파일 확인
- 존재하는 것 확인

2) root 디렉토리 확인

- 컨테이너의 nginx conf 확인 ( /etc/nginx/nginx.conf -> /etc/nginx/sites-enabled/default )
- root : /var/www/html로 되어있는데 혹시 이거때문에...?

- root 디렉토리 위치를 /usr/share/nginx/html로 바꾼후 nginx reload 수행

 

- 81포트/index.html 접속

 

먼저 Hello Wolrd 출력부터 해보려고 한다

 

마찬가지로 아래 2가지 방식으로 구현할 것이다.

1) 이미 만들어져있는 이미지 사용
2) Docker File을 통한 커스텀 이미지 생성

 

1) 기존 이미지 사용

 

https://hub.docker.com/ 에 가면 다양한 도커 이미지들을 볼 수 있다.

그중에서 도커 공식이미지인 Hello-world 이미지를 살펴보자

 

hello-world 이미지

아무런 태그를 달지않으면 latest 태그가 받아질 것이고,

어떤 태그들이 있는지도 확인할 수 있다.

 

Hello-world Tag

기본 이미지, 사용방법 등의 설명페이지가 있지만,

간단한 Hello-world 이미지이기때문에 바로 수행해볼 것이다.

 

sudo docker run hello-world

위의 간단한 명령어로, 사용 가능하다.

어떤 동작원리인지 모르는 블랙박스 형태여도, 사용할수 있다는게 장점이기도 하다.

 

run 명령어 수행시, Host PC에 이미지가 없어서 hub.docker 에서 이미지를 가져오는 모습이다.

Tag는 따로 지정해주지 않아, Default 인 latest 태그 이미지를 가져온다.

 

 

2) Docker File을 통한 커스텀 이미지 생성

 

먼저, Docker File 기본 구성에 대해 알아보자.

 

- From : base 이미지 지정
- ADD : 로컬,URL에서 파일이나 디렉토리를 컨테이너로 복사할때 사용
- COPY : ADD와 같은 기능이나 URL에서 가져올 수 없고, 압축파일도 해제없이 그대로 복사된다.
- LABEL : key=value의 기타 정보를 이미지에 심을 떄 사용
            메타정보라고 넘어갈 수 있지만, 후에 쿠버네티스 사용 시 필요한 항목이니 유의
- ENV : 컨테이너에 적용할 환경변수 사전 정의
- ARG : 컨테이너 빌드시 사용할 아큐먼트 정의
- EXPOSE : 호스트와 연결할 포트 번호를 설정
- VOLUME : 호스트 디렉토리 마운트. 
- RUN : 이미지 생성 시, 실행할 Command 지정
- CMD : 이미지 생성 이후, 처음으로 실행될 명령어. 여러개의 CMD 작성시, 마지막 CMD만 적용
- ENTRYPOINT : 이미지 생성 이후 실행될 명령어.
 
 ※ Command 문법

RUN/CMD/ENTRYPOINT ["command","parameter1","parameter2"]

※ CMD와 ENTRYPOINT 차이

 

ENTRYPOINT는 DockerFile에 지정된 그대로 명령을 수행하지만,

CMD는 인자값을 주게되면 해당 인자값으로 명령을 수행한다.

 

 

Hello World DOCKER FILE

 

- Dockerfile 생성

 

FROM alpine:3.14  # 우분투 말고, 도커 베이스이미지로 많이쓰이는 알파인을 사용하였다. ( 5MB 정도 )

CMD ["echo","Hello-World"] # 이미지 생성후 Hello World 출력

 

- 이미지 빌드

sudo docker build -t sk007001/hello-world:v0.1 /docker

-t <이미지명:tag명> <Dockerfile 위치> 명령어로, Dockerfile 기반의 이미지를 태깅하여 빌드하였다.

앞의 sk007001은 개인 hub 저장소 위치를 명시해주었다.

 

 

- 이미지 확인 및 컨테이너 생성

 

sudo docker images

 

sudo docker run sk007001/hello-world:v0.1

 

- 해당 Image 저장소에 Push

 

잘 동작하는것을 확인했으니, 저장소에 Push 하려한다.

sudo docker push sk007001/hello-world:v0.1

 

'IT > 도커도커' 카테고리의 다른 글

(6-1) 도커 內 Rest Api 서버 구성하기 ( Python )  (0) 2021.08.11
(5) 도커 Hello World - 웹페이지  (0) 2021.07.22
(3) 도커 명령어  (0) 2021.07.19
(2) 컨테이너 및 도커  (0) 2021.07.14
(1) Ubuntu에 도커 설치하기  (0) 2021.06.30

도커 아키텍처


Docker run

 

클라이언트 환경에서 Docker run 수행시, Host의 Docker daemon과 통신한다.

UNIX 소켓 또는, 네트워크로 연결되며 REST API를 사용해 리퀘스트를 보낸다.

 

Run 프로세스

 

- docker run <option> $Image:tag <command>

1) Docker_Host 내에서 해당 이미지:태그를 찾는다
2) 없으면 레지스트리에서 이미지:태그를 다운받아온다
3) 이미지를 사용하여 컨테이너 실행
4) 컨테이너에서 명령 수행

 

Run 옵션

 

주로 사용하는 옵션들을 정리해보았다.

 

-d : 컨테이너를 백그라운드로 수행

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

    --env-file : 환경변수 파일을 지정하여 컨테이너 수행

-i : 표준입력(stdin)을 컨테이너와 연결하여, 명령어를 작성할 수 있게한다.

    주로 -t 옵션과 같이써서, bash 명령어 수행가능하게 한다.

--name: 컨테이너에 이름을 지정하여, 관리가 쉽게한다.

-p : 호스트로 접근하는 특정 포트를, 컨테이너 포트와 매핑시켜준다 ( 프록시, 포워딩 )

     ex) -p 80:8080 / 80포트로 호스트에 접근하는 리퀘스트를, 컨테이너의 8080포트로 연결해준다.

--rm : 컨테이너 수행이 완료되면, 자동으로 삭제한다.

-v : 호스트의 파일시스템을 컨테이너에 마운트한다.

 


Docker ps

 

현재 수행중인 컨테이너 목록. -a 옵션을 통해 종료된 컨테이너까지 확인할 수 있다.

 

Docker Images

 

현재 Host PC에 저장된 이미지 목록 확인

 

Docker Stop/Start $Contianer_ID

 

컨테이너 종료 및 종료된 컨테이너 수행

 

 

Docker rm $Container_ID

 

Host PC 내에서 컨테이너 삭제

 

Docker rmi $Container_ID

 

Host PC 내에서 이미지 삭제

 

 

Docker search $Image_name

 

Docker Hub내에서 해당 이미지 검색

 

 

Docker pull $Image:$tag

 

해당 이미지 다운로드. Run 명령어에는 pull 및 수행 명령단계가 포함되어있다.

 


※ docker pull 이슈 발생




Pull 리퀘스트 횟수 제한에 걸림

- 도커의 경우, 구독 유저가 아니면 리퀘스트 제한이 있는데 ( 익명 100회 / 로그인 200회 . 6시간 기준 )
  프록시 IP를 쓰다보니, 다른 사용자들로 인해 리퀘스트 제한에 걸렸다.

- login 하여, 계정을 통한 리퀘스트로 문제 해결

 

 

'IT > 도커도커' 카테고리의 다른 글

(5) 도커 Hello World - 웹페이지  (0) 2021.07.22
(4) 도커 Hello World  (1) 2021.07.20
(2) 컨테이너 및 도커  (0) 2021.07.14
(1) Ubuntu에 도커 설치하기  (0) 2021.06.30
(0) Oracle VM 을 통한 Ubuntu 서버 설치  (1) 2021.06.29

도커에 대해 설명하기전에 컨테이너 개념에 대해서 먼저 알아야한다.

컨테이너 : 리눅스 커널을 공유하여, 프로세스를 격리된 공간에서 띄우는 기술

 

비슷한 용어로 가상화가 있지만, 둘의 의미는 다르다.

 

먼저 가상화 같은경우

컴퓨터 리소스의 추상화라는, 좀더 넓은 의미를 가지고있다.

 

하지만 주로 Hypervisior를 구동하여 가상머신 ( Virtual Machine ) 을 생성하는 논리적 플랫폼 기술을 의미한다.


VM은 리소스의 추상화와 격리가 되어있지만, 크나큰 단점이 하나 있다.

 

바로 Geust OS의 중복이다.

VM 아키텍처

VM을 하나 생성해, 격리할때마다 Gesut OS 위에 Application을 올리므로

Guest OS 만큼의 리소스가 중복으로 낭비되고 있다.

 

이러한 특징은 MSA ( MicroService Architecture )가 떠오르면서, 큰 단점이 되었다.

2021.07.13 - [분류 전체보기] - MSA ( MicroService Architecture )

 


MSA에서 수백 수천개로 나뉘는 서비스를 위해, 효율적인 리소스 활용은 필수가 되었고

운영체제 수준의 가상화리눅스 커널을 공유하는 컨테이너 기술이 떠오르게 되었다.

 

컨테이너는 모든 컴포넌트마다 OS를 가상화하는것이 아니라

리눅스 커널을 공유하고, APP 단위로 가상화하여 구분하는 개념이다.

 

각 컨테이너는 Cgroup, namespace 개념을 적용해, 격리 및 관리가 진행된다.

 

Cgroup


프로세스들의 격리 및 자원관리 역할을 하는 리눅스 커널 기능
cpu, 디스크, 메모리 등을 다룬다.


Namespace

각 컨테이너는 namespace 단위로 리소스가 관리된다.

(1)  Mnt(파일 시스템 마운트) : 파일시스템 포인트 관리
(2)  Pid(프로세스) : 독립적인 프로세스 공간을 할당
(3)  Net(네트워크) : 네트워크 인터페이스. namespace 간에 network 충돌을 방지 (중복 포트 등)
(4)  Ipc(System IPC) : 독립적으로 프로세스 간의 통신 관리 ( Sahred memory, semaphore 등 )
(5)  Uts(hostname) : 독립적인 hostname 할당
(6)  User(UID) : 독립적인 사용자 할당

 

그중, 대표적인 오픈소스 프로젝트가 Docker 이다.

 

도커 아키텍처


도커 이미지

 

 

이미지란 컨테이너 실행에 필요한 파일과 설정 값등을 포함하고 있는 읽기전용 템플릿이다.

( ex: Ubuntu 이미지에는, Ubuntu 구성을 위한 파일과 환경변수값들이 저장되어있다 )

 

 

특징으로는,

 

1) 변하지 않는다.
2) 하나의 이미지로 여러개의 컨테이너를 구동할 수 있다.
3) Dockerfile을 bulid하면 Image가 생성되고, Image 를 run 하면 컨테이너가 생성된다.
4) Git 처럼 Docker Hub를 통해 쉽게 관리할 수 있다 ( Pull & Push )
5) 레이어 개념을 적용해, 이미지 다운로드시 불필요한 작업을 줄인다

 

※ 도커에서 이미지를 만드는 방식 ( 레이어 )

 

- 여러개의 레이어를 겹쳐서 하나의 F/S처럼 동작하는 이미지를 만든다.

 

예를들어, Hello World를 출력하는 웹페이지를 서비스하는 Image를 만든다고 가정하자.
Base Image를 기반으로, ubuntu OS 레이어와, Nginx 레이어를 올려 하나의 이미지를 만들 것이다.

이 이미지를 누군가 다운받아, Hello Wolrd2라는 image를 만들었을때
index.jsp 내용만 바뀌었을뿐인데 전체 레이어를 다시 받을필요가 없다.

변경된 index.jsp 에 해당하는 레이어만 다시 받음으로써,
Hello World2 이미지를 사용할 수 있다.

 

 

도커의 장점

 

어느곳에서든 동일한 환경을 유지할 수 있다.

  - 개발서버가 존재하여, 운영과 동일환경에서 개발하는 경우는 드물다고 생각된다.

    보통 로컬PC 에서 개발하고, 해당 소스를 시스템에 반영할텐데 몇 가지 문제가 예상된다.

     

   1) 가장 먼저, 로컬PC (윈도우) 에서 만든 서비스는, 시스템 (리눅스)에서 호환되지 않을 가능성이 높을 것이다.

   2) 로컬PC의 환경변수 세팅과 시스템의 환경변수가 다르기 때문에, 동일 아키텍처라도 디플로이가 안될수도 있다.

 

컨테이너 단위로 관리

  - 하나의 OS에 다양한 컨테이너를 띄울수 있으며, 각 컨테이너는 독립된 환경이기 때문에

    다양한 서버들을 운영할 수 있다. ( 자바, 파이썬, 오라클 등등 )

 

유연한 자원관리

  - 고정된 자원을 할당받는것이 아니기 때문에, 자유롭게 Scale up/out 이 가능하다.

 

'IT > 도커도커' 카테고리의 다른 글

(5) 도커 Hello World - 웹페이지  (0) 2021.07.22
(4) 도커 Hello World  (1) 2021.07.20
(3) 도커 명령어  (0) 2021.07.19
(1) Ubuntu에 도커 설치하기  (0) 2021.06.30
(0) Oracle VM 을 통한 Ubuntu 서버 설치  (1) 2021.06.29

- 다운로드전 필요 패키지 설치

 

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  • apt-transport-https : 패키지 관리자가 https를 통해 데이터 및 패키지에 접근할 수 있도록 한다.
  • ca-certificates : 인증서 기반의 SSL 통신을 가능하게 해준다.
  • curl : 서버와 통신할수 있는 커맨드 툴
  • software-properties-common : 개인 소프트웨어 패키지 저장소.
                                            우분투 공식 저장소에 없는 패키지들을 받을 때 사용

- 도커 저장소 및 Key 추가

 

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

 

  • s ( slient ) : 진행로그를 표시하지 않음
  • apt-key : 패키지 인증시 사용할 키를 추가한다.

 

※ Curl 명령어 실패

 

더보기

curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
gpg: no valid OpenPGP data found.

1. https://curl.haxx.se/ca/cacert.pem 에서 인증서를 받아 적용하거나

2. -k 옵션으로 인증서 검증 스킵

 


- Repository 경로 추가하기 ( PPA )

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

 

- apt update

 

sudo apt-get update

※ docker update 시, 인증서 에러 발생. 프록시에 사용할 인증서를 추가해주자

 

 

ㅁ 인증서를 구한다음에 openssl을 통해 crt 확장자로 바꿔준다.

openssl x509 -in ABC.pem -inform pem -out ABC.crt

 

ㅁ /usr/share/ca-certificates/extra 디렉토리 생성후, 변환된 crt 인증서 이동

 

ㅁ 인증서 패키지 reconfig후 해당 인증서 추가.

sudo dpkg-reconfigure ca-certificates 

- 도커 설치 및 확인

 

sudo apt install docker-ce
sudo systemctl status docker

 

 

 

참조 ( https://roseline124.github.io/kuberdocker/2019/07/17/docker-study02.html )

'IT > 도커도커' 카테고리의 다른 글

(5) 도커 Hello World - 웹페이지  (0) 2021.07.22
(4) 도커 Hello World  (1) 2021.07.20
(3) 도커 명령어  (0) 2021.07.19
(2) 컨테이너 및 도커  (0) 2021.07.14
(0) Oracle VM 을 통한 Ubuntu 서버 설치  (1) 2021.06.29

Oracle VM 설치

 

Oracle 사이트에서 Virtual Machine 최신버전을 받는다.

https://www.oracle.com/kr/virtualization/technologies/vm/downloads/virtualbox-downloads.html?source=:ow:o:p:nav:mmddyyVirtualBoxHero_kr&intcmp=:ow:o:p:nav:mmddyyVirtualBoxHero_kr

 


Ubuntu server 이미지 받기

 

- 디폴트로 Ubuntu 서버를 설치하려고 하면, 하기와 같은 에러가 발생한다.

 

 

- 우분투 이미지를 받아준다.

 

https://ubuntu.com/download

 

- 우분투는 크게 정규버전/LTS 버전 및 Desktop/Server 로 나눌수 있다.

  ( 해당 글에서는 ubuntu-Desktop 20.04 LTS 버전 사용 )

정규버전 : ex) ubuntu server 21.04
             21년 04월에 출시된 버전으로, 9개월간 업데이트를 지원한다. 6개월단위로 새 버전이 나온다.
LTS : ex) ubuntu server 20.04 LTS
       Long Term Support의 약자로, 5년간 업데이트를 지원하며 2년마다 새 버전이 나온다.

 

- 컨트롤러 IDE에 Ubuntu 이미지 지정

 

- apt-get update 명령어로 네트워크까지 동작 확인

 

 


기타 설정

 

- GUI 설치하기

sudo apt-get install ubuntu-desktop

- 추가 패키지 설치하기

sudo apt-get install indicator-appmenu-tools ( hud service not connected 오류 해결 )
sudo apt-get install indicator-session ( 계정, 세션 아이콘 추가 )
sudo apt-get install indicator-datetime ( 상단 메뉴 시간 추가 )
sudo apt-get install indicator-applet-complete ( 볼륨 조절 아이콘 추가 )

- 부팅시 자동으로, GUI 환경 구성하기

startx ( xwindow 환경 실행 )
sudo systemctl isolate graphical.target ( runlevel 5 일회성 실행 / init 실행 )
sudo systemctl enable graphical.target ( runlevel 5 영구히 실행 / 활성 )
sudo systemctl set-default graphical.target ( runlevel 5 영구히 실행 / inittab 수정 )

- 재부팅후 , 수행이 안됌

startx 매뉴얼 수행 시, xinit 패키지 설치하라고 나옴.

sudo apt install xinit

- 재부팅

 

- Proxy 설정

 

※ GUI 환경때문에 Desktop 환경에서 진행하려는 도중, Proxy 설정이 안먹힘

 

VM 내의 Proxy 및 , 터미널에서 env http_proxy 확인하였으나 apt-get update 안됌

 

   -> /etc/apt/apt.conf.d 밑에 아무파일이나 만들고 하기 내용 입력

Acquire::http::proxy "http://proxy.server:port/";
Acquire::https::proxy "http://proxy.server:port/";

 

참고 ( https://wlsvud84.tistory.com/26 )

'IT > 도커도커' 카테고리의 다른 글

(5) 도커 Hello World - 웹페이지  (0) 2021.07.22
(4) 도커 Hello World  (1) 2021.07.20
(3) 도커 명령어  (0) 2021.07.19
(2) 컨테이너 및 도커  (0) 2021.07.14
(1) Ubuntu에 도커 설치하기  (0) 2021.06.30

+ Recent posts