Summary 서버에 프로젝트를 배포할 경우 ftp로 파일을 옮기는 방식으로 사용할 수도 있다. 하지만 git repository를 사용하면 git 명령어만으로 간단히 서버코드를 갱신할 수 있다.
로그인이 아닌 access key를 통해 git repository에 접근하는 방법에 대해 알아보자.
Key pair 생성하기 먼저 배포하고 싶은 서버에 ssh로 접속한 후 key pair를 생성하자.
# 이 커맨드는 현재 접속한 유저 directory에 .ssh폴더가 없으면 생성할 것이고, 있다면 .ssh directory에 key pair만 생성할 것이다. $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/USERNAME/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/USERNAME/.ssh/id_rsa. Your public key has been saved in /home/USERNAME/.ssh/id_rsa.pub. The key fingerprint is: SHA256:L68PHdXfH2yfSUKraajtNLnm9ltO2HXtzk0y8Z76XUI USERNAME@localhost The key\'s randomart image is: +---[RSA 2048]----+ | | | . . . | | . = ... | | + + ... o.o| | =So. +E*+| | o o+.o.=+*| | oo.o= +oB| | . .++ O=| | .=+. .oo*| +----[SHA256]-----+ # ~/.ssh의 file을 확인해보자. $ ls -a ~/.ssh . .. authorized_keys id_rsa id_rsa.pub # 파일을 확인했다면 권한설정을 해주자. $ chmod 700 .ssh && chmod 600 .ssh/id_rsa && chmod 600 .ssh/id_rsa.pub 개인키와 공개키를 발급하였다. 이제 ssh-agent를 시작하고 keys를 load하자.
...
Summary Localhost에서 elastic cache에는 원칙적으로 접근할 수 없다. 별도로 VPC내에 Virtual Private Gateways나 Customer Gateways를 사용하여 VPC내에 존재하는 Elasic Cache에 접근할 수 있다. 하지만 이는 별도의 설정과정이 들어가므로 귀찮았다. 그래서 바로 VPC내의 EC2 인스턴스에서 Elastic Cache에 접근하였다. Docker 이미지 중에서 Redis-cli가 있기 때문에 손쉽게 별도의 설치과정 없이 접근할 수 있다.
이 과정은 이미 elastic cache를 사용하고 있고 인스턴스에 Docker가 설치되어 있다는 전제 하에 진행한다.
Docker hub에서 redis-cli 이미지를 받아 접속하자. 아래와 같은 Dockerfile을 기반으로 redis client를 사용할 수 있다.
...
Summary node js나 web ui를 다루기 위해 javascript를 사용하면 closure를 사용할 것이다. constructor로 객체를 생성하지 않고 왜 closure를 사용하는지 살펴보자.
Constructor와 Closure의 성능차이 샘플코드는 아래와 같다. 성능 결과값을 보면 거의 2배의 차이가 나는 것을 볼 수 있다.
이러한 차이는 node 서버를 사용할 경우 더욱 두드러지게 체감할 것이다.
constructor를 사용하는 경우 javascript 객체가 반드시 가져야할 함수들을 상속받기 때문에 속도차이가 나타나는 것이다. 하지만 front에서는 클라이언트가 메모리를 가지기 때문에 크게 우려하지 않아도 된다.
...
Summary Java를 개발하다보면 String에 대해서 별다른 고민없이 (“Some text” + " added text")와 같이 ‘+‘기호를 통해 스트링을 더하곤 한다. 하지만 Java 개발자라면 고민을 더 해보고 Class를 선택해야한다. String과 StringBuilder, 그리고 StringBuffer를 어떤 경우에 사용하는지 확인해보자.
각 클래스의 특징 설명에 들어가기에 앞서서 java api와 친숙해져야 된다고 생각한다.
java api에 접속해서 java.lang 패키지를 들어가보자. java.lang은 별도로 import를 해주지 않아도 사용할 수 있는 class들이 모여있다. Classes항목을 보면 자주 기본적인 클래스들이 있는 것을 볼 수 있다. Boolean, Byte, Integer등과 같은 WrapperClass들도 찾아볼 수 있다.
...
Summary Docker hub에 private image를 올리는 것은 제한이 있다. 개인 사용자의 경우 하나의 이미지만 private이 가능하고 organization의 경우에는 비용을 지불해야만 사용이 가능하다. 이런점에 비추어 볼 때 우리는 private registry환경을 구축하고 싶다는 생각이 들 것이다.
EC2에 개인 registry를 구축하고 local 또는 다른 서버에서 접근하는 방법에 대해서 진행해보겠다. 그리고 Amazon S3 를 이미지 저장소로 사용하겠다.
Docker registry 구축하기 docker가 설치되어 있는 EC2에 접근하여 registry 이미지를 pull 해보자.
docker registry의 기본포트는 5000번이다. # registry 이미지를 가져오기 $ docker pull registry # registry를 실행하기 $ docker run -dit --name docker-registry -p 5000:5000 registry Docker image를 push하기 도커허브를 사용할 때는 <계정아이디>/registry:latest 처럼 tag명에 내 아이디가 들어가는 모양이었다. 하지만 private registry를 사용할 때는 <계정아이디>부분에 내 registry의 url주소를 사용하여야 한다.
...
Summary 이제 모든 준비는 끝났다. Docker image를 EC2 인스턴스에 배포하자.
순서 Amazon web service에 Ubuntu OS를 사용하는 EC2 인스턴스 생성하기 접속 포트를 열어주고 별도의 Ubuntu 유저를 생성하기 EC2에 Docker를 설치하고 Ubuntu 유저에게 권한주기 Bitbucket을 사용하여 git repository 생성하기 Express JS를 사용하여 Node 서버 구축하기 PM2를 사용하여 EC2에 Node 서버 배포하기 Node 서버를 바탕으로 Dockerfile로 만들기 Docker Hub의 automated build를 사용하여 Docker image를 만들기 만들어진 Docker image를 EC2 인스턴스에 배포하기 Docker image를 받아오기 EC2 인스턴스에 SSH로 접속하자. 리눅스 계정은 이전에 만들었던 docker 로 로그인하자.
...
Summary 이전에는 Dockerfile을 만들었다. 하지만 매번 build하는 것은 소모적인 시간이라고 생각한다. 그럼 만들어진 Dockerfile을 git repository에 push하면 Dockerfile이 빌드되는지 확인하는 것은 어떨까. docker hub의 automated_build기능을 사용하면 간단히 구현된다.
순서 Amazon web service에 Ubuntu OS를 사용하는 EC2 인스턴스 생성하기 접속 포트를 열어주고 별도의 Ubuntu 유저를 생성하기 EC2에 Docker를 설치하고 Ubuntu 유저에게 권한주기 Bitbucket을 사용하여 git repository 생성하기 Express JS를 사용하여 Node 서버 구축하기 PM2를 사용하여 EC2에 Node 서버 배포하기 Node 서버를 바탕으로 Dockerfile로 만들기 Docker Hub의 automated build를 사용하여 Docker image를 만들기 만들어진 Docker image를 EC2 인스턴스에 배포하기 Automated_build Docker hub에서 지원해주는 이미지 빌딩시스템이다. docker hub와 github나 bitbucket 계정은 단 하나만 연동이 가능하며 다른 계정과는 연동할 수 없다. 또한 만능으로 항상 build를 해주는 것이 아닌 역시 limit 이 존재한다. 이 링크를 참고하길 바란다. https://forums.docker.com/t/automated-build-resource-restrictions/1413
...
Summary Dockerfile로 이미지로 관리하면 배포 및 관리가 간편하게 가능하다. 여기서는 node를 베이스 이미지로하여 노드 서버를 배포할 수 있도록 준비한다.
순서 Amazon web service에 Ubuntu OS를 사용하는 EC2 인스턴스 생성하기 접속 포트를 열어주고 별도의 Ubuntu 유저를 생성하기 EC2에 Docker를 설치하고 Ubuntu 유저에게 권한주기 Bitbucket을 사용하여 git repository 생성하기 Express JS를 사용하여 Node 서버 구축하기 PM2를 사용하여 EC2에 Node 서버 배포하기 Node 서버를 바탕으로 Dockerfile로 만들기 Docker Hub의 automated build를 사용하여 Docker image를 만들기 만들어진 Docker image를 EC2 인스턴스에 배포하기 Dockerfile 이란? Docker image의 설정 정보를 담고 있는 파일이다. 실제 운영 소프트웨어를 배포할 경우 node 베이스 이미지를 올린 다음 패키지를 설치하고 volume을 할당할 수도 있다. 현재 이미지를 주기적으로 commit하여 백업하고 직접 docker exec를 하여 컨테이너 내에 실행명령어를 보내야하는 단점이 있었다. 하지만 Dockerfile은 docker image를 생성할 때 source file을 가져와서 컨테이너 구동과 동시에 서버를 가동시킬 수 있다. 이러한 docker container를 관리하는 방법으로는 docker-compose가 있는데 추후에 살펴볼 것이다.
...
Summary node js 패키지 중에서 PM2를 사용하여 웹서버를 배포하자.
순서 Amazon web service에 Ubuntu OS를 사용하는 EC2 인스턴스 생성하기 접속 포트를 열어주고 별도의 Ubuntu 유저를 생성하기 EC2에 Docker를 설치하고 Ubuntu 유저에게 권한주기 Bitbucket을 사용하여 git repository 생성하기 Express JS를 사용하여 Node 서버 구축하기 PM2를 사용하여 EC2에 Node 서버 배포하기 Node 서버를 바탕으로 Dockerfile로 만들기 Docker Hub의 automated build를 사용하여 Docker image를 만들기 만들어진 Docker image를 EC2 인스턴스에 배포하기 웹서버에 node js를 설치하고 PM2를 설치하기 이전에 생성한 EC2 인스턴스에 ubuntu계정으로 SSH 접속한 후 Node js를 설치하자.
...
Summary Bitbucket을 사용하여 git respository를 생성한다. 보통은 github로 관리하지만 github는 private한 repository를 사용하기 위해서는 사용료를 내야한다. 하지만 Bitbucket은 무제한적인 repository를 생성할 수 있으며 repository의 크기만 제한되어 있다. 2GB까지 사용이 가능한데 보통 코드로만 200MB도 사용하기 어려운 관계로 사실상 무제한이라고 볼 수 있다.
순서 Amazon web service에 Ubuntu OS를 사용하는 EC2 인스턴스 생성하기 접속 포트를 열어주고 별도의 Ubuntu 유저를 생성하기 EC2에 Docker를 설치하고 Ubuntu 유저에게 권한주기 Bitbucket을 사용하여 git repository 생성하기 Express JS를 사용하여 Node 서버 구축하기 테스트로 PM2를 사용하여 EC2에 Node 서버 배포하기 Node 서버를 바탕으로 Dockerfile로 만들기 Docker Hub의 automated build를 사용하여 Docker image를 만들기 만들어진 Docker image를 EC2 인스턴스에 배포하기 Bitbucket Repository 생성하기 먼저 bitbucket.org/에 접속하여 회원가입을 진행하고 로그인한다.
...