Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.

VM은 호스트 OS위에 게스트 OS 전체를 가상화하여 사용하는 방식

Docker는 전체 OS를 가상화하는 방식이 아니라 프로세스를 격리 하는 방식

 

Container는 뜻 그대로 화물 수송용 박스를 생각하면 된다. container에 다양한 화물을 넣고 다양한 운송수단에 적재되어 쉽게 옮길 수 있는데 서버에서도 마찬가지입니다. 서버 실행에 필요한 모든 것(코드, 런타임, 시스템도구)들을 container에 넣어 쉽게 추상화하고 어디서에든(GCP, AWS, Local-machine) 실행할 수 있다.

 

Docker image는 container의 모든 정보를 포함한 하나의 단위로 볼 수 있다.

 

Docker 를 사용하는 이유는 container를 활용하여 쉽게 개발환경과 운영환경을 동일하게 구성할 수 있기 때문입니다.


VM vs Container

vm이 container보다 훨씬 더 강력하게 격리된다.

vm은 가상화된 하드웨어 위에 os가 올라가는 형태로 거의 완벽하게 host와 분리된다고 봐도 무방하다.

반면 container는 os 가상화이다.

os 부분을 가상화해서 올리고 커널을 host와 공유한다. vm보다 얕게 격리된다.

 

1) vm 보다 작다. 

일단 그림의 볼륨만으도 container가 작다. 왜 작은가 하니 vm은 hypervisor가 hardware 가상화를 한다. 그리고 그 위에 Guest OS가 올라가게 된다. 위의 그림만 해도 3개의 GuestOS가 올라간다. 반면 container는 Docker-engine 위에 application에 실행에 필요한 바이너리만 올라간다. 그 외 커널 부분은 호스트의 커널을 공유한다. 격리는 linux namespace를 통해 개념적으로 수행한다. 만약 호스트의 커널과 container 의 커널이 다르다면? 다른 부분만큼만 패키징 된다. 그만큼 또 공간을 절약할 수 있다. 근데 작은 것이 왜 장점일까? 요즘 서버 용량 어마어마할텐데?

 

만들어진 이미지가 작다는 것 자체가 장점이기도 하겠지만 network를 덜 사용할 수 있다는 장점도 있다. docker 의 라이프 사이클은 우선 hub(혹은 private Registry)로부터 image를 pull을 받아오면서 시작한다. 여기서부터 용량이 작다는 것은 큰 장점이 된다. 그만큼 네트워크를 덜 쓸 수 있고 (pull 받는데 시간이 적게 걸리는 건 덤) cloud는 사용량만큼 과금한다. 돈과도 직접적으로 연결이 된다. 게다가 host가 하나가 아니라 clustering 환경이었다면? 용량이 큰 vm으로 배포한다고 생각하면 답답해진다.

 

2) 빠르다.

우선 vm이나 container나 (당연히 ) host 머신보다는 느리다. 하지만 container와 vm을 비교하자면 container가 더 빠르다. 몇까지 원인이 있겠지만 단순하게 비교를 해보자면 vm은 io가 발생하는 통로가 container보다 많다. vm은 host os에서 거의 완전히 분리된 형태로 운영이 되지만 io가 오갈 때는 이야기가 좀 다르다. vm이 처리한 io를 결국 host os의 커널이 다시 받아 자신의 드라이버에 맞게 처리해줘야 한다. 이 부분에서 병목이 발생하게 된다. 반면 container는 커널을 공유하기 때문에 들어온 io가 쉽게 처리돼서 나갈 수 있게 된다. 즉 쉽게 표현하면 vm이 container보다 더 많은 커널 처리가 들어가야 되니 당연히 성능이 좀 더 느리다.

근데 요즘 vm벤더들은 이 부분을 의식해서 계속해서 성능경쟁을 하고 있다. 몇몇 자료에서는 vm이 container보다 빠르다는 증거를 내기도 한다. 하지만 기본적인 개념으론 container가 더 빠르다.

 

3) Life Cycle & Microservice

내 개발 환경에서 운영 환경 image를 만들어 registry에 배포하고 원래 돌던 거 내리고 새 거 올리고 끝. 


1. ubuntu 18.04 컨테이너 만들기

$ docker run ubuntu:18.04 

 

RCcamp1 이름으로 우분투 만들기

$ docker run -t -d --name RCcamp1 ubuntu:18.04

 

RCcamp1 컨테이너 실행

$ docker start RCcamp1

 

RCcamp1 우분투 쉘스크립트 실행하기

$ docker exec -it RCcamp1 /bin/bash

 

 

다운받은 image 확인

$ docker images 

이미지가 없으면 컨테이너를 실행할 때 다운로드 받고 다운로드 받은게 PC에 저장이 되어 있다.

 

수동으로 image 다운 받기

$ docker pull ubuntu

run할 때 없으면 자동으로 다운 받는데 수동으로 다운 받을 수도 있다.


Apache, PHP, MySQL

 

