본문 바로가기
배포/AWS

2. AWS EC2(우분투)에 배포하기

by moca7 2024. 12. 10.

 

 

 

 

- https://gdu-cloud.signin.aws.amazon.com/console 에 접속하고 로그인한다.

 

- stud_01~18 / !P@ssw0rd (숫자 0임)

 

 

 

 

 

- 인스턴스 시작을한다.

 

- 모바엑스텀에서 접속한다.

 

 

 

 

- ec2를 누른다.

 

 

 

 

 

- 인스턴ㅅ ㅡ클릭

 

 

 

- 자기 이니셜-svr이 서버다. 왼쪾 체크박스 선택하고 인스턴스 상태보면 6개가 있는데 종료하기 누르면 삭제다. 인스턴스 시작을 누른다.

 

 

 

 

- 시작처리되었다고 뜬다.

 

 

 

 

 

 

- 요약 정보를 보면 ip가 이전과는 바뀌었을 거다.

 

 

 

 

 

- 모바엑스텀에서 ec2를 킨다.

 

- 모바 엑스텀에 기존에 퍼블릭 ipv4 dns를 햇는데 퍼블릭ipv4주소도, 퍼블릭ipv4 dns도 바뀌었다.

그래서 바꿔줘야 한다.

 

 

 

 

 

 

 

 

- 세션에 에딧세션. ssh에서 리모트 호스트를 바뀐 주소로 다시 복붙한다.

 

 

 

 

 

 

 

- ip 주소를 바꿔주니 접속되었다.

 

 

 

- 클라우드 aws에 잇는 ec2에 우분투를 설치하고 동작했다.

어제까지 우린 버츄얼박스에 있는 우분투를 썼다.

우분투는 똑같다. 서버의 위치만 다르다. 접속하는건 똑같다.

그런데 여기다 어떤 작업을 하면 애플리케이션을 올려서 동작을하면 외부에서 접속이 된다.

 

- 배포라고 하는게 우리 서비스를 공개하는 거다. 

공개하면 사람들이 접속할 수 있어야 한다. 그런데 여기(aws의 서버들)는 이 서버는 공인ip를 갖고있는 서버다.

아무데서낟 다 접속이 가능하다. 우리가 접속한것처럼. 이렇게 외부에서 접속할 수 있게끔 여기다 배포하면 서비스할수있다.

 

 

 

 

- 도커를 깔아본다.

 

 

 

 

 

 

- 아래로 내린다.

 

 

 

- 첫번째 저장소 셋업을 붙여넣기 했다. 

 

 

 

 

 

- 두번째도 붙여넣기 한다. y입력한다.

 

 

- 컨테이너를 이용해서 배포한다면 이게 끝이다. 도커만 설치되어 있으면 된다.

 

 

 

 

 

 

 

 

- 버츄얼 박스를 키고 실행한다.

- 모바엑스텀에서 버츄얼박스의 우분투도 접속한다.

 

 

 

 

 

 

- 버츄얼 박스의 우분투는 개발환경. dev로 리네임

- 클라우드 서비스 aws에 있는 우분투는 배포환경. product로 리네임.

- 리네임은 꼭 해야하는 건 아님.

 

 

 

 

 

 

 

 

 

 

 

 

 

- aws의 우분투에 오라클을 설치해야 한다.

 

 

ㅁ docker run -d --name oracle11g -e ORACLE_PASSWORD=1234 -p 1521:1521 gvenzl/oracle-xe:11

- 디나이등 된다. 권한이 없어서.

 

ㅁ sudo usermod -aG docker ubuntu

- ubuntu라는 사용자를 docker 그룹에다가 포함시키는 명령이다. 

이걸하고나서 종료했따 다시접속한다.

 

ㅁ exit

 

 

 

docker run -d --name oracle11g -e ORACLE_PASSWORD=1234 -p 1521:1521 gvenzl/oracle-xe:11

 

 

 

- 인바운드 규칙편집에서

지난번에 80을 추가한 상태다.

여기다가 규칙추가. 오라클 ibs를 선택하면 1521이 자동적으로 선택된다.

 0.0.0.0을 선택한다. 이거의 의미는 어디서든지 다 접속이 가능하다. 

대신 cmd에서 ipconfigme로 나온 아이피를 0.0.0.0대신에 한다.

 

