Lightsail 을 사용한 이후 그동안의 업데이트와 변화

AWS를 사용하기 시작한지도 꽤 된 것 같다. 이 서비스가 나온지 얼마 안되서부터 사용하기 시작했고 아쉬운 점이 많았는데 최근에 몇가지 기능들이 추가되었다.

 

리전간 스냅샷 복사 기능 추가

오늘 알게된 내용인데 리전간 스냅샷 복사 기능이 드디어 추가되었다.

일본 리전에서 인스턴스를 만들어 쓰다가 몇달전 서울 리전으로 이동하려고 했을 때, 이 스냅샷 복사 기능이 아직 구현되어 있지 않았었다. 그래서 서울 리전에 인스턴스를 새로 만들어서 데이터를 수동으로 옮겼다. 그때 이 기능이 없어서 아쉬웠는데 이제서야 생겼네.

스냅샷을 생성한 후 메뉴를 보면 다른 리전에 복사라는 메뉴가 생겼다. 그러고보니 Amazon EC2로 내보내기라는 메뉴도 생겼다…? 라이트세일에서 운영하던 인스턴스를 그대로 EC2로 가져갈 수 있다는 의미인건가…!?

스냅샷 복사를 선택하면 리전은 어디로도 이동가능하다.

 

데이터베이스 기능 추가

데이터베이스를 별도의 인스턴스로 추가시켜주는 기능이다. 내가 라이트세일을 처음 이용할 때는 이런 기능이 없었는데 얼마전 추가되었다. 사실 라이트세일을 이용하는 유저라면 기본적으로 자기 서버에 데이터베이스를 설치해서 쓸줄 알것이라 생각되므로 이런 기능이 굳이 필요한지는 잘 모르겠다.

현재는 MySQL만 지원한다.

가격은 월 15달러.

고가용성 옵션도 있는데 가격은 두배!

 

태그 기능 추가

어떤 인스턴스가 어떤 서비스를 담당하고 있는지 태그 기능으로 묶을 수 있다.

https://aws.amazon.com/ko/about-aws/whats-new/2018/11/amazon-lightsail-now-supports-resource-tagging/

 

EC2 업그레이드

lightsail에서 사용하던 인스턴스를 그대로 EC2로 가지고 갈 수 있다. 서비스가 크게 늘어나거나 하면 EC2로 가져갈 수 있게 만들어준듯. 한편으로는 라이트세일이 미끼용이기도하고. ㅎㅎ

https://aws.amazon.com/ko/about-aws/whats-new/2018/11/amazon-lightsail-now-provides-an-upgrade-path-to-ec2/

C++에서 엑셀파일 처리하기

C++에서 엑셀파일을 다루는 법을 찾아보았다.

2012년도에 엑셀 파일을 처리할 방법을 찾다가 https://blog.dongbumkim.com/archives/754 이런 글을 썼었는데 이제는 그보다 더 나은 방법을 찾을 수 있었다.

예전에 작업하던 소스에서는 ODBC를 이용하여 연결했었는데 왠일인지 이 방법으로는 제대로 연결되지 않았다. 당시에는 잘 작동하던 소스였는데…

찾아보니 윈도우 버전이 올라가며 제대로 작동하지 않는듯하다.(확실히 끝까지 찾아보지는 못했다.) ADO 등의 다른 방법으로 연결하는 것을 안내하고 있었다.

웹서핑을 하며 엑셀 파일을 다룰 수 있는 라이브러리를 찾아보다가 스택오버플로우에서 xlnt 라는 라이브러리를 추천해줘서 한번 테스트해보았다.

https://github.com/tfussell/xlnt

무려 크로스플랫폼의 C++14에 맞춘 xlsx 파일 처리 가능한 라이브러리라고 설명이 되어있다.

처음에는 잘 작동하는듯했으나… 오 잘되네 하고 본격적인 테스트코드를 만들다보니 버그가 있었다. 시트를 하나 더 추가해서 2개의 시트를 만들고 컬럼을 추가하면 에러가 떴다. 엑셀 파일을 아무리 봐도 문제가 없어 검색해봤더니 이미 버그리포팅이 되어있던 이슈. 나도 가서 한마디 거들었다.