Apache : 웹서버로 분류되는 소프트웨어이다.

웹서버의 역할 : 주소창에 url을 입력하면 url에 해당하는 서버 컴퓨터에 접속해서 서버 컴퓨터에게 "나는 이런 이미지를 보고싶어" 라고 요청하면 웹서버는 그것을 받아서 apache라는 소프트웨어를 구동한다.

그럼 apache는 사용자가 요청한 웹페이지나 이미지나 기타 등등의 리소스를 제공한다. 

경쟁 제품은 Nginx가 있다.

 

MySQL : 데이터베이스

데이터베이스의 역할은 데이터를 관리하는 역할을 한다.

파일에 데이터를 저장하면 파일을 관리하기 쉽고 편리하게 하게 해준다.

경쟁 제품은 Oracle, MsSQL, PostgreSQL이 있다.

 

PHP : Apache와 유사한 역할을 한다.

Apache가 이미지나 웹페이지를 제공하면 PHP도 웹페이지를 제공한다.

차이점은 Apache가 정적인 html 문서를 제공한다면,

php는 동적인 html 문서를 제공한다.

 

웹페이지는 html을 통해 만들어진다. 그리고 html은 파일 형태를 띠고 있는데,

Apache는 이 파일을 수동적으로 전달하는 역할만 한다.

php는 있는 그대로 전달하는 것이 아니라, 그 파일에 프로그래밍적인 요소를 가미한다.

현재시간을 적어서 전달한다거나 데이터베이스에 접근해서 데이터를 가져온 다음 그것을 사용자에게 제공하거나,

사용자가 입력한 데이터를 받아서 그것을 데이터베이스에 저장한다거나 이런 역할을 한다.

경쟁 제품으로는 ASP, JSP, Python, Ruby, Perl 등이 있다.


APR(Apache Portable Runtime)는 아파치 HTTP 서버 2.x.의 핵심이며 휴대용 라이브러리입니다. 이런 APR은 고급 IO 기능(예:sendfile, epoll and OpenSSL 등)에 대한 접근을 포함하여 OS 수준의 기능 (난수 생성, 시스템 상태), 그리고 기본 프로세스 처리(공유 메모리, NT 파이프와 유닉스 소켓) 등 많은 용도로 사용되고 있습니다.

$ cd /usr/local
$ wget http://mirror.navercorp.com/apache//apr/apr-1.7.0.tar.gz
bash: wget: command not found

 

$ apt-get update
$ apt-get install sudo
$ apt-get install update
$ wget http://mirror.navercorp.com/apache//apr/apr-1.7.0.tar.gz
$ tar xvfz apr-1.7.0.tar.gz
$ tar xvfz apr-util-1.6.1.tar.gz

 

apr 과 apr-util 을 다운받고, 압축을 해제하였으니 이제 각 폴더로 이동해서 설치를 해야한다.


2. apr 과 apr-util 을 설치 (apr-util 설치 이전에 apr 설치가 선행되어야한다)

 

아래의 명령어는 apr 의 설치파일을 만들고, 설치하는 것이라고 생각할 수 있다.

 

./configure --prefix=/usr/local/apr 라는 명령어는 어떤 파일을 /usr/local/apr 에 설치하겠다는 뜻이다.

 

$ ./configure --prefix=/usr/local/apr

 

no acceptable C compiler found in $PATH

C 컴파일러가 없어서 생기는 문제

 

$ sudo apt-get install build-essential



다시

$ ./configure --prefix=/usr/local/apr
$ make && make install

 

make소스를 컴파일한다는 뜻이다.

컴파일이라는 것은 소스파일을 사용자가 실행가능한 파일로 만들어주는것이다.

make 과정이 끝나고 나면 설치파일이이 생성된 상태이다.

 

여기서 중요한 것이 make 에게 어떤 프로그램을 컴파일하고 링크해야하는지 방법을 설명하는것인데 그게 makefile 이다.

make installmake를 통해 만들어진 설치파일을 설치하는 과정이다. 

 


3. apr-util 설치

이제 apr 설치가 다 되었으면, apr-util 을 설치해주면 된다.

 

$ cd usr/local/apr-util-1.6.1
$ ./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-util 
$ make
$ make install

# $ ./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-util && make && make install

 

make 과정에서 에러가 떴다.

xml/apr_xml.c:35:10: fatal error: expat.h: No such file or directory
 #include <expat.h>
          ^~~~~~~~~

 

libexpat1-dev 라는 패키지가 없어서 뜨는 에러로, apt-get install libexpat1-dev 명령어로 해결할 수 있다고 한다.

 

나머지를 설치해주면 apr 과 apr-util 이 설치가 완료된다.


4. PCRE 설치

 

Apache2.4X 대 버전이라면 PCRE 를 다운받아야 한다.

PCRE( Perl Compatible Regular Expressions )는 펄 호환 정규 표현식으로서, 정규식 패턴 일치를 구현하는 함수의 집합이다.