- 규칙추가. 유형에 오라클rds. 없으면 추가하면 된다. 그러면 포트범위가 1521로 자동으로 된다. 이게 오라클 포트죠.

여기다가 0.0.0.0을 하게되면 어디에서든지 다 들어올 수있다. 위치에 상관없이.

근데 0.0.0.0을 해놓고 규칙저장한다.

 

 

 

 

 

- 보안그룹눌러서 여기들어가고, 보안그룹 id 클릭한다.

그리고 인바운드 규칙편집

 

 

 

 

이렇게 저장한다.

 

 

 

 

 

 

 

 

 

 

- 그리고 sql developer 켠다. 여기서 접속해본다.

- 접속 새로만드리글 ㄹ하낟.

 

 

 

- 사용자 이름은 system, 비번은 1234.

- 로컬호스트 대신 자기 인스턴스의 퍼블릭ipv4 dns 주소를 복사해서 넣는다. 이거 대신 퍼블릭 ipv4주소해도되고. 이걸로한다 너무기니까.

- 저장하고 접속한다.

 

 

 

 

- 비번 입력해야 한다.

 

 

 

 

 

 

 

- create user admin identified by 12234;

- grant connect, resource to admin;

 

- admin이라는 user를 만들었다. 비밀번호는 1234다.

- 사용자 만들고 권한주는거까지 했다. 오라클은 겨기까지 하고 끝이다.

테이블 만들고 해주시면 되고. 

- 디비는 준비가 된거고.

 

 

 

 

 

○ docker inspect oracle11g

- 컨테이너 ip 확인한다.

- 이건 컨테이너의 주소다. 오라클이 동작하고있는 컨테이너으의주소다.

이주소가 어딜 들어가야하냐면 애프리켕시ㅕㄴ프로퍼티스의 디비연결부분 주소에 들어가야 한다.

 

- 컨테이너를 또 만들면 0.3, 또만들면 0.4가 된다.

 

 

 

 

 


 

 

ㅁ 이번엔 버츄얼박스의 우분투

 

 

 

 

○ cd stswebjpa

 

○ ls

○ cd src/main/resources/

○ nano application.properties

 

 

 

 

- 저게 버츄얼박스가 있는 우분투의 오라클? 주소다.

근데 저게 아니라 0.2가 되어야 하는거죠.

지금 우리가 aws에서 사용하고 잇는 오라클이 설치되어있는 컨테이너 주소를 적는거다. 0.2로 하고 저장하고 나온다.

 

- 보통 저 주소는 소스가 배포되는 환경은 다 다르니까 오라클 디비는 공인 ip가 있어야 한다.

 

 

 

 

 

 

 

 

ㅁ cd 

 

ㅁ cd stswebjpa

- 내용이바뀌었으니 빌드해줘야 한다.

 

ㅁ ls

 

ㅁ ./mvnw clean package

- 그런데 에러 발생.

- 지금 에러난 거는 db 주소를 바꿔서 컨테이너 안의 오라클 주소가 아니기 때문에 에러난거다.

이건 체크안하게금 설정을 해야한다.

 

- 빌드하면서 테스트를 한다. 웹 애플리케이션을 실행해보면ㅅ ㅓ정상적으로 되는지 테스트를 해보는데, 지금 디비가 버츄얼박으의 디빅 ㅏ아니라 aws에 설치한 디비르릈ㄹ거라 ip를 바꿨다. 그런데 디비가 없으니 에러가 나는거죠.

- 테스트를 건너 뛸게요.

 

 

 

 

 

 

 

 

○ ls

○ nano pom.xml

 

 

 

 

 

 

 

 

- <maven.test.skip>true</maven.test.skip>을 넣는다.

- ctrl + x, y, 엔터로 저장하고 나간다.

 

 

 

 

 

 

○ ./mvnw clean package

- 다시 빌드한다.

- 이러면 저 jar파일가지고 컨테이너 이미지를 만들어주면 된다.

 

 

 

 

 

 

ㅁ docker build -t gdlsw/memberbook:2.0 .

- 어제 1.0으로 했다. 2.0으로 해본다. 

- 현재 디렉토리에잇는 도커파일을 가지고 ~하는 명령어다.

- 이러면 이미지가 만들어졌다. 

