코딩기록

AWS) ec2 우분투 서버에 도커, 도커컴포즈 설치, 포트포워딩, nohup(도커파일, 자바) 본문

백엔드

AWS) ec2 우분투 서버에 도커, 도커컴포즈 설치, 포트포워딩, nohup(도커파일, 자바)

뽀짝코딩 2022. 12. 28. 09:57
728x90

1. 깃배쉬 열기

2. ssh -i 아마존에서_받은_pem키_드레그앤드랍 ubuntu@서버주소

ssh -i /c/Users/userpc/Desktop/PINEd_be.pem ubuntu@15.164.104.157

 

3. 도커 & 도커컴포즈 설치하기

명령어를 통해 Docker을 설치해 보고 Docker Image를 이용한 서버를 구축

 

3-1. AWS EC2에 Docker 설치 

* 명령어 사용 전 sudo를 쓰기 귀찮다면 아래 명령어 입력

sudo su

1) 필요한 Util 설치

sudo apt update

sudo apt install apt-transport-https

sudo apt install ca-certificates

sudo apt install curl

sudo apt install software-properties-common

 

2) curl을 통해 docker 설치 & apt 기능 추가

# (필수아님!) 혹시라도 이전에 docker 를 설치했다면? 한번 지워주면 그만이다.
sudo apt remove docker docker-engine docker.io containerd runc

 

     오류      

apt-cache policy docker-ce

!! 위 코드는 ↓오류가 난다
'Package 'docker-ce' has no installation candidate'
docker-ce 패키지를 사용할 수 없습니다. 하지만 다른 패키지가 참조하고 있습니다.

 

3) Docker 설치

sudo apt-get install \
   ca-certificates \
   curl \
   gnupg \
   lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

 

4) Docker 다운로드 후 Docker Engine 설치

sudo apt update
sudo apt-get install docker-ce docker-ce-cli containerd.io

 

5) 확인

# 잘 실행되는지 확인한다.
# Active: active (running) 라는 문구가 보이면 된거다.
sudo systemctl status docker

참고-  Ubuntu 20.04에 도커, 도커 컴포즈 설치

https://miraekwak.tistory.com/76

 

 

3-2. AWS EC2에 Docker-compose 설치 

 Docker Compose 제거

# Docker Compose 제거
sudo rm /usr/local/bin/docker-compose

# 혹은 
 sudo apt-get remove docker-compose 

# Docker Compose 제거 확인
docker-compose -v

 

jq library 설치

  • github에서 최신 버젼 읽어오는 용도로 확실하게 타겟 잡아서 가져오려고
sudo apt install jq

 

docker-compose 최신 버전 설치

// check latest version
VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | jq .name -r)
DESTINATION=/usr/bin/docker-compose

// download latest version
sudo curl -L https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m) -o $DESTINATION

// chmod set
sudo chmod 755 $DESTINATION

// versionn check
docker-compose -v
Docker Compose version v2.14.2

 

혹은

sudo curl -L https://github.com/docker/compose/releases/download/$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | jq .name -r)/docker-compose-$(uname -s)-$(uname -m) -o /usr/bin/docker-compose

sudo chmod 755 /usr/bin/docker-compose

 

 

2023년 6월 말부터 Compose V1은 더이상 지원되지 않으며 모든 Docker Desktop 버전에서 제거됩니다. CLI 플러그인을 사용하거나 Docker Desktop에서 Docker Compose V2 사용 설정을 활성화하여 Compose V2  전환해야 합니다. 자세한 내용 은 Compose의 진화를 참조하세요.docker compose
https://docs.docker.com/compose/install/linux/

 

1. 최신버전 docker compose 업뎃

  • Ubuntu 및 Debian의 경우 다음을 실행합니다.
sudo apt-get update
sudo apt-get install docker-compose-plugin

2. 버전을 확인하여 Docker Compose가 올바르게 설치되었는지 확인합니다.

  • docker compose version

 

 


(참고 : 도커는 설치가 되면 자동으로 system service에 등록이 되기때문에 항상 실행 가능하다고 함)

4. Docker로 서버 구축하기

Docker Image, Container 개념을 모르시면 다음 포스팅을 참고 : https://kku-jun.tistory.com/6

 

Docker Image, Docker container, Docker file 개념

시작하는 말 회사를 다니며 시간날때마다 짬짬히 사이드 프로젝트를 진행하며 공부하고 있다. 이번 Stocking 프로젝트에서는 사용해보지 않았던 Docker를 이용해 AWS에 인프라를 구축

kku-jun.tistory.com

 

1) Docker hub 레퍼지토리 - Git 연동(Spring과 같은 서버 프로젝트)

   도커 허브에서 레퍼지토리 생성은 다음 링크를 통해 확인하자.

2) 해당 레퍼지토리에서 이미지 받기

docker pull {Docker hub id}/{Docker hub repository name}

 

3) 받은 이미지 확인하기

docker images

4) 이미지를 실행하기 전 AWS EC2에서 인바운드 규칙을 설정해주기

   AWS EC2 > 네트워크 및 보안 > 보안 그룹 > 보안 그룹 생성

보안 그룹 생성 화면

   보안 그릅 생성 클릭 후 아래 캡처 화면과 같이 인스턴스 오른쪽 마우스 클릭 > 생성한 보안 그룹으로 할당

보안 그룹 변경 화면

5) 받은 이미지를 실행하여 컨테이너 상태로 만들기

   이제 다시 돌아와 이미지를 컨테이너화 시켜주자.

docker run -d -p 8080:8080 {docker hub id}/{docker buh repository name}:latest

 

