<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Cloud &amp;amp; Infra Tech Blog</title>
    <link>https://minseokk.tistory.com/</link>
    <description>시작이 반이다.</description>
    <language>ko</language>
    <pubDate>Fri, 22 May 2026 21:24:18 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>minseoki</managingEditor>
    <image>
      <title>Cloud &amp;amp; Infra Tech Blog</title>
      <url>https://tistory1.daumcdn.net/tistory/7176212/attach/d16de281a2a241f89493672fe351efc8</url>
      <link>https://minseokk.tistory.com</link>
    </image>
    <item>
      <title>AWS Summit SEOUL 2026 후기</title>
      <link>https://minseokk.tistory.com/18</link>
      <description>&lt;p&gt;&lt;img style=&quot;width: 399px; height: 529.3333333333334px; max-width: 100%; object-fit: contain; display: block; margin-left: auto; margin-right: auto;&quot; src=&quot;https://res.cloudinary.com/df4g2myjt/image/upload/v1779289031/blog/mig7pxliocnfelbxc1sv.heic&quot; alt=&quot;이미지&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS Summit SEOUL 2026을 다녀왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 관심을 가지고 있던 주제가 마이그레이션, 운영, 그리고 AWS의 생성형 AI 서비스인 Bedrock이었던 만큼, 이번 Summit에서는 해당 내용을 다루는 세션들을 위주로 듣고 오자는 목표를 가지고 참여했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 들었던 세션은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Amazon Bedrock Knowledge Base와 S3 Vectors로 스트리밍 AI 챗봇 구축하기&lt;/li&gt;
&lt;li&gt;VMware 종속을 넘어 자율로, 삼성SDS와 함께하는 AX 전략&lt;/li&gt;
&lt;li&gt;2천만 디바이스 요청을 처리하는 API Gateway 마이그레이션 생존기 (LG U+)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Amazon Bedrock Knowledge Base와 S3 Vectors로 스트리밍 AI 챗봇 구축하기..&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 인상 깊었던 세션은 첫 번째 세션이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 진행 중인 팀 프로젝트와도 방향성이 맞닿아 있었기 때문에 개인적으로 가장 많은 인사이트를 얻을 수 있었던 시간이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션에서는 Bedrock Knowledge Base와 S3 Vectors를 활용해 도서 기반 AI 챗봇을 구축한 사례를 소개했다.&lt;br /&gt;단순히 &amp;ldquo;챗봇을 만들었다&amp;rdquo; 수준의 발표가 아니라, 실제 서비스 관점에서 어떤 고민과 선택이 있었는지를 상세하게 다뤘다는 점이 특히 좋았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;width: 900px; max-width: 100%; object-fit: contain; display: block; margin-left: auto; margin-right: auto;&quot; src=&quot;https://res.cloudinary.com/df4g2myjt/image/upload/v1779289770/blog/yzyzz1ihnfoi1zxwadb2.heic&quot; alt=&quot;이미지&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;width: 900px; max-width: 100%; object-fit: contain; display: block; margin-left: auto; margin-right: auto;&quot; src=&quot;https://res.cloudinary.com/df4g2myjt/image/upload/v1779289507/blog/sevcu3tqjoprusin0huq.heic&quot; alt=&quot;이미지&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발표에서는 다음과 같은 내용들을 단계별로 설명했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소비자 요구사항 분석&lt;/li&gt;
&lt;li&gt;Bedrock Knowledge Base의 동작 방식&lt;/li&gt;
&lt;li&gt;문장 단위 분할(Chunking)&lt;/li&gt;
&lt;li&gt;벡터 변환(Embedding)&lt;/li&gt;
&lt;li&gt;기본 청킹(Default Chunking)에서 시맨틱 청킹(Semantic Chunking)으로 개선한 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 RAG(Retrieval-Augmented Generation)를 실제로 운영 환경에 적용하면서 발생했던 문제들과 그 해결 과정이 굉장히 인상 깊었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PoC 단계에서 비용을 고려한 모델 선택 전략, 토큰 사용량 최적화, Guardrail을 통한 제약 설정, 데이터 트래킹 등 단순 기능 구현을 넘어 &amp;ldquo;서비스 운영&amp;rdquo; 관점에서 어떤 요소들을 고려해야 하는지까지 다루며 발표가 진행되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무엇보다 좋았던 점은 발표자분이 직접 겪었던 트러블슈팅 경험들을 솔직하게 공유해주셨다는 부분이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bedrock을 처음 접하거나 실제 프로젝트에 적용해보는 과정에서 충분히 마주칠 수 있는 문제들이 많았고, 현재 진행 중인 프로젝트에서도 충분히 참고할 수 있을 만한 좋은 레퍼런스가 될 것 같다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VMware 종속을 넘어 자율로, 삼성SDS와 함께하는 AX 전략..&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 들었던 삼성SDS 세션 역시 굉장히 흥미로웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션에서는 Nutanix와 AWS 서비스를 활용해 VMware 환경에서 어떻게 전환(Migration)을 진행했는지 실제 사례 중심으로 설명했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 &amp;ldquo;클라우드로 옮긴다&amp;rdquo; 수준이 아니라,&lt;br /&gt;왜 전환을 결정했는지, 어떤 구조로 운영했는지, 운영 과정에서 어떤 문제를 겪었는지까지 실제 현업 관점에서 다뤘다는 점이 인상적이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2천만 디바이스 요청을 처리하는 API Gateway 마이그레이션 생존기 (LG U+)..&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;width: 900px; max-width: 100%; object-fit: contain; display: block; margin-left: auto; margin-right: auto;&quot; src=&quot;https://res.cloudinary.com/df4g2myjt/image/upload/v1779289696/blog/e2anufe9xt7qe7zyi9jd.heic&quot; alt=&quot;이미지&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;width: 900px; max-width: 100%; object-fit: contain; display: block; margin-left: auto; margin-right: auto;&quot; src=&quot;https://res.cloudinary.com/df4g2myjt/image/upload/v1779289723/blog/be4endl5fwzk836pmva6.heic&quot; alt=&quot;이미지&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 들었던 LG U+ 세션도 굉장히 재미있게 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대규모 트래픽 환경에서 API Gateway를 어떻게 마이그레이션했고, 실제 운영 과정에서 어떤 문제를 해결했는지를 중심으로 발표가 진행되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 기억에 남았던 부분은 다양한 모델 테스트를 통해 최적의 RAG 패턴을 구축해 나가는 과정이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 성능만 보는 것이 아니라 비용 효율성과 운영 안정성까지 고려하며 최적의 구조를 찾아가는 과정이 인상 깊었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 &amp;ldquo;최저 비용으로 운영 혁신을 달성한다&amp;rdquo;는 관점에서 접근한 내용들이 실제 서비스 운영을 고민하는 입장에서 굉장히 현실적으로 다가왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 AWS Summit SEOUL 2026은 단순히 새로운 서비스를 소개하는 행사가 아니라,&lt;br /&gt;실제 기업들이 어떤 방식으로 AWS 서비스를 운영 환경에 적용하고 있는지 생생하게 들을 수 있었던 자리였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 최근 관심을 가지고 공부하고 있던 분야인:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마이그레이션&lt;/li&gt;
&lt;li&gt;운영 자동화&lt;/li&gt;
&lt;li&gt;Bedrock&lt;/li&gt;
&lt;li&gt;RAG&lt;/li&gt;
&lt;li&gt;생성형 AI 서비스 아키텍처&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등과 관련된 실제 사례들을 직접 들을 수 있어서 개인적으로 굉장히 의미 있는 시간이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술 자체도 중요하지만, 결국 실제 서비스에서는 비용, 운영 안정성, 장애 대응, 트래픽, 데이터 관리까지 모두 함께 고려해야 한다는 점을 다시 한번 느낄 수 있었던 경험이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 진행 중인 프로젝트에서도 이번 Summit에서 들었던 내용들을 많이 참고하게 될 것 같다.&lt;/p&gt;</description>
      <category>Infra/AWS</category>
      <author>minseoki</author>
      <guid isPermaLink="true">https://minseokk.tistory.com/18</guid>
      <comments>https://minseokk.tistory.com/18#entry18comment</comments>
      <pubDate>Thu, 21 May 2026 00:18:19 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] Pod, 리소스, Ingress 정리</title>
      <link>https://minseokk.tistory.com/17</link>
      <description>&lt;h2&gt;Pod란?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;한 개 이상의 컨테이너로 구성된 쿠버네티스의 기본 단위&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;같은 Pod면 IP가 같다&lt;/li&gt;
&lt;li&gt;같은 Pod 내 컨테이너들은 &lt;strong&gt;포트&lt;/strong&gt;로 구분한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pod도 결국 컨테이너로 구성되어 있으며, 이 컨테이너를 실행하기 위해 docker, containerd, CRI-O 같은 &lt;strong&gt;CRI(컨테이너 런타임)&lt;/strong&gt;가 필요하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCJ1vd/dJMcaf0O4XH/Wubuu4Sz25xK9HB30pjDTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCJ1vd/dJMcaf0O4XH/Wubuu4Sz25xK9HB30pjDTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCJ1vd/dJMcaf0O4XH/Wubuu4Sz25xK9HB30pjDTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCJ1vd%2FdJMcaf0O4XH%2FWubuu4Sz25xK9HB30pjDTk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/72bso/dJMcabxmjVC/kDqMgVeFaT5qAlSKcXepm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/72bso/dJMcabxmjVC/kDqMgVeFaT5qAlSKcXepm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/72bso/dJMcabxmjVC/kDqMgVeFaT5qAlSKcXepm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F72bso%2FdJMcabxmjVC%2FkDqMgVeFaT5qAlSKcXepm1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;1. kube-apiserver&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;내/외부의 모든 요청을 주고받는 서버. contoller나 scheduler,proxy의 주시대상.&lt;/li&gt;
&lt;li&gt;호텔지배인.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. kube-scheduler&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;생성될 리소스들을 어떤 노드에 &amp;#39;배치&amp;#39;할지 결정(스케쥴링)&lt;/li&gt;
&lt;li&gt;호텔 로비 직원&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. kube-controller&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;다양한 리소스에 대한 여러가지 컨트롤러들이 존재한다.&lt;/li&gt;
&lt;li&gt;원하는 상태(Desired state)에 현재 상태(current state)가 수렴하도록 지속적으로 모니터링. 문제가 생기면 고치거나 리소스를 재생성.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ex) 하우스키퍼&lt;/p&gt;
&lt;h3&gt;4. etcd&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;클러스터 및 모든 리소스에 대한 정보를 key:value 형태로 저장하는 일종의 데이터베이스.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ex) 장부&lt;/p&gt;
&lt;br&gt;

&lt;h2&gt;모든 노드에 존재하는 컴포넌트&lt;/h2&gt;
&lt;h3&gt;1. kubelet&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;노드 관리자. 실질적으로 각 노드에 존재하는 리소스 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. kube-proxy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;노드 안과 밖을 넘나드는 수직트래픽을 관리.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;매니페스트 (yml 파일)&lt;/h2&gt;
&lt;p&gt;매니페스트란 &lt;strong&gt;내가 원하는 상태를 적어둔 명세서&lt;/strong&gt;다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZcTPn/dJMcaipKcXn/TSKvaPdmtTl37MLsMKS0rK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZcTPn/dJMcaipKcXn/TSKvaPdmtTl37MLsMKS0rK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZcTPn/dJMcaipKcXn/TSKvaPdmtTl37MLsMKS0rK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZcTPn%2FdJMcaipKcXn%2FTSKvaPdmtTl37MLsMKS0rK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vi test-pod.yml&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
  - image: public.ecr.aws/docker/library/httpd:latest
    name: test-con&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f test-pod.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;kubectl apply -f&lt;/code&gt;는 &lt;code&gt;docker compose up&lt;/code&gt;, &lt;code&gt;docker stack deploy&lt;/code&gt;와 비슷하다.&lt;br&gt;내가 원하는 상태(Desired State)가 미리 정의된 매니페스트 파일을 구성해놓고 apply해서 반영한다. 매니페스트 수정 후 다시 apply하면 바로 변경사항을 반영시킬 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl delete -f test-pod.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;앞으로는 명령어로 직접 리소스를 생성하거나 지우지 말고 매니페스트 파일을 &lt;code&gt;-f&lt;/code&gt; 옵션을 통해 apply하거나 delete하도록 하자.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;label - 중요&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vi labels.yml&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;apiVersion: v1
kind: Pod
metadata:
  name: test-label-pod
  labels:
    app: my-web
spec:
  containers:
  - image: public.ecr.aws/docker/library/httpd:alpine
    name: test-label-con&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;label은 여러 개를 쓸 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f labels.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;생성.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl describe pod test-label-pod&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;조회.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfxGR0/dJMcaf0O5ak/b4687G8PKeZKrHL2MlkJEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfxGR0/dJMcaf0O5ak/b4687G8PKeZKrHL2MlkJEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfxGR0/dJMcaf0O5ak/b4687G8PKeZKrHL2MlkJEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfxGR0%2FdJMcaf0O5ak%2Fb4687G8PKeZKrHL2MlkJEk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;label은 &lt;strong&gt;리소스를 컨트롤(원하는 상태, 현재 상태)하고 찾아가기 위한 용도&lt;/strong&gt;다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;쿠버네티스의 다양한 리소스들&lt;/h2&gt;
&lt;h3&gt;1. pod&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;한 개 이상의 컨테이너로 구성된 쿠버네티스의 기본 배포 단위.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. replicaset&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pod의 복제본 수를 유지해주는 리소스. &lt;/li&gt;
&lt;li&gt;지정한 수만큼 Pod가 항상 실행되도록 보장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. Deployment&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ReplicaSet을 관리하며 롤링 업데이트, 롤백 등을 지원하는 리소스. &lt;/li&gt;
&lt;li&gt;실무에서 가장 많이 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. namespace&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;클러스터 내에서 리소스를 논리적으로 분리하는 단위. &lt;/li&gt;
&lt;li&gt;팀이나 프로젝트별로 격리된 환경을 만들 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. Service (너무 중요!)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDMjVD/dJMcabc2PkR/fWubngw3deWkFep7nNF1pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDMjVD/dJMcabc2PkR/fWubngw3deWkFep7nNF1pK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDMjVD/dJMcabc2PkR/fWubngw3deWkFep7nNF1pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDMjVD%2FdJMcabc2PkR%2FfWubngw3deWkFep7nNF1pK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;작은 로드밸런서라고도 할 수 있다.&lt;/li&gt;
&lt;li&gt;Pod에 접근하기 위한 고정된 엔드포인트를 제공하는 리소스이다. &lt;/li&gt;
&lt;li&gt;Pod는 재생성될 때마다 IP가 바뀌기 때문에 Service를 통해 안정적으로 접근한다.&lt;/li&gt;
&lt;li&gt;서비스라는 리소스를 생성 시 하나의 접속지점이 생성된다.&lt;br&gt;이 서비스를 통해 모든 노드에 존재하는 pod에 트래픽을 인가할 수 있다.&lt;br&gt;인가하는 기준은 labels 를 통해 해당 pod를 특정하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;서비스는 다양한 종류(type)이 존재한다.&lt;/p&gt;
&lt;br&gt;

&lt;h4&gt;5-1. ClusterIP 타입 (svc의 default 타입)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;클러스터 내부에서만 유효한 IP&lt;/li&gt;
&lt;li&gt;내부 테스트 용도, 외부로 배포를 안하는 경우. 내부에 존재하는 서비스들끼리만 통신할 때.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vi dep.yml&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-web
  template:
    metadata:
      labels:
        app: my-web
    spec:
      containers:
      - image: public.ecr.aws/docker/library/httpd:alpine
        name: my-web-con&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f dep.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;svc를 연결할 deployment 생성.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vi dep-svc.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;서비스 매니페스트 정의.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;apiVersion: v1
kind: Service
metadata:
  name: svc-myweb
spec:
  selector:
    app: my-web
  ports:
  - port: 80
    targetPort: 80&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f dep-svc.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;svc 생성.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl describe svc svc-myweb&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;자세한 정보 확인.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dc5P7c/dJMcaipKdjw/3F5EKdbfAx3kYh7PNrvJw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dc5P7c/dJMcaipKdjw/3F5EKdbfAx3kYh7PNrvJw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dc5P7c/dJMcaipKdjw/3F5EKdbfAx3kYh7PNrvJw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdc5P7c%2FdJMcaipKdjw%2F3F5EKdbfAx3kYh7PNrvJw0%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Endpoint에 뜨는 pod들은 &lt;strong&gt;건강한 pod만&lt;/strong&gt; 뜬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HpgRd/dJMb99M34Rk/j0VMykpBQgODzxTdLSRBb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HpgRd/dJMb99M34Rk/j0VMykpBQgODzxTdLSRBb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HpgRd/dJMb99M34Rk/j0VMykpBQgODzxTdLSRBb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHpgRd%2FdJMb99M34Rk%2Fj0VMykpBQgODzxTdLSRBb0%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;5-2. NodePort 타입&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;노드의 포트&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;서비스를 제공받는 사용자 입장에서 내부로 진입하여 pod에 접근하려면 노드 포트로 진입해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir svc
cd svc
vi svc-nodeport.yml&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;apiVersion: v1
kind: Service
metadata:
  name: svc-dep
spec:
  selector:
    app: mydep
  type: NodePort
  ports:
  - nodePort: 30001
    port: 80
    targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydep
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mydep
  template:
    metadata:
      labels:
        app: mydep
    spec:
      containers:
      - image: public.ecr.aws/docker/library/httpd:alpine
        name: dep-con&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f svc-nodeport.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VqXvu/dJMcab5dib0/X9kxaw5knT9qPxqMrSaKEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VqXvu/dJMcab5dib0/X9kxaw5knT9qPxqMrSaKEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VqXvu/dJMcab5dib0/X9kxaw5knT9qPxqMrSaKEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVqXvu%2FdJMcab5dib0%2FX9kxaw5knT9qPxqMrSaKEK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boqIC8/dJMcagZJiZQ/ZrDtklUlyZDgiKIQwe4BBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boqIC8/dJMcagZJiZQ/ZrDtklUlyZDgiKIQwe4BBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boqIC8/dJMcagZJiZQ/ZrDtklUlyZDgiKIQwe4BBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboqIC8%2FdJMcagZJiZQ%2FZrDtklUlyZDgiKIQwe4BBk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tFlPc/dJMcacJQ3tX/qFnHQvQGknIIXtmjkvvj5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tFlPc/dJMcacJQ3tX/qFnHQvQGknIIXtmjkvvj5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tFlPc/dJMcacJQ3tX/qFnHQvQGknIIXtmjkvvj5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtFlPc%2FdJMcacJQ3tX%2FqFnHQvQGknIIXtmjkvvj5K%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl describe svc svc-dep&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3개의 포트(NodePort, Port, TargetPort)가 각각 어떤 대상인지 구분할 수 있어야 한다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Port - 서비스 포트&lt;/li&gt;