도커 로그인하고 push 해보세요.

 

 

 

 

 

 

 

 

 docker login -u 사용자이름

- 비번은 9자리다. 123456789

 

 

 docker push gdlsw/memberbook:2.0

- 저 컨테이너 이미지만 있으면 stswebjpa를 실행할 수 있는거다.

 

 

 

 

 

 

 

- 브라우저 도커허브에서 확인해본다.

- hub.docker.com에서 상단의 Repositories를 클릭하면 이 화면이 뜬다. 

- push한 gdlsw/memberbook을 클릭해본다.

 

 

 

 

- 여기까지 했으면 aws의 우분투에 가서 run 해보세요.

 

 

 


 

 

ㅁ aws 우분투

 

 

 

 

○ docker run -d --name memberbook2 -p 88:80 gdlsw/memberbook:2.0

- 내 저장소에있는 이 memberbook:2.0 태그명으로된 이미지를 webapp1이라는 일므으로 컨테이너를 만들어라.

근데 만들때 포트포워딩을 할건데 외부에서 접속할때 포트번호는 88, 내부 컨테이너 포트번호는 80이다.

그리고 -d로 백ㄹ그라운드에서 동작시켜라. 

근데 이미지가 없죠. 글머 docker hub에서 다운받으면서 동작시킨다.

 

 

 

- -d를 안넣었다 이번엔.

- 80번 열어놨읜까 80번 하죠. 컨테이너안쪽은 8080이 동작하고 있습니다.

이미지이름은 자기아이디/멤버북:2.0

- 포트공개는 80번하고 그 건 컨테이너 안쪽의 8080과 연결할거다.

- 이 이미지는 로컬에 없기때문에 우리가 올려놓은 이미지를 다운받을 거에요.

 

- 근데 에러. 80번이 이미 동작중이다. 아마 아파치가 80번이다.

 

 

 

 

 

 

 

○ netstat -ntlp

- 뭑 ㅏ동작중인지본다.

 

○ sudo service nginx stop

- nginx 스탑하고 다시ㅏ 멤버북을 스타트한다.

 

 

○ docker start memberbook

 

○ docker ps

- 두개가 떠있으면 된다. 하나는 멤버북, 하나는 오라클.

 

 

 

 

 

http:그리고 4개 

- 이제 aws으 ㅣ공인 ip로 접속을 시도해본다. 4자리로.

 

- 이게 접속이 안되면 https가 아닌 http로 한다. 근데 나는 바로 됐다.

 

 

 

 

 

 

 

 

ㅁ AWS EC2(우분투)에 배포 과정

 

0. 전제조건

- DB는 생성된 상태(오라클 컨테이너에 생성했다)


1. 개발서버(VirtualBox의 ubuntu 또는 윈도우)
- 이건 꼭 VirtualBox를 의미하는건 아니다. 로컬을 의미하는거.
- 여기서 빌드를 한다. 메이븐이나 그래들로. (내용이 바뀌었으니 빌드 다시 해야 한다)
- 메이븐 빌드 : target/~~~~.jar 파일이 생성된다.

 

2. 그다음 Dockerfile을 이용해서 도커 이미지 생성

 

3. 도커이미지를 도커허브에 업로드(push)

 

4. 배포서버(AWS EC2)에서 컨테이너 생성

 

5. 서비스 접속

 

 

- 이 과정을 내가 매번 해줘야 하니 번거롭다. 이 과정을 자동화한다.

- 윈도우에서 인텔리제이나 이클립스로 작업을하고 빌드를 한다.

그럼 JAR파일이 있다.

그 JAR파일을 가지고 위의 과정을 하면 되는데, 이젠 그렇게 안하고 이 작업을 자동화한다.

 

- 단순하게 AWS안에다 EC2만들어서 배포한다 . 이렇게만 쓰면 AWS쓰는 의미가 없다.

그냥 서버 호스팅해서 서버 빌려서 그거 쓰면 된다.

근데 AWS는 오토스케일링 쓸 수 있고, 이중화되어 있어서 단순하게 서버 한 대 써서 배포한다는 의미는 아니다.

 

 

 

 

 

 

- AWS에서 RDS를 쳐보면 관리되는 관계형 데이터베이스 서비스다.

원래 오라클 설치하려면 서벅 ㅏ필요한데 여기서는 디비가 서비스다.

