프로젝트 루트 폴더에서 docker pull debian:buster
을 입력하고, docker images
를 입력하여 잘 실행되었는지 확인해 보자.
docker run -it -p 80:80 -p 443:443 debian:buster
을 입력한다. 하나하나 설명하자면,docker run
명령어는 도커를 실행한다. -it
의 경우, 옵션 -i는 Keep STDIN open even if not attached. 즉, 표준 입력을 유지한다. 쉽게 말하면, 컨테이너 작성 시점에 사용하고 있는 host 컴퓨터 운영체제의 쉘이 아닌, 컨테이너의 쉘에 명령을 입력하겠다는 의미이다. 옵션 -t는 Allocate a pseudo-TTY. TTY*를 활성화 해 준다. -p
의 경우, 옵션 -p는 호스트와 컨테이너의 포트를 연결한다. Publish a container's port(s) to the host. 합쳐서 -it -p [호스트의 포트]:[컨테이너의 포트]
형식으로 쓴다.
TTY란? TeleTYpewriter의 약자로, terminal과 상호작용하는 tty라는 콘솔을 연다는 의미이다. TTY는 콘솔의 한 종류로, Ctrl-Alt-F1~F6 키 조합으로 사용할 수 있는, OS에서 제공하는 가상의 콘솔이다. 실제 물리적인 장치가 연결된 것이 아니기 때문에, 커널에서 터미널을 에뮬레이션 한다.
TTY에 대한 자세한 설명은 여기를 참조.
debian:buster
은 도커 허브의 [이미지 이름]:[태그]
형식이다. 도커 허브에서 이미 만들어진 특정한 이미지들을 받아올 수 있는데, 우리가 작업하고 있는 해당 이미지는 데비안 운영체제의 버스터 버전을 태그한 것이다. 만약 이 태그 위치에 아무것도 쓰지 않으면, 자동으로 latest(최신)버전을 받아온다. 우리 프로젝트에서는 데비안 버스터를 기반으로 이미지를 빌드하라고 했으니, debian:buster
형식으로 버전을 명시해 준다.
위와 같이 되면, debian을 기반으로 빌드된 bash shell에 접속하였다.
데비안에서는 패키지 관리자로 apt-get 명령어를 사용한다. apt-get(Advanced Packaging Tool)은 우분투를 포함한 데비안 계열 리눅스 운영체제에서 사용되는 패키지 관리 명령어 도구이다. 우분투에는 GUI로 되어 있는 관리자 도구 모음도 있지만, 개발 관련 패키지 관리에는 커맨드 기반의 apt-get을 사용한다.
apt-get update
를 입력해서, 데비안의 apt 패키지 목록을 최신으로 받는다. apt-get upgrade
도 입력한다. 중간 중간 패키지 관련에 소요되는 메모리 등을 허용할건지 하는 질문을 띄우는데, 이에 모두 yes로 답하려면 -y 옵션을 사용해 준다. 위의 두 커맨드를 실행하고, apt-get -y install nginx
를 해서, NginX도 설치해 준다.
많은 양의 커맨드라인이 출력될 것이다. 이후에, service nginx start
커맨드로 NginX를 실행시켜 본다. service ngingx status
를 입력해 실행이 잘 되는지도 확인한다.
브라우저를 켜고, 검색 입력창에 localhost:80 또는 localhost를 입력하여 아래와 같은 창이 뜨면 성공이다.
인터넷 상에서 웹 브라우저(클라이언트)와 웹 서버(서버)간에 데이터를 안전하게 주고받기 위해서는 서로 암호화하여 통신한다. SSL 인증서는, SSL(Secure Socket Layer)을 기반으로 사용자의 웹 브라우저와 인터넷 사이트의 웹 서버 사이에 암호화 통신을 가능하게 하는 프로토콜으로, 제 3의 신뢰기관이 인증한 인증서를 말한다.
이 SSL 인증서에는 웹서버의 공개 키(Public Key), 인터넷 사이트의 정보, 소유자 정보 등이 포함되어 있다. 사용자는 서버와 암호화 통신을 위해 필요한 사용자 PC에서 생성한 세션 키(암호화 키, 대칭 키)를, SSL 인증서에 포함된 웹 서버의 공개 키를 이용하여 암호화해 웹 서버에 전달한다.
SSL의 기능과 키 전달 방법에 대한 더욱 자세한 내용은 여기를 참조.
Self-signed 인증서의 경우, CSR(Certificate Signing Request, 인증서 서명 요청)을 명시적으로 생성하여 인증서에 셀프로 사인을 한 뒤 인증서를 완성한다. 만일 CSR을 명시적으로 생성하지 않을 경우에는 key와 부가 정보들을 입력하여 직접 셀프로 사인을 한 뒤 인증서를 완성할 수도 있다. CSR을 만들어 CA에 요청해서 발급받는 방법에는 무료, 유료 방법이 있다. 이를 해주는 업체들이 코모도 등의 서비스이다.
openssl은 ssl 프로토콜을 위한 도구로, 다양한 암호화 알고리즘을 지원하는 오픈소스 도구이다. 이 프로그램을 사용하여, 인증서에 필요한 키를 생성하고 스스로 사인한 인증서를 만들 수 있다. 우리는 위에서 설명한 방법 중, CSR을 생성하고 인증서에 셀프로 사인하는 방법을 택해 보겠다.
이전 포스팅에서, 도커를 설치하고 데비안 버스터 기반의 이미지를 생성한 후, 쉘에 접속하고 NginX를 설치하여 실행까지 한 뒤 다음 커맨드를 입력하여 인증서 생성을 진행한다.
apt-get install openssl
apt 매니저를 사용하여 openssl을 설치해 준다.
openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/0=42Seoul/OU=Kang/CN=localhost" -keyout localhost.dev.key -out localhost.dev.crt
엄청 긴 명령어를 입력한다.
openssl req -newkey
는 openssl 커맨드 옵션. req는 request의 약자이다. CSR을 생성하기 위해 쓰고, 이 요청으로 crt(인증서 파일의 한 종류)를 생성한다. 이렇게 하면, localhost.dev.key
와 localhost.dev.crt
파일이 생성될 것이다. -days
옵션은 유효한 일 수를 의미한다. -nodes
옵션을 통해 리부팅 할 때마다 암호를 입력할 필요 없게 해 준다.
mv localhost.dev.crt etc/ssl/certs/
mv localhost.dev.key etc/ssl/private/
chmod 600 etc/ssl/certs/localhost.dev.crt etc/ssl/private/localhost.dev.key
이후 위와 같은 명령어를 통해 파일의 경로를 옮겨주고, 권한을 600으로 설정해 준다. 아까 경로이동을 해 준 곳으로 옮겨서 cat 을 해보면, 긴 무작위 알파벳의 나열이 들어 있을 것이다.
vim etc/nginx/sites-available/default
를 입력한다. (컨테이너 bash에서 vim을 입력하니 오류가 발생해서, apt-get install vim
으로 설치를 해 주었다.) 위의 default 파일을 vim으로 열어 보면, NginX configuration 파일을 알기 위해 참고할 수 있는 링크가 주석으로 첨부돼 있다.
config 파일에 server 블럭을 하나 더 추가하고, 아래 내용을 덧붙여 준다.
server {
listen 443;
ssl on;
ssl_certificate /etc/ssl/certs/localhost.dev.crt;
ssl_certificate_key /etc/ssl/private/localhost.dev.key;
root /var/www/html;
index index.html index.htm index.nginx-debian.html index.php;
...
}
이후, service nginx reload
를 입력하여 수정 사항을 적용시킨 뒤 localhost에 접속할 수 있다. 여기까지 하면, 우리는 도커를 통해, 데비안 버스터 이미지를 기반으로 생성한 컨테이너에 NginX를 설치하고, SSL 인증서를 추가하는 것 까지 완료한 것이다.
주소창 왼 쪽의 정보 아이콘을 누르면 현재 안정되지 않은 연결이라고 뜬다.