SSH Server 설치와 설정

Violet_Evgadn·2023년 4월 25일
0

CI&CD 자동화

목록 보기
12/28

우리는 이전에 Maven Project를 동작하고 있는 Local 컴퓨터의 Tomcat에 WAR 파일을 배포하여 웹 프로그램을 실행시켰다.

그런데 이때 귀찮은 점이 있었을 것이다. 무조건 Local 컴퓨터에서 Tomcat이 기동 되고 있어야 한다는 점!

이렇게 되면 Local 컴퓨터가 켜져 있고 Tomcat이 항상 동작되어야 하는데 만약 서비스를 24시간 제공하고 싶다면 Data Center가 필요해질 것이다.

하지만 MSA 및 CI/CD를 활용할 때는 Cloud를 활용함으로써 Data Center를 직접 운영하지 않고 끊임없는 서비스를 제공할 수 있다는 장점을 가진다.

따라서 우리는 Cloud를 통해 서버를 구성하고 동작하고 있는 Cloud 서버에 WAR 파일을 배포시킴으로써 24시간 서비스를 제공할 수 있을 것이다.

이를 위해 필요한 것은 SSH Server에 빌드한 결과물을 복사하여 저장하는 과정이다.

이 과정을 수행해보자.


SSH Server 생성

먼저 빌드할 결과물을 저장하고 실행시킬 SSH Server를 만들어야 한다.

SSH Server VM VirtualBox같은 VM Tool로 Virtual Server를 하나 생성해도 되고 AWS의 EC2 Server를 만들어도 되지만 우리는 Docker Container를 통해 SSH Server를 만들어보도록 하겠다.

1. Docker Image 다운

SSH Server의 역할을 할 수 있는 Container를 만드는 Image를 찾아야 한다.

사실 SSH Server라고 말하니 거창해보이지만, 그냥 VM Container로 만들 수 있는 Linux 가상화 서버처럼 Docker Container를 통해 Linux 서버 하나를 만드는 과정이다.

우리는 이 중 "edowon0623/docker:latest" Image를 활용하여 SSH Server를 만들 것이다.

이를 위해 아래와 같은 명령어를 입력하면 된다.

docker pull edowon0623/docker:latest

2. DooD 방식으로 Docker Container 생성

왜인지는 모르겠으나 Docker Desktop 위에서 --privileged Option을 활용해 DinD 방식으로 만들면 에러가 발생한다.

이전에 말한 DinD 방식의 위험성 때문에 막아놨을 수도 있을 것 같다.

이유가 무엇이든 DinD 방식이 막힌 사실은 바뀌지 않기 때문에 DooD 방식으로 Container를 생성하자.

Container 생성 명령어는 아래와 같다.

docker run -itd --name docker-server -p 10022:22 \
      -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
      -v /var/run/docker.sock:/var/run/docker.sock edowon0623/docker:latest /usr/sbin/init
  • -i : 표준 입출력을 활용
  • -t : tty를 할당
    • 위 2개 Parameter를 통해 Container 위에서 Bash와 동일한 명령어를 활용할 수 있다.
  • -d : Daemon으로 실행
    • Container를 일반 프로세스가 아닌 데몬 프로세스로 실행시킴으로써 명령어를 실행시킨 CMD가 꺼져도 프로세스는 유지된다
    • 백그라운드 쪽에서 프로그램이 실행된다고 생각하면 편하다.
  • -e : 환경 변수 설정.
    • Dockerfile의 ENV 설정이 덮어써짐
  • --tmpfs : tmpfs Directory를 Mount 시킴
  • -v : 이전에 Mount Option임을 설명했다. Host Container와 Socket과 cgroup을 Mount 시킴으로써 Host Container의 Socket을 활용하게 되며, DooD 방식임을 알 수 있다

우리는 이렇게 Docker Container를 만들면 "systemctl start docker" 명령어를 통해 Container를 활성화시키지 않아도 된다.

왜냐하면 DooD 방식이기 때문!

Docker Container가 생성되었다는 것은 Host는 이미 동작하고 있는 상황이기 때문에 Host의 Socket을 사용하는 Container는 동작 명령을 내리지 않아도 이미 동작중인 상황인 것이다.