- 데이터베이스 생성하면 바로 생성이 된다. 우리가 서버를 관리할 필요가 없다.

어떤 데이터베이스를 쓸건지 선택만 해주면 됨. 대신 비싸다. 편하긴한데 비싸다.

 

 

 

- 클라우드 서비스는 이런 것들을 이용해서 애플리케이션을 빠르게 배포할 수 있는 환경을 갖추고 있다.

- 그런데 비용은 내가 물리적으로 로컬 서버 구축하고 쓰는것보다 더 많이 나올 수도 있다.

어떻게 쓸건지 선택을 해야 한다.

- 근데 내가 아무 인프라가 없는데 어떤 서비스를 하고싶다. 웹애플리케이션을 가지고.

그때 클라우드를 쓰면 다 할수있다. 코드만 있으면.

 

- 어차피 디비는 여러개 만들거 아니고 한개만들거죠. 애플리케이션은 여러개 만들어도.

- 디비는 AWS에 만들든 어따 만들든 접근이 가능하면 된다. 디비를 로컬에 만들면 근데 로컬은 바깥에서 못들어오니까 NGROK같은걸 쓰면 쓸 수 있다.

 

- HTTPS는 하려면 인증서가 필요하다.

 


 

 

ㅁ개발 서버(DEV)**와 **배포 서버(PROD)**를 나누는 이유는 역할이 다르기 때문입니다.

 

 

1. 개발 서버 (DEV)

위치: 로컬 PC나 VirtualBox의 우분투
목적: 개발과 테스트

  • 애플리케이션의 새로운 기능을 개발하고 테스트하기 위해 사용합니다.
  • 개발 과정에서 에러가 발생하거나 코드 수정이 잦습니다.
  • 안전하게 실험할 수 있는 환경이 필요합니다.
  • DB도 로컬 컨테이너나 개발용 DB를 사용합니다.

 

2. 배포 서버 (PROD)

위치: AWS EC2 우분투
목적: 실제 서비스 운영

  • 외부 사용자가 접속하는 공식 서비스 환경입니다.
  • 여기서는 안정성이 매우 중요합니다.
  • 이미 개발이 완료된 애플리케이션을 배포해서 운영합니다.
  • DB도 AWS 서버에 설치된 컨테이너운영용 DB와 연결합니다.

 

 

ㅁ 내가 준거 정리

개발 서버 (VirtualBox 우분투 / 로컬 PC)

목적: 개발테스트
역할: 애플리케이션을 개발하고 Docker 이미지로 빌드하여 배포 준비를 하는 단계

1. 빌드 과정

  • 메이븐 빌드:
    bash
    코드 복사
    ./mvnw clean package
    • 결과: target/프로젝트이름.jar 파일이 생성됨.

2. Docker 이미지 생성

  • Dockerfile을 이용해서 도커 이미지를 빌드함:
    bash
    코드 복사
    docker build -t 사용자이름/이미지이름:태그 .
    • 예시:
      bash
      코드 복사
      docker build -t gdlsw/memberbook:2.0 .
  • 이 과정에서 애플리케이션 실행 환경이 Docker 이미지로 패키징됨.

3. Docker Hub에 업로드

  • Docker Hub에 로그인:
    bash
    코드 복사
    docker login -u 사용자이름
  • Docker 이미지를 푸시:
    bash
    코드 복사
    docker push 사용자이름/이미지이름:태그
    • 예시:
      bash
      코드 복사
      docker push gdlsw/memberbook:2.0

배포 서버 (AWS EC2 우분투)

목적: 배포서비스 운영
역할: 개발 서버에서 준비된 Docker 이미지를 가져와 실행해 서비스 제공

1. 환경 준비

  • Docker 설치: AWS EC2에 Docker를 설치함.
  • 권한 설정 (docker 그룹에 유저 추가):
    bash
    코드 복사
    sudo usermod -aG docker ubuntu exit # 로그아웃 후 재접속

2. 오라클 DB 컨테이너 실행

  • 오라클 컨테이너를 실행해 DB 준비:
    bash
    코드 복사
    docker run -d --name oracle11g -e ORACLE_PASSWORD=1234 -p 1521:1521 gvenzl/oracle-xe:11
  • 인바운드 규칙 설정:
    • AWS 보안 그룹에서 1521 포트를 열어줌 (오라클 접근 가능).