요즘에는 Apache, PHP, KDE 등을 포함한 오프 소스 프로젝트에서 사용되고 있으며, 아파치 2.4 버전을 설치할 때는 pcre를 설치해야 한다.

 

$ apt-get install pcre-devel
$ apt-get install g++

 

$ cd usr/local
$ wget ftp://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
$ tar xvfz pcre-8.43.gar.gz
$ cd usr/local/pcre-8.43
$ ./configure --prefix=/usr/local/pcre
$ make
$ make install

## $ ./configure && make && make install

5. Apache 2.4.46 설치

$ cd /usr/local
$ wget https://mirror.navercorp.com/apache//httpd/httpd-2.4.46.tar.gz
$ tar xvfz httpd-2.4.46.tar.gz

 

$ ./configure --prefix=/usr/local/apache2.4 \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--with-pcre=/usr/local/pcre \
--enable-module=so \
--enable-rewrite \
--enable-so \
--enable-mods-shared=all

 

--enable-module=shared : 모듈을 실행중에 포함하거나 뺄 수 있는 공유객체(shared object, DSO)로 컴파일한다.

* DSO (Dynamic Shared Objects, DSO) 동적공유객체란? : 아파치 웹서버는 관리자가 모듈들을 선택하여 서버에 포함할 기능을 결정할 수 있는 모듈화된 프로그램이다. 서버를 컴파일할때 httpd 실행파일에 정적으로 모듈을 컴파일할 수 있다. 아니면 모듈을 httpd 실행파일과 분리하여 DSO(동적공유객체) 로 컴파일할 수 있다. DSO 모듈은 서버를 컴파일할 때 컴파일하거나, Apache Extension Tool 을 사용하여 나중에 컴파일하여 추가할 수 있다.

 

--enable-rewrite : mod_rewrite가 제공하는 규칙기반 URL 조작 기능을 사용한다.

 

--enable-so : mod_so가 제공하는 DSO 기능을 사용한다. --enable-mods-shared 옵션을 사용하면 자동으로 이 모듈을 포함한다.

 

 

configure 시 에러 발생

error: Bundled APR requested but not found at ./srclib/. Download and unpack the corresponding apr and apr-util packages to ./srclib/.

이러한 경우는 추가적인 라이브러리를 설치하지 않아서 발생된 문제다.

 

 

 

설치가 완료되면 위와 같은 메시지가 출력된다.

 


6. Apache 실행

$ cd /usr/local/apache2.4/bin 
$ ./httpd -k start
./httpd: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

 

libpcre.so.1 이 존재하지 않았다.

 

확인해 보아도 존재하지 않는다는 것을 알 수 있다.

 

$ find / -name libpcre.so.1

/usr/local/lib/libpcre.so.1
/usr/local/pcre/lib/libpcre.so.1
/usr/local/pcre-8.43/.libs/libpcre.so.1

 

local/lib에 있는데 not found라고 뜬다.

 

$ /sbin/ldconfig

-> 공유 라이브러리 캐시를 재 설정하는 명령어

 

그 후 다시 실행 

 

$ ps -ef | grep httpd | grep -v grep

 

ps 는 preocess status 의 준말로, 현재 실행중인 프로세스의 목록을 보여준다.

-ef 옵션에서 e는 모든 프로세스를 출력하라는 뜻이고, -f 는 풀 포맷(UID, PID 등)으로 보여주겠다는 뜻이다.


netstat

$ netstat -anp | grep httpd

 

netstat 은 네트워크 연결상태, 라우팅테이블, 인터페이스 상태등을 보여주는 명령어이다.

앞에 붙은 anp 옵션에서

a는 all 으로, 모든 네트워크 상태를 출력한다.

n은 numeric 으로, 도메인주소를 숫자로 출력한다.

p는 program 으로, PID(processor ID) 와 사용중인 프로그램명을 출력한다.

 

netstat이 없을시 아래의 명령어로 설치

$ apt-get install net-tools

curl 서버

$ curl http://172.17.0.2

curl 은 command line 기반의 웹 요청도구이다. curl [options] <url> 형태로 사용.

curl 뒤에 붙인 url 주소에 따른 HTML 정보를 콘솔에 출력해주는 역할을 한다

 

curl이 없을시 아래의 명령어로 설치

$ apt-get install curl

 


7. httpd 서비스 등록

 

/usr/local/apache2.4/bin/apachectl 이라는 파일을 /etc/init.d/httpd 에 복사해준다.

아파치 서비스를 등록해준다.

$ cp /usr/local/apache2.4/bin/apachectl /etc/init.d/httpd 
$ update-rc.d httpd defaults

 

 

 

Ref : apache수동설치

'🚦 Server > AWS' 카테고리의 다른 글

Bitnami local 서버 구축, 포트포워딩  (0) 2021.07.07
nginx  (0) 2021.07.02
APM 자동 설치  (0) 2021.06.28
PHP 수동 설치  (0) 2021.06.27
MySQL 수동 설치  (0) 2021.06.25
복사했습니다!