&lt;li&gt;TargetPort - pod&lt;/li&gt;
&lt;li&gt;NodePort - Node&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;외부에서 노드로 통신만 된다면 노드 포트를 통해 pod로 접속 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWJhAn/dJMcabc2PKf/Ke5ilCI3qurRTKYRSodV9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWJhAn/dJMcabc2PKf/Ke5ilCI3qurRTKYRSodV9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWJhAn/dJMcabc2PKf/Ke5ilCI3qurRTKYRSodV9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWJhAn%2FdJMcabc2PKf%2FKe5ilCI3qurRTKYRSodV9K%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;strong&gt;어떤 노드로 들어가는지는 중요하지 않고, NodePort로 접근하면 동일한 공간(오버레이 네트워크가 구성된 pod-network)으로 들어간다는 사실을 인지하자.&lt;/strong&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;pod가 어떤 노드에 존재하는지는 신경 쓸 필요도 없고 중요하지도 않다.&lt;br&gt;pod가 worker1에 띄워져 있어도 worker2의 노드 포트를 통해 접근 가능하다.&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;5-3. LoadBalancer 타입&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqGh4u/dJMcahRSsdi/pKQQTAR32JkVuE5Mkhodo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqGh4u/dJMcahRSsdi/pKQQTAR32JkVuE5Mkhodo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqGh4u/dJMcahRSsdi/pKQQTAR32JkVuE5Mkhodo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqGh4u%2FdJMcahRSsdi%2FpKQQTAR32JkVuE5Mkhodo1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;클러스터 관리자의 도움이 필요한 서비스 타입.&lt;/p&gt;
&lt;p&gt;쿠버네티스 외부 네트워크 대역의 IP를 자동으로 할당하고 관리해 주는 사설 로드밸런서 관리자가 &lt;strong&gt;MetalLB&lt;/strong&gt;다.&lt;/p&gt;
&lt;p&gt;EKS 같은 쿠버네티스 클러스터의 경우 클라우드 서비스 제공자(AWS)가 LB를 제공해줄 수 있지만, 온프레미스에 구성한 클러스터는 그렇지 않다. 따라서 svc를 LoadBalancer 타입으로 만들었을 때 누군가는 LB를 생성하면서 노드 대역대의 IP를 할당해줘야 한다. 그 기능을 활성화하기 위해 &lt;strong&gt;MetalLB&lt;/strong&gt;가 필요하다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vi config-metal.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;LB가 생성됐을 때 뿌려줄 IP 범위 설정.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 211.183.3.200-211.183.3.240  # 안겹치게 수정. LB가 부여받을 IP 범위
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f config-metal.yml
vi lb-tom.yml&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;apiVersion: v1
kind: Service
metadata:
  name: svc-tom
spec:
  selector:
    app: tom
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dep-tom
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tom
  template:
    metadata:
      labels:
        app: tom
    spec:
      containers:
      - image: public.ecr.aws/docker/library/tomcat:10.1.40-jre11
        name: tom-con&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;svc의 타입으로 LoadBalancer 타입을 지정해준다. nodePort는 삭제한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f lb-tom.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8oWS9/dJMcafNmbxr/kM26RxOaka5BpOaYnwx4MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8oWS9/dJMcafNmbxr/kM26RxOaka5BpOaYnwx4MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8oWS9/dJMcafNmbxr/kM26RxOaka5BpOaYnwx4MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8oWS9%2FdJMcafNmbxr%2FkM26RxOaka5BpOaYnwx4MK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;생성된 LB는 svc의 포트를 따라간다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Ingress (제일 중요!)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;path 기반 라우팅&lt;/strong&gt; (&lt;code&gt;/board&lt;/code&gt;로 가면 board 앱으로, &lt;code&gt;/login&lt;/code&gt;으로 가면 login 앱으로)&lt;/li&gt;
&lt;li&gt;일반적인 svc는 path 기반 라우팅이 불가능하다. (LoadBalancer, NodePort, ClusterIP)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gbuon/dJMcabD9so1/7do6pIvlg7lFbshTJeNp6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gbuon/dJMcabD9so1/7do6pIvlg7lFbshTJeNp6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gbuon/dJMcabD9so1/7do6pIvlg7lFbshTJeNp6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGbuon%2FdJMcabD9so1%2F7do6pIvlg7lFbshTJeNp6k%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;서비스는 한 종류의 라벨만 품을 수 있기 때문에 이런 한계가 발생한다. 합칠 수 없다 = 같은 주소가 될 수 없다.&lt;/p&gt;
&lt;p&gt;여러 개의 컨테이너에 각 기능들을 구현하면 path로 라우팅이 가능해야 한다. 일반적인 svc는 path 기반 라우팅이 불가능하기 때문에 &lt;strong&gt;Ingress&lt;/strong&gt;라는 리소스가 필요하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5DUfk/dJMcagFutdr/QwkvkTtmHIkDF3rkoe8Z9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5DUfk/dJMcagFutdr/QwkvkTtmHIkDF3rkoe8Z9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5DUfk/dJMcagFutdr/QwkvkTtmHIkDF3rkoe8Z9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5DUfk%2FdJMcagFutdr%2FQwkvkTtmHIkDF3rkoe8Z9K%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Ingress를 구성하면 path 기반 라우팅이 가능하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;ex) &lt;code&gt;www.naver.com/board&lt;/code&gt; 로 오면 svc-board라는 svc로 보내줘.&lt;br&gt;ex) &lt;code&gt;www.naver.com/login&lt;/code&gt; 으로 오면 svc-login이라는 svc로 보내줘.&lt;br&gt;→ 하나의 접속지점(&lt;code&gt;www.naver.com&lt;/code&gt;)을 통해 여러 개의 svc를 구성할 수 있다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Ingress를 구성하기 위해서는 &lt;strong&gt;Ingress Controller&lt;/strong&gt;가 필요하다.&lt;br&gt;(AWS EKS에서는 Ingress Controller를 LoadBalancer Controller라고 부른다.)&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Ingress Controller 설치&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vi deploy.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;필요한 부분 수정.&lt;br&gt;(type 을 NodePort에서 LoadBalancer로 수정한다.)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f deploy.yaml
kubectl get svc -n ingress-nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgjsDh/dJMcafGzaP4/woHe4feCx6wHCKnny0q0q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgjsDh/dJMcafGzaP4/woHe4feCx6wHCKnny0q0q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgjsDh/dJMcafGzaP4/woHe4feCx6wHCKnny0q0q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgjsDh%2FdJMcafGzaP4%2FwoHe4feCx6wHCKnny0q0q1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Ingress 매니페스트 작성&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cp ../svc/ip.yml .
vi ip.yml&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;apiVersion: v1
kind: Service
metadata:
  name: svc-ipnginx
spec:
  selector:
    app: myipnginx
  ports:
  - port: 80
    targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ip-dep
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myipnginx
  template:
    metadata:
      labels:
        app: myipnginx
    spec:
      containers:
      - image: public.ecr.aws/docker/library/httpd:alpine
        name: ip-con&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f ip.yml
kubectl describe svc svc-ipnginx&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;서비스가 정상인지 확인.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vi ing-ip.yml&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ing-ip
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: &amp;quot;nginx&amp;quot;
  rules:
    - host: rapa.com
      http:
        paths:
        - path: /httpd
          pathType: Prefix
          backend:
            service:
              name: svc-ipnginx
              port:
                number: 80&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;annotation&lt;/code&gt; : 추가적인 정보. labels와 비슷하지만 주로 부가적인 기능 명시.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ingressClassName&lt;/code&gt; : ingress-controller의 종류 중에 nginx 방식을 사용.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rewrite-target: /&lt;/code&gt; → 비록 &lt;code&gt;/httpd&lt;/code&gt;라는 경로로 들어왔더라도 실제 pod에서는 &lt;code&gt;/&lt;/code&gt;라는 경로로 바꿔주는 기능.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;host&lt;/code&gt; : 영문주소. IP는 안됨. DNS 기능이 필요하다. 인증서가 있다면 https 통신도 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;path&lt;/code&gt; : 한 종류의 앱. &lt;code&gt;pathType: Prefix&lt;/code&gt; → &lt;code&gt;/httpd&lt;/code&gt;로 접근하는 애들 전부.&lt;/li&gt;
&lt;li&gt;서비스의 이름을 마치 주소처럼 사용하고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f ing-ip.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZYRQS/dJMb99TRjP6/CXH9yKyUajljtnjtad01fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZYRQS/dJMb99TRjP6/CXH9yKyUajljtnjtad01fK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZYRQS/dJMb99TRjP6/CXH9yKyUajljtnjtad01fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZYRQS%2FdJMb99TRjP6%2FCXH9yKyUajljtnjtad01fK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dREGIU/dJMcajvozpw/4vBy3CxXVQkoktFbk4MKn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dREGIU/dJMcajvozpw/4vBy3CxXVQkoktFbk4MKn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dREGIU/dJMcajvozpw/4vBy3CxXVQkoktFbk4MKn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdREGIU%2FdJMcajvozpw%2F4vBy3CxXVQkoktFbk4MKn1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;ingress를 describe 했을 때 endpoint들(pod들)이 잘 떠있는 것만 봐도 ingress-svc-pod가 잘 연결되어 있는 걸 어느정도 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;원래는 DNS를 통해서 &lt;code&gt;rapa.com&lt;/code&gt;에 해당하는 IP를 매핑시켜줘야 하지만, 미니 DNS인 &lt;code&gt;/etc/hosts&lt;/code&gt; 파일을 사용하자.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vi /etc/hosts&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9skxh/dJMcafNmbIz/2gYobCUDTrKtKWc259qtiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9skxh/dJMcafNmbIz/2gYobCUDTrKtKWc259qtiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9skxh/dJMcafNmbIz/2gYobCUDTrKtKWc259qtiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9skxh%2FdJMcafNmbIz%2F2gYobCUDTrKtKWc259qtiK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Ingress 트래픽 흐름&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;쿠버네티스에서 외부 사용자가 도메인 이름(rapa.com)을 치고 들어와서 실제 앱(pod)까지 도달하는 ingress 트래픽 흐름.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;code&gt;rapa.com&lt;/code&gt; → ingress-controller의 svc External-IP(DNS) → ingress(path 기반 라우팅) → svc → pod&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;</description>
      <category>Infra/Kubernetes</category>
      <author>minseoki</author>
      <guid isPermaLink="true">https://minseokk.tistory.com/17</guid>
      <comments>https://minseokk.tistory.com/17#entry17comment</comments>
      <pubDate>Sun, 10 May 2026 18:03:00 +0900</pubDate>
    </item>
    <item>
      <title>Docker Swarm 에 대해서...</title>
      <link>https://minseokk.tistory.com/16</link>
      <description>&lt;h1&gt;[Docker] Docker Swarm 정리&lt;/h1&gt;
&lt;p&gt;Docker를 사용하다 보면 단일 서버만으로는 한계가 생긴다. 트래픽이 몰리거나 서버가 죽었을 때 대응이 안 되기 때문이다. 이런 문제를 해결하기 위해 나온 게 바로 &lt;strong&gt;Docker Swarm&lt;/strong&gt;이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;&lt;strong&gt;Docker vs Docker Compose vs Docker Swarm&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4fjQ1/dJMcaja0X8L/N5saBx8omawJtJEutvdFSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4fjQ1/dJMcaja0X8L/N5saBx8omawJtJEutvdFSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4fjQ1/dJMcaja0X8L/N5saBx8omawJtJEutvdFSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4fjQ1%2FdJMcaja0X8L%2FN5saBx8omawJtJEutvdFSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1420&quot; height=&quot;744&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt; — 단일 호스트, 단일 컨테이너&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt; — 단일 호스트, 여러 종류의 컨테이너&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker Swarm&lt;/strong&gt; — 다수의 호스트(manager + workers)에 여러 종류의 컨테이너&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여러 개의 호스트 묶음을 &lt;strong&gt;&amp;quot;클러스터&amp;quot;&lt;/strong&gt; 라고 한다.&lt;br&gt;docker swarm은 도커에서 만든 &lt;strong&gt;컨테이너 오케스트레이션 툴&lt;/strong&gt;이다.&lt;/p&gt;
&lt;br&gt;

&lt;h2&gt;&lt;strong&gt;오케스트레이션이란?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;오케스트레이션은 다수의 호스트로 구성된 클러스터에서 다수의 컨테이너를 관리하는 기술이다. (스케일링, 헬스체크, 로드밸런서(트래픽제어))&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;혼자서 악기 하나를 연주하는 건 쉽지만, 수십 명의 연주자가 합주를 하려면 지휘자가 필요하다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;docker swarm&lt;/strong&gt;은 그 지휘 역할을 하는 것이다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;클러스터링&lt;/strong&gt; : 여러 대의 물리 서버를 하나의 가상 리소스로 통합한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;스케일링&lt;/strong&gt; : 명령 한 줄로 컨테이너 개수를 수십 개로 늘리거나 줄인다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;상태 관리(Self-healing)&lt;/strong&gt; : 어떤 서버가 죽어서 컨테이너가 꺼지면 살아있는 다른 서버에 자동으로 그 컨테이너를 다시 살려낸다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;로드밸런싱(트래픽제어)&lt;/strong&gt; : 들어오는 요청을 여러 서버에 떠 있는 컨테이너들에게 골고루 분산한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;

&lt;h2&gt;&lt;strong&gt;docker swarm 클러스터 구성&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;실습에서 사용한 클러스터 구성은 아래와 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;manager : &lt;code&gt;211.183.3.100&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;worker1 : &lt;code&gt;211.183.3.110&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;worker2 : &lt;code&gt;211.183.3.120&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;

&lt;h3&gt;&lt;strong&gt;manager node 구성&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;manager 노드는 &lt;strong&gt;control plane&lt;/strong&gt; 역할을 한다. manager에서 아래 명령으로 swarm을 초기화한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker swarm init&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8GHkE/dJMcaad7Vme/3K30pRV11rkNQSCdLVo9P1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8GHkE/dJMcaad7Vme/3K30pRV11rkNQSCdLVo9P1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8GHkE/dJMcaad7Vme/3K30pRV11rkNQSCdLVo9P1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8GHkE%2FdJMcaad7Vme%2F3K30pRV11rkNQSCdLVo9P1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1356&quot; height=&quot;364&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;초기화 후 출력되는 join 토큰을 파일로 저장해두자.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vi token&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F2IYe/dJMcah5omZw/45UInsgvZLE36ORPiqgzkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F2IYe/dJMcah5omZw/45UInsgvZLE36ORPiqgzkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F2IYe/dJMcah5omZw/45UInsgvZLE36ORPiqgzkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF2IYe%2FdJMcah5omZw%2F45UInsgvZLE36ORPiqgzkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1372&quot; height=&quot;600&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZiGJ3/dJMcabKTKtN/eKfFKkhjp7yu8RpxxxM0ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZiGJ3/dJMcabKTKtN/eKfFKkhjp7yu8RpxxxM0ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZiGJ3/dJMcabKTKtN/eKfFKkhjp7yu8RpxxxM0ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZiGJ3%2FdJMcabKTKtN%2FeKfFKkhjp7yu8RpxxxM0ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1352&quot; height=&quot;266&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;manager 노드와 worker1,2 노드가 연결이 되었다.&lt;/p&gt;
&lt;br&gt;

&lt;h2&gt;&lt;strong&gt;docker service&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;다수의 호스트에 한 가지 종류의 컨테이너를 한 개 이상 생성한다. &lt;code&gt;docker run&lt;/code&gt;으로 컨테이너를 생성하는 것과 비슷한 개념이다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker service create --replicas 2 -p 5858:80 --name myweb oolralra/ipnginx&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;--replicas&lt;/code&gt; : 복제본, 컨테이너를 두 개 띄우겠다는 의미.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ipnginx&lt;/code&gt; : 자신(컨테이너)의 IP를 출력하는 이미지.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnBnVA/dJMcaicaFpk/m38wi7DkniMumPKmJJURQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnBnVA/dJMcaicaFpk/m38wi7DkniMumPKmJJURQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnBnVA/dJMcaicaFpk/m38wi7DkniMumPKmJJURQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnBnVA%2FdJMcaicaFpk%2Fm38wi7DkniMumPKmJJURQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1356&quot; height=&quot;276&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;로드밸런싱이 잘 되고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2lssC/dJMcadBOUqy/GvXW61nFOHlGresps13ID0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2lssC/dJMcadBOUqy/GvXW61nFOHlGresps13ID0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2lssC/dJMcadBOUqy/GvXW61nFOHlGresps13ID0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2lssC%2FdJMcadBOUqy%2FGvXW61nFOHlGresps13ID0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1330&quot; height=&quot;648&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker service ps myweb&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwrIag/dJMcabYoZ6F/d2iQa8p6BgP60oVEe1lbG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwrIag/dJMcabYoZ6F/d2iQa8p6BgP60oVEe1lbG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwrIag/dJMcabYoZ6F/d2iQa8p6BgP60oVEe1lbG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwrIag%2FdJMcabYoZ6F%2Fd2iQa8p6BgP60oVEe1lbG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1358&quot; height=&quot;240&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;따로 컨테이너 배치 제한을 두지 않았기 때문에 현재 총 3개의 노드 중 아무 곳에 배치되었을 것이다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker network inspect ingress&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKX5hQ/dJMcahEho06/GTYbZ502Dwr0cDOo4MIZB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKX5hQ/dJMcahEho06/GTYbZ502Dwr0cDOo4MIZB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKX5hQ/dJMcahEho06/GTYbZ502Dwr0cDOo4MIZB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKX5hQ%2FdJMcahEho06%2FGTYbZ502Dwr0cDOo4MIZB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1320&quot; height=&quot;590&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;docker swarm을 구성하는 순간, &lt;strong&gt;오버레이 네트워크&lt;/strong&gt;도 함께 구성된다.&lt;br&gt;오버레이 네트워크에 의해 다른 호스트에 있는 컨테이너들끼리도 서로 통신이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj8sGa/dJMcacQwuOy/7SbfhXNCD25UwsimKYw3ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj8sGa/dJMcacQwuOy/7SbfhXNCD25UwsimKYw3ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj8sGa/dJMcacQwuOy/7SbfhXNCD25UwsimKYw3ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj8sGa%2FdJMcacQwuOy%2F7SbfhXNCD25UwsimKYw3ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1250&quot; height=&quot;394&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ROoOg/dJMcahj2zKc/OuI22qBI8SKcF9pv4gMNKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ROoOg/dJMcahj2zKc/OuI22qBI8SKcF9pv4gMNKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ROoOg/dJMcahj2zKc/OuI22qBI8SKcF9pv4gMNKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FROoOg%2FdJMcahj2zKc%2FOuI22qBI8SKcF9pv4gMNKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1288&quot; height=&quot;770&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;770&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;만든 web1과 web2 컨테이너를 하나로 묶어주는, 눈에는 보이지 않는 접속 포인트가 생긴다. (LB와 유사)&lt;/p&gt;
&lt;br&gt;

&lt;h2&gt;&lt;strong&gt;docker stack deploy&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;docker compose와 비슷하다. 컴포즈 파일이 필요하다.&lt;/li&gt;
&lt;li&gt;기존의 컴포즈 파일과 거의 문법이 흡사하지만 조금 다른 부분이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;strong&gt;스택이란 여러 종류의 서비스의 묶음&lt;/strong&gt;이라고 생각하면 된다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;mkdir /swarm
cd /swarm
vi docker-compose.yml&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;services:
  ip-nginx:
    image: oolralra/ipnginx
    deploy:
      replicas: 2
      placement:
        constraints: [node.role != manager]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;노드의 역할이 manager인 경우는 배치하지 않겠다. 워커노드에만 컨테이너를 배치하겠다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker stack deploy -c docker-compose.yml ip-stack&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;docker stack rm ip-stack&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;스택 삭제 명령어.&lt;/p&gt;
&lt;br&gt;

