<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>땅지원's Personal blog</title>
    <link>https://ddangjiwon.tistory.com/</link>
    <description>신입 개발자의 우당탕탕 기술 블로그</description>
    <language>ko</language>
    <pubDate>Wed, 1 Jul 2026 16:53:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>땅지원</managingEditor>
    <image>
      <title>땅지원's Personal blog</title>
      <url>https://tistory1.daumcdn.net/tistory/4186889/attach/fe56966ed6dc4ae790f91289130d4ab9</url>
      <link>https://ddangjiwon.tistory.com</link>
    </image>
    <item>
      <title>Access Control 종류(ACL, RBAC, ABAC)</title>
      <link>https://ddangjiwon.tistory.com/382</link>
      <description>&lt;h3 id=&quot;Access%20Control%20List%20(ACL)-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Access Control List (ACL)&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 인증된 후에, 해당 사용자의 IP가 인증된 사용자 리스트(White List) 또는 차단된 사용자 리스트(Black 리스트)에 있는지에 따라 Access를 허용하거나 차단한다. 사용자 IP가 White List에 없을 경우에도 차단된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉, ACL은 특정 사용자의 시스템 액세스 권한 여부를 결정하는 데 사용된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Role-based%20access%20control(RBAC)-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Role-based access control(RBAC)&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;사용자의 역할에 따라 액세스 권한을 부여하는 방식이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;RBAC에서 사용자는 다른 권한을 부여받을 수 있는 여러 역할을 가질 수 있다.&amp;nbsp;예를 들어 IT회사에서의 RBAC을 다음과 같이 나눠볼 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;시스템 관리자 역할: 서버 관리, 시스템 관리&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;데이터베이스 관리자 역할: 데이터 베이스 관리, 복구&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;네트워크 관리자 역할: 네트워크 관리, 보안 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;총 관리자는 각 권한을 부여/회수하는 것이 간단하고, 역할에 따라 어떤 권한을 갖고 있는지 쉽게 파악할 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 한계가 있다. 다음과 같은 경우를 살펴보자.&lt;br /&gt;시스템 관리자가 데이터베이스의 역할도 부여받고 싶은데, 시스템 관리자의 역할이 주 업무이므로 데이터 베이스 관리 중 삭제, 복구는 불가능하도록 하고 싶다. 이럴 경우 어떻게 해야 할까?&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다른 역할을 또 만들어야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;시스템 &amp;amp; 데이터 관리자 역할: 서버 관리, 시스템 관리, 삭제 기능을 제거한 데이터 베이스관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이때 또 네트워크 관리자 역할도 부여받는다면... 점점 역할이 많아지고 복잡해진다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Attribute-based%20access%20control(ABAC)-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Attribute-based access control(ABAC)&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;역할 대신 속성을 이용하여 더 세밀하게 권한을 부여할 수 있다. 위의 RBAC의 한계를 개선할 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;속성은 사용자, 리소스, 작업, 개체, 환경 등을 설명하는 데이터다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 특정 부서의 크루가 파일에 접근하려면 아래의 속성을 전부 갖고 있어야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;사용자: 해당 부서 직원&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;리소스: 파일&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;동작: 읽기/쓰기&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;환경: 해당 부서의 컴퓨터&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이처럼 여러 속성을 활용하여 권한에 대해 좀 더 세밀한 작업을 할 수 있다.&lt;br /&gt;만약 읽기만 가능하도록 하고 싶으면&lt;span&gt;&amp;nbsp;&lt;/span&gt;쓰기&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성을 제거하고, 재택에서도 되도록 하려면&lt;span&gt;&amp;nbsp;&lt;/span&gt;재택&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성만 추가하면 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;ACL -&amp;gt; RBAC -&amp;gt; ABAC 순으로 점점 Coarse -&amp;gt; Fine으로 되는 것을 확인할 수 있다.&amp;nbsp;&lt;br /&gt;Fine일수록 유연해지고 세밀한 접근제어를 할 수 있지만, 그만큼 구현이 어렵고 관리포인트가 많아진다는 단점이 있다.&lt;/p&gt;</description>
      <category>CS</category>
      <author>땅지원</author>
      <guid isPermaLink="true">https://ddangjiwon.tistory.com/382</guid>
      <comments>https://ddangjiwon.tistory.com/382#entry382comment</comments>
      <pubDate>Tue, 5 Nov 2024 13:47:34 +0900</pubDate>
    </item>
    <item>
      <title>[React] Material UI 적용</title>
      <link>https://ddangjiwon.tistory.com/381</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1730273528263&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;React themes &amp;amp; templates - MUI Store&quot; data-og-description=&quot;A collection of the best React templates, React dashboard, and React themes. It includes templates for dashboard, admin, landing page, e-commerce site and more.&quot; data-og-host=&quot;mui.com&quot; data-og-source-url=&quot;https://mui.com/store/&quot; data-og-url=&quot;https://mui.com/store/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jUDq1/hyXpEyz5a7/CrXVnGuEUvk6tErYJDkaY0/img.jpg?width=520&amp;amp;height=286&amp;amp;face=0_0_520_286&quot;&gt;&lt;a href=&quot;https://mui.com/store/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mui.com/store/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jUDq1/hyXpEyz5a7/CrXVnGuEUvk6tErYJDkaY0/img.jpg?width=520&amp;amp;height=286&amp;amp;face=0_0_520_286');&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;React themes &amp;amp; templates - MUI Store&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A collection of the best React templates, React dashboard, and React themes. It includes templates for dashboard, admin, landing page, e-commerce site and more.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mui.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;pre id=&quot;code_1730273564586&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm start&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;&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;a href=&quot;https://mui.com/store/items/modernize-next-js-free-admin-template/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mui.com/store/items/modernize-next-js-free-admin-template/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730275812676&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;Modernize Next.js Free Admin Template - MUI Store&quot; data-og-description=&quot;Free React Admin Dashboard made with Material UI components and React. Demo Dashboard Page Typography Page Shadow Page Login Page Register Page Sample Page&quot; data-og-host=&quot;mui.com&quot; data-og-source-url=&quot;https://mui.com/store/items/modernize-next-js-free-admin-template/&quot; data-og-url=&quot;https://mui.com/store/items/modernize-next-js-free-admin-template/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvhCWD/hyXpBPnOEJ/x4k13Nig6MaEufzLMdSkE0/img.png?width=688&amp;amp;height=385&amp;amp;face=0_0_688_385&quot;&gt;&lt;a href=&quot;https://mui.com/store/items/modernize-next-js-free-admin-template/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mui.com/store/items/modernize-next-js-free-admin-template/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvhCWD/hyXpBPnOEJ/x4k13Nig6MaEufzLMdSkE0/img.png?width=688&amp;amp;height=385&amp;amp;face=0_0_688_385');&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;Modernize Next.js Free Admin Template - MUI Store&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Free React Admin Dashboard made with Material UI components and React. Demo Dashboard Page Typography Page Shadow Page Login Page Register Page Sample Page&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mui.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mui.com/store/items/devias-kit/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mui.com/store/items/devias-kit/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mui.com/store/items/minimal-dashboard-free/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mui.com/store/items/minimal-dashboard-free/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730275823506&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;Minimal Free &amp;ndash; React Admin Dashboard - MUI Store&quot; data-og-description=&quot;Free React Admin Dashboard made with Material UI components and React. Pages Dashboard Users Products Posts Sign in Not found Quick start Clone the repo: git&quot; data-og-host=&quot;mui.com&quot; data-og-source-url=&quot;https://mui.com/store/items/minimal-dashboard-free/&quot; data-og-url=&quot;https://mui.com/store/items/minimal-dashboard-free/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/VEf2e/hyXpwmYucG/Zje0atheDvtnRg6KHkhPHk/img.jpg?width=1400&amp;amp;height=770&amp;amp;face=0_0_1400_770,https://scrap.kakaocdn.net/dn/UTuD4/hyXpr6410e/56rJPr3bO5gGWuwT1KXvpK/img.jpg?width=1400&amp;amp;height=770&amp;amp;face=0_0_1400_770,https://scrap.kakaocdn.net/dn/eitGnp/hyXpCAKbc7/G3SZzsDehHJdleq5OzVtwk/img.jpg?width=700&amp;amp;height=385&amp;amp;face=0_0_700_385&quot;&gt;&lt;a href=&quot;https://mui.com/store/items/minimal-dashboard-free/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mui.com/store/items/minimal-dashboard-free/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/VEf2e/hyXpwmYucG/Zje0atheDvtnRg6KHkhPHk/img.jpg?width=1400&amp;amp;height=770&amp;amp;face=0_0_1400_770,https://scrap.kakaocdn.net/dn/UTuD4/hyXpr6410e/56rJPr3bO5gGWuwT1KXvpK/img.jpg?width=1400&amp;amp;height=770&amp;amp;face=0_0_1400_770,https://scrap.kakaocdn.net/dn/eitGnp/hyXpCAKbc7/G3SZzsDehHJdleq5OzVtwk/img.jpg?width=700&amp;amp;height=385&amp;amp;face=0_0_700_385');&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;Minimal Free &amp;ndash; React Admin Dashboard - MUI Store&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Free React Admin Dashboard made with Material UI components and React. Pages Dashboard Users Products Posts Sign in Not found Quick start Clone the repo: git&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mui.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;</description>
      <category>Frontend/React</category>
      <author>땅지원</author>
      <guid isPermaLink="true">https://ddangjiwon.tistory.com/381</guid>
      <comments>https://ddangjiwon.tistory.com/381#entry381comment</comments>
      <pubDate>Wed, 30 Oct 2024 16:32:52 +0900</pubDate>
    </item>
    <item>
      <title>[React] React 시작하기</title>
      <link>https://ddangjiwon.tistory.com/380</link>
      <description>&lt;pre id=&quot;code_1730271651833&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install -g create-react-app