3. 애플리케이션 배포

  • Docker Hub에서 이미지를 다운로드하고 컨테이너 실행:
    bash
    코드 복사
    docker run -d --name 컨테이너이름 -p 외부포트:내부포트 사용자이름/이미지이름:태그
    • 예시:
      bash
      코드 복사
      docker run -d --name memberbook -p 80:8080 gdlsw/memberbook:2.0

4. 포트 충돌 문제 해결

  • 기존 80 포트를 사용하는 nginx 서비스 중지:
    bash
    코드 복사
    sudo service nginx stop

5. 서비스 접속 확인

  • AWS EC2의 공인 IP로 접속:
    arduino
    코드 복사
    http://<EC2공인IP>:80

요약 흐름

  1. 개발 서버 (VirtualBox 우분투/로컬)
    • 애플리케이션 빌드 → Docker 이미지 생성 → Docker Hub에 업로드
  2. 배포 서버 (AWS EC2 우분투)
    • Docker 설치 → 오라클 DB 컨테이너 실행 → Docker 이미지를 가져와 실행 → 서비스 접속 확인

이렇게 개발 서버에서는 준비 작업(개발, 빌드, 이미지 생성)을 하고, 배포 서버에서는 준비된 이미지를 실행하여 서비스를 운영하는 구조입니다.

 


 

- 오라클 DBAWS EC2의 우분투 서버컨테이너로 설치되었고, 애플리케이션은 그 EC2 우분투 서버의 IP로 연결했습니다.

 

 


DB 연결 과정 요약

  1. AWS EC2 우분투 서버에 오라클 DB 컨테이너를 생성했습니다:
  2. bash
    코드 복사
    docker run -d --name oracle11g -e ORACLE_PASSWORD=1234 -p 1521:1521 gvenzl/oracle-xe:11
  3. AWS 보안 그룹에서 1521 포트를 열었습니다.
    • 0.0.0.0/0으로 설정하여 어디서든 접속 가능하게 했습니다.
  4. SQL Developer를 사용하여 오라클 DB에 접속할 때,
    • AWS EC2의 퍼블릭 IP 또는 퍼블릭 DNS 주소를 입력했습니다.
    • 사용자: system, 비밀번호: 1234
  5. 이후 애플리케이션의 application.properties 파일DB 연결 정보를 설정했습니다:
    • EC2의 IP 주소를 사용해 연결.

최종 확인

  • 오라클 DB는 AWS EC2 우분투 서버에서 실행 중입니다.
  • 애플리케이션은 EC2의 IP를 사용해 오라클 DB에 연결합니다.
  • 연결 설정이 완료되면 개발한 애플리케이션이 AWS EC2의 DB를 사용해 실행됩니다.

 


 

 

상황 설명

  1. 기존 개발 환경 (로컬 또는 VirtualBox)
    • 애플리케이션이 Docker 내부에서 실행되는 오라클 DB를 사용했음.
    • 172.17.0.7은 로컬 Docker 네트워크의 오라클 컨테이너 IP였음.
  2. AWS EC2 환경
    • 오라클 DB를 EC2의 우분투 서버에 컨테이너로 띄웠기 때문에,
    • 172.17.0.x와 같은 Docker 내부 IP는 여전히 컨테이너 안에서 할당됩니다.
  3. 문제점
    • 172.17.0.7은 로컬 Docker 네트워크에서의 주소이기 때문에,
    • EC2 서버 외부에서는 이 IP를 사용할 수 없습니다.
    • EC2의 퍼블릭 IP 또는 DNS 주소를 사용해야 외부에서 접속이 가능합니다.

정리하면

  • 172.17.0.7: Docker 네트워크에서 자동으로 할당된 컨테이너 내부 IP입니다.
  • 이 IP는 같은 Docker 호스트같은 네트워크에 있는 다른 컨테이너에서만 접근할 수 있습니다.
  • 외부에서 접속하려면 EC2의 퍼블릭 IP 또는 퍼블릭 DNS를 사용해야 합니다.

애플리케이션 설정 변경 예시