Docker Container에서 우리가 생성한 docker-server Container가 동작하고 있음을 볼 수 있다.


SSH Server에 Build

1. 동작하고 있는 Docker-Server Container IP 주소 알아보기

hostname -i를 통해 현재 docker-server Container의 IP 주소를 알아볼 수 있다.

이 IP 주소를 알아야 하는 이유는 간단하다.

우리는 docker-server에서 빌드 과정을 수행할 것이다. 당연히 docker-server IP 주소를 알아야지만 Bulid 이전 IP 주소를 통해 SSH-Server에 접속하여 빌드를 수행할 수 있을 것이다.

2. Plugin Manger > publish Over 검색 & Publish Over SSH 설치

3. Jenkins 관리 > Configure System > Publish over SSH > SSH Servers 추가 선택

4. Name, Hostname, Username, Password, Port 입력

  • Name : SSH Server를 Jenkins 측에서 구분할 수 있기 위해 만들 이름
  • Username : SSH Server의 Username
  • Hostname : SSH Server의 IP Address
    • SSH Server 접속 명령 : ssh [Username]@[Hostname] -p [Port 번호]
      • 이 명령어에서 [Hostname]에 해당하는 부분이다.
  • Password : SSH Server에 접근하기 위한 Password
  • Port : 접속할 SSH Server의 Port Number
    • 우리는 docker-server Container 생성 시 -p 10022:22로 설정했으므로 10022 Port로 접속해야 Container 내부로 접속할 수 있다. 따라서 10022를 Port Number로 지정해준다.

여기에서 주의 깊게 봐야 할 것이 Hostname과 Port이다.

이 Hostname은 언제나 Jenkins 기준이기 때문에 Jenkins가 어디에서 실행되고 있는지에 따라 설정값이 달라질 수 있다.

필자는 Jenkins가 Windows에서 실행되고 있다. 따라서 root@localhost로도 Docker Server에 접근 가능하기 때문에 위 사진처럼 Hostname을 localhost로 지정했다.

하지만 Jenkins가 Docker Container에서 실행되고 있는 환경은 상황이 약간 다르다. Jenkins가 Docker Container에서 실행되고 있을 경우 localhost는 Jenknis Server의 IP Address를 나타내게 될 것이다. 즉, 우리가 원하는 root@[Docker Host IP Address]가 아닌 root@[Jenkins Container IP Address] 명령이 수행되는 것이다. 그리고 이 경우 Jenkins Server에서 Jenkins Server에 다시 접속하려는 행위밖에 되지 않으므로 우리가 원하는 작업과 거리가 멀어지게 된다.

이때 해결 방법은 2가지가 존재한다.

먼저 Hostname을 Windows, 즉 Docker Host IP Address로 지정해주는 것이다.

이 경우 Jenkins Server에서 Docker Host로 이동한 이후 SSH 명령을 수행하여 Docker Server에 접속할 것이므로 Port Number는 Docker Host(Windows)에서 접속하는 것처럼 10022로 지정해야 할 것이다.

두 번째 방법은 Jenkins Server에서 바로 Docker Server로 이동하는 것이다.

이는 Jenkins Server와 Docker Server가 같은 Docker Host(Windows)에서 실행되고 있는 Container로써 1개의 Bridge에 연결되어 있기 때문에 가능한 방법이다.

문제는 이 때 Port Number를 22로 지정해야 한다는 것이다.

우리가 10022:22로 지정한 것은 Container 외부, 즉 Docker Host 측에서 접속을 수행할 때 활용하는 Port Number이다. 우리는 10022 Port Number를 통해 Docker Server의 22 Port Number에 접속할 수 있게 된다.

하지만 Jenkins Server는 Docker Server와 같이 Host 내에 존재하고 있다.

즉, Jenkins Server에서 Docker Server로 갈 때는 Docker Host 외부와 연동할 수 있게 한 10022 Port Number가 아닌 Docker Server 내부에서 실제 서비스를 제공해주는 22 Port Number를 지정해줘야 한다.

5. Test Configuration 클릭 & Success 문구 보기

이후 Apply & 저장 버튼을 클릭해 설정을 저장한다.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글