npx create-react-app my-app

cd my-app
npm start&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;node_modules/&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 프로젝트에 사용되는 외부 라이브러리와 모듈이 저장되는 폴더입니다. 이러한 라이브러리와 모듈은 npm install 명령어를 통해 설치되며, package.json 파일에 명시됩니다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;public/&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 정적 파일들이 저장되는 폴더로, HTML, 이미지, 아이콘 등이 포함됩니다. 주요 파일로는 index.html이 있으며, 이는 리액트 앱의 기본 템플릿으로 사용됩니다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;src/&lt;/b&gt;&lt;/span&gt;: 애플리케이션의 소스 코드가 저장되는 폴더입니다. 이 폴더에는 컴포넌트, 스타일, 이미지 등의 파일이 포함됩니다. 주요 파일들은 다음과 같습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;index.js&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 리액트 앱의 진입점입니다. ReactDOM.render()를 사용하여 App 컴포넌트를 index.html에 렌더링합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;App.js&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 애플리케이션의 메인 컴포넌트입니다. 이 컴포넌트에서 다른 컴포넌트들을 불러와 렌더링합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;App.css&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: App 컴포넌트의 스타일을 정의하는 CSS 파일입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;App.test.js&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: App 컴포넌트에 대한 테스트 코드가 저장되는 파일입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;serviceWorker.js&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Progressive Web App(PWA) 기능을 구현하는데 사용되는 서비스 워커 파일입니다. 이 파일을 수정하여 오프라인 경험, 백그라운드 동기화 등의 기능을 구현할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;package.json&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 프로젝트의 메타데이터와 의존성을 담고 있는 파일입니다. 프로젝트에 사용되는 라이브러리, 모듈, 스크립트 등이 이 파일에 명시됩니다.&lt;/li&gt;
&lt;/ul&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;* npm vs npx&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGG3Sj/btsKpBBuOMm/LNljqxAkCb82sv2KQjdx91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGG3Sj/btsKpBBuOMm/LNljqxAkCb82sv2KQjdx91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGG3Sj/btsKpBBuOMm/LNljqxAkCb82sv2KQjdx91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGG3Sj%2FbtsKpBBuOMm%2FLNljqxAkCb82sv2KQjdx91%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;270&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #111111; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;npm&lt;span&gt;&amp;nbsp;&lt;/span&gt;은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;노드 패키지 관리자&lt;/b&gt;를 뜻한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;node.js를 설치하면 시스템에 설치된다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Node 프로젝트의 필수 패키지 및 모듈은 npm을 사용하여 설치된다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;패키지에는 모듈에 필요한 모든 파일이 포함되어 있다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;npm 5.2.0&lt;span&gt;&amp;nbsp;&lt;/span&gt;버전 이상부터 npm을 설치하면 자동으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;npx&lt;span&gt;&amp;nbsp;&lt;/span&gt;가 설치된다.&lt;/li&gt;
&lt;li&gt;즉, 새로운 패키지 관리 모듈이 아닌, npm의 5.2.0버전부터 새로 추가된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;도구&lt;/b&gt;이다. 따라서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;npm과 비교대상이 아니라, npm을 좀 더 편하게 사용하기 위해 npm 제공해주는 하나의 도구이다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;패키지를 설치하지 않고도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;npm 레지스트리에서&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;원하는 패키지를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;실행(Excute)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;할 수 있다.&lt;/li&gt;
&lt;li&gt;실행 즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;npm package runner&lt;span&gt;&amp;nbsp;&lt;/span&gt;로써&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;npx는 일회용 패키지 로써 사용된다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Frontend/React</category>
      <author>땅지원</author>
      <guid isPermaLink="true">https://ddangjiwon.tistory.com/380</guid>
      <comments>https://ddangjiwon.tistory.com/380#entry380comment</comments>
      <pubDate>Wed, 30 Oct 2024 16:12:46 +0900</pubDate>
    </item>
    <item>
      <title>[Airflow] DAG 생성</title>
      <link>https://ddangjiwon.tistory.com/378</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://github.com/andreax79/airflow-code-editor&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/andreax79/airflow-code-editor&lt;/a&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1729818916259&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - andreax79/airflow-code-editor: A plugin for Apache Airflow that allows you to edit DAGs in browser&quot; data-og-description=&quot;A plugin for Apache Airflow that allows you to edit DAGs in browser - andreax79/airflow-code-editor&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/andreax79/airflow-code-editor&quot; data-og-url=&quot;https://github.com/andreax79/airflow-code-editor&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QiJ5Q/hyXlTQonqI/iyd1wNq8yuSnv91Fmu5Sj1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/g4olb/hyXponEYBp/WCpGwTCufkJX7niBkLdFQ0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/andreax79/airflow-code-editor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/andreax79/airflow-code-editor&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QiJ5Q/hyXlTQonqI/iyd1wNq8yuSnv91Fmu5Sj1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/g4olb/hyXponEYBp/WCpGwTCufkJX7niBkLdFQ0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - andreax79/airflow-code-editor: A plugin for Apache Airflow that allows you to edit DAGs in browser&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A plugin for Apache Airflow that allows you to edit DAGs in browser - andreax79/airflow-code-editor&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 마운트 된 airflow 디렉터리 ./dags 폴더에 넣어도 되지만 UI환경에서 바로 코드 수정을 할 수 있는 에디터가 존재&lt;/p&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. SQL을 이용한 DAG 구현 &lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729571294905&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from datetime import timedelta
from airflow import DAG
import airflow.utils.dates
from urllib import request
from airflow.operators.python import PythonOperator
from airflow.operators.bash import BashOperator
from airflow.operators.dummy import DummyOperator
from airflow.providers.microsoft.mssql.operators.mssql import MsSqlOperator
from airflow.providers.postgres.operators.postgres import PostgresOperator

# dag 정의 
dag = DAG(
    dag_id = &quot;mssql_connection&quot;,
    start_date = airflow.utils.dates.days_ago(1),
    schedule_interval=None
)

start = DummyOperator(task_id=&quot;start&quot;)
end = DummyOperator(task_id=&quot;end&quot;)

# sql 입력 
# mssql_create_sql = &quot;CREATE TABLE airflow_test (a int)&quot;
mssql_select_sql = &quot;SELECT * FROM [dbo].[KT_DKT_INPUT_TRAIN]&quot;

# mssql operator task 정의
create_table_mssql_task = MsSqlOperator(
            task_id='mssql_select_sql',
            mssql_conn_id='reco_mart',
            database='AIDO_RECO_KT',
            sql=mssql_select_sql,
            params={&quot;table&quot;:&quot;airflow_test&quot;},
            dag=dag
        )

start &amp;gt;&amp;gt; create_table_mssql_task &amp;gt;&amp;gt; end&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. Pythonoperator를 이용한 DAG 구현&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729571372290&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pathlib import Path
from airflow import DAG
import datetime as dt
from airflow.operators.bash import BashOperator
from airflow.operators.python import PythonOperator
import pandas as pd