https://github.com/tfussell/xlnt/issues/330#issuecomment-440589168

xlnt로 하루 넘는 시간을 날리고 다시 검색해보니 ExcelFormat 라이브러리를 추천했다. 이것으로 작업을 성공적으로 했다는 댓글도 있어서 이걸로 결정.

https://www.codeproject.com/Articles/42504/ExcelFormat-Library

사용해보니 다른 외부 컴포넌트 없이 바로 사용 가능했다.

단점은,

  • xlsx는 지원하지 않고 xls 파일만 지원한다.
  • 데이터를 가져올 각 셀마다 데이터타입을 정확하게 지정해줘야한다.
  • 그런데 숫자만 들어있는 셀은 전부다 double 형으로 데이터를 가져온다. int로 캐스팅해야함.
    for (int k = 0; k < sheet->GetTotalRows(); ++k)
    {
        for (int j = 0; j < sheet->GetTotalCols(); ++j)
        {
            ExcelFormat::BasicExcelCell* cell = sheet->Cell(k, j);
            switch (cell->Type())
            {
            case ExcelFormat::BasicExcelCell::INT:
                std::cout << "INT:" << cell->GetInteger() << std::endl;
                break;
            case ExcelFormat::BasicExcelCell::DOUBLE:
                std::cout << "DOUBLE:" << static_cast<int>(cell->GetDouble()) << std::endl;
                break;
            case ExcelFormat::BasicExcelCell::STRING:
                std::cout << "STRING:" << cell->GetString() << std::endl;
                break;
            case ExcelFormat::BasicExcelCell::WSTRING:
                std::cout << "WSTRING:" << cell->GetWString() << std::endl;
                break;
            case ExcelFormat::BasicExcelCell::UNDEFINED:
            case ExcelFormat::BasicExcelCell::FORMULA:
            default:
                break;
            }
        }
    }
  • 암호 걸린 엑셀파일은 처리 불가능하다.

테스트 코드를 열심히 작성해봤더니 시트가 여러개일때도, 데이터가 꽤 많을 때에도 데이터 처리가 무난했다.

사용했던 테스트 코드의 일부.

class DataTableMgr
{
private:
	ExcelFormat::BasicExcel xls;
};

bool DataTableMgr::LoadWeaponBombTable(void)
{
    ExcelFormat::BasicExcelWorksheet* sheet = nullptr;
    
    for (int i = 0; i < xls.GetTotalWorkSheets(); ++i)
    {
        sheet = xls.GetWorksheet(i);
        if (nullptr == sheet)
            continue;

        if (!strcmp(WEAPONBOM_SHEETNAME, sheet->GetAnsiSheetName()))
        {
            sheet = xls.GetWorksheet(i);
            break;
        }
    }

    if (nullptr == sheet)
        return false;

    // 첫행은 컬럼 인덱스이므로 항상 패쓰
    for (int i = 1; i < sheet->GetTotalRows(); ++i)
    {
        DATATABLE_WEAPONBOMB weapon_bomb;
        weapon_bomb.index = static_cast<int>(sheet->Cell(i, 0)->GetDouble());
        weapon_bomb.id = static_cast<int>(sheet->Cell(i, 1)->GetDouble());
        weapon_bomb.id_5pack = static_cast<int>(sheet->Cell(i, 2)->GetDouble());
        weapon_bomb.id_11pack = static_cast<int>(sheet->Cell(i, 3)->GetDouble());
        weapon_bomb.itemid = static_cast<int>(sheet->Cell(i, 4)->GetDouble());

        weapon_bomb_map.insert(DATATABLE_WEAPONBOMB_MAP::value_type(weapon_bomb.index, weapon_bomb));
    }

    std::cout << "WeaponBomb count : " << weapon_bomb_map.size() << std::endl;

    return true;
}

코드 자체는 잘 작동했지만, static 데이터를 엑셀 파일로 관리하는 것에 대해 위험함이 제기 되어 이 프로젝트는 무산되었다. ㅎㅎㅎ 나중에 언젠가는 쓸 일이 있겠지.

DROWN Attack 취약점 방지용 SSL 설정

https://www.ssllabs.com 에서 SSL 테스트를 해봤는데 DROWN 취약점이 있다고 F 등급을 먹인다.