&lt;h3&gt;&lt;strong&gt;visualizer — 컨테이너 시각화&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;각 호스트의 컨테이너를 시각화하는 컨테이너 이미지 = &lt;strong&gt;visualizer&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vi visual.yml&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;services:
  visual:
    image: 61.254.18.30:5000/visualizer
    ports:
    - &amp;#39;5656:8080&amp;#39;
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      placement:
        constraints: [node.role == manager]&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;docker stack deploy -c visual.yml vis&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;insecure 설정이 안 되어있으면 해주자.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vi /etc/docker/daemon.json&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;{
        &amp;quot;insecure-registries&amp;quot;: [&amp;quot;211.183.3.100:5000&amp;quot;,&amp;quot;61.254.18.30:5000&amp;quot;]
}&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;systemctl restart docker&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;211.183.3.100:5656&lt;/code&gt;으로 접속.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uV1Sx/dJMcagyBGAP/K1OHJzKZsym8Dk5fR0EzpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uV1Sx/dJMcagyBGAP/K1OHJzKZsym8Dk5fR0EzpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uV1Sx/dJMcagyBGAP/K1OHJzKZsym8Dk5fR0EzpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuV1Sx%2FdJMcagyBGAP%2FK1OHJzKZsym8Dk5fR0EzpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1340&quot; height=&quot;532&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;&lt;strong&gt;실습 1 — 사설 저장소에서 이미지 가져오기&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;61.254.18.30:5000/ipnginx:latest&lt;/code&gt; 이미지로 컴포즈 파일을 수정해서 replicas 4개로 5959 포트로 publish 해보자.&lt;/p&gt;
&lt;p&gt;저장소 수정 후 insecure 설정도 바꿔줘야 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;사설 저장소에 이미지가 존재함에도 불구하고 컨테이너가 띄워지지 않는다.&lt;br&gt;사설 저장소 insecure 설정이 manager 노드에만 되어있는데, 실질적으로 컨테이너 이미지를 땡겨오는 주체는 &lt;strong&gt;worker1과 worker2&lt;/strong&gt;이기 때문이다.&lt;br&gt;worker1과 worker2에도 insecure 설정을 해주면 된다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;vi /etc/docker/daemon.json&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;{
        &amp;quot;insecure-registries&amp;quot;: [&amp;quot;211.183.3.100:5000&amp;quot;,&amp;quot;61.254.18.30:5000&amp;quot;]
}&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;docker stack deploy -c docker-compose.yml pstack&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;&lt;strong&gt;실습 2 — ECR 퍼블릭 갤러리 이미지로 WordPress + MySQL 스택 배포&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;DB는 manager에 한 개만 띄우고, wordpress는 worker 노드에 2개를 띄워서 12345 포트로 접속 가능하게 해보자.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vi wordpress.yml&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;services:
  mywp:
    image: public.ecr.aws/docker/library/wordpress:php8.1-apache
    ports: 
    - &amp;#39;12345:80&amp;#39;
    deploy:
      replicas: 2
      placement:
        constraints: [node.role == worker]
    environment:
      WORDPRESS_DB_HOST: dbdb
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: &amp;#39;1234&amp;#39;
      WORDPRESS_DB_NAME: wpdb
    depends_on:
    - dbdb

  dbdb:
    image: public.ecr.aws/docker/library/mysql:8
    deploy:
      placement:
        constraints: [node.role == manager]
    environment:
    - MYSQL_ROOT_PASSWORD=1234
    - MYSQL_USER=wpuser
    - MYSQL_PASSWORD=1234
    - MYSQL_DATABASE=wpdb&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbmEvd/dJMcahEho14/nHkSEca5TDCAJLo2tyckL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbmEvd/dJMcahEho14/nHkSEca5TDCAJLo2tyckL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbmEvd/dJMcahEho14/nHkSEca5TDCAJLo2tyckL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbmEvd%2FdJMcahEho14%2FnHkSEca5TDCAJLo2tyckL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1274&quot; height=&quot;758&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;잘 접속된다.&lt;/p&gt;</description>
      <category>Infra/Docker</category>
      <author>minseoki</author>
      <guid isPermaLink="true">https://minseokk.tistory.com/16</guid>
      <comments>https://minseokk.tistory.com/16#entry16comment</comments>
      <pubDate>Tue, 5 May 2026 17:09:18 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] 기본 명령어와 주요 옵션 정리</title>
      <link>https://minseokk.tistory.com/15</link>
      <description>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;style&gt;
    body {
      font-family: 'Apple SD Gothic Neo', 'Noto Sans KR', sans-serif;
      font-size: 15px;
      line-height: 1.9;
      color: #333;
      max-width: 860px;
      margin: 0 auto;
      padding: 20px;
    }

    h1 {
      font-size: 26px;
      font-weight: 700;
      border-bottom: 2px solid #333;
      padding-bottom: 12px;
      margin-bottom: 40px;
    }

    h2 {
      font-size: 20px;
      font-weight: 700;
      margin-top: 64px;
      margin-bottom: 20px;
      padding: 10px 16px;
      background-color: #f0f0f0;
      border-left: 5px solid #333;
    }

    h3 {
      font-size: 17px;
      font-weight: 700;
      margin-top: 48px;
      margin-bottom: 14px;
      padding-bottom: 6px;
      border-bottom: 1px solid #ddd;
    }

    h4 {
      font-size: 15px;
      font-weight: 700;
      margin-top: 32px;
      margin-bottom: 10px;
      color: #444;
    }

    p {
      margin: 14px 0;
    }

    code {
      background-color: #f4f4f4;
      border: 1px solid #ddd;
      border-radius: 3px;
      padding: 1px 5px;
      font-family: 'D2Coding', 'Consolas', monospace;
      font-size: 13px;
      color: #c7254e;
    }

    .code-block {
      background-color: #1e1e1e;
      color: #d4d4d4;
      border-radius: 6px;
      padding: 18px 22px;
      overflow-x: auto;
      margin: 18px 0;
      font-family: 'D2Coding', 'Consolas', monospace;
      font-size: 13.5px;
      line-height: 1.7;
      white-space: pre;
      border: none;
      box-shadow: none;
    }

    blockquote {
      margin: 20px 0;
      padding: 14px 20px;
      border-left: 4px solid #aaa;
      background-color: #f9f9f9;
      color: #555;
      font-size: 14px;
      line-height: 1.9;
    }

    blockquote code {
      background-color: #eee;
      border-color: #ccc;
    }

    ul, ol {
      padding-left: 24px;
      margin: 12px 0;
    }

    li {
      margin: 6px 0;
    }

    .section {
      margin-bottom: 32px;
    }

    .badge-important {
      display: inline-block;
      background-color: #e74c3c;
      color: white;
      font-size: 11px;
      font-weight: 700;
      padding: 2px 7px;
      border-radius: 3px;
      margin-left: 6px;
      vertical-align: middle;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;h1&gt;[Docker] 기본 명령어와 주요 옵션 총정리&lt;/h1&gt;

&lt;p&gt;도커를 설치하고 나서 가장 먼저 마주치는 것들 — 컨테이너를 어떻게 만들고, 어떻게 관리하는지에 대한 기본 명령어와 자주 쓰는 옵션들을 정리해봤다.&lt;/p&gt;


&lt;h2&gt;Docker 설치&lt;/h2&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;div class=&quot;code-block&quot;&gt;curl -fsSL https://get.docker.com -o get-docker.sh&lt;/div&gt;
  &lt;p&gt;도커 공식 홈페이지에서 설치 스크립트를 다운로드한다. 환경에 맞춰서 자동으로 설치해준다.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;div class=&quot;code-block&quot;&gt;chmod +x get-docker.sh&lt;/div&gt;
  &lt;p&gt;&lt;code&gt;+x&lt;/code&gt; : 실행 권한 추가&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;설치 후 &lt;code&gt;ip a&lt;/code&gt; 명령으로 &lt;code&gt;docker0&lt;/code&gt; 브릿지 IP가 올라와 있는지 확인한다.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;IP가 올라와 있다 = 정상적인 상태&lt;/li&gt;
    &lt;li&gt;IP가 사라진 경우 = 비정상적인 상태 (컨테이너가 통신이 안됨)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;비정상 상태라면 아래 명령으로 도커를 재시작하면 된다.&lt;/p&gt;
  &lt;div class=&quot;code-block&quot;&gt;systemctl restart docker&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;도커 재시작 자동화 스크립트&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;IP가 사라졌을 때 자동으로 도커를 재시작하는 스크립트를 만들어두면 편하다.&lt;/p&gt;
  &lt;div class=&quot;code-block&quot;&gt;tee /root/check_ip_and_restart_docker.sh&amp;lt;&amp;lt;EOF
#!/bin/bash

if ! ip add | grep -q 172.17; then
    systemctl restart docker
fi
EOF&lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;div class=&quot;code-block&quot;&gt;chmod +x check_ip_and_restart_docker.sh&lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;div class=&quot;code-block&quot;&gt;crontab -e&lt;/div&gt;
  &lt;div class=&quot;code-block&quot;&gt;* * * * * /root/check_ip_and_restart_docker.sh&lt;/div&gt;
  &lt;p&gt;매분마다 스크립트를 실행하도록 크론탭에 등록한다.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;div class=&quot;code-block&quot;&gt;systemctl enable docker&lt;/div&gt;
  &lt;p&gt;서버 재부팅 시에도 도커가 자동으로 시작되도록 설정.&lt;/p&gt;
&lt;/div&gt;


&lt;h3&gt;우분투 IP 설정&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;div class=&quot;code-block&quot;&gt;vi /etc/netplan/50-cloud-init.yaml&lt;/div&gt;
  &lt;p&gt;우분투의 IP 설정 파일. IP를 &lt;code&gt;211.183.3.100&lt;/code&gt;으로 수정한다.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;div class=&quot;code-block&quot;&gt;netplan apply&lt;/div&gt;
  &lt;p&gt;변경사항 반영. &lt;code&gt;systemctl restart network&lt;/code&gt; 와 같은 개념이다.&lt;/p&gt;
&lt;/div&gt;


&lt;h2&gt;docker 기본 명령어&lt;/h2&gt;

&lt;h3&gt;docker run&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;컨테이너를 &lt;strong&gt;생성하고 실행&lt;/strong&gt;하는 명령어.&lt;br&gt;
  &lt;code&gt;docker start&lt;/code&gt;, &lt;code&gt;docker restart&lt;/code&gt;, &lt;code&gt;docker stop&lt;/code&gt; 등과 함께 컨테이너 라이프사이클을 관리한다.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;div class=&quot;code-block&quot;&gt;docker run nginx&lt;/div&gt;
  &lt;p&gt;nginx 이미지로 컨테이너를 run(생성 + 동작) 시키는 명령어.&lt;/p&gt;

  &lt;p&gt;컨테이너 이미지는 여러 개의 &lt;strong&gt;layer&lt;/strong&gt;로 구성되어 있다.&lt;/p&gt;

  &lt;blockquote&gt;
    ex) A 이미지 = 1+2+3, B 이미지 = 1+2+5 라면,&lt;br&gt;
    A 이미지를 갖고 있는 상태에서 B 이미지를 새로 구성할 때 5라는 레이어만 새로 받고, 1+2는 재활용한다.
  &lt;/blockquote&gt;

  &lt;p&gt;AWS에서 AMI로 인스턴스를 만들어도 AMI 자체는 변하지 않는 것처럼, 컨테이너 이미지로 여러 개의 컨테이너를 만들어도 이미지 자체는 변하지 않는다.&lt;/p&gt;
&lt;/div&gt;


&lt;h3&gt;docker ps&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;동작 중인 컨테이너를 조회한다. 컨테이너 ID나 이름으로 특정할 수 있다.&lt;/p&gt;

  &lt;p&gt;&lt;code&gt;docker run&lt;/code&gt; 을 하면 컨테이너가 생성된다. &lt;code&gt;--name&lt;/code&gt; 옵션으로 이름을 지정하지 않으면 &lt;code&gt;angry_maxwell&lt;/code&gt; 같은 랜덤한 이름이 부여된다.&lt;/p&gt;

  &lt;p&gt;컨테이너 이미지 태그(tag)의 디폴트 값은 &lt;code&gt;latest&lt;/code&gt;다. 태그를 명시하지 않으면 자동으로 latest로 설정된다.&lt;/p&gt;

  &lt;blockquote&gt;
    옵션 없이 &lt;code&gt;docker run&lt;/code&gt;을 하면 컨테이너 내부로 진입한다.&lt;br&gt;
    컨테이너가 잘 동작하려면 반드시 내부에서 &lt;strong&gt;foreground 상태인 프로세스&lt;/strong&gt;가 존재해야 한다.
  &lt;/blockquote&gt;

  &lt;p&gt;컨테이너 종류마다 foreground로 동작시키는 명령이 다르다.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;자바 컨테이너 : &lt;code&gt;java -jar app.jar&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;파이썬 컨테이너 : &lt;code&gt;python manage.py runserver&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;nginx 컨테이너 : &lt;code&gt;nginx -g &quot;daemon off;&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;

&lt;h4&gt;모든 컨테이너 조회 : -a 옵션&lt;/h4&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;컨테이너를 중지하면 &lt;code&gt;docker ps&lt;/code&gt; 목록에서 사라진다.&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker ps -a&lt;/div&gt;
  &lt;p&gt;중지된 컨테이너까지 포함해서 모든 컨테이너를 볼 수 있다.&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker restart &amp;lt;컨테이너명&amp;gt;&lt;/div&gt;
  &lt;p&gt;중지된 컨테이너를 재시작할 수 있다.&lt;/p&gt;
&lt;/div&gt;


&lt;h3&gt;컨테이너에서 나가기&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;&lt;strong&gt;&lt;code&gt;Ctrl + PQ&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;조용히 나가기&lt;/li&gt;
    &lt;li&gt;foreground 유지&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;&lt;code&gt;Ctrl + PQ&lt;/code&gt; 로 빠져나와도 컨테이너가 잘 동작 중이다.&lt;br&gt;
  &lt;code&gt;-it&lt;/code&gt; 옵션을 통해 상호작용을 함으로써 컨테이너가 잘 동작할 수 있다.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;&lt;strong&gt;&lt;code&gt;Ctrl + d&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;강제로 나가기&lt;/li&gt;
    &lt;li&gt;때에 따라서 컨테이너가 중지될 수도 있다.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;&lt;code&gt;Ctrl + d&lt;/code&gt; 로 빠져나오면 pid = 1 인 프로세스가 중지되기 때문에 컨테이너도 중지된다.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;처음에 bash로 직접 컨테이너를 만든 주인(PID 1)이라면 &lt;code&gt;Ctrl + d&lt;/code&gt; 로 나가는 순간 주인이 죽어 컨테이너도 함께 종료된다.&lt;/li&gt;
    &lt;li&gt;그러나 이미 돌아가는 서버에 exec로 나중에 들어간 손님이라면 &lt;code&gt;Ctrl + d&lt;/code&gt; 로 나가도 주인(서버 프로세스)이 살아있어 컨테이너는 계속 유지된다.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;


&lt;h3&gt;모든 컨테이너 한 번에 삭제&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;div class=&quot;code-block&quot;&gt;docker rm -f $(docker ps -qa)&lt;/div&gt;
  &lt;p&gt;컨테이너의 ID를 변수로 받아와서 삭제한다. (컨테이너 전부 삭제)&lt;/p&gt;
&lt;/div&gt;


&lt;h3&gt;docker rm&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;컨테이너를 삭제한다.&lt;/p&gt;
  &lt;div class=&quot;code-block&quot;&gt;docker rm -f &amp;lt;컨테이너명&amp;gt;&lt;/div&gt;
  &lt;p&gt;동작 중인 컨테이너는 기본적으로 삭제가 안 되기 때문에 &lt;code&gt;-f&lt;/code&gt; 옵션으로 강제 삭제한다.&lt;/p&gt;
&lt;/div&gt;


&lt;h3&gt;--name&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;&lt;code&gt;docker run&lt;/code&gt; 시 컨테이너의 이름을 직접 지정할 수 있다.&lt;/p&gt;
  &lt;div class=&quot;code-block&quot;&gt;docker run --name mycon nginx&lt;/div&gt;
  &lt;p&gt;포어그라운드로 동작 중인 컨테이너에서 &lt;code&gt;Ctrl + C&lt;/code&gt; 로 빠져나오면 포어그라운드 프로세스가 중지되면서 컨테이너도 함께 중지된다.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;이미지 이름 오른쪽에 컨테이너 실행 시 수행할 &lt;strong&gt;command&lt;/strong&gt;를 명시할 수 있다.&lt;/p&gt;
  &lt;div class=&quot;code-block&quot;&gt;docker run --name mycon nginx /bin/bash&lt;/div&gt;
  &lt;p&gt;&lt;code&gt;/bin/bash&lt;/code&gt; 명령으로는 특정 프로세스가 포어그라운드로 실행되지 않기 때문에 컨테이너는 바로 중지 상태가 된다.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;div class=&quot;code-block&quot;&gt;docker run centos:7 sleep 60&lt;/div&gt;
  &lt;p&gt;&lt;code&gt;sleep 60&lt;/code&gt; 이 바로 커맨드다. &quot;컨테이너가 생기자마자 60초 동안 자라&quot;는 명령을 수행한다. 60초가 지나면 업무가 끝났으므로 컨테이너는 종료된다.&lt;/p&gt;

  &lt;blockquote&gt;
    도커 컨테이너는 운영체제 전체를 띄우는 게 아니라 &lt;strong&gt;딱 하나의 프로세스를 실행하기 위해&lt;/strong&gt; 만들어진다.&lt;br&gt;
    command의 가장 큰 목적은 특정 프로세스를 foreground로 동작시켜 컨테이너 상태(state=up)를 유지하는 것이다.
  &lt;/blockquote&gt;
&lt;/div&gt;


&lt;h3&gt;docker inspect / docker exec&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;div class=&quot;code-block&quot;&gt;docker inspect ntest&lt;/div&gt;
  &lt;p&gt;&lt;code&gt;ntest&lt;/code&gt; 컨테이너의 자세한 정보를 확인하는 명령. IP 값을 확인한 후 curl을 찍어 nginx가 잘 동작하는지 확인할 수 있다.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;div class=&quot;code-block&quot;&gt;docker exec -it ntest bash&lt;/div&gt;
  &lt;p&gt;&lt;strong&gt;-it 옵션&lt;/strong&gt; : 실행 중인 컨테이너 안으로 접속한다.&lt;/p&gt;
&lt;/div&gt;


&lt;h2&gt;주요 옵션&lt;/h2&gt;

&lt;h3&gt;volume (-v) &lt;span class=&quot;badge-important&quot;&gt;매우 중요&lt;/span&gt;&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;컨테이너와 호스트를 &lt;strong&gt;마운트&lt;/strong&gt;하는 개념.&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;mkdir /shared&lt;/div&gt;
  &lt;p&gt;마운트할 호스트 디렉토리 생성.&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker run -d --name con -v /shared:/remote nginx:latest&lt;/div&gt;
  &lt;p&gt;&lt;code&gt;/shared&lt;/code&gt;(호스트) 와 &lt;code&gt;/remote&lt;/code&gt;(컨테이너) 를 마운트한 컨테이너 생성.&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;echo vol-test &amp;gt; /shared/test.txt&lt;/div&gt;
  &lt;p&gt;호스트에 테스트 파일 생성.&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker exec con cat /remote/test.txt&lt;/div&gt;
  &lt;p&gt;컨테이너 내부에서 마운트된 파일 내용을 확인한다. 컨테이너를 삭제해도 호스트에는 파일이 남는다.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;&lt;strong&gt;호스트와 컨테이너 양쪽에 파일이 있으면 어떻게 될까?&lt;/strong&gt;&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker run -d --name vol nginx:latest
docker exec -it vol bash&lt;/div&gt;
  &lt;p&gt;nginx 컨테이너 내부의 &lt;code&gt;/usr/share/nginx/html&lt;/code&gt; 경로에는 기본 파일들이 존재한다.&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker run -d --name vol -v /shared:/usr/share/nginx/html nginx:latest&lt;/div&gt;
  &lt;p&gt;기존에 파일이 존재하는 디렉토리를 마운트 포인트로 지정하면,&lt;br&gt;
  &lt;strong&gt;호스트의 파일이 우선순위가 더 높다.&lt;/strong&gt; 컨테이너에 있던 기존 파일은 무시된다.&lt;/p&gt;
&lt;/div&gt;