application.properties 파일의 DB 설정을 AWS 환경에 맞게 수정해야 합니다:

 
spring.datasource.url=jdbc:oracle:thin:@<EC2-퍼블릭IP>:1521:XE
spring.datasource.username=admin
spring.datasource.password=1234
 

이제 EC2에 배포된 애플리케이션이 오라클 DB 컨테이너에 정상적으로 연결될 것입니다.

 

 


 

 

배포서버라는게 그럼 DB서버인거야?

 

 

배포서버DB서버는 역할이 다릅니다. AWS EC2에 설치된 우분투 서버두 가지 역할을 동시에 하고 있을 뿐입니다. 정리해줄게요.


1. 배포 서버 (애플리케이션 서버)

  • 역할: 애플리케이션을 실행하고 사용자에게 서비스를 제공
  • 위치: AWS EC2에 Docker를 사용해 애플리케이션 컨테이너를 실행
  • 예시: docker run -d --name memberbook -p 80:8080 gdlsw/memberbook:2.0
  • 사용자 요청이 들어오면 이 애플리케이션이 처리합니다.

2. DB 서버 (데이터베이스 서버)

  • 역할: 애플리케이션에서 사용하는 데이터 저장 및 관리
  • 위치: 같은 AWS EC2 우분투 서버에 Oracle 컨테이너로 설치됨
  • 예시: docker run -d --name oracle11g -e ORACLE_PASSWORD=1234 -p 1521:1521 gvenzl/oracle-xe:11
  • DB 주소를 통해 애플리케이션이 연결해서 데이터를 사용합니다.

현재 상황

  • AWS EC2의 우분투 서버애플리케이션 서버DB 서버 역할을 동시에 하고 있습니다.
  • 즉, 한 대의 서버에서:
    1. 애플리케이션 컨테이너 실행
    2. 오라클 DB 컨테이너 실행

이렇게 구성한 이유

  1. 간편한 배포: 같은 서버에 애플리케이션과 DB를 올리면 설정이 간단합니다.
  2. 비용 절감: 서버를 여러 대 사용하는 대신 하나의 서버에서 두 가지 역할을 처리합니다.
  3. 개발 및 테스트 목적: 실험 환경이므로 애플리케이션과 DB를 같은 서버에 둬도 무리가 없습니다.

실제 운영 환경 (PROD)

실제 운영에서는 애플리케이션 서버DB 서버를 분리하는 것이 일반적입니다:

  1. 애플리케이션 서버: AWS EC2에서 애플리케이션을 실행
  2. DB 서버: RDS(Managed Database Service) 또는 다른 EC2 서버에서 데이터베이스 운영

결론적으로, 지금의 AWS EC2배포 서버DB 서버동시에 운영하는 상태입니다. 실험 및 개발 단계에서는 괜찮지만, 실제 서비스로 확장할 때는 분리하는 것이 좋습니다.

 

 


 

ㅁ 개발서버랑 배포서버를 나눴다.
- 개발서버는 버츄얼박스의 우분투고, 배포서버는 AWS EC2 우분투.

개발서버에서 
(1) ./mvnw clean package로 빌드해서 JAR파일 만듦
(2) docker build -t gdlsw/memberbook:2.0 .로 도커파일로 도커 이미지를 생성함.
(3) docker push gdlsw/memberbook:2.0 도커허브에 이미지를 push함.

배포서버에서
(1) 도커 설치
(2) 오라클 db 컨테이너 실행함
(3) aws 보안그룹에서 1521 포트 열어줌. 오라클 접근가능하게.
(4) 애플리케이션 배포함.
- 도커허브에서 이미지를 다운로드하고 컨테이너를 실행했음.
(5) 브라우저에서 서비스접속을 확인했음.

 

 

- 그래서 개발서버에서 aws의 오라클 컨테이너 ip를 넣은거고

- 배포서버는 애플리케이션 서버와 db서버 역할을 동시에 하고있다.

- 배포서버에서 오라클db컨테이너, 애플리케이션 컨테이너 실행중.

 

 

 

 

P.137 4번까지 한거임.

'배포 > AWS' 카테고리의 다른 글

5. 프로젝트 젠킨스로 배포 해보기  (1) 2024.12.11
4. 젠킨스로 배포  (1) 2024.12.11
3. CI/CD - Jenkins, GitHub, Eclipse  (0) 2024.12.10
1. aws 개념  (1) 2024.12.10