DROWN 공격 취약점에 대한 내용

줄여서 얘기하자면, SSL v1, v2, v3와 TLS 1.0은 사용하지 않도록 하는 것이 목표이다.

그렇게 설정했는데도 아무리해도 되질 않았다.

에서 답을 찾았다. default_server 설정이 있어야 한다는 것.

nginx virtualhost 설정에서

server {
        listen                  443 ssl default_server;
        root                    /opt/bitnami/apps/blog.dongbumkim.com/htdocs/;
        server_name             blog.dongbumkim.com;
        ssl_certificate         /etc/letsencrypt/live/blog.dongbumkim.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/blog.dongbumkim.com/privkey.pem;
        include                 "/opt/bitnami/nginx/conf/ssl_param.conf";
        include                 "/opt/bitnami/apps/blog.dongbumkim.com/conf/nginx-app.conf";
}

default_server 를 꼭 넣어줘야한다.

이 default_server 설정은 하나만 있어야하므로 여러 가상호스트를 쓰고 있다면 그 중 한 곳의 server 블록에만 넣어줘야한다. 만약 여러곳에 넣으면 nginx 실행시 에러난다.

SSL 설정은 다음 사이트에서도 만들 수 있다.

 

yum에서 특정패키지 제외하고 업데이트하는 방법

지금 운영하는 서버에는 데디케이트 서버 라이브러리를 제작해준 회사에서 제공한 패키지가 같이 설치되어 있다.

이 파일이 따로 RPM 파이롤 제공되었기 때문에 yum localinstall 로 설치하게 되었는데, 문제는 yum update 를 하게 되면 이 패키지까지 같이 업데이트를 하려고 시도를 하게 된다.

이 패키지는 강제설치된 것이어서 의존성 문제가 엄청나게 발생하고 결국에는 yum update 는 실패하게 된다.

그래서 매번 yum update 를 할때마다 이 패키지만 제외한 채로 하나씩 업데이트를 해왔는데 아예 이 패키지를 제외하고 업데이트를 간편하게 하는 방법이 있었다.

원본 출처 : https://access.redhat.com/solutions/10185

yum update 시에

yum update --exclude=PACKAGENAME

을 이용해 특정패키지를 제외하고 나머지 패키지를 전체 업데이트 할 수 있다.

 

하지만 매번 명령어를 저렇게 입력해야하는지라, 아예 저 명령조차 입력하고 싶지 않다면,

/etc/yum.conf 파일에 다음처럼 입력한다.

