본문 바로가기
sub_project

서버를 컨테이너로 띄우자

by Younji! 2020. 6. 12.

테스트 서버를 이미지로 빌드해 컨테이너로 띄웠던 기억을 되새겨 기록합니다.

SpringBoot 기반으로 서버를 띄워보려 합니다. 우선, SpringBoot 애플리케이션을 준비합니다.

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Dockerfile

빌드할 이미지를 위해 도커파일을 준비해봅니다. 몇몇 명령어만 설명합니다.

FROM openjdk:8-jre

LABEL maintainer="younji@tistory.com"

RUN cat /usr/share/zoneinfo/Asia/Seoul > /etc/localtime

ADD build/libs/server-0.0.1.war new-server.jar

ENV JVM_OPTION -Dfile.encoding="utf-8" -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Seoul -server -d64 -XX:+UseG1GC

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "${JVM_OPTION}","/new-server.war"]

EXPOSE 9998

ENV KEY VALUE

ENV <key> <value>
ENV <key>=<value> ...

 

환경변수를 주입해줍니다. 두 가지 형태로 입력할 수 있고 위와 같이 명시해줄 수 있습니다.

ENV JVM_OPTION -Dfile.encoding="utf-8" -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Seoul -server -d64 -XX:+UseG1GC

EXPOSE {{port}}

호스트에서 내부 컨테이너에 포트를 바인딩 시키기 위해 명시해줍니다. EXPOSE {port} 를 이미지에 생성했다고 호스트의 포트와 바인딩되는 것은 아닙니다. 정확하게는 문서화라고 보는 게 더 정확합니다. EXPOSE로 명시해준 포트를 실제로 퍼블리싱 하는 건 컨테이너를 실행할 때 -p, -P 를 사용하면 됩니다. 예제는 아래에서 다시 적습니다.

모든 준비는 끝났습니다. 이제 애플리케이션을 실행시켜 봅시다.

우선 Dockerfile이 위치한 곳에서 빌드를 하고, 참고로 -t 옵션은 생성될 이미지의 이름을 정하게 됩니다. 없을 경우 16진수로 이미지명이 저장됩니다.

docker build -t new-server .

빌드된 이미지를 실행시켜봅니다.

docker run -P --name newserver new-server

Publishing port

아까 전에 EXPOSE로 설정한 포트를 호스트에 연결하도록 하려면 -P (capital)와 -p를 사용할 수 있습니다. 물론 연결하지 않으면 외부로 포트가 연결되지 않겠죠. -p를 통해서 여러 형태로 호스트의 포트와 연결하도록 설정할 수 있습니다.

-p

-p {{host}}:{{port}}:{{container-port}}
-p {{port}}:{{container-port}}
-p {{container-port}} // 이 경우엔 랜덤으로 호스트에서 사용할 포트를 생성해줍니다.

-P

-P를 사용하면 EXPOSE로 명시했던 포트들을(1개 이상 설정할 수 있습니다.) 한 번에 호스트의 랜덤 포트와 매핑시켜줍니다.
EXPOSE 9998 8888 로 설정했다면 아래와 같이 랜덤 포트와 매핑시켜 웹 서버로 접근할 수 있습니다.

 

사실 이 내용을 포스팅한 계기는..

어떤 분이 호스트에서 접근하는 데 난 포트 퍼블리싱도 안했는데 접근이 돼

라는 말이 시작이었는데 희한하다 싶어서 구글링을 해보았다.

호스트, 컨테이너에 대한 개념을 한 번 다시 확인하고 https://m.blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=220278762795&proxyReferer=&proxyReferer=https:%2F%2Fwww.google.co.kr%2F

 

내가 잘못알았나 싶어 EXPOSE 와 포트 PUBLISH를 하지 않았을 경우에 혹은 EXPOSE, PUBLISH PORT 중 하나만 실행시켰을 때의 대한 https://stackoverflow.com/questions/22111060/what-is-the-difference-between-expose-and-publish-in-docker 것도 있었다.

 

결국엔 kuberntes의 pod 에서 다른 pod로 접근이 됐다는 거에 조금은 허탈했지만 마침 정리할 계기가 됐기 때문에 좋은 시간이었다.
https://stackoverflow.com/questions/51960707/kubernetes-pod-access-without-mentioning-container-port

'sub_project' 카테고리의 다른 글

Nest.js  (0) 2020.12.31
마이크로서비스 패턴 1장  (0) 2020.11.08
BitBucket Deployment 파이프라인을 만들어보자  (3) 2020.06.09
Elasticsearch Python API  (0) 2017.02.09
aws 웹서버 설정  (0) 2016.04.16

댓글