6) 컨테이너 상태 확인하기

docker ps

실행된 컨테이너 목록

이제 레퍼지토리에 연동한 Git 프로젝트가 잘 되어있다면 ip:port번호를 브라우저에 입력해보자.

7) 결과 : AWS EC2에서 서버로 구축한 API

API 결과

참고: https://kku-jun.tistory.com/10

 

 


5. sudo 없이 docker쓰기

docker 명령어는 많은 기능이 sudo를 붙여쓰는 경우가 많다.
매번 sudo docker를 쓰기 귀찮으면 단순히 docker라는 그룹에 현재 계정을
포함시키면 된다. 아래처럼 하자.

 

Group Docker

먼저, 아래의 명령어로 docker 그룹을 만들어 줘야합니다.

sudo groupadd docker

 

그 후, USER()docker.docker,USER 대신 다른 사용자명을 넣어도 됩니다.

sudo gpasswd -a $USER docker
sudo usermod -aG docker $USER

 

그 후, docker daemon을 재시작해줍니다.

sudo systemctl daemon-reload
sudo systemctl restart docker

마지막으로 터미널을 종료 한 후 (logout 한 후) 다시 접속하면 docker 명령어를 sudo 없이 사용할 수 있습니다.

 

##### 아래 2줄은 현재 계정으로 다시 로그인하기 위한 일종의 trick 이다. 
##### 만약 아래처럼 못하면 그냥 exit으로 아예 터미널 종료 후, 다시 로그인을 시도한다.
sudo su - # 루트 계정으로 접속
su - ubuntu # 다시 원래 계정으로 로그인

# 제대로 docker 라는 group에 들어갔는지 확인한다.
# "docker"라는 문구가 보이면 성공한 것이다.
groups ubuntu 

# sudo 없이 되는지 테스트해보자. 아래 명령어는 docker 명령어 테스트용으로 자주 쓴다.
docker run hello-world

 

요약 명령어 모음집

sudo systemctl start docker
sudo groupadd docker
sudo gpasswd -a $USER docker
sudo usermod -aG docker $USER
sudo systemctl daemon-reload
sudo systemctl restart docker

 


6. 포트포워딩 & nohup 적용하기

포트 번호 없애기 - 기본 개념

  • 지금은 8080 포트에서 웹 서비스가 실행되고 있습니다. 그래서 매번 :8080 이라고 뒤에 붙여줘야 하죠. 뒤에 붙는 포트 번호를 없애려면 어떻게 해야할까요?
  • http 요청에서는 80포트가 기본이기 때문에, 굳이 :80을 붙이지 않아도 자동으로 연결이 됩니다.
  • 포트 번호를 입력하지 않아도 자동으로 접속되기 위해, 우리는 80포트로 오는 요청을 8000 포트로 전달하게 하는 포트포워딩(port forwarding) 을 사용하겠습니다.

포트 번호 없애기 - 리눅스 자체 포트포워딩을 작동시키기

  • 띄워둔 터미널에서 새롭게 설정을 적용하기 전에 돌아가고 있던 서비스는 일단 끄고! (터미널에서 ctrl + c)
  • 포트포워딩 룰을 입력합니다.
    • sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

다시 서비스 시작 (자바)

java -jar JAR파일명.jar

 

웹 브라우저에서 접속하기

http://내AWS아이피/

 

nohup 적용하기  

SSH 접속을 끊어도 서버가 계속 돌게 하기

  • 현재 상황
  • Git bash 또는 맥의 터미널을 종료하면 (=즉, SSH 접속을 끊으면) 프로세스가 종료되면서, 서버가 돌아가지 않고 있습니다. 그러나 우리가 원격접속을 끊어도, 서버는 계속 동작해야겠죠?
  • 원격 접속을 종료하더라도 서버가 계속 돌아가게 하기
# 아래의 명령어로 실행하면 된다
nohup java -jar JAR파일명.jar &
  • 서버 종료하기 - 강제종료하는 방법
# 아래 명령어로 미리 pid 값(프로세스 번호)을 본다
ps -ef | grep java

# 아래 명령어로 특정 프로세스를 죽인다
kill -9 [pid값]
  • 다시 켜기
# 아래의 명령어로 실행하면 된다
nohup java -jar JAR파일명.jar &
  • SSH 접속을 종료한 뒤, 접속해봅니다!
    • 브라우저에서 접속하기
http://내AWS아이피/

 

 

!!
도커파일로 설정을 해서 도커 파일에 nohup을 입력한다.

[java.dockerfile]
FROM openjdk:17-jdk-slim
ARG JAR_File=./Pine.jar
COPY ${JAR_File} app.jar
ENTRYPOINT [ "nohup", "java", "-jar", "app.jar" ]

----------------------------------------------------
[docker-compose.yaml]
version: "2.6"
services:
  java:
    container_name: server_pined_test
    build:
      context: .
      dockerfile: ./dockerFile/java.dockerfile
    ports:
    - "8080:8080"

 

 

 

 

 

 

 

참고

*도커컴포즈

https://velog.io/@nohsangwoo/docker-compose-%EC%B5%9C%EC%8B%A0%EB%B2%84%EC%A0%BC-%EC%84%A4%EC%B9%98

*경로 /usr/local/bin/docker-compose 로 설치시 파일 위치 변경해야한다.

https://velog.io/@bbkyoo/%EB%8F%84%EC%BB%A4-%EC%BB%B4%ED%8F%AC%EC%A6%88-%EC%84%A4%EC%B9%98

*공식)도커 컴포즈 최신버전 확인

https://github.com/docker/compose/releases

 

 

반응형
Comments