&lt;h3&gt;publish (-p) &lt;span class=&quot;badge-important&quot;&gt;매우 중요&lt;/span&gt;&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;컨테이너를 외부에 노출, 배포(publish)시키는 옵션.&lt;br&gt;
  호스트를 외부, 컨테이너를 내부로 생각했을 때 &lt;strong&gt;DNAT(포트포워딩)&lt;/strong&gt; 해주는 개념과 비슷하다.&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker run -d --name pub -p 8080:80 httpd:latest&lt;/div&gt;
  &lt;p&gt;&lt;code&gt;-p 8080:80&lt;/code&gt; 설정을 통해 호스트의 8080 포트로 들어오는 모든 신호를 해당 컨테이너의 80 포트로 전달하도록 규칙을 정해놓는다. 그래서 IP를 따로 지정하지 않아도 된다.&lt;/p&gt;

  &lt;blockquote&gt;
    도커를 설치하면 호스트 컴퓨터 안에 &lt;code&gt;docker0&lt;/code&gt; 라는 가상 브릿지(Bridge)가 생긴다.&lt;br&gt;
    컨테이너를 실행할 때마다 도커는 이 브릿지로부터 &lt;code&gt;172.17.0.x&lt;/code&gt; 대역의 내부 IP를 각 컨테이너에 자동으로 할당한다.&lt;br&gt;
    그래서 IP를 지정하지 않아도 도커가 알아서 지정해주기 때문에 충돌 없이 사용할 수 있다.
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;h4&gt;실습 예제 : 댕댕이 템플릿 퍼블리시&lt;/h4&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;호스트의 &lt;code&gt;/host_vol&lt;/code&gt; 경로에 무료 템플릿을 넣고 7979번 포트로 퍼블리시해보자.&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;wget -O dog.zip https://templatemo.com/download/templatemo_074_dog
unzip dog.zip
mkdir /host_vol
cp -r templatemo_074_dog/* /host_vol&lt;/div&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker run -d --name web -v /host_vol:/usr/local/apache2/htdocs -p 7979:80 httpd:latest&lt;/div&gt;
  &lt;p&gt;&lt;code&gt;-v&lt;/code&gt; 와 &lt;code&gt;-p&lt;/code&gt; 를 함께 사용해서 호스트의 파일을 컨테이너에 마운트하고 외부에 노출시킨다.&lt;/p&gt;
&lt;/div&gt;


&lt;h3&gt;-e : 환경변수 구성&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;컨테이너 내부에 환경변수를 설정하는 옵션. 항상 &lt;code&gt;키=값&lt;/code&gt; 형태로 작성한다.&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker run -d --name envcon -e ENVTEST=contest nginx:latest&lt;/div&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker exec -it envcon bash
echo $ENVTEST
# contest 출력&lt;/div&gt;
  &lt;p&gt;컨테이너 내부에 진입해서 실제로 환경변수가 구성됐는지 확인한다.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;p&gt;&lt;strong&gt;도커로 데이터베이스를 띄울 때 &lt;code&gt;-e&lt;/code&gt; 옵션은 필수다.&lt;/strong&gt;&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker run -d --name mydb mysql:8&lt;/div&gt;
  &lt;p&gt;환경변수 없이 DB 컨테이너를 생성하면 잘 동작하지 않는다.&lt;br&gt;
  데이터베이스 이미지들은 root 패스워드 설정이 안 되어 있기 때문에 컨테이너 생성 단계에서 환경변수로 설정해줘야 한다.&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=test123 mysql:8&lt;/div&gt;
  &lt;p&gt;환경변수로 root 암호를 설정하면 정상적으로 동작한다.&lt;/p&gt;
&lt;/div&gt;


&lt;h3&gt;-w : 작업 디렉토리&lt;/h3&gt;

&lt;div class=&quot;section&quot;&gt;
  &lt;ul&gt;
    &lt;li&gt;리눅스에서 &lt;code&gt;pwd&lt;/code&gt; 명령을 입력한 가장 큰 목적은 내가 현재 어디 경로에 있는지를 확인하고 싶어서였다.&lt;/li&gt;
    &lt;li&gt;컨테이너에서는 내가 현재 있는 경로를 고정시키기 위한 용도로 쓰인다.&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;&lt;code&gt;/app&lt;/code&gt; 에 &lt;code&gt;myapp.jar&lt;/code&gt; 파일을 두고 &lt;code&gt;java -jar ./myapp.jar&lt;/code&gt; 명령으로 앱을 실행하려면 반드시 &lt;code&gt;/app&lt;/code&gt; 경로에 있어야 한다.&lt;br&gt;
  &lt;code&gt;-w&lt;/code&gt; 로 작업 디렉토리를 명시해두면 항상 그 경로에서 시작한다.&lt;/p&gt;

  &lt;div class=&quot;code-block&quot;&gt;-w /app&lt;/div&gt;

  &lt;div class=&quot;code-block&quot;&gt;docker run -d --name pwd -w /usr nginx:latest
docker exec -it pwd bash
# 접속하면 바로 /usr 경로에 위치한다&lt;/div&gt;
&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;</description>
      <category>Infra/Docker</category>
      <category>docker</category>
      <author>minseoki</author>
      <guid isPermaLink="true">https://minseokk.tistory.com/15</guid>
      <comments>https://minseokk.tistory.com/15#entry15comment</comments>
      <pubDate>Tue, 28 Apr 2026 16:26:05 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Compose 파일 작성법과 주요 옵션 총정리</title>
      <link>https://minseokk.tistory.com/14</link>
      <description>&lt;h1&gt;Docker compose&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;도커(docker run)의 경우에는 단일 컨테이너를 실행한다.&lt;/li&gt;
&lt;li&gt;도커 컴포즈는 여러 종류의 컨테이너를 한번에 띄울 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;border-left:4px solid #ccc; padding-left:12px;&quot;&gt;
ex) 도커로 3tier를 구성한다면, docker run 을 3번 해서 web-was-db 컨테이너를 각각 구성해야 하고 —link도 구성해줘야 한다. 
하지만 docker compose의 경우엔 3종류의 컨테이너를 컴포즈 파일 하나에서 동시에 구성이 가능하다.
&lt;/div&gt;


&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/aZ2bHq3.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;컨테이너를 띄우는 목적은 뭘까?&lt;/strong&gt;&lt;/p&gt;
&lt;div style=&quot;border-left:4px solid #ccc; padding-left:12px;&quot;&gt;
서비스를 제공하고 싶기 때문이다. 컨테이너 안에 앱, 애플리케이션이 들어있다.
도커 컴포즈에서는 이런 한 종류의 컨테이너를 service라고 지칭한다.
&lt;/div&gt;

&lt;br&gt;

&lt;pre&gt;&lt;code&gt;mkdir /com

cd /com

vi docker-compose.yml&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;docker-compose.yml 이라는 파일명 = 디폴트값&lt;/p&gt;
&lt;p&gt;한 개의 서비스로 구성된 도커 컴포즈 파일 편집&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;services:
#내가 띄울 다양한 종류의 컨테이너들

  webserver:
  #서비스의 이름. 내가 원하는대로 정하면 됨.
    image: nginx
    ports:
    - &amp;#39;8787:80&amp;#39;
    #publish 기능
    networks:
    - webnet
    # 아직 만들진 않았다. 밑에서 만들예정. 놓여질 네트워크

networks:
  webnet:
  # webnet이라는 이름의 네트워크 생성.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;샘플 코드.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose up&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/h0bvA1s.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;잘 동작한다.&lt;/p&gt;
&lt;br&gt;

&lt;pre&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;도커 컴포즈 삭제&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;docker run 과 비슷하게 -d (detach) 백그라운드로 동작할 수 있다.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;&lt;strong&gt;볼륨 구성&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;호스트의 현재 디렉토리에 vtest라는 디렉토리를 구성한 후 간단한 인덱스 파일을 생성하여 컨테이너에 볼륨 구성을 통해 웹루트디렉토리에 넣어주고 싶다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir ./vtest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;경로 생성.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo compose-volume-test &amp;gt; vtest/index.html&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;인덱스 파일 생성.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vi docker-compose.yml&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;services:
#내가 띄울 다양한 종류의 컨테이너들

  webserver:
  #서비스의 이름. 내가 원하는대로 정하면 됨.
    image: nginx
    ports:
    - &amp;#39;8787:80&amp;#39;
    #publish 기능
    networks:
    - webnet
    # 아직 만들진 않았다. 밑에서 만들예정. 놓여질 네트워크
    volumes:
    - ./vtest:/usr/share/nginx/html
    # 호스트의 ./vtest를 컨테이너의 /usr/share/nginx/html에 마운트
networks:
  webnet:
  # webnet이라는 이름의 네트워크 생성.&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/LwFIe4u.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;마운트가 잘 되었다.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;&lt;strong&gt;docker-compose.yml 옵션들에 대해 알아보자.&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;networks:&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;네트워크 정의 및 선택&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ports:&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-p, publish 옵션&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;volumes:&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-v, 호스트와 컨테이너 마운트&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;command:&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;CMD&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;environment:&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-e, 환경변수&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;depends_on:&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;의존성 설정(컨테이너 띄울 순서)도 가능.&lt;/p&gt;
&lt;p&gt;ex) node.js 앱(todo, weather, chat)의 경우 몽고디비가 연동이 안되면 앱 자체가 죽어버린다. node.js 서비스를 정의하면서 몽고디비를 depends_on 으로 걸어줘야 한다.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;

&lt;hr&gt;
&lt;h3&gt;&lt;strong&gt;/com의 ubun 이라는 경로에서 위 명령어를 활용하여 ubuntu:latest를 동작시키는 compose 파일을 만들어 보자.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;네트워크 : ubun_net&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir ubun

cd ubun/

vi docker-compose.yml&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;services:
  ubun:
    image: ubuntu:latest
    networks:
    - ubun_net
    command: &amp;quot;sleep infinity&amp;quot;

networks:
  ubun_net:&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;

&lt;pre&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/jdFhPoF.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;br&gt;

&lt;pre&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;

&lt;br&gt;

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;environment:
    - ENV_TEST=test&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ubun 서비스에 환경변수 추가.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;

&lt;pre&gt;&lt;code&gt;docker exec -it ubun-ubun-1 bash&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ktOsTMT.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;환경변수가 잘 들어있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;도커 컴포즈에서는 &lt;code&gt;—link&lt;/code&gt; 를 굳이 명시하지 않아도 서비스의 이름으로 찾아갈 수 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;&lt;strong&gt;실습) wordpress 구성하기!&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;mysql:8, wordpress:latest를 베이스 이미지로 하여, Dockerfile은 쓰지않고, docker-compose.yml 파일을 구성해보자. publish 포트는 wordpress는 1234로 하고, mysql는 따로 publish 하지 않는다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir wp

cd wp

vi docker-compose.yml&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;services:
  wp:
    image: wordpress:latest
    ports:
    - &amp;#39;1234:80&amp;#39;
    environment:
    - WORDPRESS_DB_HOST=dbdb
    - WORDPRESS_DB_NAME=wpdb
    - WORDPRESS_DB_USER=wpuser
    - WORDPRESS_DB_PASSWORD=1234
    networks:
    - wpnet
    depends_on:
    - dbdb

  dbdb:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: &amp;#39;1234&amp;#39;
      MYSQL_USER: &amp;#39;wpuser&amp;#39;
      MYSQL_PASSWORD: &amp;#39;1234&amp;#39;
      MYSQL_DATABASE: &amp;#39;wpdb&amp;#39;
    networks:
    - wpnet
networks:
  wpnet:&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/VeODDJ5.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;성공!&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;

&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;기존에 존재하는 네트워크를 사용하고 싶을 때&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker network create mynet --driver=bridge&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;네트워크 생성.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/HhG2VeD.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;br&gt;

&lt;pre&gt;&lt;code&gt;vi docker-compose.yml&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/GDdp1xh.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/Tj9VMNl.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;172.19.0.0 대역에 생성됐다.&lt;/p&gt;
&lt;h2&gt;빌드한 이미지로 서비스 구성&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;mkdir build

cd build/

vi Dockerfile&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;FROM httpd:latest&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;도커 파일 생성.&lt;/p&gt;
&lt;br&gt;

&lt;pre&gt;&lt;code&gt;vi docker-compose.yml&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;services:
  myweb:
    build: .
    # docker-compose.yml 파일이 있는 경로(.)의 Dockerfile을 빌드&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;도커 컴포즈 파일 생성.&lt;/p&gt;
&lt;br&gt;

&lt;pre&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;echo build-test &amp;gt; index.html&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;index.html 파일 생성.&lt;/p&gt;
&lt;br&gt;

&lt;pre&gt;&lt;code&gt;vi Dockerfile&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;위에서 생성한 index.html 파일을 넣어보자.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;FROM httpd:latest
WORKDIR /usr/local/apache2/htdocs
COPY index.html index.html&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;curl localhost:5959&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;
&lt;br&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/5pIDEzk.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;기본 페이지가 뜨고 &lt;code&gt;docker-compose up -d&lt;/code&gt; 를 했지만 이미지가 빌드되지 않았다.&lt;br&gt;이미 빌드를 한 적이 있어서 빌드된 이미지가 존재하면 다시 빌드하지 않는다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;컨테이너 종료.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d --build&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;—build&lt;/code&gt; 옵션을 명시해야 계속 빌드한다.&lt;/p&gt;
&lt;br&gt;

&lt;p&gt;다시 curl을 찍어보면,&lt;/p&gt;
&lt;br&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/7PEGbBc.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;수정한 Dockerfile 대로 다시 빌드가 되었다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;컨테이너 종료.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;p&gt;&lt;strong&gt;이번엔 빌드를 하 되, 도커파일을 지정해줘보자.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vi docker-compose.yml&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;services:
  myweb:
    build: 
    # docker-compose.yml 파일이 있는 경로(.)의 Dockerfile을 빌드
      context: .
      # 디렉토리 지정
      dockerfile: Dockerfile
      # 도커파일의 이름 지정.
    image: myimg:1
    # 빌드해서 나온 이미지의 이름.
    # 단독으로 쓰일때와는 의미가 좀 다르다.

    ports:
    - &amp;#39;5959:80&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;context:&lt;/code&gt;  도커가 빌드를 시작할 때 참고할 작업 폴더의 위치.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;context: .&lt;/code&gt; 으로 되어있으면 도커는 현재 폴더에 있는 Dockerfile, 소스코드, package.json 등을 모두 빌드 컨텍스트 라는 임시 공간에 담는다.&lt;/p&gt;
&lt;p&gt;위 코드 중 context, build 부분 해석&lt;/p&gt;
&lt;p&gt;→ Dockerfile 란 이름의 도커파일로 빌드를 하는데, 지정한 디렉토리(현재 디렉토리)의 모든 내용을 빌드해라.&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;

&lt;h2&gt;docker compose scaling&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;—scaling &amp;lt;서비스명&amp;gt;=&amp;lt;컨테이너개수&amp;gt;&lt;/code&gt;&lt;/strong&gt; 로 서비스를 구성하는 컨테이너의 수를 변경할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ljsFROv.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/pOcTkZB.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;docker-compose.yml 파일에 포트 범위를 명시해준다.&lt;/strong&gt;&lt;/p&gt;
&lt;br&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/WY4IUXb.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/Lb6a4aK.png&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;

&lt;p&gt;하나의 접속 지점을 통해 로드밸런싱이 됐으면 좋겠지만 docker compose 에서는 그게 불가능하다.&lt;/p&gt;
&lt;p&gt;서비스를 구성하는 컨테이너마다 호스트의 포트를 1:1 로 맵핑시켜야 한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;왜?&lt;/strong&gt;&lt;/p&gt;
&lt;div style=&quot;border-left:4px solid #ccc; padding-left:12px;&quot;&gt;    
&lt;p&gt;
  도커 컴포즈에서 --scale 옵션을 통해 컨테이너 개수를 늘리는 것은 동일한 서비스를 여러 개 복제하여 실행하는 기능에 불과하다. 이 방식은 단순히 물리적인 숫자를 늘려줄 뿐, 외부에서 들어오는 트래픽을 각 컨테이너의 상태나 부하 정도에 맞춰 지능적으로 분산해주는 전문적인 로드밸런싱 기능을 포함하지 않는다.
&lt;/p&gt;
  &lt;br&gt;
&lt;p&gt;
  따라서 여러 개의 컨테이너를 띄우더라도 특정 컨테이너에만 요청이 몰리거나, 장애가 발생한 컨테이너로 접속이 시도되는 등의 한계가 존재한다.
이를 해결하기 위해서는 Nginx나 HAProxy와 같은 별도의 로드밸런서 서비스를 도커 컴포즈 설정에 추가하여 앞단에 배치해야 한다. 
&lt;/p&gt; 
  &lt;br&gt;
&lt;p&gt;
    전문 로드밸런서는 들어오는 모든 요청을 단일 지점에서 받아 각 컨테이너로 골고루 전달하고, 컨테이너의 생존 여부를 실시간으로 확인하여 정상적인 곳으로만 트래픽을 보내는 가이드 역할을 수행한다. 결과적으로 효율적인 트래픽 분산과 안정적인 서비스 유지를 위해서는 단순한 개수 확장보다는 로드밸런서를 통한 체계적인 관리가 필수적이다.
&lt;/p&gt;
&lt;/div&gt;</description>
      <category>Infra/Docker</category>
      <author>minseoki</author>
      <guid isPermaLink="true">https://minseokk.tistory.com/14</guid>
      <comments>https://minseokk.tistory.com/14#entry14comment</comments>
      <pubDate>Sun, 26 Apr 2026 21:54:05 +0900</pubDate>
    </item>
    <item>
      <title>서버가 죽지 않도록... ELB와 Auto-Scailing 이해하기 (feat. AWS)</title>
      <link>https://minseokk.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &lt;b&gt;ELB&lt;/b&gt;와 &lt;b&gt;Auto-Scailing&lt;/b&gt;에 대해 알아보자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ELB (Elastic Load Balancing)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ELB는 들어오는 애플리케이션 트래픽을 Amazon EC2 인스턴스, 컨테이너, IP 주소 등 여러 대상에 자동으로 분산시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 가용 영역 또는 여러 가용 영역에서 다양한 대상에 걸쳐 애플리케이션 트래픽의 부하를 분산하여 애플리케이션의 결함 허용 능력을 높인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BMpp9/dJMcafMLRAN/nN0uV8pxLmEApiXB3jM8ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BMpp9/dJMcafMLRAN/nN0uV8pxLmEApiXB3jM8ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BMpp9/dJMcafMLRAN/nN0uV8pxLmEApiXB3jM8ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBMpp9%2FdJMcafMLRAN%2FnN0uV8pxLmEApiXB3jM8ck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;301&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 중 ALB(Application Load Balancer)의 특징은 OSI 모델의 7계층(애플리케이션 계층)에서 작동하며 HTTP/HTTPS 프로토콜의 헤더 내용을 기반으로 고급 라우팅 결정을 내릴 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NLB(Network Load Balancer)는 OSI 모델의 4계층에서 작동하며 초당 수백만 개의 요청을 처리할 수 있는 성능을 제공한다. 또한 가용 여역당 하나의 고정 IP를 가질 수 있다는 큰 특징이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 얘기해보면 웹서비스를 운영한다면 ALB를, 게임 서버나 실시간 스트리밍이라면 속도가 생명인 NLB를 사용한다고 볼 수도 있겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Auto-Scailing&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amazon EC2 Auto-Scailing은 애플리케이션의 부하를 처리할 수 있는 정확한 수의 EC2 인스턴스를 유지할 수 있게 도와준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정된 조건에 따라 EC2 인스턴스를 자동으로 시작하거나 종료한다. 이를 통해 수요가 급증할 때는 성능을 유지하고 수요가 적을 때는 비용을 절감한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 큰 목적은 고가용성(High-Availability)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scale out = 서버의 갯수가 늘어남, scale in = 서버의 갯수가 줄어듬.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scale up = 서버의 리소스가 증가, scale down = 서버의 리소스가 감소.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Auto-Scailing의 구성 순서는 아래와 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ELB를 생성하면서 빈 타겟그룹을 생성한다.&lt;/li&gt;
&lt;li&gt;빈 타겟그룹으로 로드밸런서를 생성한다.&lt;/li&gt;
&lt;li&gt;Auto-Scailing 그룹을 만든 후, 위에서 만든 빈 타켓그룹에 넣어준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 실습을 통해 개념을 익히고 감각을 익혀보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Web 서버를 ubuntu 24.04 기반으로 생성하여 &lt;b&gt;Auto-Scailing&lt;/b&gt;을 구성해보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2 인스턴스 개수는 최소 1대 ~ 최대 3대&lt;/li&gt;
&lt;li&gt;가용 영역 최소 2개 이상(a, c)으로 하는 Auto-Scailing 가능한 web 서버들을 프라이빗 서브넷에 위치.&lt;/li&gt;
&lt;li&gt;stress 패키지가 재부팅 시에도 자동으로 부하가 걸리게끔.&lt;/li&gt;
&lt;li&gt;외부(노트북의 브라우저)에서 웹페이지가 보이도록.&lt;/li&gt;
&lt;li&gt;ALB의 Listen Port : 88&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Web 서버(인스턴스)를 생성할 때 퍼블릭으로 둔 후 필요한 패키지를 설치하고 인스턴스를 이미지 화 하여 프라이빗 서브넷에 인스턴스를 생성하는 방향으로 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHfr99/dJMcadORBUR/JaCkD3sPSLCpHC7cmEGgX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHfr99/dJMcadORBUR/JaCkD3sPSLCpHC7cmEGgX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHfr99/dJMcadORBUR/JaCkD3sPSLCpHC7cmEGgX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHfr99%2FdJMcadORBUR%2FJaCkD3sPSLCpHC7cmEGgX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;624&quot; height=&quot;382&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 퍼블릭 서브넷에 인스턴스를 하나 만들어서 nginx, stress(cpu 부하용) 패키지를 설치한 후 이미지화 하여 시작 템플릿을 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774333649129&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt update -y &amp;amp;&amp;amp; apt install -y nginx

echo web_tem &amp;gt; /var/www/html/index.html

systemctl enable --now nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stress 패키지 설치 후 cpu에 부하 걸어주기.&lt;/p&gt;
&lt;pre id=&quot;code_1774333698281&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt install -y stress

stress -c 2 -t 1200&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;t3.micro의 vcpus 갯수가 2개 이상이므로 -c 2, -t초&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20분 동안 2 core cpu에 100% 부하를 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AbpUL/dJMcaiWXtsb/ijTS40A3YAdLgHGMDOLmr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AbpUL/dJMcaiWXtsb/ijTS40A3YAdLgHGMDOLmr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AbpUL/dJMcaiWXtsb/ijTS40A3YAdLgHGMDOLmr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAbpUL%2FdJMcaiWXtsb%2FijTS40A3YAdLgHGMDOLmr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;575&quot; height=&quot;93&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774333795382&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tee /etc/systemd/system/stress.service&amp;lt;&amp;lt;EOF
[Unit]
Description=Run stress test on boot
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/stress -c 2 -t 1200
Restart=no

[Install]
WantedBy=multi-user.target
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stress를 데몬화.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774333827544&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;systemctl daemon-reload

systemctl enable stress&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 반영 후 재부팅 시에도 stress를 주도록 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 했다면 이제 이미지(AMI)를 생성하고 시작 템플릿을 생성해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 로드 밸런서 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;1334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKTYcH/dJMcac3wwE3/hbaJQKyPFF7jyzfzBVje31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKTYcH/dJMcac3wwE3/hbaJQKyPFF7jyzfzBVje31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKTYcH/dJMcac3wwE3/hbaJQKyPFF7jyzfzBVje31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKTYcH%2FdJMcac3wwE3%2FhbaJQKyPFF7jyzfzBVje31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;528&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Internet-facing을 선택하고 2개의 가용 영역을 생성해주는데 퍼블릭 서브넷으로 설정을 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 그룹은 22번과 80번 포트가 열린 보안그룹을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 대상 그룹을 생성해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHvwO6/dJMcaiCF1JS/8dXoC0vl17R0KbcLy3vbC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHvwO6/dJMcaiCF1JS/8dXoC0vl17R0KbcLy3vbC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHvwO6/dJMcaiCF1JS/8dXoC0vl17R0KbcLy3vbC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHvwO6%2FdJMcaiCF1JS%2F8dXoC0vl17R0KbcLy3vbC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;124&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대상 그룹 생성 탭에 들어가 빈 타겟 그룹을 생성해준 뒤 돌아와서 생성한 대상 그룹을 선택해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Auto-Scailing 그룹 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 Auto-Scailing 그룹을 생성해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서도 2개의 가용 영역을 생성해주는데 서브넷은 프라이빗 서브넷에 위치시킨다. (EC2 인스턴스가 프라이빗 서브넷에 생성되어야 하므로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 로드 밸런서에 연결하는 설정을 해주고 위에서 만들었던 로드 밸런서 대상 그룹을 선택해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금부터가 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3AaK3/dJMcafeWump/shEC3qrWdIIQfA4FzzHAmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3AaK3/dJMcafeWump/shEC3qrWdIIQfA4FzzHAmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3AaK3/dJMcafeWump/shEC3qrWdIIQfA4FzzHAmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3AaK3%2FdJMcafeWump%2FshEC3qrWdIIQfA4FzzHAmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;471&quot; height=&quot;431&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;ELB 상태 확인 켜기&quot;를 체크해주고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXkImk/dJMcai3H1H1/gHVZHp9SHk7u2KnsiuCRkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXkImk/dJMcai3H1H1/gHVZHp9SHk7u2KnsiuCRkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXkImk/dJMcai3H1H1/gHVZHp9SHk7u2KnsiuCRkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXkImk%2FdJMcai3H1H1%2FgHVZHp9SHk7u2KnsiuCRkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;473&quot; height=&quot;291&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 용량, 최소 용량, 최대 용량을 정의한 뒤 정책 이름을 설정해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brg4pN/dJMcagZaxAH/LGE59yKciOqDGmUUMM2BQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brg4pN/dJMcagZaxAH/LGE59yKciOqDGmUUMM2BQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brg4pN/dJMcagZaxAH/LGE59yKciOqDGmUUMM2BQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrg4pN%2FdJMcagZaxAH%2FLGE59yKciOqDGmUUMM2BQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;197&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표 CPU 사용률은 70%로 설정한다. 평균 CPU 사용률이 70%를 넘어서면 Auto-Scailing이 인스턴스를 늘려야겠다라고 판단해 새로운 인스턴스를 생성한다. 여기서 새로운 인스턴스는 기존에 생성된 인스턴스 스펙과 동일하게 생성된다. (아까 만든 시작 템플릿을 바탕으로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhy2Q2/dJMcajuOoec/4EmwlonEAboI2B87Du7c21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhy2Q2/dJMcajuOoec/4EmwlonEAboI2B87Du7c21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhy2Q2/dJMcajuOoec/4EmwlonEAboI2B87Du7c21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhy2Q2%2FdJMcajuOoec%2F4EmwlonEAboI2B87Du7c21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;68&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분을 체크해주면 CloudWatch에서 지표를 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFiLev/dJMcabDz9W2/nMw0R8J0d39GGQvDl3DKXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFiLev/dJMcabDz9W2/nMw0R8J0d39GGQvDl3DKXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFiLev/dJMcabDz9W2/nMw0R8J0d39GGQvDl3DKXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFiLev%2FdJMcabDz9W2%2FnMw0R8J0d39GGQvDl3DKXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;71&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 88번 포트로 접속하면 잘 뜨는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평균 CPU 사용률이 70%가 넘어가면 인스턴스가 최대 3개까지 늘어나도록 설정했다. 필요시 사용률이 줄어들면 인스턴스가 줄어들도록 scale in 정책을 만들 수 있다. 이 부분도 평균 CPU 사용률을 정의해주면 해당 값 이하로 떨어질 경우 Auto-Scailing이 인스턴스 갯수를 줄인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1698&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSaP2e/dJMcagky3g5/Y7j1qqWtPnJg3LZFvN3hm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSaP2e/dJMcagky3g5/Y7j1qqWtPnJg3LZFvN3hm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSaP2e/dJMcagky3g5/Y7j1qqWtPnJg3LZFvN3hm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSaP2e%2FdJMcagky3g5%2FY7j1qqWtPnJg3LZFvN3hm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;277&quot; data-origin-width=&quot;1698&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CloudWatch 콘솔에 접속해 지표를 보면 CPU 사용률을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(미처 CloudWatch에서 지표 확인 화면을 캡처하지 못해 비슷한 상황인 다른 사용자의 CloudWatch 이미지를 가져왔다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경보 알람이 발생하면 Auto-Scailing이 발생하고 인스턴스가 늘어나고 줄어드는 동작을 진행한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1dwJQ/dJMcagrk6AQ/HqlycaDAT8Gtpv76ih7RC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1dwJQ/dJMcagrk6AQ/HqlycaDAT8Gtpv76ih7RC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1dwJQ/dJMcagrk6AQ/HqlycaDAT8Gtpv76ih7RC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1dwJQ%2FdJMcagrk6AQ%2FHqlycaDAT8Gtpv76ih7RC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;356&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Auto-Scailing 흐름을 보면 이런 느낌일 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 구성한 실습을 보면 이러하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALB가 퍼블릭 서브넷에 위치하여 외부 손닙을 맞이하는 입구 역할을 하고 EC2는 프라이빗 서브넷에 숨서어 실제 서비스를 제공한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;외부 사용자는 ALB(88포트)로 들어오고, ALB는 내부망을 통해 EC2(80포트)로 연결을 토스한다. 인스턴스는 공인 IP가 없어도 ALB 덕분에 안전하게 서비스할 수 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작 템플릿은 서버를 만들 때 필요한 붕어빵 틀이라고 생각하면 편하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Auto-Scailing 그룹을 생성하고 scale out(확장), scale in(축소) 정책을 생성해 CPU 부하에 따라서 시작 템플릿을 활용해 서버를 자동으로 생성하고 삭제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 궁금증이 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&quot;그럼 CPU 사용률이 떨어져 인스턴스가 삭제될 때 해당 인스턴스에 남아있는 사용자는 안 튕기나?&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제 결정이 내려진 서버에는 더 이상 새로운 사용자를 보내지 않는다.(배수 상태, Draining) 이미 접속 중인 손님이 볼일을 마칠 때까지 설정된 시간(기본 300초)동안 기다려 준다. 시간이 다 되면 사용자가 남아있더라도 연결을 끊고 서버를 종료한다. (이때 브라우저는 자동으로 다른 살아있는 서버에 재접속을 시도한다.) 그래서 사용자 입장에서는 잠깐의 딜레이가 발생하고 다른 큰 이슈 없이 사용할 수 있게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 인프라륵 구축하는 것도 중요하지만 이 속에서 &quot;사용자가 장애를 느끼지 않게 하는 것&quot;이 가장 큰 핵심인 것 같다. ALB와 Auto-Scailing의 조합은 단순한 자동화를 넘어 서비스의 연속성을 보장하는 강력한 도구인 것 같다.&lt;/p&gt;</description>
      <category>Infra/AWS</category>
      <author>minseoki</author>
      <guid isPermaLink="true">https://minseokk.tistory.com/13</guid>
      <comments>https://minseokk.tistory.com/13#entry13comment</comments>
      <pubDate>Tue, 24 Mar 2026 16:06:32 +0900</pubDate>
    </item>
    <item>
      <title>클라우드 환경에서 DB를 어떻게 안전하고 효율적으로 관리할까? (feat. AWS RDS)</title>
      <link>https://minseokk.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 EC2에 MySQL을 깔아서 DB를 사용할 수 있다. 그럼에도 RDS라는 서비스가 존재하며 왜 비싼 RDS를 사용하는지 생각해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답은 &quot;운영의 자동화&quot; 부분에 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 RDS 서비스가 뭔지 가볍게 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RDS란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS가 제공하는 관계형 데이터베이스 서비스다. 이 서비스는 EC2에 비해서 상대적으로 비싸지만 대부분의 사용자들이 이 서비스를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 점을 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;하드웨어 및 OS 관리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RDS는 서버 장비 교체, OS 보안 패치 등을 알아서 처리한다. (AWS 측에서)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;백업 및 복구&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 시점으로의 복구 (Point-in-Time Recovery)가 클릭 한 번으로 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;확장성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS 콘솔에서 DB 사양을 높이거나 저장 공간을 쉽게 늘리고 줄일 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;고가용성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Multi-AZ 기능을 통해 데이터 센터 장애가 발생 시 서비스가 중단되지 않도록 해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 사용자 대신 AWS 측에서 귀찮은 일처리들을 대신 처리해주며 편의성과 고가용성을 강조한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습 과정을 통해 좀 더 깊이있게 다뤄보도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RDS는 반드시 서브넷 그룹에 만들어야 한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷 그룹이란 두 개 이상의 서브넷 묶음을 말한다. DB를 만들 때는 반드시 두 개 이상의 가용 영역에 걸쳐서 만드는 걸 강제한다. AWS의 고가용성 원칙 때문이다. 만약 한쪽의 가용 영역에만 DB를 두었는데 해당 데이터 센터가 중단되는 상황이 생기면 서비스에 장애가 발생한다. 하지만 서브넷 그룹을 통해 묶어둔다면 메인 DB에 문제가 생겼을 때 AWS가 즉시 다른 가용 영역에 있는 예비 DB로 서비스를 전환해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;922&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tBELF/dJMcadg4NRL/uDKhutbWQ2kqiceR7LyzC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tBELF/dJMcadg4NRL/uDKhutbWQ2kqiceR7LyzC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tBELF/dJMcadg4NRL/uDKhutbWQ2kqiceR7LyzC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtBELF%2FdJMcadg4NRL%2FuDKhutbWQ2kqiceR7LyzC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;567&quot; height=&quot;408&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;922&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 RDS를 생성할 때 두개의 서브넷을 지정해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMfoQH/dJMcajat5dy/0yMxDk7afpudFxTlx1PyKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMfoQH/dJMcajat5dy/0yMxDk7afpudFxTlx1PyKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMfoQH/dJMcajat5dy/0yMxDk7afpudFxTlx1PyKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMfoQH%2FdJMcajat5dy%2F0yMxDk7afpudFxTlx1PyKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;326&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들고자 하는 내용을 도식화 하자면 위와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDS를 생성했다면 DB 인스턴스를 생성해줄 차례다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL을 선택해주고 자격 증명(마스터 사용자 이름, 마스터 암호)설정한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uImM0/dJMcabctfEw/dxx2oFGF93244ytcGzttq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uImM0/dJMcabctfEw/dxx2oFGF93244ytcGzttq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uImM0/dJMcabctfEw/dxx2oFGF93244ytcGzttq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuImM0%2FdJMcabctfEw%2Fdxx2oFGF93244ytcGzttq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;538&quot; height=&quot;294&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결 설정에서 기존에 만들었던 VPC를 선택하고 DB 서브넷 그룹, VPC 보안 그룹, 데이터베이스 포트(3306), 초기 데이터베이스 이름(testdb) 등 기본 설정을 진행한 뒤 데이터베이스를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 필자는 DB용 서브넷을 인터넷 게이트웨이로 향하는 경로가 없는 프라이빗 서브넷으로 구성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9D7mD/dJMcahRiQ33/AT9tWKPLJP8xDo1ttyZh90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9D7mD/dJMcahRiQ33/AT9tWKPLJP8xDo1ttyZh90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9D7mD/dJMcahRiQ33/AT9tWKPLJP8xDo1ttyZh90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9D7mD%2FdJMcahRiQ33%2FAT9tWKPLJP8xDo1ttyZh90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;278&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 RDS에 접속하여 &lt;b&gt;show databases; &lt;/b&gt;명령을 입력해 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZKGWf/dJMcaaLqtzd/1gg4PpFVspe9m0UEcCGwfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZKGWf/dJMcaaLqtzd/1gg4PpFVspe9m0UEcCGwfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZKGWf/dJMcaaLqtzd/1gg4PpFVspe9m0UEcCGwfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZKGWf%2FdJMcaaLqtzd%2F1gg4PpFVspe9m0UEcCGwfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;307&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;RDS가 프라이빗 서브넷에 있으므로 직접적인 접근이 불가능하다. 따라서 퍼블릭 서브넷에 bastion 서버를 생성해 RDS에 접근할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bastion 서버를 생성했다면 접속하여 mysql을 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;apt update -y &amp;amp;&amp;amp; apt install mariadb-client-core -y (mysql 설치 명령)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQMDRf/dJMcabjhQ5V/TU9eLVDMnKz3j1O1YfjH8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQMDRf/dJMcabjhQ5V/TU9eLVDMnKz3j1O1YfjH8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQMDRf/dJMcabjhQ5V/TU9eLVDMnKz3j1O1YfjH8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQMDRf%2FdJMcabjhQ5V%2FTU9eLVDMnKz3j1O1YfjH8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;829&quot; height=&quot;80&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 RDS 엔드포인트로 접속을 한다. RDS 생성할 때 설정한 마스터 사용자 이름과 마스터 암호를 입력해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b79qNG/dJMb99TgYH9/r3HIOiLuQTRSOGfbfTkhx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b79qNG/dJMb99TgYH9/r3HIOiLuQTRSOGfbfTkhx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b79qNG/dJMb99TgYH9/r3HIOiLuQTRSOGfbfTkhx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb79qNG%2FdJMb99TgYH9%2Fr3HIOiLuQTRSOGfbfTkhx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;346&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDS 생성 화면에서는 따로 정책 편집을 하지 못하므로 RDS 생성 후 반드시 보안그룹 정책을 수정해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC 보안그룹으로 이동해서 인바운드 규칙을 편집해준다.(RDS 접근 가능하도록)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트용이니 모든 대역에서 접근이 가능하도록 수정해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로는 0.0.0.0/0으로 인바운드 규칙을 열어주는 것은 위험하다. 접근 가능한 것들만 지정해서 DB에 접근할 수 있도록 해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 DB에 접근이 가능해졌으니 다시 접속해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs0UaQ/dJMcacvJea0/Lklil6TetkCkwqXkvFDbt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs0UaQ/dJMcacvJea0/Lklil6TetkCkwqXkvFDbt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs0UaQ/dJMcacvJea0/Lklil6TetkCkwqXkvFDbt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs0UaQ%2FdJMcacvJea0%2FLklil6TetkCkwqXkvFDbt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;636&quot; height=&quot;272&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속 후 &lt;b&gt;show databases;&amp;nbsp;&lt;/b&gt;명령을 쳐보면 아까 RDS 생성 시 설정한 초기 데이터베이스 이름(testdb)이 잘 뜨는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDS 서비스를 잘 다룰 수 있다면 엄청난 편의성과 고가용성을 챙겨 인프라 운영 관리 측면에서 매우 이득을 볼 수 있을거라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDS는 클릭 몇 번으로 업무를 자동화 해주지만 그 바탕에는 탄탄한 VPC 설계와 서브넷 그룹, 민감한 보안그룹 설정이 이루어져야한다. 이번 실습에서는 0.0.0.0/0으로 모든 대역에서 접근가능하도록 허용하였지만 실무에서는 반드시 특정 IP로 제한하여 영향을 받지 않도록 구성해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Infra/AWS</category>
      <author>minseoki</author>
      <guid isPermaLink="true">https://minseokk.tistory.com/12</guid>
      <comments>https://minseokk.tistory.com/12#entry12comment</comments>
      <pubDate>Tue, 24 Mar 2026 00:48:10 +0900</pubDate>
    </item>
    <item>
      <title>가상 네트워크 만들기 - AWS VPC 설계 및 프라이빗 서브넷 통신</title>
      <link>https://minseokk.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 AWS VPC와 NAT-Gateway을 실습을 통해 습득한 내용을 포스팅하고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(단계적으로 실습을 하며 개념을 익히는 과정에 대해 설명한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습 및 포스팅 순서는 VPC 생성, Internet-Gateway, Subnet, Route Table 마지막으로 Nat-Gateway를 학습하며 마무리 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;VPC (Virtual Private Cloud)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC는 &amp;nbsp;AWS 클라우드 내에 논리적으로 격리된 가상 네트워크 공간이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독립적인 사설 네트워크로 일반적으로 VPC는 다른 VPC 끼리 통신이 안된다. 디른 VPC끼리 통신이 되게끔 하려면 VPN이나 VPC peering, Transit Gateway 가튼 특수한 방법을 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물리적으로는 떨어져있지만 논리적으로는 같은 공간에 있는 것 처럼 구성하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 VPC를 생성해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/so5LU/dJMcaaScp7o/oM67sTyujnARXsIPFeKMb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/so5LU/dJMcaaScp7o/oM67sTyujnARXsIPFeKMb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/so5LU/dJMcaaScp7o/oM67sTyujnARXsIPFeKMb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fso5LU%2FdJMcaaScp7o%2FoM67sTyujnARXsIPFeKMb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;390&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 설정하여 폐쇄된 사설 네트워크를 생성했다. 이 VPC에 속한 서브넷들은 반드시 10.10.0.0/16 대역을 벗어날 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRtpSR/dJMcabDyCI6/ahtq5z8tgYF5IWJy8eUc8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRtpSR/dJMcabDyCI6/ahtq5z8tgYF5IWJy8eUc8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRtpSR/dJMcabDyCI6/ahtq5z8tgYF5IWJy8eUc8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRtpSR%2FdJMcabDyCI6%2Fahtq5z8tgYF5IWJy8eUc8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;456&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC를 생성하면 반드시 DNS 설정을 해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수동으로 VPC를 생성하면 이 옵션이 꺼져 있다. 다른 사람이 읽기 편한 영문 주소(도메인)로 서버에 접속하고, AWS의 다른 서비스(RDS, ALB 등)들과 문제없이 통신하기 위해 반드시 설정해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC를 성공적으로 생성했다면 인터넷 게이트웨이를 설정해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Internet Gateway(IGW - 인터넷 게이트웨이)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC와 인터넷 사이의 통로 역할을 하는 관문이다. 이 설정이 있어야 외부(인터넷)와 양방향 통신이 가능해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CMFJV/dJMcafTuyR5/PTKcAhyGQVgkKLJDpLym11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CMFJV/dJMcafTuyR5/PTKcAhyGQVgkKLJDpLym11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CMFJV/dJMcafTuyR5/PTKcAhyGQVgkKLJDpLym11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCMFJV%2FdJMcafTuyR5%2FPTKcAhyGQVgkKLJDpLym11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;703&quot; height=&quot;474&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리소스를 만들 땐 이름만 봐도 어떤 성질이며, 어디에 속해 있는지 알 수 있도록 하는게 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJdLe6/dJMcahjuNaQ/5CVKHtpxq9H1ISdUkmPJbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJdLe6/dJMcahjuNaQ/5CVKHtpxq9H1ISdUkmPJbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJdLe6/dJMcahjuNaQ/5CVKHtpxq9H1ISdUkmPJbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJdLe6%2FdJMcahjuNaQ%2F5CVKHtpxq9H1ISdUkmPJbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;325&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 게이트웨이를 생성해주고 아까 생성한 VPC에 연결해준다. 그럼 VPC의 열린문(인터넷 게이트웨이) 설정이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 서브넷을 생성해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Subnet(서브넷)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC를 더 작은 단위로 쪼갠 네트워크이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷에는 퍼블릭(Public) 서브넷과 프라이빗(Private) 서브넷이 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;퍼블릭 서브넷 (Public Subnet)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VPC 외부와 통신이 되는 서브넷(인바운드-아웃바운드 둘 다 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프라이빗 서브넷 (Private Subnet)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VPC 내부에서만 통신이 가능한 서브넷, 때에 따라서 아웃바운드 가능(NAT-GW)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 퍼블릭 서브넷을 생성해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;1510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVm5Nu/dJMcaaYVJKV/SCrz7x7Ov9oS6StEXvXthk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVm5Nu/dJMcaaYVJKV/SCrz7x7Ov9oS6StEXvXthk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVm5Nu/dJMcaaYVJKV/SCrz7x7Ov9oS6StEXvXthk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVm5Nu%2FdJMcaaYVJKV%2FSCrz7x7Ov9oS6StEXvXthk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;760&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;1510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC라는 아파트 단지를 생성했다면 서브넷에서 CIDR을 통해 아파트 동을 지정해주는 개념이라고 이해하면 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퍼블릭 서브넷을 생성했다면 반드시 해줘야 하는 설정이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퍼블릭 IP 자동 부여, 영문 주소 활성화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 퍼블릭 서브넷을 만들 땐 항상 이 두 옵션을 체크해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;982&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btJAhZ/dJMcaio9ixn/DBNnNk3CvDDwY2TV3JTA90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btJAhZ/dJMcaio9ixn/DBNnNk3CvDDwY2TV3JTA90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btJAhZ/dJMcaio9ixn/DBNnNk3CvDDwY2TV3JTA90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtJAhZ%2FdJMcaio9ixn%2FDBNnNk3CvDDwY2TV3JTA90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;508&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;982&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷 설정 편집에 들어가서 해당 설정을 해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 프라이빗 서브넷을 생성해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KtIez/dJMcahcGInB/IPM4ZdNjXU6NpGcC6epaLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KtIez/dJMcahcGInB/IPM4ZdNjXU6NpGcC6epaLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KtIez/dJMcahcGInB/IPM4ZdNjXU6NpGcC6epaLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKtIez%2FdJMcahcGInB%2FIPM4ZdNjXU6NpGcC6epaLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;485&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프라이빗 서브넷은 외부에서 찾아오지 못하도록 하는 것이 핵심이라 위에서 해줬던 설정을 안해줘도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷까지 생성했다면 이번엔 라우팅 테이블을 생성해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Route Table(라우팅 테이블)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 테이블은 네트워크의 이정표 역할이다. 패킷이 어디로 가야 할지(Next-hop) 경로를 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn6M73/dJMcahKx8LI/ZxdyhmfyWwUKMkHITwYUfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn6M73/dJMcahKx8LI/ZxdyhmfyWwUKMkHITwYUfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn6M73/dJMcahKx8LI/ZxdyhmfyWwUKMkHITwYUfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn6M73%2FdJMcahKx8LI%2FZxdyhmfyWwUKMkHITwYUfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;685&quot; height=&quot;630&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷을 만들면 이 라우팅 테이블이 기본적으로 선택(비명시)된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프라이빗 서브넷(내부에서만 통신이 가능)의 라우팅 테이블 정책과 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 기본 정책에서 이름을 바꿔 프라이빗 라우팅 테이블로 사용할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcYx6m/dJMcadH5vq2/V6dEWmLKoKEcpF1U2s1B7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcYx6m/dJMcadH5vq2/V6dEWmLKoKEcpF1U2s1B7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcYx6m/dJMcadH5vq2/V6dEWmLKoKEcpF1U2s1B7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcYx6m%2FdJMcadH5vq2%2FV6dEWmLKoKEcpF1U2s1B7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;649&quot; height=&quot;446&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷 연결은 이 라우팅 테이블을 선택한 서브넷들을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퍼블릭 라우팅 테이블을 생성해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;852&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lunCf/dJMcaduxc2P/gFskkvK41VYz8oSGQqRuj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lunCf/dJMcaduxc2P/gFskkvK41VYz8oSGQqRuj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lunCf/dJMcaduxc2P/gFskkvK41VYz8oSGQqRuj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlunCf%2FdJMcaduxc2P%2FgFskkvK41VYz8oSGQqRuj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;364&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;852&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 테이블을 생성해였다면 라우팅 편집에 들어가 아까 생성한 인터넷 게이트웨이를 추가해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;1190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JfdGx/dJMcabXQ3vj/Pe5MTXPXXPskt1g9ahggXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JfdGx/dJMcabXQ3vj/Pe5MTXPXXPskt1g9ahggXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JfdGx/dJMcabXQ3vj/Pe5MTXPXXPskt1g9ahggXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJfdGx%2FdJMcabXQ3vj%2FPe5MTXPXXPskt1g9ahggXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;447&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;1190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO3eMN/dJMcadaeEPl/jJzpvWyL2nzj30UDS52Ve0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO3eMN/dJMcadaeEPl/jJzpvWyL2nzj30UDS52Ve0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO3eMN/dJMcadaeEPl/jJzpvWyL2nzj30UDS52Ve0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO3eMN%2FdJMcadaeEPl%2FjJzpvWyL2nzj30UDS52Ve0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;289&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 추가했다면 라우팅 섹션에 표시된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 퍼블릭 라우팅 테이블을 퍼블릭 서브넷에 연결해줘야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zABna/dJMb996N2EE/pSekVpkEsJ4SskMi0hRaSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zABna/dJMb996N2EE/pSekVpkEsJ4SskMi0hRaSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zABna/dJMb996N2EE/pSekVpkEsJ4SskMi0hRaSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzABna%2FdJMb996N2EE%2FpSekVpkEsJ4SskMi0hRaSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;389&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계까지 잘 구성했다면 아래와 같은 다이어그램처럼 VPC 구성이 되었을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjCxVr/dJMcaibCLLP/b8zV8sId7nAn7dODNHwGr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjCxVr/dJMcaibCLLP/b8zV8sId7nAn7dODNHwGr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjCxVr/dJMcaibCLLP/b8zV8sId7nAn7dODNHwGr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjCxVr%2FdJMcaibCLLP%2Fb8zV8sId7nAn7dODNHwGr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;354&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 구성한 내용으로 Bastion 서버를 통한 프라이빗 서브넷 인스턴스에 ssh로 접근하는 실습을 진행해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습 상황은 아래와 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프라이빗 서브넷에 인스턴스를 생성할 때 서브넷 설정 편집은 하지말고 퍼블릭 IP를 억지로 부여받도록 한다.&lt;/li&gt;
&lt;li&gt;보안 그룹은 모든 트래픽을 모든 대역에 허용하는 정책을 생성한다.&lt;/li&gt;
&lt;li&gt;노트북으로 해당 인스턴스로 통신(ping)이 되는지 확인한다.&lt;/li&gt;
&lt;li&gt;인바운드, 아웃바운드를 검증한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IR1Ga/dJMcahKx80w/0z0ktcjg0DMYTZ5AS8svQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IR1Ga/dJMcahKx80w/0z0ktcjg0DMYTZ5AS8svQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IR1Ga/dJMcahKx80w/0z0ktcjg0DMYTZ5AS8svQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIR1Ga%2FdJMcahKx80w%2F0z0ktcjg0DMYTZ5AS8svQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;298&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다이어그램을 구성해보면 이런 흐름이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 프라이빗 서브넷은 라우팅 테이블 상에 외부(0.0.0.0/0)로 향하는 트래픽은 발생할 수 없기 때문에 노트북과 직접 통신은 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, bastion 서버를 통해 접근해야 한다는 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 구성했던 VPC를 활용해서 프라이빗 서브넷에 퍼블릭 IP를 달고 있는 인스턴스(A)를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKXcwr/dJMcadVCBSj/bH8iLIx4ENKIh9OFtGBzg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKXcwr/dJMcadVCBSj/bH8iLIx4ENKIh9OFtGBzg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKXcwr/dJMcadVCBSj/bH8iLIx4ENKIh9OFtGBzg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKXcwr%2FdJMcadVCBSj%2FbH8iLIx4ENKIh9OFtGBzg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;567&quot; height=&quot;209&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 그룹은 모든 트래픽을 모든 대역에 허용하는 정책을 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스를 생성해도 노트북에서는 프라이빗 서브넷으로 접속이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 경유해서 접속할 bastion(퍼블릭) 서버를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 그룹은 위에서 생성한 보안 그룹을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ssh를 통해 bastion 서버에 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 프라이빗 인스턴스에 접속해야 하기 때문에 프라이빗 키가 필요하다. 이 키 값은 내 노트북에 있을 것이고 bastion 서버안에는 없기에 노트북에서 bastion 서버로 scp 명령어를 사용해 전송해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전송이 되었다면 ssh를 통해 bastion 서버에서 프라이빗 인스턴스로 접속해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(전송 과정에서 키 권한이 헐거워서 경고 메시지가 뜰 수도 있다. 그럼 chmod 400 &amp;lt;키파일이름&amp;gt; 을 통해 권한 설정을 변경해준 후 다시 접속한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9wVXS/dJMcaf0eiHG/ubPoBRmn8y1va4cajScZb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9wVXS/dJMcaf0eiHG/ubPoBRmn8y1va4cajScZb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9wVXS/dJMcaf0eiHG/ubPoBRmn8y1va4cajScZb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9wVXS%2FdJMcaf0eiHG%2FubPoBRmn8y1va4cajScZb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;289&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속 후 노트북에서 퍼블릭 IP를 강제로 할당받은 프라이빗 서버로 ping을 보내면 실패한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IuX5u/dJMcad2nB1s/PbzAiQkeu8CKIhuemKr95K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IuX5u/dJMcad2nB1s/PbzAiQkeu8CKIhuemKr95K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IuX5u/dJMcad2nB1s/PbzAiQkeu8CKIhuemKr95K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIuX5u%2FdJMcad2nB1s%2FPbzAiQkeu8CKIhuemKr95K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;244&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인바운드가 들어오고 심지어 응답도 해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;근데 왜 통신이 안되고 ping을 보내면 실패할까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3bRIX/dJMcacoVp43/F4LkhoDfszsqtcKoLWMU01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3bRIX/dJMcacoVp43/F4LkhoDfszsqtcKoLWMU01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3bRIX/dJMcacoVp43/F4LkhoDfszsqtcKoLWMU01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3bRIX%2FdJMcacoVp43%2FF4LkhoDfszsqtcKoLWMU01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;422&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 그림을 보면 이해가 좀 될 거라 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노트북에서 프라이빗 서버로는 icmp 메시지가 잘 도달하지만, 프라이빗 서버가 보낸 icmp 응답 메시지는 노트북에 도달하지 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 원인은 프라이빗 인스턴스가 속해있는 서브넷에 외부(0.0.0.0/0)로 빠져나가기 위한 라우팅 정책이 없기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퍼블릭 IP 자체가 외부에서 통용되는 IP라서 당연히 통신이 되는건 맞지만, 결국 라우팅이 안되어있어서 통신이 될 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결국 외부로 향하기 위한 라우팅 테이블이 필요한 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 NAT-Gateway에 대해서 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NAT-Gateway&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PAT 개념과 비슷하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프라이빗 서브넷에 대해 아웃바운드 트래픽만 허용하고 싶을 때 구성한다. 프라이빗 서브넷 대역을 퍼블릭 서브넷 대역으로 NAT 하는 개념이라고 생각하면 된다. (퍼블릭 서브넷에 있으면 라우팅 테이블 정책에 의해 외부로 아웃바운드 통신이 가능하다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 VPC에 존재하는 리소스들이 통신이 되냐 안되냐의 차이는 기본적으로 공인 IP가 있냐 없냐로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공인 IP를 달고 있는 서버가 IGW를 Next-hop으로 라우팅이 되어있으면(=퍼블릭 서브넷에 있다면) 인바운드, 아웃바운드 통신이 다 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 프라이빗 서브넷에 존재하는 서버가 외부로 통신이 안되는 이유는 공인 IP도 없고 라우팅도 안되어있기 때문이다. 따라서 아웃바운드라도 가능하게 하기 위해 NAT-GW에 EIP(Elastic IP, 탄력적 IP)를 붙여서 PAT를 해준다고 생각하면 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(깨알 정보, NAT-GW는 AWS에서 과금요소가 많기 때문에 사용하고 끄는게 좋다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAT-GW는 퍼블릭 서브넷에 존재한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hv43T/dJMcaiWVXZv/zsPvJ8JwMkZmVJOKidIPe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hv43T/dJMcaiWVXZv/zsPvJ8JwMkZmVJOKidIPe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hv43T/dJMcaiWVXZv/zsPvJ8JwMkZmVJOKidIPe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHv43T%2FdJMcaiWVXZv%2FzsPvJ8JwMkZmVJOKidIPe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;277&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAT-GW를 생성할 때 연결 유형을 반드시 퍼블릭으로 해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성했다면 라우팅 정책을 추가해줘야 한다. 대상을 0.0.0.0/0으로 하고 NAT-GW를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAT-GW 설정이 완료되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 프라이빗 서브넷에서 아웃바운드가 가능해졌다.&lt;/p&gt;</description>
      <category>Infra/AWS</category>
      <author>minseoki</author>
      <guid isPermaLink="true">https://minseokk.tistory.com/11</guid>
      <comments>https://minseokk.tistory.com/11#entry11comment</comments>
      <pubDate>Sun, 22 Mar 2026 21:50:40 +0900</pubDate>
    </item>
    <item>
      <title>grafana로 서버 모니터링 하기 (feat. telegraf, influxDB, node_expoter, prometheus)</title>
      <link>https://minseokk.tistory.com/10</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 CentOS 환경에서 VM 템플릿을 활용한 효율적인 인프라 배포부터 시작하여, 현대 모니터링의 표준이라 불리는 두 가지 조합인 [Telegraf + InfluxDB + Grafana] 와 [Prometheus + &amp;nbsp;Node Exporter + Grafana] 시스템을 직접 구축해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[Telegraf + InfluxDB + Grafana]&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 수집 - Telegraf&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 서버의 어떤 리소스(CPU, RAM, 스토리 입출력... 등 내가 원하는 대부분의 리소스의 상태, 사용량)를 얼마의 간격으로 수집할지 결정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 저장 - InfluxDB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시계열(tme-series) DB, 일정한 시간 간격으로 수집된 데이터를 DB에 저장.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 시각화 - Grafana&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장된 데이터를 토대로 그래프를 그리거나 수치를 표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boROxe/dJMcagLxHua/nhqPUy8AjpwyzK3If7bpek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boROxe/dJMcagLxHua/nhqPUy8AjpwyzK3If7bpek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boROxe/dJMcagLxHua/nhqPUy8AjpwyzK3If7bpek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboROxe%2FdJMcagLxHua%2FnhqPUy8AjpwyzK3If7bpek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;318&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성하고자 하는 모니터링 구성 흐름.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모니터링하고자 하는 서버에는 agent가 설치되어있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 모니터링 대상 서버에 설치된 Telegraf(agent)가 자료를 수집(input)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 수집한 자료를 output을 통해 InfluxDB에 저장시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 저장된 데이터 소스를 Grafana가 가져와서 시각화(Dashboard) 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Telegraf&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Telegraf 및 InfluxDB 설치를 위한 레포 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773472380990&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 0
gpgkey = https://repos.influxdata.com/influxdb.key
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* tea 명령은 cat이랑 결과물은 동일하나 한 번 더 출력해주는 명령이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773472448896&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yum install -y telegraf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Telegraf 먼저 설치해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773472547850&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi /etc/telegraf/telegraf.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Telegraf 설정 파일.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;어떻게 수집할지&quot; 와 &quot;어떻게 저장할지&quot;를 설정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;telegraf.conf 에 넣을 내용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773472609709&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[global_tags]

# Configuration for telegraf agent
[agent]
    interval = &quot;10s&quot;
    debug = false
    hostname = &quot;server-hostname&quot;
    round_interval = true
    flush_interval = &quot;10s&quot;
    flush_jitter = &quot;0s&quot;
    collection_jitter = &quot;0s&quot;
    metric_batch_size = 1000
    metric_buffer_limit = 10000
    quiet = false
    logfile = &quot;&quot;
    omit_hostname = false

###############################################################################
#                                  OUTPUTS                                    #
###############################################################################

[[outputs.influxdb]]
    urls = [&quot;http://localhost:8086&quot;] # InfluxDB가 설치된 서버의 IP를
    database = &quot;telegraf&quot; # 데이터베에스 이름, 생성이 되어있지 않으면 자동 생성됨
    timeout = &quot;10s&quot;
    username = &quot;admin&quot; # InfluXDB 기본 계정
    password = &quot;admin&quot;
    retention_policy = &quot;&quot;

###############################################################################
#                                  INPUTS                                     #
###############################################################################

[[inputs.cpu]]
    percpu = true
    totalcpu = true
    collect_cpu_time = false
    report_active = false
[[inputs.disk]]
    ignore_fs = [&quot;tmpfs&quot;, &quot;devtmpfs&quot;, &quot;devfs&quot;]
[[inputs.diskio]]
[[inputs.mem]]
[[inputs.net]]
[[inputs.system]]
[[inputs.swap]]
[[inputs.netstat]]
[[inputs.processes]]
[[inputs.kernel]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. InfluxDB 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773472639411&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yum install -y influxdb-1.8.10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InfluxDB를 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InfluxDB의 기본 포트는 8086이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773472672247&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;systemctl enable --now influxdb&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OVMmq/dJMcaaYPyQy/N5dKHzUSGk8X1RMjeKDwr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OVMmq/dJMcaaYPyQy/N5dKHzUSGk8X1RMjeKDwr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OVMmq/dJMcaaYPyQy/N5dKHzUSGk8X1RMjeKDwr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOVMmq%2FdJMcaaYPyQy%2FN5dKHzUSGk8X1RMjeKDwr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;554&quot; height=&quot;98&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB로 진입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773472713779&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;systemctl enable --now telegraf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/babFW5/dJMcaiWPTcL/qOy1f4Li1l0Qxj9b0gP0Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/babFW5/dJMcaiWPTcL/qOy1f4Li1l0Qxj9b0gP0Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/babFW5/dJMcaiWPTcL/qOy1f4Li1l0Qxj9b0gP0Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbabFW5%2FdJMcaiWPTcL%2FqOy1f4Li1l0Qxj9b0gP0Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;564&quot; height=&quot;252&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Telegraf에서 output 된 자료들이 InfluxDB에 저장되는걸 확인 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Grafana&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773472788801&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | tee /etc/yum.repos.d/grafana.repo
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=0
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grafana 설치 레포 추가.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773472813282&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yum install -y grafana&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grafana를 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grafana의 기본 포트는 3000번이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773472844059&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;systemctl enable --now grafana-server&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grafana 서버를 실행시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7tf76/dJMcabDssis/B6Vuppkq7RdDbDEKXMyOE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7tf76/dJMcabDssis/B6Vuppkq7RdDbDEKXMyOE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7tf76/dJMcabDssis/B6Vuppkq7RdDbDEKXMyOE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7tf76%2FdJMcabDssis%2FB6Vuppkq7RdDbDEKXMyOE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;364&quot; height=&quot;68&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹브라우저를 통해 접속하여 서버에 잘 설치되었는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3000번 포트를 통해 서비스를 제공하고있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ylATk/dJMcajuGDzC/aFkqUCYDBDnLLlL7p5swZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ylATk/dJMcajuGDzC/aFkqUCYDBDnLLlL7p5swZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ylATk/dJMcajuGDzC/aFkqUCYDBDnLLlL7p5swZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FylATk%2FdJMcajuGDzC%2FaFkqUCYDBDnLLlL7p5swZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;461&quot; height=&quot;427&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 telegraf.conf 파일에 ID 와 Password 설정을 'admin'으로 했기 때문에 입력 후 로그인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 시각화 할 Datasource 명시(InfluxDB)하고 Datasource의 형태에 맞는 Dashboard를 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dashboard는 보통 타인이 만들어 놓은 걸 import 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRLTGc/dJMcach3TaV/VGVQSWMSdkgksmcABKxasK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRLTGc/dJMcach3TaV/VGVQSWMSdkgksmcABKxasK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRLTGc/dJMcach3TaV/VGVQSWMSdkgksmcABKxasK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRLTGc%2FdJMcach3TaV%2FVGVQSWMSdkgksmcABKxasK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;217&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Datasource 구성과 시각화&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽에 DATA SOURCES 탭을 눌러 InfluxDB를 선택 후 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/opAEU/dJMcacbhPI8/BmjWpB02oEU4BTYeJ0ixnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/opAEU/dJMcacbhPI8/BmjWpB02oEU4BTYeJ0ixnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/opAEU/dJMcacbhPI8/BmjWpB02oEU4BTYeJ0ixnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FopAEU%2FdJMcacbhPI8%2FBmjWpB02oEU4BTYeJ0ixnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;140&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 grafana와 InfluxDB는 같은 서버에 설치했기 때문에 localhost라고 해도 무방하다. 다만 포트는 당연히 InfluxDB의 포트를 명시해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/skVHy/dJMcaio275C/P1RmGxw1brKCmx3FrA6eS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/skVHy/dJMcaio275C/P1RmGxw1brKCmx3FrA6eS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/skVHy/dJMcaio275C/P1RmGxw1brKCmx3FrA6eS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FskVHy%2FdJMcaio275C%2FP1RmGxw1brKCmx3FrA6eS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;506&quot; height=&quot;104&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;telegraf.conf 파일에서 설정했던 값을 입력해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 단계까지 진행했으면 아래에 Save &amp;amp; test 버튼을 눌러 테스트를 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이제 대시보드를 세팅해보자.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다양한 대시보드들이 grafana.com에 존재한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ID만 copy 해서 import 해보자.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vGSNg/dJMcaaEyW21/PEqo1fYcqayALu8D1YA7Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vGSNg/dJMcaaEyW21/PEqo1fYcqayALu8D1YA7Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vGSNg/dJMcaaEyW21/PEqo1fYcqayALu8D1YA7Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvGSNg%2FdJMcaaEyW21%2FPEqo1fYcqayALu8D1YA7Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;538&quot; height=&quot;241&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFLvUh/dJMcaaLjkt9/JKy1xmTOgMJs870rtBIMg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFLvUh/dJMcaaLjkt9/JKy1xmTOgMJs870rtBIMg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFLvUh/dJMcaaLjkt9/JKy1xmTOgMJs870rtBIMg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFLvUh%2FdJMcaaLjkt9%2FJKy1xmTOgMJs870rtBIMg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;75&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Import dashboard 를 눌러 대시보드 템플릿 ID인 928을 입력해 import 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 대시보드상에 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;${DS_INFLUXDB_TELEGRAF} 를 통해 datasource로 접근 가능하도록 환경변수가 구성된 상태지만, 실제 환경변수는 존재하지 않는다. 따라서 대시보드의 설정에서 환경변수를 추가해줘야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qzr23/dJMcafeOIZp/pENuEVBsRz9P1VmnIVsNq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qzr23/dJMcafeOIZp/pENuEVBsRz9P1VmnIVsNq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qzr23/dJMcafeOIZp/pENuEVBsRz9P1VmnIVsNq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqzr23%2FdJMcafeOIZp%2FpENuEVBsRz9P1VmnIVsNq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;126&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dashboards 에 들어가 우측 상단에 Edit 버튼을 누르고 들어가 Settings를 눌러 대시보드를 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgo0bV/dJMcacbhPUZ/BtCtDUkF1eR7J9kTMa57j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgo0bV/dJMcacbhPUZ/BtCtDUkF1eR7J9kTMa57j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgo0bV/dJMcacbhPUZ/BtCtDUkF1eR7J9kTMa57j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcgo0bV%2FdJMcacbhPUZ%2FBtCtDUkF1eR7J9kTMa57j1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;545&quot; height=&quot;199&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Variables 탭에서 New variable 버튼을 눌러 새로운 환경변수를 등록해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE9juW/dJMcagdHBvk/7fv1wUeMu6OFGaeF3rj2vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE9juW/dJMcagdHBvk/7fv1wUeMu6OFGaeF3rj2vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE9juW/dJMcagdHBvk/7fv1wUeMu6OFGaeF3rj2vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE9juW%2FdJMcagdHBvk%2F7fv1wUeMu6OFGaeF3rj2vK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;544&quot; height=&quot;386&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVvQUJ/dJMcaio28tF/euyWHyoq7pKYkjDKV7fEzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVvQUJ/dJMcaio28tF/euyWHyoq7pKYkjDKV7fEzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVvQUJ/dJMcaio28tF/euyWHyoq7pKYkjDKV7fEzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVvQUJ%2FdJMcaio28tF%2FeuyWHyoq7pKYkjDKV7fEzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;345&quot; height=&quot;150&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수 이름을 등록해주고, 이 환경변수가 가리키는 대상은 InfluxDB임을 등록해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다 되었으면 우측 상단에 Save dashboard 버튼을 눌러 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQsgBG/dJMcadBbNDG/pJ4MbPEdtVeVlphJggU8W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQsgBG/dJMcadBbNDG/pJ4MbPEdtVeVlphJggU8W1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQsgBG/dJMcadBbNDG/pJ4MbPEdtVeVlphJggU8W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQsgBG%2FdJMcadBbNDG%2FpJ4MbPEdtVeVlphJggU8W1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;227&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대시보드를 통해 CPU, RAM, 스토리 입출력 등 내가 원하는 대부분의 리소스의 상태, 사용량 정보를 확인할 수 있게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;[Prometheus + &amp;nbsp;Node Exporter + Grafana]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 서버의 실시간 상태 정보를 자동으로 수집하고 저장하여 시각화하는 표준 오픈소스 모니터링 시스템 구축.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Node Exporter - 수집기 / agent&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버의 CPU 사용률, 남은 RAM 용량, 디스크 읽기/쓰기 속도 같은 로우(Raw) 데이터를 수집해서 9100번 포트에 텍스트 형태로 노출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Prometheus - 저장소 / 서버&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prometheus.yml 설정 파일에 등록된 대상(Node Exporter)를 주기적으로 방문하여 데이터를 긁어와 시계열 데이터베이스에 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Grafana - 시각화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prometheus에 저장된 복잡한 숫자 데이터를 가져와 그래프로 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Node Exporter 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773475372050&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget [https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz](https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node exporter 압축 파일을 wget 명령으로 다운로드 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;압축을 풀 때와 할 때의 명령어를 간단히 적어주겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;tar -xvf&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;-x : extract(해제), v : 과정출력, -f : 파일&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;tar -cvf&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;-c : 압축 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773475889526&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tar -xvf node_exporter-1.7.0.linux-amd64.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 받은 node_exporter 파일을 압축 해제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J5fr2/dJMcaaYPzEc/up7mxSoHJZa1MNtTdcDhZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J5fr2/dJMcaaYPzEc/up7mxSoHJZa1MNtTdcDhZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J5fr2/dJMcaaYPzEc/up7mxSoHJZa1MNtTdcDhZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ5fr2%2FdJMcaaYPzEc%2Fup7mxSoHJZa1MNtTdcDhZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;263&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;압축 해제 후 node_exporter-1.7.0.linux-amd64 경로로 들어가보면 초록색으로 node_exporter 파일이 생긴걸 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773476048381&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./node_exporter&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어로 실행시켜준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HXilh/dJMcajuGERV/MlGzkQqyOd6NNC9imr5Qsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HXilh/dJMcajuGERV/MlGzkQqyOd6NNC9imr5Qsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HXilh/dJMcajuGERV/MlGzkQqyOd6NNC9imr5Qsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHXilh%2FdJMcajuGERV%2FMlGzkQqyOd6NNC9imr5Qsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;529&quot; height=&quot;287&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약에 프로세스를 종료하고 싶다면, kill이나 pkill을 통해 종료시키면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pid 값은 그때그때 바뀐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773476189249&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl [http://211.183.3.90:9100/metrics](http://211.183.3.90:9100/metrics)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node exporter 가 잘 동작하는지 확인하려면 curl &amp;lt;주소&amp;gt; 명령을 통해 찍어보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Prometheus 설치&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773476245090&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;**wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz**&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wget 명령으로 prometheus를 설치해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773476295275&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tar -xvf prometheus-2.45.0.linux-amd64.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node exporter와 마찬가지로 tar -xvf 명령으로 압축을 해제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773476308805&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi prometheus.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi 명령으로 prometheus.yml 파일에 들어가 모니터링 대상인 prometheus를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpBp4Y/dJMcaaR6dMF/OgS9wjbXmZQCAJyIgGUuc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpBp4Y/dJMcaaR6dMF/OgS9wjbXmZQCAJyIgGUuc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpBp4Y/dJMcaaR6dMF/OgS9wjbXmZQCAJyIgGUuc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpBp4Y%2FdJMcaaR6dMF%2FOgS9wjbXmZQCAJyIgGUuc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;545&quot; height=&quot;238&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9100은 node_exporter 포트 번호이고, 9090은 prometheus 포트 번호다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773476403214&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./prometheus&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prometheus를 실행해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;웹 브라우저에서 http://211.183.3.90:9090/targets 경로로 접속해 잘 동작하는지 테스트해본다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3GgR2/dJMcafy6aQN/ELXDOujPkK6sscUiWojK31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3GgR2/dJMcafy6aQN/ELXDOujPkK6sscUiWojK31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3GgR2/dJMcafy6aQN/ELXDOujPkK6sscUiWojK31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3GgR2%2FdJMcafy6aQN%2FELXDOujPkK6sscUiWojK31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;303&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;3. Grafana&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773476496499&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | tee /etc/yum.repos.d/grafana.repo
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=0
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grafana 설치를 위해 레포를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773476518263&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yum install -y grafana&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grafana 설치.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773476554774&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;**systemctl restart grafana-server**
**systemctl enable grafana-server**&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grafana-server 실행.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b464M1/dJMcaa5B93f/5l73U3j6K5W95i5m2kkZmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b464M1/dJMcaa5B93f/5l73U3j6K5W95i5m2kkZmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b464M1/dJMcaa5B93f/5l73U3j6K5W95i5m2kkZmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb464M1%2FdJMcaa5B93f%2F5l73U3j6K5W95i5m2kkZmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;507&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 했던 설정과 같이 admin 을 통해 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서는 InfluxDB를 통해 구성했다면, 이번엔 Prometheus를 구성할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsyNjU/dJMcacbhQmi/3TxzkavnXpVOasjfdABKQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsyNjU/dJMcacbhQmi/3TxzkavnXpVOasjfdABKQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsyNjU/dJMcacbhQmi/3TxzkavnXpVOasjfdABKQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsyNjU%2FdJMcacbhQmi%2F3TxzkavnXpVOasjfdABKQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;533&quot; height=&quot;337&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL을 입력해주고 Save &amp;amp; test를 눌러 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 dashboard ID 1860을 입력해 import 해줄 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE0yOe/dJMcadVwmZG/zpLoXVkeqJIv8CiKFeFAvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE0yOe/dJMcadVwmZG/zpLoXVkeqJIv8CiKFeFAvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE0yOe/dJMcadVwmZG/zpLoXVkeqJIv8CiKFeFAvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE0yOe%2FdJMcadVwmZG%2FzpLoXVkeqJIv8CiKFeFAvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;84&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY4HGc/dJMcaf6Ulj2/wglw8ToXqOOcZPCNdMefG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY4HGc/dJMcaf6Ulj2/wglw8ToXqOOcZPCNdMefG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY4HGc/dJMcaf6Ulj2/wglw8ToXqOOcZPCNdMefG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY4HGc%2FdJMcaf6Ulj2%2Fwglw8ToXqOOcZPCNdMefG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;647&quot; height=&quot;309&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대시보드가 잘 세팅된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;추가로 'Daemon (데몬)' 을 만드는 법을 알아보자.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 굳이 데몬으로 만드냐하면,&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 실행 파일은 실행한 사용자가 터미널 창을 닫거나 로그아웃하면 함께 종료된다. 24시간 모니터링을 해야 하는 Prometheus가 사용자 접속이 끊겼을 경우 모니터링도 함께 종료되면 안되기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데몬으로 만들면 사용자 접속 여부와 상관없이 시스템이 켜져 있는 한 계속 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 보면 systemctl enable 명령을 사용했었다. 이 명령은 부팅 시 자동 실행을 설정하는 것이다. 정전이나 점검 등으로 서버가 재부팅되었을 때 일일이 접속해서 ./prometheus를 입력할 필요 없이 OS가 알아서 서비스를 올리게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 실행 파일을 데몬으로 만드는 법은 systemd에 등록해주고 daemon reload를 해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;node_exporter&lt;/b&gt; 와 &lt;b&gt;prometheus&lt;/b&gt;를 데몬으로 만들어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 node_exporter를 데몬으로 만들어보자.&lt;/p&gt;
&lt;pre id=&quot;code_1773477132270&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | tee /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
ExecStart=/root/node_exporter-1.7.0.linux-amd64/node_exporter
# 실행할 대상 파일.
[Install]
WantedBy=multi-user.target
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;systemd에 데몬 파일&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;(/etc/systemd/system/node_exporter.service)을 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;node_exporter가 데몬의 이름이 될 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773477189872&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;systemctl daemon-reload&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 사항을 반영하면 정상적으로 작동할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prometheus도 데몬으로 만들어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773477224944&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | tee /etc/systemd/system/prometheus.service

[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
Type=simple

ExecStart=/root/prometheus-2.45.0.linux-amd64/prometheus \
    --config.file=/root/prometheus-2.45.0.linux-amd64/prometheus.yml \
    --storage.tsdb.path=/root/prometheus-2.45.0.linux-amd64/data
# 실행파일 및 설정파일도 등록

[Install]
WantedBy=multi-user.target
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773477244741&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;systemctl daemon-reload
systemctl enable --now prometheus&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 사항을 반영해주고 enable 시켜준다.&lt;/p&gt;</description>
      <category>Infra/네트워크</category>
      <author>minseoki</author>
      <guid isPermaLink="true">https://minseokk.tistory.com/10</guid>
      <comments>https://minseokk.tistory.com/10#entry10comment</comments>
      <pubDate>Sat, 14 Mar 2026 17:37:43 +0900</pubDate>
    </item>
    <item>
      <title>3 Tier Architecture 구성하기 (feat. VMware, xshell, GNS3)</title>
      <link>https://minseokk.tistory.com/9</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kwxg6/dJMcah4Fica/ku4FwjErB1HbqabcjkjGYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kwxg6/dJMcah4Fica/ku4FwjErB1HbqabcjkjGYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kwxg6/dJMcah4Fica/ku4FwjErB1HbqabcjkjGYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKwxg6%2FdJMcah4Fica%2Fku4FwjErB1HbqabcjkjGYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;789&quot; height=&quot;431&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3 Tier Architecture 구성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 독립적인 서버 구성 시 장점.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;확장성이 좋다.&lt;/li&gt;
&lt;li&gt;유지보수가 용이하다.&lt;/li&gt;
&lt;li&gt;보안성이 증가한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSANY8/dJMcadVrKmQ/MhPnbShf7z7mkc3jlooa5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSANY8/dJMcadVrKmQ/MhPnbShf7z7mkc3jlooa5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSANY8/dJMcadVrKmQ/MhPnbShf7z7mkc3jlooa5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSANY8%2FdJMcadVrKmQ%2FMhPnbShf7z7mkc3jlooa5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;691&quot; height=&quot;205&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;연결 흐름&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3 Tier Architecture 를 구성하기 위해 VMware로 TOMCAT, DB, WEB 서버 3대를 생성한다.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. TOMCAT 서버&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스펙&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CentOS 7 미니멀, 2 core, &amp;nbsp;2GB, 20GB&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IP -&lt;/b&gt; 211.183.3.88&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxxRY1/dJMcaaYKTNH/I4dHGRcAE4rQv35NRHeKG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxxRY1/dJMcaaYKTNH/I4dHGRcAE4rQv35NRHeKG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxxRY1/dJMcaaYKTNH/I4dHGRcAE4rQv35NRHeKG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxxRY1%2FdJMcaaYKTNH%2FI4dHGRcAE4rQv35NRHeKG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;328&quot; height=&quot;198&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바로 웹 페이지(웹어플리케이션)을 만들었다면, 이런 웹어플리케이션을 배포하는 WAS가 필요하고, 추가적으로 개발환경(JAVA)도 구성이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로 JAVA + TOMCAT이 필요하다는 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAVA = openjdk-11&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TOMCAT = tomcat 10 버전&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 사용하기로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발환경에 맞는 WAS도 잘 매칭을 시켜주는게 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TOMCAT 서버를 생성하고 xshell 로 접속하여 명령어를 수행한다. (앞으로의 과정에서 설명 생략.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomcat ~]# yum install -y java-11-openjdk wget unzip&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;# 자바 설치 및 wget unzip 설치&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;# 배포판이나 운영체제 버전에 따라서 패키지명이 다를 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomcat ~]# yum search openjdk&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;# openjdk 문구가 들어간 것들 중에 내가 설치할 수 있는 패키지 검색&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvYX0Z/dJMcabi51KC/cgUWjQd8RqCvTpxCYZkg6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvYX0Z/dJMcabi51KC/cgUWjQd8RqCvTpxCYZkg6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvYX0Z/dJMcabi51KC/cgUWjQd8RqCvTpxCYZkg6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvYX0Z%2FdJMcabi51KC%2FcgUWjQd8RqCvTpxCYZkg6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;75&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 사용 중인 버전이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰캣을 웹 페이지에서 다운로드 할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://tomcat.apache.org/download-10.cgi&quot;&gt;https://tomcat.apache.org/download-10.cgi&lt;/a&gt; (톰캣 10 버전 설치 페이지)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;1414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y1NR5/dJMcaiCtpSx/FUtaZRhAYK4JPpP9hSpsMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y1NR5/dJMcaiCtpSx/FUtaZRhAYK4JPpP9hSpsMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y1NR5/dJMcaiCtpSx/FUtaZRhAYK4JPpP9hSpsMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy1NR5%2FdJMcaiCtpSx%2FFUtaZRhAYK4JPpP9hSpsMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;367&quot; height=&quot;459&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;1414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wget &amp;lt;링크&amp;gt; 로 다운로드 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSGDQN/dJMcabQTyJA/TWPulIBnXJXKBcveXkMBp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSGDQN/dJMcabQTyJA/TWPulIBnXJXKBcveXkMBp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSGDQN/dJMcabQTyJA/TWPulIBnXJXKBcveXkMBp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSGDQN%2FdJMcabQTyJA%2FTWPulIBnXJXKBcveXkMBp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;164&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomcat ~]# unzip apache* &amp;gt; /dev/null&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;# apache로 시작하는 모든 파일을 unzip 하고, 압축 풀리는 과정은 생략한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/58zKP/dJMcafy1yJ3/kZdxEkcuZNU8pXWadUiNO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/58zKP/dJMcafy1yJ3/kZdxEkcuZNU8pXWadUiNO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/58zKP/dJMcafy1yJ3/kZdxEkcuZNU8pXWadUiNO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F58zKP%2FdJMcafy1yJ3%2FkZdxEkcuZNU8pXWadUiNO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;100&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[root@tomcat ~]# mv apache-tomcat-10.1.52 tomcat&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[root@tomcat ~]# chmod -R 777 tomcat&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# 디렉토리 이름 변경 및 권한 부여&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVAufO/dJMcachZe0M/sbINNuF8fCSQrPxpghBsck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVAufO/dJMcachZe0M/sbINNuF8fCSQrPxpghBsck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVAufO/dJMcachZe0M/sbINNuF8fCSQrPxpghBsck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVAufO%2FdJMcachZe0M%2FsbINNuF8fCSQrPxpghBsck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;599&quot; height=&quot;273&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Um3hv/dJMcafy1yMb/UzCSCKA5ukRNkKYcSWtVhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Um3hv/dJMcafy1yMb/UzCSCKA5ukRNkKYcSWtVhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Um3hv/dJMcafy1yMb/UzCSCKA5ukRNkKYcSWtVhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUm3hv%2FdJMcafy1yMb%2FUzCSCKA5ukRNkKYcSWtVhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;241&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;startup.sh&lt;/span&gt; 는 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;catalina.sh&lt;/span&gt; 를 백그라운드에서 동작시키기 위한 스크립트이다. (.sh = shell script)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;shutdown.sh&lt;/span&gt; 는 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;catalina.sh&lt;/span&gt; 를 중지시키기 위한 스크립트다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;catalina.sh 를 동작시키면 포어그라운드로 동작하기 때문에 일반적인 환경에서는 startup.sh 나 shutdown.sh 를 쓴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행시키는 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. &lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomcat tomcat]# sh ./bin/startup.sh&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. &lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomcat tomcat]# ./bin/startup.sh&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 명령어로 안되면 1번 명령어로 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckOIp5/dJMcaa5xmAh/s39kg3wNIG7KY5zqztCpkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckOIp5/dJMcaa5xmAh/s39kg3wNIG7KY5zqztCpkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckOIp5/dJMcaa5xmAh/s39kg3wNIG7KY5zqztCpkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckOIp5%2FdJMcaa5xmAh%2Fs39kg3wNIG7KY5zqztCpkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;534&quot; height=&quot;197&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰캣이 실행되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1189&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEF78u/dJMcah4FiAC/dQJHf7DOzhgNJ45JGnwWhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEF78u/dJMcah4FiAC/dQJHf7DOzhgNJ45JGnwWhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEF78u/dJMcah4FiAC/dQJHf7DOzhgNJ45JGnwWhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEF78u%2FdJMcah4FiAC%2FdQJHf7DOzhgNJ45JGnwWhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;572&quot; height=&quot;264&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1189&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 tomcat의 설정에 의해 8080 포트로 웹어플리케이션 서버(WAS)가 동작하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XCFwe/dJMcaaEubGr/NXkkFueODU1kWNrCWTY1KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XCFwe/dJMcaaEubGr/NXkkFueODU1kWNrCWTY1KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XCFwe/dJMcaaEubGr/NXkkFueODU1kWNrCWTY1KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXCFwe%2FdJMcaaEubGr%2FNXkkFueODU1kWNrCWTY1KK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;531&quot; height=&quot;350&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저에서 잘 돌아가는 모습을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글에 검색어로 tomcat sample 를 입력하여 들아간 후 sample application 을 다운받을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QjhEo/dJMcaaqWdRC/XQ84ih6CsNIVXiWuo2kCN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QjhEo/dJMcaaqWdRC/XQ84ih6CsNIVXiWuo2kCN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QjhEo/dJMcaaqWdRC/XQ84ih6CsNIVXiWuo2kCN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQjhEo%2FdJMcaaqWdRC%2FXQ84ih6CsNIVXiWuo2kCN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;623&quot; height=&quot;276&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;링크 주소를 복사한 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[root@tomcat tomcat]# wget&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://tomcat.apache.org/tomcat-9.0-doc/appdev/sample/sample.war**&quot;&gt;https://tomcat.apache.org/tomcat-9.0-doc/appdev/sample/sample.war&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wget으로 다운로드 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomcat tomcat]# mv ./sample.war /root/tomcat/webapps&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;# 다운받은 sample.war 를 webapps 경로로 이동시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c69P59/dJMb99S5aBb/BHPK6pOhMUqfSHFLXD2KZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c69P59/dJMb99S5aBb/BHPK6pOhMUqfSHFLXD2KZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c69P59/dJMb99S5aBb/BHPK6pOhMUqfSHFLXD2KZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc69P59%2FdJMb99S5aBb%2FBHPK6pOhMUqfSHFLXD2KZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;575&quot; height=&quot;143&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이동하는 과정에서 자동으로 압축이 해제된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/04cZ4/dJMb99ZS2nP/Jkel0yPGn0KokAAN03YJ9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/04cZ4/dJMb99ZS2nP/Jkel0yPGn0KokAAN03YJ9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/04cZ4/dJMb99ZS2nP/Jkel0yPGn0KokAAN03YJ9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F04cZ4%2FdJMb99ZS2nP%2FJkel0yPGn0KokAAN03YJ9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;545&quot; height=&quot;418&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 주소/sample 경로로 접근하면 다운받은 샘플 앱이 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;현재 호스트의 IP를 출력하는 간단한 test.jsp 파일을 만들어준다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772974286414&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; test.jsp
&amp;lt;%@ page contentType=&quot;text/html; charset=UTF-8&quot;%&amp;gt;
&amp;lt;html&amp;gt;
    	&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;hello world&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
    	&amp;lt;body&amp;gt;
    	&amp;lt;h2&amp;gt;
            	TOMCAT TEST&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
            	time : &amp;lt;%= new java.util.Date()%&amp;gt;
            	&amp;lt;%@ page import=&quot;java.net.InetAddress&quot; %&amp;gt;&amp;lt;br&amp;gt;
            	&amp;lt;%InetAddress inet= InetAddress.getLocalHost();%&amp;gt;
            	WAS ip : &amp;lt;%=inet.getHostAddress()%&amp;gt;
    	&amp;lt;/h2&amp;gt;
 
 
    	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성 후 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;ls&lt;/span&gt; 명령어를 입력하면 test.jsp 파일이 생성된 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bajNi3/dJMcaakau1j/HDFizgbBxGzhayAKVruucK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bajNi3/dJMcaakau1j/HDFizgbBxGzhayAKVruucK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bajNi3/dJMcaakau1j/HDFizgbBxGzhayAKVruucK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbajNi3%2FdJMcaakau1j%2FHDFizgbBxGzhayAKVruucK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;479&quot; height=&quot;231&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;서버 주소:8080/ROOT/test.jsp&lt;/span&gt; 가 아닌 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;서버주소:8080/test.jsp&lt;/span&gt; 로 접근 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 파일들은 ROOT 경로에 위치시켜야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. DB 구성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스펙&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CentOS 7 미니멀, 2 core, &amp;nbsp;2GB, 20GB&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IP -&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;211.183.3.6&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DB 서버를 생성했다면 mariadb-server 를 설치해준다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[root@tomdb ~]# yum install -y mariadb-server&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[root@tomdb ~]# systemctl enable --now mariadb&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[root@tomdb ~]# systemctl restart mariadb &amp;amp;&amp;amp; systemctl enable mariadb&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# 두 개의 명령을 동시에 실행하고 싶다면 &amp;amp;&amp;amp; 기호를 사용하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomdb ~]# mysql_secure_installation&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;# 암호는 본인이 설정하고 싶은 암호로 설정하고 다른 추가 설정을 물어보는 부분에서는 y, n, y, y 순서대로 입력해 설정을 완료해주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomdb ~]# mysql -u root -p&amp;lt;본인암호&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MariaDB [(none)]&amp;gt; create database tomcatdb;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# 여기서 tomcatdb는 필자가 설정한 DB 이름이므로 본인이 설정한 DB 이름을 입력하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MariaDB [(none)]&amp;gt; grant all privileges on tomcatdb.&lt;span&gt;* &lt;/span&gt;to tomuser@'%' identified by '암호';&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# tomuser 는 사용자 이름부분이다. 필자는 tomuser로 설정했다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MariaDB [(none)]&amp;gt; grant all privileges on tomcatdb.*&lt;span&gt;&amp;nbsp;&lt;/span&gt;to tomuser@'localhost' identified by '1234';&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# 경우에 따라서 local 에서 접속이 안되는 경우도 있다. % 안에는 localhost 가 포함이 안될 걸로 간주하는 상황이 생기기도 하기 때문이다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;접속이 안되는 경우 위 명령어로 다시 시도해본다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;후에 exit 명령어로 나간 후 root 가 아닌 사용자 이름으로 다시 DB에 접속해보자.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DOaRV/dJMcabDnN2T/RA4gEXNrsHRlCzL25r24qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DOaRV/dJMcabDnN2T/RA4gEXNrsHRlCzL25r24qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DOaRV/dJMcabDnN2T/RA4gEXNrsHRlCzL25r24qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDOaRV%2FdJMcabDnN2T%2FRA4gEXNrsHRlCzL25r24qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;295&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;접속해 보면 tomcatdb가 잘 생성된 걸 볼 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다시 tomcat 서버로 돌아와서 mysql 명령을 설치한 다음 접속이 잘 되는지 확인해보자.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomcat tomcat]# yum install -y mysql&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;# mysql 명령 설치(클라이언트 역할)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomcat tomcat]# mysql -u tomuser -p암호 -h DB서버주소&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sqpty/dJMcaiWLf7K/Csd2nG58WAZoEzqF17UbF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sqpty/dJMcaiWLf7K/Csd2nG58WAZoEzqF17UbF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sqpty/dJMcaiWLf7K/Csd2nG58WAZoEzqF17UbF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsqpty%2FdJMcaiWLf7K%2FCsd2nG58WAZoEzqF17UbF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;549&quot; height=&quot;245&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;tomcat 서버에서도 잘 보인다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음으로 dbtest.jsp 파일을 만들어서 연동이 잘 되는지 테스트 해보자.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dbtest.jsp 파일&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772975218264&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; dbtest.jsp

&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ page import=&quot;java.sql.*&quot;%&amp;gt;
&amp;lt;h1&amp;gt;DB&amp;lt;/h2&amp;gt;
&amp;lt;%
        Connection conn=null;
        try{
                String Url=&quot;jdbc:mysql://&amp;lt;DB주소&amp;gt;/&amp;lt;DB이름&amp;gt;&quot;;
                String Id=&quot;&amp;lt;DB유저&amp;gt;&quot;;
                String Pass=&quot;&amp;lt;유저암호&amp;gt;&quot;;

                Class.forName(&quot;com.mysql.jdbc.Driver&quot;);
                conn=DriverManager.getConnection(Url,Id,Pass);
                out.println(&quot;was-db Connection Success!&quot;);
        }catch(Exception e) {
                e.printStackTrace(); 
}
%&amp;gt;

EOF&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;&amp;gt; 안에는 본인이 설정한 대로 수정하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;JDBC = JAVA DataBase Connector&lt;br /&gt;자바와 MySQL을 연동하기 위한 라이브러리이다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomcat tomcat]# mv ./dbtest.jsp /root/tomcat/webapps/ROOT&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;# 현재 디렉토리의 dbtest.jsp 파일을 웹앱루트디렉토리로 이동시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L0YG2/dJMcacvxtdW/T3CED3BDuCvfGelkpJER9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L0YG2/dJMcacvxtdW/T3CED3BDuCvfGelkpJER9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L0YG2/dJMcacvxtdW/T3CED3BDuCvfGelkpJER9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL0YG2%2FdJMcacvxtdW%2FT3CED3BDuCvfGelkpJER9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;533&quot; height=&quot;197&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저에서 접속을 해보면 아직 연동이 되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JDBC를 설치해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.23&quot;&gt;https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.23&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1772975454536&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Maven Repository: mysql &amp;raquo; mysql-connector-java &amp;raquo; 8.0.23&quot; data-og-description=&quot;mysql mysql-connector-java 8.0.23 compile Scope:CompileTestProvidedRuntime Format:Groovy LongGroovy ShortKotlin Include backlinks implementation(&amp;quot;mysql:mysql-connector-java:8.0.23&amp;quot;) libraryDependencies += &amp;quot;mysql&amp;quot; % &amp;quot;mysql-connector-java&amp;quot; % &amp;quot;8.0.23&amp;quot; ivy&amp;quot;mys&quot; data-og-host=&quot;mvnrepository.com&quot; data-og-source-url=&quot;https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.23&quot; data-og-url=&quot;https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.23&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.23&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.23&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Maven Repository: mysql &amp;raquo; mysql-connector-java &amp;raquo; 8.0.23&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;mysql mysql-connector-java 8.0.23 compile Scope:CompileTestProvidedRuntime Format:Groovy LongGroovy ShortKotlin Include backlinks implementation(&quot;mysql:mysql-connector-java:8.0.23&quot;) libraryDependencies += &quot;mysql&quot; % &quot;mysql-connector-java&quot; % &quot;8.0.23&quot; ivy&quot;mys&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mvnrepository.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# JDBC 라이브러리 설치 경로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HOOfz/dJMcadgSYuJ/khKChSUWAOz2yK4mjI6BK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HOOfz/dJMcadgSYuJ/khKChSUWAOz2yK4mjI6BK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HOOfz/dJMcadgSYuJ/khKChSUWAOz2yK4mjI6BK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHOOfz%2FdJMcadgSYuJ%2FkhKChSUWAOz2yK4mjI6BK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;381&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 링크 주소를 복사해서 wget &amp;lt;링크 주소&amp;gt; 으로 설치해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mB0Nq/dJMcadumnO9/CbTVNJPyikmICRKwCQYZYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mB0Nq/dJMcadumnO9/CbTVNJPyikmICRKwCQYZYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mB0Nq/dJMcadumnO9/CbTVNJPyikmICRKwCQYZYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmB0Nq%2FdJMcadumnO9%2FCbTVNJPyikmICRKwCQYZYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;526&quot; height=&quot;123&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드가 잘 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomcat tomcat]# mv mysql-connector-java-8.0.23.jar /root/tomcat/lib&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;# 받은 파일을 라이브러리 디렉토리에 복사한다.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomcat tomcat]# sh ./bin/shutdown.sh&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;# 톰캣 중지&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomcat tomcat]# sh ./bin/startup.sh&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;# 톰캣 시작&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B9HqM/dJMcahXTdQw/mO9d4aS0CuaSiz2d9KIRq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B9HqM/dJMcahXTdQw/mO9d4aS0CuaSiz2d9KIRq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B9HqM/dJMcahXTdQw/mO9d4aS0CuaSiz2d9KIRq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB9HqM%2FdJMcahXTdQw%2FmO9d4aS0CuaSiz2d9KIRq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;235&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 브라우저에서 접속해보면 연동이 잘 된 걸 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. WEB 서버 구축&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스펙&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CentOS 7 미니멀, 2 core, &amp;nbsp;2GB, 20GB&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IP -&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;211.183.3.80&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 Reverse Proxy 개념이 등장한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HPLun/dJMcahDzdry/3YV2ZjkWyRiVkfJXNZKg51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HPLun/dJMcahDzdry/3YV2ZjkWyRiVkfJXNZKg51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HPLun/dJMcahDzdry/3YV2ZjkWyRiVkfJXNZKg51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHPLun%2FdJMcahDzdry%2F3YV2ZjkWyRiVkfJXNZKg51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;320&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 client가 직접 WAS 서버(백엔드, tomcat)에 가서 test.jsp 파일을 가져와야 하는데, 외부의 사용자들이 내 백엔드 서버에 접근하는게 보안적으로 좋지 않기 때문에 Reverse Proxy가 WAS를 대리하여 client들에게 test.jsp 파일을 제공하는 구조이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹서버를 설치하고 실행시켜준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[root@tomweb ~]# yum install -y httpd&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[root@tomweb ~]# systemctl restart httpd&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[root@tomweb ~]# systemctl enable httpd&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정적인 페이지를 만들어보자&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[root@tomweb ~]# echo 'static page' &amp;gt; /var/www/html/index.html&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# /var/www/html 경로에 index.html 파일을 만들어 static page 라는 내용을 넣어준다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정적인 요청은 web 서버가 스스로 처리하고 jsp 파일에 대한 요청을 하면 tomcat 서버가 처리하도록 하고자 한다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomweb ~]# vi /etc/httpd/conf/httpd.conf&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;# Reverse Proxy 파일 설정을 해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 명령어로 들어가 아래 코드를 56번째 줄 이후에 복붙해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1772975933330&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

&amp;lt;VirtualHost *:80&amp;gt; # 80번 포트로 들어오는 모든 ip에 대한 설정
    ProxyRequests Off
    ProxyPreserveHost On
    &amp;lt;Proxy *&amp;gt; 
        Order deny,allow
        Allow from all
    &amp;lt;/Proxy&amp;gt;

    ProxyPass /jsp http://172.16.101.88:8080/
    ProxyPassReverse /jsp http://172.16.101.88:8080/
&amp;lt;/VirtualHost&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyZaRu/dJMcafeJ1iS/uJR1KciYLoJgMLbMfZ0Fm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyZaRu/dJMcafeJ1iS/uJR1KciYLoJgMLbMfZ0Fm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyZaRu/dJMcafeJ1iS/uJR1KciYLoJgMLbMfZ0Fm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyZaRu%2FdJMcafeJ1iS%2FuJR1KciYLoJgMLbMfZ0Fm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;296&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가가 웹서버의 jsp 경로(http://211.183.3.80:80/jsp)로 요청하면 그 요청을 211.183.3.88:/8080/ 으로 전달해라 라는 코드 내용이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;[root@tomweb ~]# systemctl restart httpd&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;# 웹서버를 재실행시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[root@tomweb ~]# curl 211.183.3.80:80/index.html&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 정적 요청 = 웹서버가 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVRKRG/dJMcachZfIS/cn2ogfjScjZOSPuftdaKmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVRKRG/dJMcachZfIS/cn2ogfjScjZOSPuftdaKmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVRKRG/dJMcachZfIS/cn2ogfjScjZOSPuftdaKmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVRKRG%2FdJMcachZfIS%2Fcn2ogfjScjZOSPuftdaKmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;314&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적인 요청은 웹서버가 처리하고 jsp 파일에 대한 요청은 tomcat 서버가 처리하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reverse Proxy 동작 흐름&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQO0PY/dJMcabchDFY/CiVVRkSnAzLX2fp9eALjZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQO0PY/dJMcabchDFY/CiVVRkSnAzLX2fp9eALjZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQO0PY/dJMcabchDFY/CiVVRkSnAzLX2fp9eALjZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQO0PY%2FdJMcabchDFY%2FCiVVRkSnAzLX2fp9eALjZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;266&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Infra/네트워크</category>
      <author>minseoki</author>
      <guid isPermaLink="true">https://minseokk.tistory.com/9</guid>
      <comments>https://minseokk.tistory.com/9#entry9comment</comments>
      <pubDate>Sun, 8 Mar 2026 22:27:29 +0900</pubDate>
    </item>
  </channel>
</rss>