# DAG 정의
dag = DAG (
    dag_id = &quot;01_unscheduled&quot;,
    start_date = dt.datetime(2022,4,18),
    schedule_interval=&quot;@daily&quot; # 매일 자정 
)

fetch_events = BashOperator(
    task_id=&quot;fetch_events&quot;,
    bash_command=(
        &quot;mkdir -p /data/events &amp;amp;&amp;amp; &quot;
        &quot;curl -o /data/events.json http://events_api:5000/events&quot;
    ),
    dag=dag,
)

# 파이썬 함수 정의 
def _calculate_stats(input_path,output_path):
    &quot;&quot;&quot;
    이벤트 통계 계산하기
    &quot;&quot;&quot;

    events = pd.read_json(input_path)
    stats = events.groupby([&quot;date&quot;,&quot;user&quot;]).size().reset_index()
    Path(output_path).parent.mkdir(exist_ok = True)
    stats.to_csv(output_path,index=False)

# Task 정의 - Pythonoperator 
calculate_stats = PythonOperator(
    task_id=&quot;calculate_stats&quot;,
    python_callable=_calculate_stats,
    op_kwargs = {
            &quot;input_path&quot;:&quot;data/events.json&quot;,
            &quot;output_path&quot;:&quot;data/stats.csv&quot;,
    },
    dag=dag
)

fetch_events &amp;gt;&amp;gt; calculate_stats&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. ssh operator를 이용한&amp;nbsp;ssh&amp;nbsp;연결&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729571455497&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from airflow.providers.ssh.hooks.ssh import SSHHook
import airflow.utils.dates
from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.providers.ssh.operators.ssh import SSHOperator
from airflow.models import Variable

# DAG 정의 
dag = DAG(
    dag_id=&quot;ssh_call&quot;,
    description=&quot;sshcall&quot;,
    start_date=airflow.utils.dates.days_ago(1),
    schedule_interval=None,
)

# 원격 아이피 주소 입력 
REMOTE_BIND_IP = Variable.get('SERVER_REMOTE_BIND_IP')


# ssh_hook 정의
ssh_hook = SSHHook(ssh_conn_id=None,remote_host=REMOTE_BIND_IP,username='user',password='passwd')

# ssh_opertor 
ssh_opertor= SSHOperator(
    ssh_hook = ssh_hook,
    task_id = 'ssh_call',
    command = 'python airflow_pipeline/ssh_test.py',
    dag = dag

)&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 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;airflow api&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 외부에서 airflow 서버 내 dag 실행이 필요할 경우 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000;&quot;&gt;airflow.cfg 파일에서&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;auth_backend = airflow.api.auth.backend.basic_auth 으로 수정 필요&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;- airflow webserver 서버 재시작 (sudo systemctl start airflow-webserver&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;- 호출 Url :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #3db39e;&quot; href=&quot;http://13.209.33.190:8080/api/v1/dags/ai_reco_pipeline/dagRuns&quot;&gt;http://서버아이피주소:8080/api/v1/dags/dagid(호출하려고 하는 dagid 입력) /dagRuns&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>DevOps</category>
      <author>땅지원</author>
      <guid isPermaLink="true">https://ddangjiwon.tistory.com/378</guid>
      <comments>https://ddangjiwon.tistory.com/378#entry378comment</comments>
      <pubDate>Fri, 25 Oct 2024 10:15:50 +0900</pubDate>
    </item>
    <item>
      <title>[Airflow] SlackAPIPostOperator 설정</title>
      <link>https://ddangjiwon.tistory.com/379</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전 버전에서는 SlackAPIPostOperator 메소드 내에서 token 를 입력을 했어야 했지만 직접 token 을 입력해보았을 때, 에러가 발생하고 현재는 지원하지 않는 것 같다.&lt;/p&gt;
&lt;figure id=&quot;og_1729745940595&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;airflow.providers.slack.operators.slack &amp;mdash; apache-airflow-providers-slack Documentation&quot; data-og-description=&quot;&quot; data-og-host=&quot;airflow.apache.org&quot; data-og-source-url=&quot;https://airflow.apache.org/docs/apache-airflow-providers-slack/stable/_api/airflow/providers/slack/operators/slack/index.html#airflow.providers.slack.operators.slack.SlackAPIPostOperator&quot; data-og-url=&quot;https://airflow.apache.org/docs/apache-airflow-providers-slack/stable/_api/airflow/providers/slack/operators/slack/index.html#airflow.providers.slack.operators.slack.SlackAPIPostOperator&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://airflow.apache.org/docs/apache-airflow-providers-slack/stable/_api/airflow/providers/slack/operators/slack/index.html#airflow.providers.slack.operators.slack.SlackAPIPostOperator&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://airflow.apache.org/docs/apache-airflow-providers-slack/stable/_api/airflow/providers/slack/operators/slack/index.html#airflow.providers.slack.operators.slack.SlackAPIPostOperator&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;airflow.providers.slack.operators.slack &amp;mdash; apache-airflow-providers-slack Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;airflow.apache.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Post&amp;nbsp;messages&amp;nbsp;to&amp;nbsp;a&amp;nbsp;Slack&amp;nbsp;channel.&lt;/p&gt;
&lt;pre id=&quot;code_1729745878034&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;slack = SlackAPIPostOperator(
    task_id=&quot;post_hello&quot;,
    dag=dag,
    text=&quot;hello there!&quot;,
    channel=&quot;#random&quot;,
)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;해결방법 : Slack API Connection을 만들어주고 BaseHook 사용&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1729745900281&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;self.slack_token = BaseHook.get_connection('slack_api_default').password&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;slack_operator.py &lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729745908248&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from airflow.hooks.base_hook import BaseHook
from airflow.operators.slack_operator import SlackAPIPostOperator
 
class SlackAlert:
    def __init__(self, channel):
        self.slack_channel = channel
        self.slack_token = BaseHook.get_connection('slack_api_default').password
 
    def slack_fail_alert(self, context):
        alert = SlackAPIPostOperator(
            task_id='slack_failed',
            channel=self.slack_channel,
            text=&quot;&quot;&quot;
                :red_circle: Task Failed.
                *Task*: {task} 
                *Dag*: {dag}
                *Execution Time*: {exec_date} 
                *Log Url*: {log_url}
                &quot;&quot;&quot;.format(
                    task=context.get('task_instance').task_id,
                    dag=context.get('task_instance').dag_id,
                    exec_date=context.get('execution_date'),
                    log_url=context.get('task_instance').log_url
                    )
                  )
        return alert.execute(context=context)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;test_alert.py &lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729745914441&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime, timedelta
 
from airflow.providers.slack.operators.slack import SlackAPIPostOperator
from airflow.providers.slack.notifications.slack import send_slack_notification
 
from slack_operator import SlackAlert
 
alert = SlackAlert('#일반-test-모니터링')
 
# DAG 기본 설정
default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2024, 10, 20),
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
    'on_success_callback': alert.slack_fail_alert
}
 
# DAG 정의
dag = DAG(
    'Slack_test',
    default_args=default_args,
    description='A simple tutorial DAG',
    schedule_interval=timedelta(days=1),
)
 
# 첫 번째 Bash 작업
task1 = BashOperator(
    task_id='print_date',
    bash_command='date',
    dag=dag,
)
 
# 세 번째 Bash 작업
task2 = BashOperator(
    task_id='print_hello',
    bash_command='echo &quot;Hello World&quot;',
    dag=dag,
)
 