[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exclude=kernel* redhat-release*                           <====

 

이렇게 추가하고 나면 이후에는 아예 yum update 시에 이 패키지를 제외하게 된다.

Node.js MaxListener 에러 수정

웹소켓 테스트 중 마주친 에러.

대략 코드상으로는 별 문제가 없는데 실행시 이러한 에러가 나왔다.

(node:5828) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 close listeners added. Use emitter.setMaxListeners() to increase limit

해결방법은

를 참고하여 해결.

코드 중간에 다음과 같은 코드를 삽입한다.

require('events').EventEmitter.prototype._maxListeners = 100;

그런데 이 코드를 넣으면 이벤트 전반에 대한 리스너 갯수를 변경하는지라… 글로벌하게 변경해도 되나 모르겠네. 웹소켓 객체에다가만 적용하는 방법을 더 찾아봐야할 것 같다.

Lightsail 에서 NGINX에 SSL 적용하기 (2)

제대로 접속이 된다면 Lightsail 관리자페이지에서 HTTPS 접속을 위한 환경을 추가한다. ssl.83rpm.com 도메인을 추가한 다음, 443 포트를 연다.

이제 SSL 설정을 시작한다.

내가 수정해야될 사이트의 가상호스트 설정 파일을 연다. 내 경우에는, /opt/bitnami/apps/ssl.83rpm.com/conf/nginx-vhost.conf 파일.

기존의 파일 내용은 다음과 같다.

server {
        listen          80;
        root            /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name     ssl.83rpm.com;
        client_max_body_size    40M;
        include         "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

이 파일 내용을 다음과 같이 변경한다.

server {
        listen          80;
        root            /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name     ssl.83rpm.com;
        client_max_body_size    40M;
        include         "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

server {
        listen                  443 ssl;
        root                    /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name             ssl.83rpm.com;
        ssl_certificate         /opt/bitnami/nginx/ssl/server.crt;
        ssl_certificate_key     /opt/bitnami/nginx/ssl/server.key;
        ssl_session_cache       shared:SSL:1m;
        ssl_session_timeout     5m;
        ssl_ciphers             HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        include                 "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

수정이 완료되었다면 lightsail 재시작 명령어로 모두 재시작한다.

sudo /opt/bitnami/ctlscript.sh restart

재시작하고 난 뒤 웹브라우저를 열고 https://ssl.83rpm.com 으로 접속이 잘 되는지 확인해본다.

구글 크롬과 인터넷 익스플로러의 경우 다음과 같이 표시된다.

내가 임의로 생성한 인증서이므로 안전하지 않기에 경고가 표시되지만 경고를 무시하면 어찌됐든 잘 표시된다.

만약, HTTP로 접속하더래도 무조건 HTTPS로 강제로 접속시키고 싶다면, nginx-vhost.conf 파일을 열고 다음과 같은 설정을 추가한다.

server {
        listen          80;
        root            /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name     ssl.83rpm.com;
        client_max_body_size    40M;
        include         "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
        rewrite ^ https://$server_name:443?request_uri? permanent;
}

server {
        listen                  443 ssl;
        root                    /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name             ssl.83rpm.com;
        ssl_certificate         /opt/bitnami/nginx/ssl/server.crt;
        ssl_certificate_key     /opt/bitnami/nginx/ssl/server.key;
        ssl_session_cache       shared:SSL:1m;
        ssl_session_timeout     5m;
        ssl_ciphers             HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        include                 "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

엔진엑스를 재실행하면 이제부터는 http로 접속하더라도 https 로 자동전환된다.

테스트하려면 http://ssl.83rpm.com 혹은 https://ssl.83rpm.com 으로 접속해보시길. (언제 닫을지는 모릅니다.)

참고자료

Lightsail 에서 NGINX에 SSL 적용하기 (1)

Lightsail을 사용하며 SSL을 적용하는 방법에 대한 포스팅이다. SSL을 써본적도 없고 앞으로도 내가 이런걸 쓸일이 있을지는 모르겠으나 한번 시도해본다. (사실은 푸우시로님의 요청으로)

나는 상용인증서를 구매할 생각이 없으므로 셀프로 생성해서 테스트해보기로 했다.

이제부터 쓸 내용은 AWS Lightsail NGINX 스택에서 설정한 것이며 운영체제는 우분투 리눅스, 웹서버는 nginx 이다. 굳이 lightsail에만 국한된 것은 아니고 어떤 리눅스라도 같은 과정을 거치면 HTTPS 설정이 가능하다. 상용인증서를 사용한다해도 인증서 공급업체의 인증서를 쓸뿐이지 다른 과정은 똑같다.

https://goo.gl/gBSf5b

을 참고하여 인증서를 생성한다.

아래부터의 내용은 위 URL에 있는 개인인증서 생성을 직접 실행해본 것이다.

bitnami@ip-172-26-10-176:~$ openssl version
OpenSSL 1.0.2l  25 May 2017
bitnami@ip-172-26-10-176:~$

명령으로 openssl이 설치되어 있는지 확인한다. 설치가 되어있지 않다면 apt-get install openssl로 openssl 패키지를 설치한다.

개인키를 생성한다.

bitnami@ip-172-26-10-176:~$ openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
....................................+++
............................+++
unable to write 'random state'
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
bitnami@ip-172-26-10-176:~$

인증요청서를 생성한다. 몇가지 입력을 요구하는데 자기 상황에 맞도록 알아서 입력한다. 챌린지패스워드와 옵셔널 컴패니 네임은 입력하지 말라고 해서 그냥 엔터쳐서 넘기면 된다.

bitnami@ip-172-26-10-176:~$ openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:Seoul
Locality Name (eg, city) []:Seadaemoon-gu
Organization Name (eg, company) [Internet Widgits Pty Ltd]:83RPM.com
Organizational Unit Name (eg, section) []:83RPM.com
Common Name (e.g. server FQDN or YOUR name) []:83rpm.com
Email Address []:YOUR_EMAIL@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
bitnami@ip-172-26-10-176:~$

개인키에서 패스워드 제거하기

bitnami@ip-172-26-10-176:~$ cp server.key server.key.origin
bitnami@ip-172-26-10-176:~$ openssl rsa -in server.key.origin -out server.key
Enter pass phrase for server.key.origin:
writing RSA key
bitnami@ip-172-26-10-176:~$

인증서 생성

bitnami@ip-172-26-10-176:~$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=KR/ST=Seoul/L=Seadaemoon-gu/O=83RPM.com/OU=83RPM.com/CN=83rpm.com/emailAddress=YOUR_EMAIL@gmail.com
Getting Private key
unable to write 'random state'
bitnami@ip-172-26-10-176:~$

여기까지 하고 나면, server.crt / server.csr / server.key / server.key.origin 이렇게 4개의 파일이 생긴다.

인증서 파일들을 넣을 폴더를 생성한다. 나는 /opt/bitnami/nginx/ssl 로 지정했다. 이걸로 할 필요는 없으니 자기 마음대로 결정한다. (예를 들면, 사이트마다 설정할 사람은 apps 디렉토리의 자기사이트 디렉토리 밑에 만드는게 더 나을 것이다.)

bitnami@ip-172-26-10-176:~$ sudo mkdir /opt/bitnami/nginx/ssl

생성된 3개의 파일을 인증서 관리용 디렉토리로 복사한다.

bitnami@ip-172-26-10-176:~$ sudo cp server.crt /opt/bitnami/nginx/ssl/
bitnami@ip-172-26-10-176:~$ sudo cp server.csr /opt/bitnami/nginx/ssl/
bitnami@ip-172-26-10-176:~$ sudo cp server.key /opt/bitnami/nginx/ssl/

SSL을 적용할 사이트에 설정을 시작한다.

난 SSL 테스트를 위한 것이므로 따로 SSL을 위한 사이트 설정을 하나 만들었다. 주소는 ssl.83rpm.com 으로 하기로 했다. 사이트 설정을 한다. vhost 등등….

일단 http://ssl.83rpm.com 으로 접속해본다. 만약 여기서 제대로 접속이 안된다면 nginx 가상호스트 설정이 제대로 안되었으니 제대로 나올 떄까지 수정해야된다.

 

글의 내용이 너무 길어져 두 포스팅으로 나눠서 써야겠다.

docker 시작시 에러

집에 갑자기 정전이 와서 서버가 꺼져버렸다.

서버가 다시 살아나고 도커로 사용하던 컨테이너들을 재시작하려고 하니 에러가 났다.

[root@localhost ~]# docker start plex
Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/40a78337fb7041d7de6ccd93467be6ec60f7baf325f062c97e24cc4d01a13d91/merged: invalid argument
Error: failed to start containers: plex
[root@localhost ~]#

이 문제를 해결하기 위해 구글 검색을 해보았으나 딱히 좋은 의견은 보질 못했다.

docker container list 명령으로 컨테이너를 찾아보았으나 보이지 않았다. docker ps 명령으로 찾아서 모든 컨테이너를 삭제한다.

[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7d613c08b1f2 linuxserver/tautulli "/init" 7 days ago Exited (255) 3 hours ago tautulli
fdcb9b590e94 linuxserver/transmission "/init" 8 days ago Exited (255) 3 hours ago transmission
246a6d8a721b plexinc/pms-docker "/init" 10 days ago Exited (255) 3 hours ago plex
3040fb42bd81 oznu/homebridge "/init" 12 days ago Exited (255) 3 hours ago homebridge
[root@localhost docker]# docker container rm 7d613c08b1f2
7d613c08b1f2
[root@localhost docker]# docker container rm fdcb9b590e94
fdcb9b590e94
[root@localhost docker]# docker container rm 246a6d8a721b
246a6d8a721b
[root@localhost docker]# docker container rm 3040fb42bd81
3040fb42bd81

컨테이너를 모두 삭제하고 다시 컨테이너 실행스크립트를 이용해 새로운 컨테이너를 만들어서 실행시키니 해결되었다.

 

정전 같은 이유로 불완전하게 종료되었을 경우, 도커의 재실행에 문제가 생긴다. 이를 해결하는 방법 또한 시원하게 나온게 없었다. 컨테이너가 제대로 실행되지 않는다면 다 삭제하고 다시 실행하는게 차라리 빠르다.

귀찮은 실행스크립트를 다시 작성하지 않도록 잘 보관해야 한다.

Docker 설치 사용 후기

최근에 홈오토메이션을 잠깐 만져보다가 Docker를 접하게 되었다.

그동안 도커도커 얘기만 들어보고 개념만 들어봤지 이게 무엇인지 제대로 몰랐는데 이제는 좀 써봐야겠다 싶어서 도커에 대한 책도 한권 구매해서 정독하고 마이크로서버도 도커 기반으로 변경. 어차피 몇가지 서비스가 운영되지 않았기 때문에 도커로 옮기는건 별로 어렵지 않았으나 이왕이면 깨끗한 상태에서 돌리는게 기분 좋으니 CentOS 7 로 재설치하고 도커 기반으로 이전했다.

plex, transmission, nginx, homebridge 정도만 도커로 돌려보니 이제 이게 뭔지 좀 알 것 같다.

도커를 사용해본 후기.

  1. 전가상화와 비교할 수 없을 정도로 강력함.
    ESXI를 이용해 가상화로 서버를 돌려봤는데… 이건 운영체제 선택의 자유로움이 있고 정말 완벽한 격리환경이 되는 반면에, 가상화를 한다해도 자원을 너무나 많이 소모했다. 특히 게스트 운영체제 구동에 자원이 많이 드니… 이렇게까지 해야하나 싶었는데, 도커는 호스트 운영체제의 성능을 거의 그대로 쓸 수 있고, 자원도 많이 들지 않는다.아마 리눅스 서버를 가상화해서 쓴다면 ESXI보다 Docker가 정답인듯하다.
  2. 라이브러리 설치에서 해방
    yum이 나오면서 의존성에 대한 패키지 설치는 거의 자동화가 이루어졌긴하지만 서버에 프로그램을 설치하다보면 수많은 패키지들이 같이 설치가 된다. 시스템이 얼마나 더럽혀지는지도 알 수가 없고, 내가 쓰던 프로그램을 언인스톨한다고 해서 이 라이브러리와 패키지들이 같이 삭제되는건 아니기 때문에 과도한 관련 패키지와 라이브러리 설치는 별로 마음에 들지 않았었다.그런데, 도커로 오니 이러한게 한방에 해결. 더이상 운영체제가 각종 라이브러리 파일로 더럽혀질 일은 없을듯하다.
  3. 컨테이너 실행 옵션이 바뀌면 컨테이너를 통째로 지우고 다시 만들어야함.
    도커 사용시 약간 귀찮은 점. 어쩌면 방법이 있는데 내가 도커를 아직 잘 몰라서 못 찾은 것일 수도.
  4. 이미지에서 지원하지 않는 기능과 옵션에 대해서 내가 처리 불가능.
    사용하고자하는 이미지마다 정해진 옵션이 있고 이 옵션들에 대해서만 사용 가능하다.
    물론 그 부분을 내가 수정하여 이미지를 만들면서 사용하면 해결가능하다.
  5. 하지만 그럼에도 장점이 크다.
    호스트 운영체제의 시스템을 전혀 건드리지 않으면서 프로그램을 실행할 수 있다는건 정말 큰 장점.
  6. 실서비스에서 사용 가능한가…?
    사용해본 경험으로는 실서비스에 충분히 사용가능할듯하다.
    특히, 같은 이미지만 사용한다면 어디서나 같은 컨테이너를 돌릴 수 있다는게 최고의 장점인 것 같다.
    경험상 리눅스서버 사용시에는 운영체제 버전이 다르면 라이브러리 충돌 때문에 애먹는 경우가 많은데 도커가 그 해답이 될 수 있을 것 같다.

도커도커 왜들 그리 도커를 찾았나 얘기해서 사용해봤더니 실제로 아주 훌륭했다. 좀더 사용해보면 장단점이 더 많이 보이겠지.