# 작업 순서 정의
task1 &amp;gt;&amp;gt; task2&lt;/code&gt;&lt;/pre&gt;</description>
      <category>DevOps</category>
      <author>땅지원</author>
      <guid isPermaLink="true">https://ddangjiwon.tistory.com/379</guid>
      <comments>https://ddangjiwon.tistory.com/379#entry379comment</comments>
      <pubDate>Thu, 24 Oct 2024 13:59:18 +0900</pubDate>
    </item>
    <item>
      <title>[Airflow] Connection 연결 시 [TEST] 버튼 비활성화 해결방법</title>
      <link>https://ddangjiwon.tistory.com/377</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDbmgp/btsKfy5bzd7/0B891YfWxrqlWpGiTCvd4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDbmgp/btsKfy5bzd7/0B891YfWxrqlWpGiTCvd4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDbmgp/btsKfy5bzd7/0B891YfWxrqlWpGiTCvd4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDbmgp%2FbtsKfy5bzd7%2F0B891YfWxrqlWpGiTCvd4k%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;804&quot; height=&quot;230&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Airflow webserver Container 내의 airflow.cfg 파일에서 'test_connection = Disabled' &amp;rarr; 'test_connection = Enabled'로 바꿔주면서 해결하면 된다.&lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;컨테이너&amp;nbsp;내부에&amp;nbsp;들어가&amp;nbsp;vi를&amp;nbsp;다운받아야&amp;nbsp;하는데&amp;nbsp;프록시&amp;nbsp;설정이&amp;nbsp;안되어&amp;nbsp;있어&amp;nbsp;apt&amp;nbsp;update&amp;nbsp;&amp;amp;&amp;nbsp;apt&amp;nbsp;install&amp;nbsp;vim이&amp;nbsp;안되는&amp;nbsp;상황 &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;b&gt;1.docker-compose.yml 파일 내에 proxy 설정 추가 (x)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1729570843253&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;airflow-webserver:
  &amp;lt;&amp;lt;: *airflow-common
  command: webserver
  ports:
    - &quot;5678:8080&quot;
  healthcheck:
    test: [&quot;CMD&quot;, &quot;curl&quot;, &quot;--fail&quot;, &quot;http://localhost:8080/health&quot;]
    interval: 30s
    timeout: 10s
    retries: 5
    start_period: 30s
  environment:
    - HTTP_PROXY=http://
    - HTTPS_PROXY=http://
  restart: always
  depends_on:
    &amp;lt;&amp;lt;: *airflow-common-depends-on
    airflow-init:
      condition: service_completed_successfully&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;하지만&amp;nbsp;db와&amp;nbsp;통신이&amp;nbsp;안되어&amp;nbsp;'Please&amp;nbsp;airflow&amp;nbsp;db&amp;nbsp;init'&amp;nbsp;에러가&amp;nbsp;계속&amp;nbsp;나와&amp;nbsp;진행이&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;2.&amp;nbsp;호스트&amp;nbsp;서버에서&amp;nbsp;airflow.cfg&amp;nbsp;파일을&amp;nbsp;옮기기&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1729570891597&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it -u root airflow-airflow-webserver-1 bash
 
cat airflow.cfg
rm -rf airflow.cfg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;텍스트 복사 후 호스트 서버에서 test_connection = Enabled로 수정 후 파일 생성(airflow.cfg)&lt;/p&gt;
&lt;pre id=&quot;code_1729570898477&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker cp airflow.cfg airflow-airflow-webserver-1:/opt/airflow


docker restart airflow-airflow-webserver-1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QlOrl/btsKeTopSr5/ltB3SWqkATFr98pF1ZJanK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QlOrl/btsKeTopSr5/ltB3SWqkATFr98pF1ZJanK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QlOrl/btsKeTopSr5/ltB3SWqkATFr98pF1ZJanK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQlOrl%2FbtsKeTopSr5%2FltB3SWqkATFr98pF1ZJanK%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;362&quot; height=&quot;170&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps</category>
      <author>땅지원</author>
      <guid isPermaLink="true">https://ddangjiwon.tistory.com/377</guid>
      <comments>https://ddangjiwon.tistory.com/377#entry377comment</comments>
      <pubDate>Tue, 22 Oct 2024 13:21:57 +0900</pubDate>
    </item>
    <item>
      <title>[Airflow] Airflow 설치 (Docker)</title>
      <link>https://ddangjiwon.tistory.com/376</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Airflow&amp;nbsp;릴리즈&amp;nbsp;정보&amp;nbsp;확인&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://airflow.apache.org/announcements/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://airflow.apache.org/announcements/&lt;/a&gt;&lt;br /&gt;Running&amp;nbsp;Airflow&amp;nbsp;in&amp;nbsp;Docker&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://airflow.apache.org/docs/apache-airflow/2.9.0/howto/docker-compose/index.html#&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://airflow.apache.org/docs/apache-airflow/2.9.0/howto/docker-compose/index.html#&lt;/a&gt;&lt;br /&gt;&lt;br /&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;&lt;b&gt;1.&amp;nbsp;Fetching&amp;nbsp;docker-compose.yaml &lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1729570522381&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.9.0/docker-compose.yaml'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;airflow-scheduler - 스케줄러는 모든 작업(task)과 DAG를 모니터링하고, 각 작업의 종속성이 완료되면 해당 작업 인스턴스를 실행&lt;br /&gt;airflow-webserver - 웹서버는 http://localhost:8080에서 사용, port 변경 가능&lt;br /&gt;airflow-worker - 스케줄러가 제공하는 작업을 실행하는 워커&lt;br /&gt;airflow-triggerer - Triggerer는 deferrable task(대기 가능한 작업)를 위한 이벤트 루프를 실행&lt;br /&gt;airflow-init - 초기화 서비스&lt;br /&gt;postgres -&amp;nbsp;&amp;nbsp;메인 DB &amp;rarr; MySQL로 바꾸는 방법 존재&lt;br /&gt;redis&amp;nbsp;-&amp;nbsp;스케줄러에서&amp;nbsp;워커로&amp;nbsp;메시지를&amp;nbsp;전달하는&amp;nbsp;브로커&amp;nbsp;역할 &lt;br /&gt;&lt;br /&gt;* Optionally, you can enable flower by adding --profile flower option, e.g. docker compose --profile flower up, or by explicitly specifying it on the command line e.g. docker compose up flower.&lt;br /&gt;flower - The flower app for monitoring the environment. It is available at http://localhost:5555.&lt;br /&gt;&lt;br /&gt;docker-compose.yaml&amp;nbsp;파일에서&amp;nbsp;airflow-webserver&amp;nbsp;ports&amp;nbsp;부분을&amp;nbsp;변경할&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3sjoF/btsKdQfaTAr/LuiTrm3F0m7LyVszuqjE5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3sjoF/btsKdQfaTAr/LuiTrm3F0m7LyVszuqjE5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3sjoF/btsKdQfaTAr/LuiTrm3F0m7LyVszuqjE5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3sjoF%2FbtsKdQfaTAr%2FLuiTrm3F0m7LyVszuqjE5K%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;916&quot; height=&quot;667&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;667&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;&amp;nbsp;Initializing Environment&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너에 있는 일부 디렉터리는 마운트 되어있기 때문에 미리 폴더를 만들어줘야한다.&lt;br /&gt;&lt;br /&gt;./dags - DAG 파일 추가&lt;br /&gt;./logs - 작업 실행 및 스케줄러의 로그 저장 폴더&lt;br /&gt;./config - 커스텀 로그 파서를 추가하거나 airflow_local_settings.py 파일을 추가해 클러스터 정책을 구성 가능&lt;br /&gt;./plugins - 커스텀 플러그인 추가&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1729570595468&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir -p ./dags ./logs ./plugins ./config
echo -e &quot;AIRFLOW_UID=$(id -u)&quot; &amp;gt; .env
cat .env
 
AIRFLOW_UID=1004&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;b&gt;3. Initialize the database&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1729570605790&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose up airflow-init&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;b&gt;4-1.&amp;nbsp;Running&amp;nbsp;Airflow &lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1729570616037&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose up&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;ID : airflow&lt;br /&gt;PWD&amp;nbsp;:&amp;nbsp;airflow &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kl9sN/btsKfeZ8Tk2/OvmIkzgqVluB9KgrOYmE5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kl9sN/btsKfeZ8Tk2/OvmIkzgqVluB9KgrOYmE5k/img.png&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;662&quot; data-is-animation=&quot;false&quot; style=&quot;width: 55.6847%; margin-right: 10px;&quot; data-widthpercent=&quot;56.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kl9sN/btsKfeZ8Tk2/OvmIkzgqVluB9KgrOYmE5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKl9sN%2FbtsKfeZ8Tk2%2FOvmIkzgqVluB9KgrOYmE5k%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;1229&quot; height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmizx0/btsKfp1wmlO/xP9Okf9vBT0q8eQhcYRTEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmizx0/btsKfp1wmlO/xP9Okf9vBT0q8eQhcYRTEk/img.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;848&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.1525%;&quot; data-widthpercent=&quot;43.66&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmizx0/btsKfp1wmlO/xP9Okf9vBT0q8eQhcYRTEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcmizx0%2FbtsKfp1wmlO%2FxP9Okf9vBT0q8eQhcYRTEk%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;1220&quot; height=&quot;848&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;4-2 Running flower&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Airflow 클러스터에서 작업 상태 및 진행 상황을 모니터링하기 위한 웹 기반 모니터링 툴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Flower는&amp;nbsp;주로&amp;nbsp;Airflow에서&amp;nbsp;사용되는&amp;nbsp;Celery&amp;nbsp;Executor와&amp;nbsp;함께&amp;nbsp;사용되며,&amp;nbsp;Celery의&amp;nbsp;작업&amp;nbsp;및&amp;nbsp;워커&amp;nbsp;상태를&amp;nbsp;실시간으로&amp;nbsp;모니터링할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;기능을&amp;nbsp;제공 &lt;br /&gt;&lt;br /&gt;&amp;lt;주요&amp;nbsp;기능&amp;gt; &lt;br /&gt;작업(task)&amp;nbsp;상태&amp;nbsp;모니터링:&amp;nbsp;&amp;nbsp;현재&amp;nbsp;실행&amp;nbsp;중인&amp;nbsp;작업,&amp;nbsp;성공&amp;nbsp;또는&amp;nbsp;실패한&amp;nbsp;작업을&amp;nbsp;실시간으로&amp;nbsp;확인&amp;nbsp; &lt;br /&gt;워커(worker)&amp;nbsp;상태&amp;nbsp;확인:&amp;nbsp;워커의&amp;nbsp;상태,&amp;nbsp;사용&amp;nbsp;중인&amp;nbsp;메모리,&amp;nbsp;CPU&amp;nbsp;자원&amp;nbsp;등을&amp;nbsp;모니터링 &lt;br /&gt;작업&amp;nbsp;리트라이&amp;nbsp;및&amp;nbsp;강제&amp;nbsp;실행:&amp;nbsp;실패한&amp;nbsp;작업을&amp;nbsp;Flower&amp;nbsp;UI에서&amp;nbsp;직접&amp;nbsp;재시도하거나&amp;nbsp;다시&amp;nbsp;실행 &lt;br /&gt;실시간&amp;nbsp;로그:&amp;nbsp;각&amp;nbsp;작업의&amp;nbsp;로그를&amp;nbsp;실시간으로&amp;nbsp;확인 &lt;br /&gt;Celery 큐 모니터링: 각 큐의 작업 대기 상태를 볼 수 있어 작업이 병목을 일으키고 있는지 쉽게 파악&lt;/p&gt;
&lt;pre id=&quot;code_1729570631390&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose up flower&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;1222&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfgJSo/btsKe86LRoU/K1lvSK9Id6wMTx9k8QZ8o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfgJSo/btsKe86LRoU/K1lvSK9Id6wMTx9k8QZ8o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfgJSo/btsKe86LRoU/K1lvSK9Id6wMTx9k8QZ8o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfgJSo%2FbtsKe86LRoU%2FK1lvSK9Id6wMTx9k8QZ8o1%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;1222&quot; height=&quot;597&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.&amp;nbsp;Stop&amp;nbsp;and&amp;nbsp;Delete&amp;nbsp;Container &lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1729570635469&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose down&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;</description>
      <category>DevOps</category>
      <author>땅지원</author>
      <guid isPermaLink="true">https://ddangjiwon.tistory.com/376</guid>
      <comments>https://ddangjiwon.tistory.com/376#entry376comment</comments>
      <pubDate>Tue, 22 Oct 2024 13:18:59 +0900</pubDate>
    </item>
    <item>
      <title>Dockerfile을 이용한 코드에 의한 서버 구축</title>
      <link>https://ddangjiwon.tistory.com/47</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도커&amp;nbsp;이미지&amp;nbsp;만들기 &lt;/b&gt;&lt;br /&gt;도커는 이미지를 만들기 위해 컨테이너의 상태를 그대로 이미지로 저장하는 단순한&amp;nbsp;방법을&amp;nbsp;사용함 &lt;br /&gt;예를 들어, 어떤 애플리케이션을 이미지로 만든다면, 리눅스만 설치된 컨테이너에&amp;nbsp;애플리케이션을&amp;nbsp;설치하고&amp;nbsp;그&amp;nbsp;상태를&amp;nbsp;그대로&amp;nbsp;이미지로&amp;nbsp;저장함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lu3Bt/btqI5yMDqZV/xU0yQgA4dOXISwYft19iGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lu3Bt/btqI5yMDqZV/xU0yQgA4dOXISwYft19iGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lu3Bt/btqI5yMDqZV/xU0yQgA4dOXISwYft19iGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flu3Bt%2FbtqI5yMDqZV%2FxU0yQgA4dOXISwYft19iGk%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;807&quot; height=&quot;374&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저자&amp;nbsp;제공&amp;nbsp;sample&amp;nbsp;파일을&amp;nbsp;download&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1600406929573&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git clone https://github.com/asashiho/dockertext2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Docker&amp;nbsp;파일이란&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령에&amp;nbsp;의한&amp;nbsp;Docker&amp;nbsp;이미지의&amp;nbsp;작성&amp;nbsp;방법&amp;nbsp;(기존&amp;nbsp;방식)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;베이스가 되는 Docker 이미지를 바탕으로 Docker 컨테이너를 생성하고,&amp;nbsp; 생성한 Docker 컨테이너 안에서 OS의 설정이나 미들웨어의 설치, 파라미터의&amp;nbsp;설치를&amp;nbsp;수동으로&amp;nbsp;수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들어진 컨테이너에서 서버를 구축한 상태를 바탕으로 Docker 이미지를 생성&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;u&gt;Dockerfile 파일에 의한 Docker 이미지의 작성 방법 (현재&amp;nbsp;방법&amp;nbsp;)&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dockerfile은 Docker상에서 작동시킬 컨테이너의 구성 정보를 기술하기&amp;nbsp;위한&amp;nbsp;파일 &lt;br /&gt;Docker build명령은 Dockerfile에 기술된 구성정보를 바탕으로 Docker&amp;nbsp;이미지를&amp;nbsp;생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOvVkx/btqIZjKmXof/rmMx3UhsNaUnTEb0fhx4l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOvVkx/btqIZjKmXof/rmMx3UhsNaUnTEb0fhx4l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOvVkx/btqIZjKmXof/rmMx3UhsNaUnTEb0fhx4l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOvVkx%2FbtqIZjKmXof%2FrmMx3UhsNaUnTEb0fhx4l1%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;753&quot; height=&quot;242&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dockerfile&lt;/b&gt; &lt;br /&gt;텍스트 파일 형식의 파일로 에디터 등을 이용해서 작성 &lt;br /&gt;확장자는 필요 없음 &lt;br /&gt;dockerfile 이외의 다른 이름 사용 시 docker build 명령 시 &amp;ldquo;-f&amp;rdquo; 옵션 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1729471723362&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;Dockerfile reference&quot; data-og-description=&quot;Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.&quot; data-og-host=&quot;docs.docker.com&quot; data-og-source-url=&quot;https://docs.docker.com/reference/dockerfile/&quot; data-og-url=&quot;https://docs.docker.com/reference/dockerfile/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c1eNoE/hyXhW1dkJi/BSzEzO9PhcJ1aNuwSIDwtk/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot;&gt;&lt;a href=&quot;https://docs.docker.com/reference/dockerfile/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.docker.com/reference/dockerfile/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c1eNoE/hyXhW1dkJi/BSzEzO9PhcJ1aNuwSIDwtk/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260');&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;Dockerfile reference&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNNXq6/btqI08nWj6I/UQt2NWx259dQvAwy7N5lX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNNXq6/btqI08nWj6I/UQt2NWx259dQvAwy7N5lX0/img.png&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;366&quot; data-filename=&quot;2.PNG&quot; style=&quot;width: 51.6983%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNNXq6/btqI08nWj6I/UQt2NWx259dQvAwy7N5lX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNNXq6%2FbtqI08nWj6I%2FUQt2NWx259dQvAwy7N5lX0%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;669&quot; height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsoMip/btqIX4zxbnl/A6sCdrCWkwrk0KmDnGoGlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsoMip/btqIX4zxbnl/A6sCdrCWkwrk0KmDnGoGlK/img.png&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;423&quot; data-filename=&quot;1.PNG&quot; style=&quot;width: 47.1389%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsoMip/btqIX4zxbnl/A6sCdrCWkwrk0KmDnGoGlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsoMip%2FbtqIX4zxbnl%2FA6sCdrCWkwrk0KmDnGoGlK%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;705&quot; height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/div&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;FROM&amp;nbsp;명령(필수&amp;nbsp;명령) &lt;/b&gt;&lt;br /&gt;베이스 이미지를 지정함 &lt;br /&gt;tag 생략 시 최신 버전 지정됨 &lt;br /&gt;이미 만들어진 다양한 베이스 이미지는 Docker hub에서 확인 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHAKM9/btqI5SRJJqv/SFkvgfWYlkcNb0kfNSHth0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHAKM9/btqI5SRJJqv/SFkvgfWYlkcNb0kfNSHth0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHAKM9/btqI5SRJJqv/SFkvgfWYlkcNb0kfNSHth0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHAKM9%2FbtqI5SRJJqv%2FSFkvgfWYlkcNb0kfNSHth0%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;301&quot; height=&quot;88&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;88&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;Docker&amp;nbsp;이미지&amp;nbsp;생성&amp;nbsp;실습&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbJkhg/btqI5BbD8s0/pvYwm8H6xH0rNKJkoWo7b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbJkhg/btqI5BbD8s0/pvYwm8H6xH0rNKJkoWo7b0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbJkhg/btqI5BbD8s0/pvYwm8H6xH0rNKJkoWo7b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbJkhg%2FbtqI5BbD8s0%2FpvYwm8H6xH0rNKJkoWo7b0%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;1008&quot; height=&quot;614&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;614&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;Dockerfile의&amp;nbsp;빌드&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z7gRq/btqI4egCIjH/If4ErbcGIPpuERkUy9jaJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z7gRq/btqI4egCIjH/If4ErbcGIPpuERkUy9jaJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z7gRq/btqI4egCIjH/If4ErbcGIPpuERkUy9jaJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz7gRq%2FbtqI4egCIjH%2FIf4ErbcGIPpuERkUy9jaJk%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;591&quot; height=&quot;177&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;177&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;Docker파일을 이미지로 바꿔준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-t sample:1.0은 tag&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;$PWD/sample은 docker파일의 경로를 나타낸다 ($PWD는 &lt;span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Note&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;베이스&amp;nbsp;이미지와&amp;nbsp;작성한&amp;nbsp;두&amp;nbsp;개의&amp;nbsp;이미지의&amp;nbsp;이미지&amp;nbsp;ID(image&amp;nbsp;ID)가&amp;nbsp;모두&amp;nbsp;동일 &lt;br /&gt;이미지로서는 각각 다른 이름이 붙어 있지만, 그 실체는 모두 동일한 이미지라는&amp;nbsp;것을&amp;nbsp;나타냄&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UECFR/btqI4doua2j/i3BkorqpZin03cNIAmHogK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UECFR/btqI4doua2j/i3BkorqpZin03cNIAmHogK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UECFR/btqI4doua2j/i3BkorqpZin03cNIAmHogK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUECFR%2FbtqI4doua2j%2Fi3BkorqpZin03cNIAmHogK%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;677&quot; height=&quot;202&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;202&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;Dockerfile이&amp;nbsp;아닌&amp;nbsp;파일을&amp;nbsp;사용한&amp;nbsp;Docker&amp;nbsp;Build&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1600407987775&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ docker build &amp;ndash;t sample -f Dockerfile.base&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;b&gt;Docker&amp;nbsp;이미지의&amp;nbsp;layer&amp;nbsp;구조 &lt;/b&gt;&lt;br /&gt;Dockerfile을 빌드하여 Docker 이미지를 작성하면, Dockerfile의 명령별로 이미지를&amp;nbsp;작성함 &lt;br /&gt;작성된 여러 개의 이미지는 layer 구조로 되어 있음&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;Dockerfile 작성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ds6bfJ/btqI2FT9Rv2/UM30M1qzkVEWMtYFi0FoCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ds6bfJ/btqI2FT9Rv2/UM30M1qzkVEWMtYFi0FoCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ds6bfJ/btqI2FT9Rv2/UM30M1qzkVEWMtYFi0FoCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fds6bfJ%2FbtqI2FT9Rv2%2FUM30M1qzkVEWMtYFi0FoCk%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;713&quot; height=&quot;561&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;561&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 widthContent&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Izg3I/btqI9oi5hrh/DkkMOWqpmthVLzqKnkkEkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Izg3I/btqI9oi5hrh/DkkMOWqpmthVLzqKnkkEkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Izg3I/btqI9oi5hrh/DkkMOWqpmthVLzqKnkkEkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIzg3I%2FbtqI9oi5hrh%2FDkkMOWqpmthVLzqKnkkEkk%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;558&quot; height=&quot;384&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;nginx와 index.html를 통해 새로운 Dockerfile을 만들어 준다.&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_1600588147959&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ docker build -t webap .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 이용해서 Dockerfile을 도커이미지로 build 해준다.&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 widthContent&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FE4ML/btqI7w2LYmD/pvHpHaXoulykI704D6ksY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FE4ML/btqI7w2LYmD/pvHpHaXoulykI704D6ksY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FE4ML/btqI7w2LYmD/pvHpHaXoulykI704D6ksY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFE4ML%2FbtqI7w2LYmD%2FpvHpHaXoulykI704D6ksY1%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;674&quot; height=&quot;165&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I1t6Y/btqI6ixn7ha/AkVgpIWegJakKSAZ1Lkxx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I1t6Y/btqI6ixn7ha/AkVgpIWegJakKSAZ1Lkxx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I1t6Y/btqI6ixn7ha/AkVgpIWegJakKSAZ1Lkxx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI1t6Y%2FbtqI6ixn7ha%2FAkVgpIWegJakKSAZ1Lkxx1%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;607&quot; height=&quot;218&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1600589490661&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ docker container run -d -p 80:80 --name webserver_2 webap&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 통해서 webserver_2라는 container를 만들어주고 실행한 다음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 서버로 들어와보면 index파일대로 표시가 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC2DFy/btqI5AdK84e/oMUsT20UNMkm3MwjqKfo41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC2DFy/btqI5AdK84e/oMUsT20UNMkm3MwjqKfo41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC2DFy/btqI5AdK84e/oMUsT20UNMkm3MwjqKfo41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC2DFy%2FbtqI5AdK84e%2FoMUsT20UNMkm3MwjqKfo41%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;989&quot; height=&quot;725&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 여기서 유의할 점은 index.html를 수정하고 다시 컨테이너를 실행하면 안된다. Dockerfile를 도커 이미지로 바꿀 때의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index파일로 되어있기 때문이다.&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;명령&amp;nbsp;실행(RUN&amp;nbsp;명령)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;□ &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;Shell&amp;nbsp;형식으로&amp;nbsp;기술&amp;nbsp;:&amp;nbsp;shell에서&amp;nbsp;실행하는&amp;nbsp;형식으로&amp;nbsp;기술 &lt;br /&gt;- apt 명령으로 Nginx를 설치할 경우&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD1E6r/btqI5yAgsOF/KKUdSdNltlWS8OTtGcPHqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD1E6r/btqI5yAgsOF/KKUdSdNltlWS8OTtGcPHqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD1E6r/btqI5yAgsOF/KKUdSdNltlWS8OTtGcPHqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD1E6r%2FbtqI5yAgsOF%2FKKUdSdNltlWS8OTtGcPHqK%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;350&quot; height=&quot;54&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;54&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;□ &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;Exec&amp;nbsp;형식으로&amp;nbsp;기술 &lt;br /&gt;-&amp;nbsp;shell을&amp;nbsp;경유하지&amp;nbsp;않고&amp;nbsp;직접&amp;nbsp;실행(JSON&amp;nbsp;배열&amp;nbsp;형식):&amp;nbsp;환경&amp;nbsp;변수&amp;nbsp;($HOME&amp;nbsp;사용&amp;nbsp;불가)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rgQh8/btqI1KOVAxG/ZkLxzUkChT6rwzxROAKgp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rgQh8/btqI1KOVAxG/ZkLxzUkChT6rwzxROAKgp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rgQh8/btqI1KOVAxG/ZkLxzUkChT6rwzxROAKgp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrgQh8%2FbtqI1KOVAxG%2FZkLxzUkChT6rwzxROAKgp1%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;570&quot; height=&quot;53&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;53&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;데몬&amp;nbsp;실행(CMD&amp;nbsp;명령) &lt;/b&gt;&lt;br /&gt;이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행할 경우 &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;□&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;Exec 형식으로 기술: CMD [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;□ &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;Shell 형식으로 기술: CMD nginx -g 'daemon off;&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: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;□&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;ENTRYPOINT&amp;nbsp;명령의&amp;nbsp;파라미터로&amp;nbsp;기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Exec 형식으로 기술: ENTRYPOINT [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;] &lt;br /&gt;Shell 형식으로 기술: ENTRYPOINT nginx -g 'daemon off;'&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ENTRYPOINT&amp;nbsp;명령과&amp;nbsp;CMD명령을&amp;nbsp;조합한&amp;nbsp;예&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wnRad/btqI08igQSr/51u4FF9Y6KjvsWNzcgKTm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wnRad/btqI08igQSr/51u4FF9Y6KjvsWNzcgKTm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wnRad/btqI08igQSr/51u4FF9Y6KjvsWNzcgKTm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwnRad%2FbtqI08igQSr%2F51u4FF9Y6KjvsWNzcgKTm1%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;499&quot; height=&quot;154&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1600590027239&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ docker build -t sample_cmd_entr .&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZiyWK/btqI5887Ahg/COFrXSceKYoFvmeNwMEpJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZiyWK/btqI5887Ahg/COFrXSceKYoFvmeNwMEpJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZiyWK/btqI5887Ahg/COFrXSceKYoFvmeNwMEpJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZiyWK%2FbtqI5887Ahg%2FCOFrXSceKYoFvmeNwMEpJK%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;615&quot; height=&quot;350&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10초마다 갱신되는 모습을 보여주고 있다.&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 widthContent&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drVs2Y/btqI6Gkxrx8/5lobw5IQ5r81rxDN0OwiB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drVs2Y/btqI6Gkxrx8/5lobw5IQ5r81rxDN0OwiB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drVs2Y/btqI6Gkxrx8/5lobw5IQ5r81rxDN0OwiB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrVs2Y%2FbtqI6Gkxrx8%2F5lobw5IQ5r81rxDN0OwiB0%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;655&quot; height=&quot;208&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;208&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;CMD 명령은 Docker container run 수행 시 외부에서 overwrite 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-d 2를 이용해서 2초마다 갱신으로 바꿔주는 command를 추가해줬다.&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;</description>
      <category>DevOps</category>
      <author>땅지원</author>
      <guid isPermaLink="true">https://ddangjiwon.tistory.com/47</guid>
      <comments>https://ddangjiwon.tistory.com/47#entry47comment</comments>
      <pubDate>Mon, 21 Oct 2024 11:15:38 +0900</pubDate>
    </item>
    <item>
      <title>검색 증강 생성(RAG)이란?</title>
      <link>https://ddangjiwon.tistory.com/375</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #5f6368; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG(검색 증강 생성)는 데이터베이스와 같은 기존 정보 검색 시스템의 강점과 생성형 대규모 언어 모델(LLM)의 기능을 결합한 AI 프레임워크입니다.&amp;nbsp;AI는 이러한 추가 지식과 자체 언어 기술을 결합하여 사용자의 특정 니즈에 맞는 보다 정확하고 최신 상태의 텍스트를 작성할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5f6368; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #202124;&quot; data-ke-size=&quot;size26&quot;&gt;검색 증강 생성은 어떻게 작동하나요?&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 생성형 AI 출력 향상에 도움이 되는 몇 가지 주요 단계로 작동합니다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;검색 및 사전 처리&lt;/b&gt;: RAG는 강력한 검색 알고리즘을 활용하여 웹페이지, 기술 자료, 데이터베이스와 같은 외부 데이터를 쿼리합니다. 검색된 관련 정보는 토큰화, 어간 추출, 금지어 제거 등의 사전 처리 과정을 거칩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;생성&lt;/b&gt;: 사전 처리된 검색 정보가 선행 학습된 LLM에 원활하게 통합됩니다. 이러한 통합을 통해 LLM의 컨텍스트가 강화되어 주제를 보다 포괄적으로 이해할 수 있습니다. LLM은 이러한 증강된 컨텍스트를 통해 보다 정확하고 유익하며 몰입도 높은 대답을 생성할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 먼저 LLM에 의해 생성된 쿼리를 사용해 데이터베이스에서 관련 정보를 검색하는 방식으로 작동합니다. 이렇게 검색된 정보는 LLM의 쿼리 입력에 통합되어 더 정확하고 상황에 맞는 텍스트를 생성할 수 있습니다. RAG는 효율적인 검색 및 조회가 가능하도록 데이터를 저장하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #1a73e8;&quot; href=&quot;https://cloud.google.com/discover/what-is-a-vector-database&quot;&gt;벡터 데이터베이스&lt;/a&gt;를 활용합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #202124;&quot; data-ke-size=&quot;size26&quot;&gt;RAG를 사용하는 이유&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 특히 사실에 기반한 정보 또는 데이터 기반 응답을 다룰 때 기존 텍스트 생성 방법에 비해 여러 가지 이점을 제공합니다. RAG를 사용하는 것이 유익한 몇 가지 주요 이유는 다음과 같습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 style=&quot;color: #202124;&quot; data-ke-size=&quot;size23&quot;&gt;업데이트된 정보에 액세스&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 LLM은 선행 학습된 지식과 데이터로 한정되는 경우가 많습니다. 이로 인해 응답이 오래되거나 부정확할 수 있습니다. RAG는 LLM에 외부 정보 소스에 대한 액세스 권한을 부여하여 정확한 최신 답변을 보장함으로써 이를 극복합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 style=&quot;color: #202124;&quot; data-ke-size=&quot;size23&quot;&gt;사실 그라운딩&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 창의적이고 흥미로운 텍스트를 생성하는 강력한 도구이지만 사실에 기반한 정확성에서 어려움을 겪을 수 있습니다. 이는 LLM이 부정확한 정보나 편향을 포함할 수 있는 방대한 양의 텍스트 데이터를 학습하기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 LLM에게 엄선된 기술 자료에 대한 액세스 권한을 제공하고 생성된 텍스트가 사실에 기반한 정보에 그라운딩되었는지 확인함으로써 이 문제를 해결하는 데 도움을 줍니다. 따라서 RAG는 뉴스 보도, 과학 저술 또는 고객 서비스와 같이 정확성이 가장 중요한 애플리케이션에 특히 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: RAG는 최종 사용자에게 할루시네이션이 전송되는 것을 방지하는 데도 도움이 될 수 있습니다. LLM은 학습이 완료되지 않은 경우에도 때때로 솔루션을 생성할 수 있지만 RAG 기법은 사용자 환경을 개선하는 데 도움이 됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 style=&quot;color: #202124;&quot; data-ke-size=&quot;size23&quot;&gt;컨텍스트 관련성&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG의 검색 메커니즘은 입력 쿼리 또는 컨텍스트와 관련 있는 정보가 검색되도록 보장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 LLM에 상황에 맞는 정보를 제공함으로써 모델이 특정 컨텍스트에 더 일관성 있고 더 적절한 대답을 생성할 수 있도록 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 상황별 그라운딩은 관련이 없거나 주제에서 벗어난 대답이 생성되지 않도록 하는 데 도움이 됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 style=&quot;color: #202124;&quot; data-ke-size=&quot;size23&quot;&gt;사실의 일관성&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 LLM이 검색된 사실 정보와 일치하는 대답을 생성하도록 합니다.&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;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 style=&quot;color: #202124;&quot; data-ke-size=&quot;size23&quot;&gt;벡터 데이터베이스 활용&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 벡터 데이터베이스를 활용하여 관련 문서를 효율적으로 검색합니다. 벡터 데이터베이스는 문서를 고차원 공간에 벡터로 저장하므로 시맨틱 유사성을 기반으로 빠르고 정확하게 검색할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 style=&quot;color: #202124;&quot; data-ke-size=&quot;size23&quot;&gt;향상된 대답 정확도&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 상황에 맞는 정보를 제공하여 LLM을 보완합니다. 그러면 LLM은 이 정보를 사용하여 보다 일관되고 유익하며 정확한 응답(멀티모달 대답 포함)을 생성할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 style=&quot;color: #202124;&quot; data-ke-size=&quot;size23&quot;&gt;RAG 및 챗봇&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG를 챗봇 시스템에 통합하여 대화 능력을 향상시킬 수 있습니다. RAG 기반 챗봇이 외부 정보에 액세스하면 외부 지식을 활용해 보다 포괄적이고 유익하며 상황에 맞는 대답을 제공하여 전반적인 사용자 경험을 개선할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1. RAG 란?&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;* 사전적 의미와 프로세스&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;RAG(Retrieval-Augmented Generation)는 대규모 언어 모델의 출력을 최적화하여 응답을 생성하기 전에 학습 데이터 소스 외부의 신뢰할 수 있는 지식 베이스를 참조하도록 하는 프로세스입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B6qoK/btsJ7434tVI/36hyh9JE4KVzuVQkG5nzMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B6qoK/btsJ7434tVI/36hyh9JE4KVzuVQkG5nzMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B6qoK/btsJ7434tVI/36hyh9JE4KVzuVQkG5nzMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB6qoK%2FbtsJ7434tVI%2F36hyh9JE4KVzuVQkG5nzMK%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;1280&quot; height=&quot;878&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;878&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;프로세스 내에서는 의도분류, 데이터 정합성판단, 환각현상 판단, 답변생성의 과정도 포함되어있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1-2. 종류&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1-2-1. Adaptive RAG&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzwb0f/btsJ7O8gZxB/J3qQZ4VV9DykbG8aX4uiW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzwb0f/btsJ7O8gZxB/J3qQZ4VV9DykbG8aX4uiW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzwb0f/btsJ7O8gZxB/J3qQZ4VV9DykbG8aX4uiW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzwb0f%2FbtsJ7O8gZxB%2FJ3qQZ4VV9DykbG8aX4uiW1%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;1280&quot; height=&quot;671&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Adaptive RAG 는 사용자의 질문이 사용자가 가지고있는 데이터베이스의 정보와 연관성을 판단하여 검색어를 확장합니다. 연관성이 없을경우 검색엔진을 활용한 응답으로 넘어갑니다. 이는 검색엔진 뿐만 아니라 추가적인 데이터 수집 방법을 활용할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1-2-2. Corrective&amp;nbsp;RAG&amp;nbsp;(CRAG)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pvpWZ/btsJ6VAjqUD/QdAUTkWdLzTyCE4l0F3rM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pvpWZ/btsJ6VAjqUD/QdAUTkWdLzTyCE4l0F3rM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pvpWZ/btsJ6VAjqUD/QdAUTkWdLzTyCE4l0F3rM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpvpWZ%2FbtsJ6VAjqUD%2FQdAUTkWdLzTyCE4l0F3rM0%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;1280&quot; height=&quot;548&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CRAG 는 Retrieval 된 검색어를 채점하는 RAG입니다. 채점시에 질문과 확장된 질문이 연관성이 없다면 쿼리를 재생성하고 검색엔진에 넣어 응답을 생성합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style7&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1-2-3. Self_RAG&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ntrYC/btsJ7vnueog/0V42braS5dxIk6ZhrlJi31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ntrYC/btsJ7vnueog/0V42braS5dxIk6ZhrlJi31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ntrYC/btsJ7vnueog/0V42braS5dxIk6ZhrlJi31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FntrYC%2FbtsJ7vnueog%2F0V42braS5dxIk6ZhrlJi31%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;1280&quot; height=&quot;475&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Self_RAG 는 질문을 증강하여 채점후 연관성이 없으면 질문을 다시 생성하여 연관성이 있을때까지 반복합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1-3. 핵심 로직&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;RAG의 핵심 로직은 반복 쿼리 로직입니다. RAG 공식 문서에서는 langgraph의 StateGraph 를 활용하여 workflow를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728990512559&quot; class=&quot;reasonml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from langgraph.graph import END, StateGraph
workflow = StateGraph(GraphState)

# 노드 정의
workflow.add_node(&quot;web_search&quot;, web_search)  # 검색엔진
workflow.add_node(&quot;retrieve&quot;, retrieve)  # retrieve # 검색증강
workflow.add_node(&quot;grade_documents&quot;, grade_documents)  # 검증
workflow.add_node(&quot;generate&quot;, generate)  # Generate
workflow.add_node(&quot;transform_query&quot;, transform_query)  # 질문 변형, 재생성

...&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. 사용성&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2-1. 실시간 학습 불가&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재 파라미터수가 엄청나게 거대해진 LLM 모델들이 데이터를 한건한건 실시간으로 학습하는것은 불가능 하다고 볼 수 있습니다. GPT-4o는 2023년 4월까지 의 데이터를 학습했으며 그 이후의 데이터는 알지 못합니다. 여러 새로운 문화와 지식이 급증하는 시기에 1년 이상의 지식차이는 아주 뒤떨어지는것으로 볼 수 있으며 이를 해결하기 위하여 프롬프트에 현재 데이터를 함께 넘겨주는 방법을 사용하기 시작했습니다. 이를 정형화하는 과정 중 RAG 방법론이 탄생했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pq1Ml/btsJ6hcEs8T/de8EBsJldkJNEBrKGDQawK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pq1Ml/btsJ6hcEs8T/de8EBsJldkJNEBrKGDQawK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pq1Ml/btsJ6hcEs8T/de8EBsJldkJNEBrKGDQawK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpq1Ml%2FbtsJ6hcEs8T%2Fde8EBsJldkJNEBrKGDQawK%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;310&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2-2. Hallucination, 생성내용에 대한 피드백&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실시간 학습이 불가하기에 LLM은 학습하지 않은 데이터에 대한 질문은 없는 지식을 새로 창조하거나 현실적이지 않은 말도 안되는 결과물로 답을 했습니다. 이는 정확한 정보를 요구하는 사용자에게는 아주 쓸모없는 인공지능이 될 것입니다. RAG 방법론에서는 자체적으로 LLM이 생성한 결과물이 현실적인지를 검증합니다.&lt;/p&gt;</description>
      <category>인공지능/인공지능</category>
      <author>땅지원</author>
      <guid isPermaLink="true">https://ddangjiwon.tistory.com/375</guid>
      <comments>https://ddangjiwon.tistory.com/375#entry375comment</comments>
      <pubDate>Tue, 15 Oct 2024 20:08:40 +0900</pubDate>
    </item>
    <item>
      <title>[ELK] Elasticsearch SSL 인증서 발급</title>
      <link>https://ddangjiwon.tistory.com/374</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Elasticsearch&amp;nbsp;Node&amp;nbsp;(transport)&amp;nbsp;SSL&amp;nbsp;인증서&amp;nbsp;설치&amp;nbsp;및&amp;nbsp;적용&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1727845406489&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. CA 인증서 생성

&amp;gt; bin/elasticsearch-certutil ca




2. CA 인증서 기반으로 인증서 생성

&amp;gt; bin/elasticsearch-certutil cert --ca [CA인증서 파일명]




3. config/elasticsearch.yml 파일 수정

config/elasticsearch.yml 에서 ssl 인증서 파일 경로 변경




4. elasticsearch.keystore에 인증서 비밀번호 변경(추가)

&amp;gt; bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password

&amp;gt; bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password




5. 엘라스틱서치 재시작

&amp;gt; bin/run.sh restart&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Elasticsearch&amp;nbsp;Node&amp;nbsp;(http)&amp;nbsp;SSL&amp;nbsp;인증서&amp;nbsp;설치&amp;nbsp;및&amp;nbsp;적용&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1727845435453&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. CA 인증서 생성

&amp;gt; bin/elasticsearch-certutil http




2. CSR 생성 ? n

    CA 사용 여부 Y

    CA 경로 지정 : elastic-stak-ca.p12 경로 지정

   node별 발급 여부 y

  node name 입력

   host 이름 입력

  ip 입력

  keystore 암호 입력




3. config/elasticsearch.yml 파일 수정

xpack.security.http.ssl.keystore.path : http.p12




4. elasticsearch.keystore에 인증서 비밀번호 변경(추가)

&amp;gt; bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password




5. 엘라스틱서치 재시작

&amp;gt; bin/run.sh restart&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>DevOps/ELK</category>
      <author>땅지원</author>
      <guid isPermaLink="true">https://ddangjiwon.tistory.com/374</guid>
      <comments>https://ddangjiwon.tistory.com/374#entry374comment</comments>
      <pubDate>Wed, 2 Oct 2024 14:04:48 +0900</pubDate>
    </item>
  </channel>
</rss>