<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bb-seok.log</title>
        <link>https://velog.io/</link>
        <description>Develop</description>
        <lastBuildDate>Wed, 04 Sep 2024 09:23:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. bb-seok.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bb-seok" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Linux] 리눅스 마스터 2급 모의 문제 - 4]]></title>
            <link>https://velog.io/@bb-seok/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-2%EA%B8%89-%EB%AA%A8%EC%9D%98-%EB%AC%B8%EC%A0%9C-4</link>
            <guid>https://velog.io/@bb-seok/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-2%EA%B8%89-%EB%AA%A8%EC%9D%98-%EB%AC%B8%EC%A0%9C-4</guid>
            <pubDate>Wed, 04 Sep 2024 09:23:45 GMT</pubDate>
            <description><![CDATA[<ol start="61">
<li>다음 중 프로토콜과 관련된 포트번호를 확인할 수 있는 파일로 알맞은 것은?</li>
</ol>
<pre><code>① /etc/protocol

② /etc/hosts

③ /etc/group

④ /etc/services

정답 : 4번

- /etc/services 파일은 프로토콜과 관련된 포트번호를 확인할 수 있는 파일이다.
이 파일에는 프로토콜 이름, 포트번호, 서비스 이름이 매핑되어 있다.

- /etc/protocol 파일에는 프로토콜 이름과 프로토콜 번호가 매핑되어 있다.

- /etc/hosts 파일에는 호스트 이름과 IP 주소가 매핑되어 있다.

- /etc/group 파일에는 사용자 그룹과 사용자 ID가 매핑되어 있다.</code></pre><br>

<ol start="62">
<li>다음 중 IP 주소가 192.168.1.0인 경우에 사용되는 주소 체제로 가장 알맞은
것은?</li>
</ol>
<pre><code>① 네트워크 주소

② 게이트웨이 주소

③ 서브넷 마스크 주소

④ 브로드캐스트 주소

정답 : 1번

IP 주소는 네트워크 주소, 호스트 주소, 브로드캐스트 주소로 구분된다.

- 네트워크 주소는 해당 네트워크에 속한 모든 호스트를 식별하는 주소이다.
IP 주소의 첫 번째 옥텟이 네트워크 주소를 나타낸다.

- 호스트 주소는 해당 네트워크에 속한 특정 호스트를 식별하는 주소이다.
IP 주소의 두 번째 옥텟부터 네 번째 옥텟까지가 호스트 주소를 나타낸다.

- 브로드캐스트 주소는 해당 네트워크에 속한 모든 호스트에게 메시지를 전송하기
위한 주소이다.
IP 주소의 모든 옥텟이 1로 채워진 주소가 브로드캐스트 주소를 나타낸다.

- IP 주소가 192.168.1.0인 경우, 첫 번째 옥텟이 192.168.1로 고정되어 있다.
따라서, 해당 IP 주소는 해당 네트워크에 속한 모든 호스트를 식별하는 네트워크
주소로 사용된다.</code></pre><br>

<ol start="63">
<li>다음 중 패킷 교환 방식에 대한 설명으로 틀린 것은?</li>
</ol>
<pre><code>① 전송 대역폭이 동적이다.

② 패킷마다 오버헤드 비트는 존재하지 않는다.

③ 이론상 호스트의 무제한 수용이 가능하다.

④ 모든 데이터가 같은 경로로 전송되지 않을 수도 있다.

정답 : 2번

패킷 교환 방식은 데이터를 작은 단위로 나누어 전송하는 방식이다.
패킷에는 데이터와 함께 헤더가 포함된다.
헤더에는 목적지 주소, 출발지 주소, 패킷의 크기, 패킷의 순서 번호 등이 포함된다.
헤더는 패킷의 전송 및 처리에 필요한 정보를 포함하는 필수적인 부분이다.
따라서, 패킷 교환 방식에는 패킷마다 오버헤드 비트가 존재한다.</code></pre><br>

<ol start="64">
<li>다음 중 OSI 7계층 중 네트워크 계층과 가장 거리가 먼 프로토콜로 알맞은 것은?</li>
</ol>
<pre><code>① ICMP

② UDP

③ IP

④ ARP

OSI 7계층은 물리 계층, 데이터 링크 계층, 네트워크 계층, 전송 계층, 세션 계층,
표현 계층, 응용 계층으로 구분된다.

- 네트워크 계층은 데이터를 패킷으로 분할하고, 목적지 주소를 지정하여 전송하는 역할을 담당한다.

- 전송 계층은 패킷을 신뢰성 잇게 전달하기 위한 역할을 담당한다.

- UDP는 전송 계층에서 사용되는 프로토콜로, 신뢰성 없는 프로토콜이다.
따라서, UDP는 네트워크 계층과 가장 거리가 먼 프로토콜이라고 할 수 있다.

- ICMP는 네트워크 계층에서 사용되는 프로토콜로, 에러 메시지 전송, 네트워크 상태
확인 등의 역할을 담당한다.

- IP는 네트워크 계층에서 사용되는 프로토콜로, 데이터를 패킷으로 분할하고, 목적지
주소를 지정하는 역할을 담당한다.

- ARP는 네트워크 계층에서 사용되는 프로토콜로 IP 주소와 MAC 주소를 매핑하는
역할을 담당한다.</code></pre><br>

<ol start="65">
<li>다음 중 OSI 7계층 모델에서 데이터링크 계층이 제공하는 인접한 개방형
시스템 간에 데이터 전송기능을 이용하여 연결성과 통신 경로 선택(Routing)을
제공하는 계층으로 알맞은 것은?</li>
</ol>
<pre><code>① 전송계층

② 네트워크 계층

③ 데이터링크 계층

④ 물리 계층

정답 : 2번

OSI 7계층 모델에서 데이터링크 계층은 인접한 개방형 시스템 간에 데이터를 전송하기
위한 기능을 제공한다.
데이터링크 계층은 데이터를 프레임으로 분할하고, 프레임에 헤더와 트레일러를 추가하여
전송한다.

네트워크 계층은 데이터링크 계층이 제공하는 인접한 개방형 시스템 간에 데이터 전송
기능을 이용하여 연결성과 통신 경로 선택(Routing)을 제공한다.
네트워크 계층은 데이터를 패킷으로 분할하고, 패킷에 헤더를 추가하여 전송한다.
패킷 헤더에는 패킷의 목적지 주소와 출발지 주소, 패킷의 크기 등이 포함된다.

물리 계층은 데이터를 전송 매체에 전송하기 위한 기능을 제공한다.
물리 계층은 데이터를 비트로 변환하여 전송 매체에 전송한다.</code></pre><br>

<ol start="66">
<li>다음 중 게이트웨이(Gateway) 주소를 확인하는 명령어로 알맞은 것은?</li>
</ol>
<pre><code>① nslookup

② ifconfig

③ arp

④ route

정답 : 4번

- nslookup은 도메인 이름을 IP 주소로 변환하는 명령어이다.

- ifconfig는 인터페이스의 설정을 확인하는 명령어이다.

- arp는 IP 주소와 MAC 주소를 매핑하는 명령어이다.

- route는 라우팅 테이블을 확인하는 명령어이다.
라우팅 테이블에는 게이트웨이 주소가 포함되어 있다.</code></pre><br>

<ol start="67">
<li>다음 중 네트워크 인터페이스의 물리적 케이블 연결 정보를 확인할 수 있는
명령어로 가장 알맞은 것은?</li>
</ol>
<pre><code>① arp

② ifconfig

③ ethtool

④ ss

정답 : 3번

- arp는 IP 주소와 MAC 주소를 매핑하는 명령어이다.

- ifconfig는 인터페이스의 설정을 확인하는 명령어이다.

- ss는 소켓의 상태를 확인하는 명령어이다.
=&gt; netstat 대신 사용할 수 있음

- ethtool은 네트워크 인터페이스의 상태를 확인하는 명령어이다.
ethtool 명령어를 사용하여 네트워크 인터페이스의 물리적 케이블 연결 정보, 전송
속도, 대역폭 등을 확인할 수 있다.</code></pre><br>


<ol start="68">
<li>다음 중 netstat 명령을 이용하여 라우팅 테이블 정보를 출력할 때 사용하는
옵션으로 알맞은 것은?</li>
</ol>
<pre><code>① -t

② -m

③ -n

④ -r

정답 : 4번

netstat 명령어는 네트워크 연결 정보를 출력하는 명령어이다.
-r 옵션을 사용하면 라우팅 테이블 정보를 출력한다.
</code></pre><br>

<ol start="69">
<li>다음 설명에 해당하는 TCP 프로토콜의 패킷으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/18813a36-ee66-466d-a163-21e53e653731/image.png" alt="">
<br></p>
<pre><code>① RST

② SYN/ACK

③ SYN

④ ACK

정답 : 3번

SYN 패킷을 통해 클라이언트와 서버는 초기 연결을 설정하고 서로의 상태를 확인한다.
이후에는 데이터를 안정적으로 전송하기 위해 더 많은 TCP 패킷이 교환되며,
데이터 전송 및 연결 해제를 관리하기 위해 &quot;SYN&quot;, &quot;ACK&quot;, &quot;RST&quot; 등의 플래그가
사용된다.</code></pre><br>

<ol start="70">
<li>다음 중 MAN을 위한 국제 표준 규격인 IEEE 802.6로 정의된 프로토콜은?</li>
</ol>
<pre><code>① DQDB

② X.25

③ FDDI

④ Frame Relay

정답 : 1번

IEEE 802.6은 MAN을 위한 국제 표준 규격으로 Distributed Queue Dual Bus(DQDB)라는 프로토콜을 정의하고 있다.
DQDB는 두 개의 unidirectional bus를 사용하여 데이터를 전송하는 프로토콜이다.

- X.25는 WAN을 위한 표준 규격으로, DQDB와 관련이 없다.

- FDDI는 MAN을 위한 표준 규격이지만, IEEE 802.6과는 다른 프로토콜을 사용한다.

- Frame Replay는 WAN을 위한 표준 규격으로, DQDB와 관련이 없다.</code></pre><br>

<ol start="71">
<li>다음 설명에 해당하는 명령으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/c37a4308-3e87-4422-8f17-a2cd6fcadcd0/image.png" alt="">
<br></p>
<pre><code>① telnet www.kait.or.kr@80

② ssh www.kait.or.kr@443

③ ssh www.kait.or.kr:80

④ telnet www.kait.or.kr 443

정답 : 4번</code></pre><br>

<ol start="72">
<li>다음 중 IPv4의 C 클래스 대역에 대한 설명으로 알맞은 것은?</li>
</ol>
<pre><code>① IP 주소 첫 번째 부분의 2비트가 10인 경우이다.

② IP 주소 첫 번째 부분의 2비트가 11인 경우이다.

③ IP 주소 첫 번째 부분의 3비트가 110인 경우이다.

④ IP 주소 첫 번째 부분의 3비트가 111인 경우이다.

정답 : 3번

IPv4의 C 클래스 대역은 IP 주소 첫 번째 부분의 3비트가 110인 경우를 의미한다.
즉, IP 주소 첫 번째 부분이 192.168.0 ~ 192.168.255 범위에 속하는 경우이다.

| 클래스 | 첫 번째 부분 | 네트워크 주소 비트 수 | 호스트 주소 비트 수 |
|---|---|---|---|
| A | 0 | 8 | 24 |
| B | 10 | 16 | 16 |
| C | 110 | 24 | 8 |
| D | 1110 | 0 | 64 |
| E | 1111 | 0 | 0 |

- C 클래스 대역의 경우, 네트워크 주소 비트 수는 24비트
- 호스트 주소 비트 수는 8비트이다.
따라서, IP 주소 첫 번째 부분의 3비트가 110인 경우는 C 클래스 대역에 속한다고
할 수 있다.</code></pre><br>

<ol start="73">
<li>다음 중 텍스트 모드로 부팅된 상태에서 X 윈도를 실행하는 명령으로 알맞은 것은?</li>
</ol>
<pre><code>① xinit

② startx

③ systemctl xinit

④ systemctl startx

정답 : 2번

텍스트 모드로 부팅된 상태에서 X 윈도를 실행하는 명령은 &quot;startx&quot;이다.
&quot;xinit&quot;명령도 X 윈도를 실행할 수 있지만, &quot;startx&quot; 명령이 더 일반적으로 사용된다.

&quot;systemctl&quot; 명령은 시스템 서비스 관리 명령으로, X 윈도와는 관련이 없다.</code></pre><br>

<ol start="74">
<li>다음 중 PDF 문서를 확인할 때 사용하는 프로그램으로 알맞은 것은?</li>
</ol>
<pre><code>① Gimp

② eog

③ evince

④ Gwenview

정답 : 3번

- Gimp는 이미지 편집 프로그램

- eog는 이미지 뷰어 프로그램

- Gwenview는 이미지 뷰어 프로그램

- evince는 PDF 문서 뷰어 프로그램</code></pre><br>

<ol start="75">
<li>다음 설명에 해당하는 라이브러리로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/a9fc6759-8d3e-4cb0-a546-bac172849ff8/image.png" alt="">
<br></p>
<pre><code>① Xlib

② XCB

③ QT

④ GTK+

정답 : 1번

- Xlib(X Window System의 클라이언트 라이브러리)</code></pre><br>

<ol start="76">
<li>다음 중 스프레드시트(Spreadsheet) 프로그램으로 실행하는 명령으로 알맞은 것은?</li>
</ol>
<pre><code>① oocalc

② oowriter

③ ooimpress

④ oodraw

정답 : 1번

oocalc는 오픈오피스(OpenOffice)의 스프레드시트 프로그램이다.
- oowriter는 워드프로세서 프로그램

- ooimpress는 프레젠테이션 프로그램

- oodraw는 벡터 그래픽 프로그램</code></pre><br>

<ol start="77">
<li>다음 중 이미지 뷰어 프로그램으로 가장 거리가 먼 것은?</li>
</ol>
<pre><code>① Eog

② ImageMagicK

③ Gimp

④ Totem

정답 : 4번

Eog, ImageMagicK, Gimp는 모두 이미지 뷰어 프로그램으로, 이미지를 볼 수 있는
기능을 가지고 있다.

Totem은 미디어 플레이어 프로그램으로, 이미지를 볼 수 있는 기능도 있지만,
기본적인 기능은 미디어 재생이다.</code></pre><br>

<ol start="78">
<li>다음 설명에 해당하는 용어로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/5bc3e6b3-700d-4e91-b25d-8579346c51ce/image.png" alt="">
<br></p>
<pre><code>① KDE

② GNOME

③ LXDE

④ Wayland

정답 : 1번

KDE는 &quot;K Desktop Environment&quot;의 약자로서 그래픽 사용자 인터페이스 환경을
제공하는 프리 오픈 소스 소프트웨어 프로젝트이다.
KDE는 사용자가 컴퓨터를 쉽게 사용하고 다양한 애플리케이션을 실행하여 작업할 수
있는 환경을 제공한다.</code></pre><br>

<ol start="79">
<li>다음 (괄호) 안에 들어갈 명령어로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/03f88e95-63fd-4396-83bb-cccf846b6751/image.png" alt="">
<br></p>
<pre><code>① xauth

② xhost

③ xrandr

④ export

정답 : 1번

&quot;xauth&quot;는 X Window 시스템에서 인증 및 접근제어를 관리하는 데 사용되는 명령이다.
X Window 시스템은 그래픽 사용자 인터페이스(GUI)를 제공하는 시스템이다.
xauth는 X 서버와 클라이언트 간의 보안을 유지하고 사용자 및 프로세스가 X 서버에
접근 권한을 부여하거나 거부하는 데 도움을 준다.</code></pre><br>

<ol start="80">
<li>다음 중 시스템 시작 시 X Window 모드로 부팅하는 대신에 텍스트 모드로
부팅되도록 설정하는 명령으로 알맞은 것은?</li>
</ol>
<pre><code>① systemctl set-default multi-user.target

② systemctl set-default texmode.target

③ systemctl set-default runlevel5.target

④ systemctl set-default graphical.target

정답 : 1번

시스템 시작 시 X 윈도 모드로 부팅하지 않고 텍스트 모드로 부팅하려면 &quot;multi-user.target&quot;을 기본 부팅 타겟으로 설정해야 한다.

- systemctl set-default multi-user.target
multi-user.target을 기분 부팅 타겟으로 설정하는 명령이다.

- texmode.target
텍스트 모드로 부팅하는 데 사용되는 부팅 타겟이지만, 기본 부팅 타겟은 아니다.

- runlevel5.target
그래픽 모드로 부팅하는 데 사용되는 부팅 타겟이며, 기본 부팅 타겟이다.

- graphical.target
그래픽 모드로 부팅하는 데 사용되는 부팅 타겟이지만, 기본 부팅 타겟은 아니다.</code></pre><br>

]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 리눅스 마스터 2급 모의 문제 - 3]]></title>
            <link>https://velog.io/@bb-seok/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-2%EA%B8%89-%EB%AA%A8%EC%9D%98-%EB%AC%B8%EC%A0%9C-3</link>
            <guid>https://velog.io/@bb-seok/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-2%EA%B8%89-%EB%AA%A8%EC%9D%98-%EB%AC%B8%EC%A0%9C-3</guid>
            <pubDate>Wed, 04 Sep 2024 08:42:01 GMT</pubDate>
            <description><![CDATA[<ol start="41">
<li>다음 그림에 해당하는 명령어로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/91e37a39-d052-47de-88ba-5384306d601b/image.png" alt=""></p>
<pre><code>① du

② df

③ mount

④ fdisk

정답 : 2번

df 명령어는 시스템 관리 작업에서 디스크 공간관리와 디스크 용량 모니터링에
유용하며, 디스크 용량이 부족한 경우 문제를 식별하고 해결하는데 도움을 준다.</code></pre><br>

<ol start="42">
<li>다음 중 파일에 부여되는 허가권 값인 w에 대한 설명으로 알맞은 것은?</li>
</ol>
<pre><code>① 파일의 내용을 볼 수 있는 권한이다.

② 파일을 삭제할 수 있는 권한이다.

③ 파일을 실행할 수 있는 권한이다.

④ 파일의 내용을 수정할 수 있는 권한이다.

정답 : 4번

리눅스 파일의 허가권은 r, w, x의 세 가지 문자로 표현된다.
r은 읽기 권한, w는 쓰기 권한, x는 실행 권한을 의미한다.
</code></pre><br>

<ol start="43">
<li>다음은 data 디렉터리의 하위 디렉터리를 포함해서 디렉터리 내부의 모든 파일
및 디렉터리의 그룹 소유권을 kait로 변경하는 과정이다.
(괄호) 안에 들어갈 내용으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/e96bb8b2-806e-4120-90b9-912a5dfb43ac/image.png" alt="">
<br></p>
<pre><code>① ㉠ chown, ㉡ -r

② ㉠ chown, ㉡ -R

③ ㉠ chgrp, ㉡ -r

④ ㉠ chgrp, ㉡ -R

정답 : 4번

chgrp -R kait data/ 명령어를 실행하면 data/ 디렉터리와 그 하위 파일 및
디렉터리의 그룹 소유자가 kait 그룹으로 변경된다.
이 명령어를 사용하면 파일 및 디렉터리의 그룹 소유자를 변경할 수 있으며, -R 옵션을
사용하면 하위 디렉터리까지 모두 변경된다.</code></pre><br>

<ol start="44">
<li>다음은 /home 영역에 설정된 사용자 쿼터 정보를 확인하는 과정이다.
(괄호) 안에 들어갈 명령어로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/c899be7f-1628-421c-8da5-8ecc9bfbb0e2/image.png" alt="">
<br></p>
<pre><code>① quota

② edquota

③ setquota

④ repquota

정답 : 4번

- quota : 쿼터 설정 확인

- edquota : 쿼터 설정

- repquota : 쿼터 정보 확인

** quota와 repquota의 차이점
일반적으로 시스템 관리자나 디스크 용량을 할당받는 사용자 또는 그룹이 자신의
할당량을 파악하고 디스크 사용량을 모니터링하는 데에 repquota 명령어가 사용된다.</code></pre><br>

<ol start="45">
<li>다음 중 /etc/fstab 파일에서 마운트되는 옵션 정보를 기록하는 필드는
몇 번째인가?</li>
</ol>
<pre><code>① 세 번째

② 네 번째

③ 다섯 번째

④ 여섯 번째

정답 : 2번

/etc/fstab 파일은 파일 시스템을 마운트하는 정보를 저장하고 있는 파일이다.
이 파일의 각 행은 하나의 파일 시스템을 나타낸다.

파일 시스템을 마운트하는 옵션 정보를 기록하는 필드는 &#39;옵션&#39; 필드이다.
이 필드는 네 번째 필드이다.</code></pre><br>

<ol start="46">
<li>다음 중 파티션에 할당된 UUID 값을 확인하는 명령어로 알맞은 것은?</li>
</ol>
<pre><code>① uuid

② lsuid

③ blkid

④ fdisk

정답 : 3번

blkid 명령어는 블록 장치의 정보를 출력하는 명령어이다.
이 명령어는 파티션의 UUID 값을 출력할 수 있다.

- uuid 명령어는 UUID를 생성하는 명령어이다.

- lsuid 명령어는 사용자 ID를 출력하는 명령어이다.

- fdisk 명령어는 파티션을 관리하는 명령어이다.</code></pre><br>

<ol start="47">
<li>다음은 원격지의 윈도우 시스템에 공유된 폴더를 마운트하는 과정이다.
(괄호) 안에 들어갈 내용으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/d570200a-566e-4387-ab3d-16ee0bce0eb0/image.png" alt="">
<br></p>
<pre><code>① ntfs

② cifs

③ samba

④ xfs

정답 : 2번

mount -t cifs 명령어는 CIFS(Common Internet File System) 프로토콜을 사용하여
네트워크 공유 디렉터리를 마운트 하는 데 사용된다.</code></pre><br>

<ol start="48">
<li>허가권이 다음과 같이 설정되어 있을 때 관련 설명으로 가장 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/d6ea4ed7-465d-418d-a716-aad231d351c9/image.png" alt="">
<br></p>
<pre><code>① tty 사용자가 실행 시에 일시적으로 root 권한을 갖는다.

② 실행시킨 사용자에 상관없이 일시적으로 root 권한을 갖는다.

③ 실행시킨 사용자는 일시적으로 tty 그룹 권한을 갖는다.

④ tty 그룹에 속한 사용자가 실행 시에만 일시적으로 root 권한을 갖는다.

정답 : 3번

-r-xr-sr-x는 파일 퍼미션(permission)을 나타내는 문자열이다.
이 문자열은 파일에 대한 읽기, 쓰기, 실행 권한을 나타낸다.
Setgid 비트(s)가 설정되어 있으면 해당 파일을 실행할 때 파일을 실행한 사용자의
그룹으로 실행된다.</code></pre><br>

<ol start="49">
<li>다음 설명에 해당하는 클러스터 구성 방식으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/1c50d3b7-b1b9-40d7-9693-df5edf65f7ba/image.png" alt="">
<br></p>
<pre><code>① 고계산용 클러스터

② 부하분산 클러스터

③ HA(High Available) 클러스터

④ HPC(High Performance Computing) 클러스터

정답 : 3번</code></pre><br>

<ol start="50">
<li>다음 설명에 해당하는 가상화 기술로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/16e5ea0b-777e-4e00-ba05-df90f8cae592/image.png" alt="">
<br></p>
<pre><code>① KVM

② XEN

③ VirtualBox

④ Hyper-V

정답 : 1번

KVM(Kernel-based Virtual Machine)은 Linux 운영체제에서 하이퍼바이저로
사용되는 오픈 소스 가상화 솔루션이다.
KVM은 가상 머신(VM)을 만들고 관리하는데 사용되며, 하드웨어 가상화를 지원하여
여러 운영체제를 동시에 실행할 수 있도록 한다.</code></pre><br>

<ol start="51">
<li>다음 설명에 해당하는 명칭으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/24ba21fa-5e0f-40b5-90df-a9697a4b05de/image.png" alt="">
<br></p>
<pre><code>① 아두이노

② 라즈베리 파이

③ 큐비보드

④ 오드로이드

정답 : 2번</code></pre><br>

<ol start="52">
<li>다음 설명에 해당하는 프로그램으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/32f8ff88-0537-4896-a9bd-0cf4b26212f5/image.png" alt="">
<br></p>
<pre><code>① GENIVI

② Ansible

③ QpenStack

④ Kubernetes

정답 : 4번</code></pre><br>

<ol start="53">
<li>다음 중 IP 주소 할당 및 도메인을 관리하는 국제기구로 알맞은 것은?</li>
</ol>
<pre><code>① ICANN

② IEEE

③ ISO

④ EIA

정답 : 1번

ICANN은 Internet Corporation for Assigned Names and Numbers의 약자로,
인터넷의 도메인 이름 및 IP 주소 할당을 관리하는 국제기구이다.

- IEEE
Institute or Electrical and Electronics Engineers의 약자로, 전기 및
전자 공학 분야의 국제 학술 및 표준화 단체이다.

- ISO
International Organization for Standardization의 약자로, 국제 표준화
기구이다.

- EIA
Electronic Industries Alliance의 약자로, 미국의 전기 및 전자 산업 협회이다.</code></pre><br>

<ol start="54">
<li>다음 중 파일 전송 및 다운로드 진행 상태를 &#39;#&#39; 기호로 확인할 때 사용하는
FTP 명령어로 알맞은 것은?</li>
</ol>
<pre><code>① sharp

② mget

③ bi

④ hash

정답 : 4번

FTP 명령어 &#39;hash&#39;는 파일 전송 및 다운로드 진행 상태를 &#39;#&#39; 기호로 확인하는
명령어이다.
이 명령어를 사용하면, 파일 전송 및 다운로드의 진행률을 실시간으로 확인할 수 있다.

- FTP 명령어 &#39;sharp&#39;는 의미가 없다.

- FTP 명령어 &#39;mget&#39;은 여러 개의 파일을 동시에 다운로드 하는 명령어이다.

- FTP 명령어 &#39;bi&#39;는 의미가 없다.</code></pre><br>

<ol start="55">
<li>다음 중 프로토콜과 포트번호 조합으로 틀린 것은?</li>
</ol>
<pre><code>① POP3 - 110

② IMAP - 143

③ TELNET - 23

④ SNMP – 151

정답 : 4번

SNMP는 Simple Network Management Protocol의 약자로, 네트워크 장치의 관리를
위한 프로토콜이다.
SNMP의 기본 포트번호는 161이다.

- POP3는 Post Office Protocol Version 3의 약자로, 메일 서버에서 메일을
가져오는 프로토콜이다.
POP3의 기본 포트번호는 110이다.

- IMAP은 Internet Message Access Protocol의 약자로, 메일 서버에서 메일을
가져오는 프로토콜이다.
IMAP의 기본 포트번호는 143이다.

- TELNET은 Telnet Protocol의 약자로, 원격 컴퓨터에 접속하기 위한 프로토콜이다.
TELNET의 기본 포트번호는 23이다.


** POP3와 IMAP의 차이점
양방향 동기화를 사용하는 최신 프로토콜과 달리 POP3는 일방향 전자 메일 동기화만
지원하므로 사용자는 서버에서 클라이언트로 전자 메일을 다운로드 하는 것만 가능하다.

IMAP은 사용자가 컴퓨터나 모바일 장치에서 여러 전자 메일 클라이언트를 통해
로그인하여 동일한 메시지를 읽을 수 있다.</code></pre><br>

<ol start="56">
<li>다음 중 UDP 프로토콜과 가장 관련있는 서비스로 알맞은 것은?</li>
</ol>
<pre><code>① DNS

② TELNET

③ SMTP

④ HTTP

정답 : 1번

UDP는 User Datagram Protocol의 약자로, 데이터그램 기반의 비연결형 프로토콜이다.
UDP는 데이터의 전달 속도가 중요하고, 데이터의 손실이 허용되는 서비스에 사용된다.

DNS는 Domain Name System의 약자로, 도메인 이름을 IP 주소로 변환하는 서비스이다.
DNS는 데이터의 전달 속도가 중요하고, 데이터의 손실이 허용되기 때문에 UDP를 사용.

- TELNET은 Telnet Protocol의 약자로, 원격 컴퓨터에 접속하기 위한 프로토콜이다.


- SMTP는 Simple Mail Transfer Protocolq의 약자로, 메일을 보내는 프로토콜이다.


- HTTP는 Hyper Text Transfer Protocol의 약자로, 웹 페이지를 전송하는 프로토콜이다.

TELENT, SMTP, HTTP 모두 전달 속도도 중요하지만, 데이터의 손실이 허용되지
않기 때문에 TCP를 사용한다.</code></pre><br>

<ol start="57">
<li>다음 중 장애 발생 시에도 다른 시스템에 영향이 적어 가장 신뢰성이 높은
LAN 구성 방식으로 알맞은 것은?</li>
</ol>
<pre><code>① 링(Ring)형

② 버스(Bus)형

③ 스타(Star)형

④ 망(Mesh)형

링형, 버스형, 스타형은 장애 발생 시, 연결된 시스템에 영향을 미친다.

- 링(Ring)형
고장난 시스템을 우회하여 데이터를 전달할 수 있지만, 데이터 전송 속도가 저하될 수
있다.

- 버스(Bus)형
고장난 시스템을 우회하여 데이터를 전달할 수 없으며, 모든 시스템이 장애에 영향을 받는다.

- 스타(star)형
고장난 시스템을 우회하여 데이터를 전달할 수 있지만, 데이터 전송 속도가 저하됨

- 망(Mesh)형
모든 시스템이 서로 연결되어 있기 때문에, 한 시스템에 장애가 발생하더라도 다른
시스템은 영향을 받지 않는다.
따라서, 장애 발생 시에도 다른 시스템에 영향이 적어 가장 신뢰성이 높은 LAN 구성
방식이다.</code></pre><br>

<ol start="58">
<li>다음 중 루프백(Loopback) 네트워크가 속해 있는 IPv4의 클래스로
알맞은 것은?</li>
</ol>
<pre><code>① A 클래스

② B 클래스

③ C 클래스

④ D 클래스

정답 : 1번

루프백 네트워크는 로컬 호스트와 로컬 호스트 간의 통신을 위한 네트워크이다.
루프백 네트워크는 &quot;127.0.0.0/8&quot; 주소 범위를 사용한다.

A 클래스는 &quot;10.0.0.0/8&quot; ~ &quot;126.255.255.255/8&quot; 주소 범위를 사용한다.

B 클래스는 &quot;128.0.0.0/16&quot; ~ &quot;191.255.255.255/16&quot; 주소 범위를 사용한다.

C 클래스는 &quot;192.0.0.0/24&quot; ~ &quot;223.255.255.255/24&quot; 주소 범위를 사용한다.

D 클래스는 &quot;224.0.0.0/4&quot; ~ &quot;239.255.255.255/4&quot; 주소 범위를 사용한다.</code></pre><br>

<ol start="59">
<li>다음 중 메일 관련 프로토콜로 틀린 것은?</li>
</ol>
<pre><code>① POP3

② SMTP

③ IMAP

④ FTP

정답 : 4번

FTP는 File Transfer Protocol의 약자로, 파일 전송을 위한 프로토콜이다.

- POP3는 Post Office Protocol Version 3의 약자로, 메일 서버에서 메일을
가져오는 프로토콜이다.

- SMTP는 Simple Mail Transfer Protocol의 약자로, 메일을 보내는 프로토콜이다.

- IMAP은 Internet Message Access Protocol의 약자로, 메일 서버에서 메일을
가져오는 프로토콜이다.
</code></pre><br>

<ol start="60">
<li>다음 중 OSI 참조 모델을 제정한 기관으로 알맞은 것은?</li>
</ol>
<pre><code>① IEEE

② ISO

③ ANSI

④ EIA

OSI 참조 모델은 국제표준화기구(ISO)에서 제정한 네트워크 계층 모델이다.
OSI 참조 모델은 네트워크를 7개의 계층으로 구분하여, 각 계층의 기능과 역할을
정의하였다.

IEEE는 전기전자기술자협회이다.

ANSI는 미국표준협회이다.

EIA는 전자산업협회이다.

=&gt; 이 기관들은 모두 네트워크 관련 표준을 제정하는 기관이지만, OSI 참조 모델을
제정한 기관은 ISO이다.</code></pre><br>

]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 리눅스 마스터 2급 모의 문제 - 2]]></title>
            <link>https://velog.io/@bb-seok/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-2%EA%B8%89-%EB%AA%A8%EC%9D%98-%EB%AC%B8%EC%A0%9C-2</link>
            <guid>https://velog.io/@bb-seok/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-2%EA%B8%89-%EB%AA%A8%EC%9D%98-%EB%AC%B8%EC%A0%9C-2</guid>
            <pubDate>Wed, 04 Sep 2024 06:50:38 GMT</pubDate>
            <description><![CDATA[<ol start="21">
<li>다음 중 백그라운드로 실행시킨 프로세스를 확인하는 명령어로 알맞은 것은?</li>
</ol>
<pre><code>① job

② jobs

③ fg

④ bg

정답 : 2번

&quot;jobs&quot; 명령어는 현재 실행 중인 모든 프로세스를 표시한다.
백그라운드로 실행 중인 프로세스는 job 명령어를 사용하여 확인할 수 있다.

&quot;fg&quot; 명령어는 백그라운드에서 실행 중인 프로세스를 포그라운드로 가져온다.

&quot;bg&quot; 명령어는 포그라운드에서 실행 중인 프로세스를 백그라운드로 보낸다.

리눅스에서 프로세스를 백그라운드로 실행하려면 프로세스 실행 시 &#39;&amp;&#39; 기호를
추가한다.
예를 들어, 다음과 같이 명령어를 실행하면 &#39;ls&#39; 프로세스가 백그라운드로 실행된다.
ex) ls &amp;

백그라운드로 실행된 프로세스는 &#39;jobs&#39; 명령어를 사용하여 확인할 수 있다.</code></pre><br>

<ol start="22">
<li>다음 설명에 해당하는 용어로 가장 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/70e48aac-57ce-4512-bdee-3e318147a9c8/image.png" alt="">
<br></p>
<pre><code>① init

② inetd

③ standalone

④ daemon

정답 : 4번
</code></pre><br>

<ol start="23">
<li>다음 중 실시간으로 CPU 사용량을 확인할 때 이용하는 명령어로 알맞은 것은?</li>
</ol>
<pre><code>① top

② pgrep

③ nohup

④ free

정답 : 1번

- top 명령어는 실시간으로 CPU 사용량, 메모리 사용량, 디스크 사용량, 네트워크
사용량 등을 확인할 수 있는 명령어이다.

- pgrep 명령어는 프로세스 ID를 기준으로 프로세스를 찾는 명령어이다.
nohup 명령어는 백그라운드에서 프로세스를 실행하는 명령어이다.
free 명령어는 메모리 사용량을 확인하는 명령어이다.
</code></pre><br>

<ol start="24">
<li>다음 중 현재 실행 중인 포어그라운드 프로세스의 작업을 백그라운드 프로세스로
전환하기 위해 사용하는 키 조합으로 알맞은 것은?</li>
</ol>
<pre><code>① [ctrl]+[z]

② [ctrl]+[c]

③ [ctrl]+[l]

④ [ctrl]+[d]

정답 : 1번

- [ctrl] + [z]
현재 실행 중인 포그라운드 프로세스가 백그라운드 프로세스로 전환된다.

- [ctrl] + [c]
현재 실행 중인 프로세스가 종료된다.

- [ctrl] + [l]
화면 좌우를 전환한다.

- [ctrl] + [d]
터미널을 종료한다.</code></pre><br>

<ol start="25">
<li>다음 중 [ctrl] + [c] 키 조합으로 발생하는 시그널의 번호 값으로 알맞은 것은?</li>
</ol>
<pre><code>① 1

② 2

③ 15

④ 20

정답 : 2번

- [ctrl] + [c]
SIGINT 시그널을 발생시킨다.
SIGINT 시그널은 프로세스를 중단시키는 시그널이다.

- 1번(1)은 SIGHUP 시그널
- 3번(15)은 SIGTERM 시그널
- 4번(20)은 SIGKILL 시그널</code></pre><br>

<ol start="26">
<li>작업번호가 2번인 백그라운드 프로세스를 종료하려고 한다.
다음 (괄호) 안에 들어갈 내용으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/f38caafd-852d-44ce-93e9-dd663dd8b3f7/image.png" alt="">
<br></p>
<pre><code>① 2

② &amp;2

③ +2

④ %2

정답 : 4번

작업 번호가 2번인 프로세스에서 종료 시그널을 보내어 해당 프로세스를 종료하게
된다. 이렇게 하면 백그라운드에서 실행중인 해당 프로세스가 종료된다.</code></pre><br>

<ol start="27">
<li>프로세스 아이디(PID)가 1222인 bash 프로세스의 우선순위(NI)값이 0이다.
다음 중 이 프로세스의 NI값을 -10으로 변경하여 우선순위를 높이는 명령으로
알맞은 것은?</li>
</ol>
<pre><code>① nice –10 1222

② nice –-10 1222

③ nice –10 bash

④ nice –-10 bash

정답 : 4번

nice 명령은 프로세스의 우선순위를 조정하는 명령어이다.
nice 명령의 기본 형식은 다음과 같다.

nice [옵션] [프로세스]

옵션
-n : 우선순위를 지정한다.
--nice : 우선순위를 지정한다.

이 문제의 경우, 프로세스 ID가 1222인 bash 프로세스의 우선순위를 -10으로
변경하여 우선순위를 높이는 명령은 다음과 같다.

nice --10 bash

1. nice –10 1222 : PID를 지정하는 것은 옳지만, 옵션이 잘못됨
2. nice –-10 1222 : PID를 지정하는 것은 옳지만, 옵션이 중복됨
3. nice -10 bash : PID를 지정하지 않았다.</code></pre><br>

<ol start="28">
<li>cron을 이용해서 해당 스크립트를 매주 월요일 오전 10시 2분에 주기적으로
실행하려고 한다.
다음 (괄호) 안에 들어갈 내용으로 알맞은 것은?</li>
</ol>
<pre><code>① 1 10 * * 2

② 2 10 * * 2

③ 1 10 * * 1

④ 2 10 * * 1

정답 : 4번</code></pre><br>

<ol start="29">
<li>다음 중 백그라운드로 실행시킨 프로세스의 우선순위 값을 확인하는 명령으로
알맞은 것은?</li>
</ol>
<pre><code>① jobs -p

② jobs -l

③ ps aux

④ ps –l

정답 : 4번

ps 명령어는 현재 실행중인 프로세스의 정보를 확인하는 명령어이다.
-l 옵션을 사용하면 프로세스의 우선순위값을 확인할 수 있다.
따라서, 백그라운드로 실행시킨 프로세스의 우선순위값을 확인하려면 ps -l 명령어를
사용하면 된다.

jobs 명령어는 백그라운드에서 실행 중인 프로세스의 정보를 확인하는 명령어이다.
-p 옵션을 사용하면 프로세스의 우선순위값을 확인할 수 있다.
하지만, jobs 명령어는 -p 옵션을 사용할 때 프로세스의 ID를 지정해야 한다.
따라서, 백그라운드로 실행 중인 모든 프로세스의 우선순위 값만 확인하려면 
ps -l 명령어를 사용하는 것이 더 정확하다.</code></pre><br>

<ol start="30">
<li>다음 (괄호) 안에 들어갈 내용으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/dc11bed5-4de5-48f7-a153-37ec1a7a949a/image.png" alt="">
<br></p>
<pre><code>① ㉠ init, ㉡ exec

② ㉠ init, ㉡ fork

③ ㉠ systemd, ㉡ exec

④ ㉠ systemd, ㉡ fork

정답 : 4번</code></pre><br>

<ol start="31">
<li>다음 중 GNU 프로젝트의 일환으로 만들어진 셸로 알맞은 것은?</li>
</ol>
<pre><code>① ksh

② bash

③ dash

④ csh

정답 : 2번

bash는 GNU 프로젝트의 일환으로 만들어진 셸이다.

- ksh는 AT&amp;T UNIX에서 개발된 셸이다.

- dash는 GNU 프로젝트의 일환으로 개발된 셸이지만, bash와는 별개의 셸이다.

- csh는 Berkeley UNIX에서 개발된 셸이다.</code></pre><br>

<ol start="32">
<li>다음은 환경변수를 이용해서 로그인 셸을 확인하는 과정이다.
(괄호) 안에 들어갈 내용으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/dc8b4546-e03d-4999-b844-6f092ef411c3/image.png" alt="">
<br></p>
<pre><code>① $HOME

② $SHELL

③ $LOGIN

④ $TERM

정답 : 2번
</code></pre><br>

<ol start="33">
<li>다음 중 선언된 셸 변수를 확인하는 명령으로 가장 알맞은 것은?</li>
</ol>
<pre><code>① chsh

② set

③ unset

④ env

정답 : 2번

set 명령어는 셸 변수의 목록을 출력하는 명령어이다.

- chsh 명령어는 사용자의 셸을 변경하는 명령어이다.

- unset 명령어는 셸 변수를 삭제하는 명령어이다.

- env 명령어는 환경 변수를 확인하는 명령어이다.</code></pre><br>

<ol start="34">
<li>다음 중 현재 시스템에서 사용 가능한 셸의 정보를 저장하고 있는 파일로
알맞은 것은?</li>
</ol>
<pre><code>① /etc/shells

② /etc/bashrc

③ /etc/passwd

④ /etc/profile

정답 : 1번

/etc/shells 파일은 현재 시스템에서 사용 가능한 셸의 목록을 저장하고 있는
파일이다.

- /etc/bashrc 파일은 bash 셸의 환경 설정 파일이다.

- /etc/passwd 파일은 사용자 계정의 정보를 저장하고 있는 파일이다.

- /etc/profile 파일은 모든 사용자의 환경 설정 파일이다.</code></pre><br>

<ol start="35">
<li>다음 중 ls 명령어에 설정된 엘리어스(alias)를 해제하는 명령으로 알맞은 것은?</li>
</ol>
<pre><code>① alias ls

② alias –c ls

③ ualias ls

④ unalias ls

정답 : 4번

unalias 명령어는 셸 변수 또는 엘리어스를 해제하는 명령어이다.

- alias 명령어는 셸 변수 또는 엘리어스를 설정하는 명령어이다.

- alias -c ls 명령어는 ls 명령어에 설정된 모든 엘리어스를 해제하는 명령어이다.

- ualias 명령어는 존재하지 않는 엘리어스를 해제하려는 명령어이다.</code></pre><br>

<ol start="36">
<li>다음은 root 권한으로 ihduser 사용자가 실행한 명령의 목록 정보를 확인하는
과정이다. (괄호) 안에 들어갈 내용으로 가장 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/005c53b1-af83-4072-be79-906d24ffa8eb/image.png" alt="">
<br></p>
<pre><code>① ~ihduser/.history

② ~ihduser/.profile

③ ~ihduser/.bash_history

④ ~ihduser/.bash_profile

정답 : 3번

사용자 ihduser의 홈 디렉터리 아래에 위치한 .bash_history 파일의 내용을
화면에 표시하는 명령어이다.
cat ~ihduser/.bash_history 명령어를 실행하면 사용자 ihduser의 Bash 셸
이력에 저장된 명령어들이 화면에 표시된다.</code></pre><br>

<ol start="37">
<li>다음 중 셸에서 실행 후 저장되는 history 개수를 확인할 수 있는
환경변수명으로 알맞은 것은?</li>
</ol>
<pre><code>① HISTORY

② HISTORYSIZE

③ HISTSIZE

④ HISTFILESIZE

정답 : 3번

HISTSIZE 환경 변수는 셸에서 실행 후 저장되는 history 개수를 지정하는
환경 변수이다.

- HISTORY 환경 변수는 셸에서 실행된 명령어의 목록을 저장하는 환경 변수이다.

- HISTORYSIZE 환경 변수는 HISTSIZE 환경 변수의 값을 초과하는 명령어만을
저장한다.

- HISTORYSIZE 명령어는 셸에서 실행된 명령어의 목록을 출력하는 명령어이다.

- HISTFILESIZE 환경 변수는 셀에서 실행 후 저장되는 history의 파일 크기를
지정하는 환경 변수이다.</code></pre><br>

<ol start="38">
<li>다음 중 ihduser 사용자의 로그인 셸을 확인하는 명령으로 알맞은 것은?</li>
</ol>
<pre><code>① chsh ihduser

② chsh –l ihduser

③ grep ihduser /etc/passwd

④ grep ihduser /etc/shells

정답 : 3번

/etc/passwd 파일은 사용자 계정의 정보를 저장하고 있는 파일이다.
각 사용자 계정의 로그인 셸은 &#39;shell&#39; 필드에 저장되어 있다.

 -chsh 명령어는 사용자의 셸을 변경하는 명령어이다.

 - chsh -l ihduser 명령어는 ihduser 사용자의 현재 로그인 셸을 출력하는
 명령어이다.
 따라서, ihduser 사용자의 현재 로그인 셸을 확인하는 명령으로는 적절하나
 chsh 명령어를 두 번 실행해야 하는 번거로움이 있다.

 - /etc/shell 파일은 현재 시스템에서 사용 가능한 셸의 목록을 저장하고 있는
 파일이다.</code></pre><br>

<ol start="39">
<li>다음 중 파일이나 디렉터리의 허가권 값을 변경하는 명령으로 알맞은 것은?</li>
</ol>
<pre><code>① chmod

② chgrp

③ umask

④ chown

정답 : 1번

- chmod 명령어는 파일이나 디렉터리의 허가권 값을 변경하는 명령어이다.

- chgrp 명령어는 파일이나 디렉터리의 소유자 그룹을 변경하는 명령어이다.

- umask 명령어는 새 파일이나 디렉터리의 기본 허가권 값을 설정하는 명령어이다.

- chown 명령어는 파일이나 디렉터리의 소유자를 변경하는 명령어이다.</code></pre><br>

<ol start="40">
<li>다음은 마운트된 /backup 영역을 해제하는 과정이다.
(괄호) 안에 들어갈 명령으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/03db73c6-3c33-443c-a32b-856d50c924bf/image.png" alt="">
<br></p>
<pre><code>① umount

② unmount

③ eject

④ nohup

정답 : 1번</code></pre><br>]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 리눅스 마스터 2급 - 모의 문제]]></title>
            <link>https://velog.io/@bb-seok/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-2%EA%B8%89-%EB%AA%A8%EC%9D%98-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@bb-seok/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-2%EA%B8%89-%EB%AA%A8%EC%9D%98-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Wed, 04 Sep 2024 05:40:27 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="리눅스-마스터-2급-20220611일자">리눅스 마스터 2급 (2022.06.11일자)</h3>
</blockquote>
<ol>
<li>다음 중 예약된 프린터 작업을 취소하는 명령으로 알맞은 것은?</li>
</ol>
<pre><code>① lpr

② lpq

③ cancel

④ lpstat

정답 : 3번

리눅스에서 예약된 프린터 작업을 취소하는 명령은 &quot;cancel&quot;이다.
cancel 명령은 작업 ID를 입력하여 예약된 프린터 작업을 취소한다.

ex) #cancel 작업ID
예를 들어, 작업ID가 12345인 예약된 프린터 작업을 취소하려면 다음과 같이 명령을
실행한다.
=&gt; #cancel 12345

- &quot;lpr&quot; 명령은 프린터로 파일을 인쇄하는 명령이다.
- &quot;lpq&quot; 명령은 프린터 대기열에 있는 작업 목록을 표시하는 명령이다.
- &quot;lpstat&quot; 명령은 프린터 상태를 표시하는 명령이다.</code></pre><br>

<ol start="2">
<li>다음 중 스캐너를 사용하기 위해 설치해야 하는 패키지로 알맞은 것은?</li>
</ol>
<pre><code>① LPRng

② ALSA

③ CUPS

④ XSANE

정답 : 4번 XSANE

리눅스에서 스캐너를 사용하기 위해서는 다음과 같은 패키지를 설치해야 한다.
1. CUPS : 프린터 드라이버를 관리하는 패키지
- Common Unix Printing System의 약자로, 리눅스에서 프린터를 관리하기 위한
표준 프린터 스프링쿨러이다.
CUPS는 프린터 드라이버를 관리하여, 다양한 프린터를 사용할 수 있도록 한다.

2. XSANE : 스캐너 드라이버를 관리하는 패키지
- X Scanner Access Now Easy의 약자로, 리눅스에서 스캐너를 관리하기 위한
패키지이다.
스캐너 드라이버를 관리하여, 다양한 스캐너를 사용할 수 있도록 한다.


- LPRng는 프린터 드라이버만을 관리하는 패키지이다.

- ALSA는 오디오 장치를 관리하는 패키지이다.</code></pre><br>

<ol start="3">
<li>다음 RAID 구성 레벨 중에서 디스크 오류 대처와 가장 거리가 먼 것은?</li>
</ol>
<pre><code>① RAID-0

② RAID-1

③ RAID-5

④ RAID-6

정답 : 1번


RAID 구성 레벨은 디스크의 성능과 안정성을 향상시키기 위한 기술이다.
RAID-0은 스타라이핑 방식으로, 데이터를 여러 개의 디스크에 나누어 저장하는 방식
이 방식은 성능이 매우 뛰어나지만, 한 개의 디스크에 오류가 발생하면 모든 데이터가
손실된다.
따라서, 디스크 오류 대처와 가장 거리가 먼 RAID 구성 레벨은 &quot;RAID-0&quot;이다.


- RAID-1
미러링 방식으로, 동일한 데이터를 두 개의 디스크에 저장하는 방식이다.
이 방식은 성능이 RAID-0에 비해 떨어지지만, 한 개의 디스크에 오류가 발생하더라도
다른 디스크를 통해 데이터를 복구할 수 있다.


- RAID-5
패리티 방식으로, 데이터를 여러 개의 디스크에 분산 저장하면서 패리티 정보를 별도로
저장하는 방식이다.
이 방식은 성능이 RAID-1에 비해 좋고, 한 개의 디스크에 오류가 발생하더라도 다른
디스크를 통해 데이터를 복구할 수 있다.


- RAID-6
패리티 방식으로, 데이터를 여러 개의 디스크에 분산 저장하면서 두 개의 패리티 
정보를 별도로 저장하는 방식이다.
이 방식은 성능이 RAID-5에 비해 떨어지지만, 두 개의 디스크에 오류가 발생하더라도
다른 디스크를 통해 데이터를 복구할 수 있다.</code></pre><br>

<ol start="4">
<li>다음 중 사운드 카드와 관련된 조합으로 알맞은 것은?</li>
</ol>
<pre><code>① OSS, CUPS

② ALSAM CUPS

③ OSS, SANE

④ OSS, ALSA

정답 : 4번


OSS(Open Sound System)는 리눅스에서 오래 전부터 사용되어온 사운드 시스템으로,
사운드 카드의 하드웨어를 직접 제어하는 방식을 사용한다.
ALSA(Advanced Linux Sound  Architecture)는 OSS의 후속 시스템으로, 사운드
카드의 하드웨어를 추상화하여 소프트웨어적으로 제어하는 방식을 사용한다.


- 1번은 프린터 관리와 관련된 조합
- 2번은 OSS와 ALSA를 동시에 사용하는 조합
- 3번은 이미지 스캐너 관리와 관련된 조합</code></pre><br>

<ol start="5">
<li>다음 유닉스에서 사용하는 프린팅 명령어 중 나머지 셋과 계열이 다른 것은?</li>
</ol>
<pre><code>① lp

② lpr

③ lpq

④ lprm

정답 : 1번

lp, lpr, lpq, lprm은 모두 유닉스에서 사용하는 프린팅 명령어이지만,
계열이 다르다.

- lp : BSD 계열의 명령어이다.
BSD 계열은 Unix의 한 계열로, Berkeley Software Distribution의 약자이다.
BSD 계열은 유닉스의 기본 기능에 다양한 기능을 추가하여 발전시킨 계열이다.

- lpr : System V 계열의 명령어이다.
System V 계열은 UNIX의 또 다른 계열로, AT&amp;T의 UNIX System V의 약자이다.
유닉스의 기본 기능을 안정적으로 유지하는 데 중점을 둔 계열이다.

- lpq : POSIX 표준 명령어이다.
POSIX는 Portable Operationg System Interface의 약자로, 유닉스 계열
운영체제의 표준을 정의한 표준이다.
POSIX 표준 명령어는 POSIX 표준을 준수하는 모든 유닉스 계열 운영체제에서
사용할 수 있다.

- lprm : POSIX 표준 명령어이다.</code></pre><br>

<ol start="6">
<li>다음 설명에 해당하는 LVM 용어로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/2670198b-b2ba-4f6f-bb54-9c1d097f2ae1/image.png" alt="">
<br></p>
<pre><code>① PE

② PV

③ LV

④ VG

정답 : 1번

PE는 물리적 디스크 공간의 작은 블록 또는 조각이다.
이는 LVM이 디스크를 더 작은 단위로 관리하고 논리적인 볼륨을 효과적으로
할당하고 확장하기 위한 기본 단위이다.</code></pre><br>

<ol start="7">
<li>다음 중 yum 명령을 이용해서 sendmail 패키지를 설치하는 명령으로 알맞은
것은?</li>
</ol>
<pre><code>① yum install sendmail

② yum -i sendmail

③ yum -yl sendmail

④ yum infol sendmail

정답 : 1번


yum 명령은 리눅스에서 패키지를 관리하는 명령으로, `yum install`은 특정
패키지를 설치하는 명령이다.
따라서, `yum install sendmail`은 sendmail 패키지를 설치하는 명령이다.


- yum -i sendmail
i 옵션은 install 옵션과 같은 기능을 수행한다.

- yum -yl sendmail
y 옵션은 설치 시 확인 메시지를 표시하지 않는다.

- yum infol sendmail
infol 옵션은 패키지의 정보를 표시한다.</code></pre><br>

<ol start="8">
<li>다음은 httpd라는 이름의 rpm 패키지가 설치되어 있는지를 확인하는 과정이다.
(괄호) 안에 들어갈 내용으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/0d7eae19-626f-449a-ade4-d7fd2a218d78/image.png" alt="">
<br></p>
<pre><code>① -qa

② -qi

③ -qd

④ -ql

정답 : 1번

rpm -qa 명령어는 시스템에서 설치된 모든 RPM 패키지를 나열하고, 각 패키지의
이름과 버전 정보를 보여준다.</code></pre><br>

<ol start="9">
<li>다음 중 소스 파일로 프로그램 설치하는 방법이 나미저 셋과 다른 것은?</li>
</ol>
<pre><code>① MySQL

② Apache httpd

③ PHP

④ Nmap

정답 : 1번


- MySQL, Apache httpd, PHP는 모두 소스 파일로 설치할 수 있다.
하지만, MySQL은 소스 파일로 설치할 때 &#39;make&#39; 명령을 사용하기 전에 &#39;configure&#39;
명령을 사용하여 컴파일 환경을 설정해야 한다.
반면, Apache httpd와 PHP는 &#39;make&#39; 명령만 사용하여 컴파일할 수 있다.</code></pre><br>

<ol start="10">
<li>다음은 MySQL 소스 파일을 설치하기 위해서 압축을 푸는 과정이다.
(괄호) 안에 들어갈 내용으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/b3114155-f0d6-4558-9c7a-7e0522c14381/image.png" alt="">
<br></p>
<pre><code>① gxvf

② zxvf

③ jxvf

④ Jxvf

정답 : 2번

tar zxvf mysql-boost-5.7.36.tar.gz 명령어는 현재 디렉터리에서 mysql-boost
파일을 gzip으로 압축해제하고, 그 내용을 표시하는 명령어이다.
압축이 풀린 후에는 현재 디렉터리에 mysql-boost 디렉터리가 생성되고, 그 안에
압축해제된 파일들이 위치하게 된다.

세부적으로 보면 tar는 파일아카이브를 생성하거나 해제하는 명령어이다. 
- z옵션은 gzip으로 압축된 파일을 해제하는 기능

- x옵션은 아카이브에서 파일을 추출할 때 사용하며, v옵션은 작업의 진행 상황을
자세히 출력한다.

- 마지막으로 f 옵션은 파일 이름을 지정하는 옵션으로 뒤에 나오는 파일이름이나
아카이브의 이름을 지정한다.
</code></pre><br>

<ol start="11">
<li>다음은 rpm 파일을 내려받아서 설치하는 과정이다.
(괄호) 안에 들어갈 내용으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/f67569e8-e67c-4cf2-a0f9-f005dc3ef14c/image.png" alt="">
<br></p>
<pre><code>① -U

② -l

③ -E

④ -V

정답 : 1번

rpm -U 명령어는 시스템에서 이미 설치된 패키지를 업그레이드 할 때 사용되며,
새로운 버전의 패키지를 설치하고 이전 버전의 패키지를 대체하는 역할을 한다.</code></pre><br>

<ol start="12">
<li>다음 중 소스 파일로 프로그램을 설치하는 단계인 configure 작업 후에
생성되는 파일명으로 알맞은 것은?</li>
</ol>
<pre><code>① .config

② .configure

③ make

④ Makefile

정답 : 4번

configure 작업은 소스 파일의 설정을 확인하고, Makefile을 생성하는 작업이다.
따라서, configure 작업 후에 생성된느 파일명은 Makefile이다.

- .config는 커널의 설정을 저장하는 파일이다.

- .configure는 configure 작업의 설정을 저장하는 파일이다.

- make는 컴파일 작업을 수행하는 명령이다.

*** configure 작업 진행순서

1. configure 명령어를 실행한다.
2. configure 명령어는 소스 파일의 설정을 확인한다.
3. configure 명령어는 Makefile을 생성한다.


Makefile은 컴파일 작업을 수행하기 위한 설정 파일이다.
Makefile에는 컴파일 할 소스 파일, 컴파일할 옵션, 링크할 라이브러리 등이
설정되어 있다.
</code></pre><br>

<ol start="13">
<li>다음 중 온라인 기반 패키지 관리 도구로 틀린 것은?</li>
</ol>
<pre><code>① apt-get

② yum

③ dpkg

④ zypper

정답 : 3번

온라인 기반 패키지 관리 도구는 인터넷을 통해 패키지를 다운로드하고 설치하는
도구를 말한다.
apt-get, yum, zypper는 모두 온라인 기반 패키지 관리 도구이다.

dpkg는 데비안 계열의 리눅스에서 사용되는 패키지 관리 도구로, 온라인 기반 패키지
관리 도구는 아니다.
dpgk는 인터넷을 통해 패키지를 다운로드 할 수는 있지만, 설치는 별도의 명령을
사용하여 수행해야 한다.


** 온라인 기반 패키지 관리 도구의 특징
온라인 기반 패키지 관리 도구는 인터넷을 통해 패키지를 다운로드하고 설치하기
때문에, 패키지의 최신 버전을 쉽게 설치할 수 있다.
또한, 패키지의 의존성 문제를 자동으로 해결할 수 있다.
</code></pre><br>

<ol start="14">
<li>다음 중 데비안 계열 리눅스의 패키지 관리 도구로 가장 거리가 먼 것은?</li>
</ol>
<pre><code>① dselect

② alien

③ dpkg

④ 울

정답 : 4번

데비안 계열 리눅스의 패키지 관리 도구는 크게 두 가지로 나눌 수 있다.
하나는 저수준 패키지 관리 도구로, dpkg와 apt가 있다.

- dpkg : 실제 패키지의 설치, 업데이트, 삭제 등을 수행하는 도구이다.
- apt는 dpkg를 기반으로 패키지의 의존성 해결, 패키지 검색 등의 기능을
제공하는 도구이다.

다른 하나는 고수준 패키지 관리 도구로, synaptic, aptitude, wajjg 등이 있다.
이 도구들은 dpkg와 apt를 기반으로 GUI 환경에서 패키지를 관리할 수 있도록
해주는 도구이다.

울(Uul)은 Slackware 배포판에서 사용하는 패키지 관리 도구이다.
Slackware는 데비안 계열 리눅스와는 다른 배포판이기 때문에, 울은 데비안 계열
리눅스의 패키지 관리 도구와는 거리가 멀다.

- dselect : 데비안 계열 리눅스에서 사용되는 고수준 패키지 관리 도구이다.

- alien은 데비안 계열 리눅스에서 RPM 패키지를 설치할 수 있도록 도와주는
도구이다.

- dpkg는 데비안 계열 리눅스에서 사용되는 저수준 패키지 관리 도구이다.

</code></pre><br>

<ol start="15">
<li>vi 편집기에서 표시되고 있는 행번호를 제거할 때 사용하는 환경 설정값으로
알맞은 것은?</li>
</ol>
<pre><code>① set uno

② set unnu

③ set unno

④ set nonu

정답 : 4번

vi 편집기에서 표시되고 있는 행번호를 제거할 때 사용하는 환경 설정값은
set nonu이다.

vi 편집기에서 행번호를 표시하려면 set nubmer 명령어를 사용한다.
행번호를 표시하지 않으려면 set nonu 명령어를 사용한다.</code></pre><br>

<ol start="16">
<li>다음 중 가장 처음에 등장한 편집기로 알맞은 것은?</li>
</ol>
<pre><code>① vi

② gedit

③ nano

④ pico

정답 : 1번

vi는 1976년에 AT&amp;T Bell Labs에서 개발된 편집기이다.
vi는 원래 Unix 운영체제용으로 개발되었지만, 이후에 Linux, macOS, Microsoft
Windows 등 다양한 운영체제에서 사용할 수 있게 되었다.

gedit, nano, pico는 모두 vi를 기반으로 개발된 편집기이다.

- gedit
1998년에 Gnome 데스크탑 환경용으로 개발된 편집기이다.

- nano
1999년에 GNU 프로젝트에서 개발된 편집기이다.

- pico
1986년 Pine 이메일 클라이언트와 함께 개발된 편집기이다.
</code></pre><br>

<ol start="17">
<li>다음 중 vi 편집기에서 모든 windows라는 문자열을 linux로 치환하는
명령으로 알맞은 것은?</li>
</ol>
<pre><code>① :% s/linux/windows/g

② :% s/windows/linux/g

③ :% s/\&lt;linux\&gt;/windows/g

④ :% s/\&lt;windows\&gt;/linux/g

정답 : 2번

vi 편집기에서 문자열을 치환하는 명령은 &quot;s/old/new/g&quot; 이다.

- old : 치환할 문자열
- new : 치환할 문자열로 대체할 문자열
- g : 모든 문자열을 치환한다는 의미이다.</code></pre><br>

<ol start="18">
<li>vi 편집기 실행할 때마다 행 번호가 자동으로 표시되도록 설정하려고 한다.
다음 중 관련 설정을 저장하기 위해 생성해야 할 파일명으로 알맞은 것은?</li>
</ol>
<pre><code>① .virc

② .vimrc

③ .viex

④ .vimex

정답 : 2번

vi 편집기의 설정을 저장하기 위한 파일명은 &quot;.vimrc&quot;이다.
이 파일에는 vi 편집기의 다양한 설정, 예를 들어 행 번호 표시, 자동 완성, 색상
테마 등을 설정할 수 있다.
따라서, vi 편집기 실행 시마다 행 번호가 자동으로 표시되도록 설정하려면 .vimrc
파일에 다음과 같은 내요을 추가하면 된다.

- set number

이렇게 설정하면 vi 편집기를 실행할 때마다 화면에 행 번호가 표시된다.
</code></pre><br>

<ol start="19">
<li>다음 (괄호) 안에 들어갈 내용으로 알맞은 것은?</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/3a4e2824-05b9-42cb-b4d9-de5af6f108ea/image.png" alt="">
<br></p>
<pre><code>① ㄱ: vi, ㄴ: pico

② ㄱ: vi, ㄴ: nano

③ ㄱ: nano, ㄴ: pico

④ ㄱ: pico, ㄴ: nano

정답 : 4번

pico는 간단한 텍스트 편집기로, Pine(이메일 클라이언트)와 함께 제공되는
텍스트 편집기이다.
nano는 pico를 대체하는 것으로 생각할 수 있다.</code></pre><br>

<ol start="20">
<li>다음 중 emacs 편집기를 종료하는 조합으로 알맞은 것은?</li>
</ol>
<pre><code>① [Ctrl] + [c] 후에 [Ctrl] + [x]

② [Ctrl] + [x] 후에 [Ctrl] + [c]

③ [Ctrl] + [c] 후에 [Ctrl] + [f]

④ [Ctrl] + [x] 후에 [Ctrl] + [f]

정답 : 2번

emacs 편집기를 종료하는 조합은 [Ctrl] + [x]이다.

emacs 편집기에서 [Ctrl] + [c]를 누르면 현재 작업을 중단한디.

emacs 편집기에서 [Ctrl] + [f]를 누르면 파일을 열 수 있다.</code></pre><br>

]]></description>
        </item>
        <item>
            <title><![CDATA[[Kubernetes] 쿠버네티스 알아보기 2]]></title>
            <link>https://velog.io/@bb-seok/Kubernetes-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-2</link>
            <guid>https://velog.io/@bb-seok/Kubernetes-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-2</guid>
            <pubDate>Fri, 23 Aug 2024 04:04:55 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="파드-업데이트-및-복구">파드 업데이트 및 복구</h2>
</blockquote>
<ol>
<li>파드 배포</li>
</ol>
<ul>
<li>C\HashiCorp&gt; kubectl apply -f ~/_Book_k8sInfra/ch3/3.2.10/rollout-nginx.yaml</li>
<li>-record</li>
</ul>
<br>

<ol start="2">
<li>배포한 파드 확인</li>
</ol>
<ul>
<li>kubectl get pods</li>
</ul>
<br>

<ol start="3">
<li>record 옵션으로 기록된 히스토리를 명령을 통해 확인</li>
</ol>
<ul>
<li>kubectl rollout history deployment rollout-nginx</li>
</ul>
<br>

<ol start="4">
<li>배포한 파드의 정보 확인</li>
</ol>
<ul>
<li>kubectl get pods -o=custom=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase,NODE:.spec.nodeName
=&gt; 명령어 입력 시 주의할 점은 띄어쓰기를 사용하면 안된다는 것
(구분자로 인식하기 때문이다.)</li>
</ul>
<br>

<ol start="5">
<li>예제 실습을 위한 파드 생성</li>
</ol>
<ul>
<li>kubectl run nginx-pod --image=nginx</li>
</ul>
<br>

<ol start="6">
<li>파드 접속</li>
</ol>
<ul>
<li>kubectl exec -it nginx-pod -- /bin/bash</li>
</ul>
<br>

<ol start="7">
<li>서버 확인</li>
</ol>
<ul>
<li>curl -l --silent [IP Address] | grep Server</li>
</ul>
<br>

<ol start="8">
<li>set image 명령으로 파드 버전 업데이트</li>
</ol>
<ul>
<li>kubectl set image deployment rollout-nginx nginx=nginx:1.16.0 --record</li>
</ul>
<br>

<ol start="9">
<li>이전에 파드 정보 확인했던 명령어로 확인해보면</li>
</ol>
<ul>
<li>kubectl get pods -o=custom=NAME:.metadata.name,IP:.status.podIP,STATUS:
.status.phase,NODE:.spec.nodeName</li>
</ul>
<br>

<ul>
<li>기존의 생성됐던 파드의 해시값과 완전히 다른 해시값을 가지는 파드들이
생성된다.</li>
</ul>
<br>

<ol start="10">
<li>업데이트가 완료되면 Deployment 상태 확인</li>
</ol>
<ul>
<li>kubectl rollout status deployment rollout-nginx</li>
</ul>
<br>

<ol start="11">
<li>히스토리 확인하기</li>
</ol>
<ul>
<li>kubectl rollout history deployment rollout-nginx</li>
</ul>
<br>

<ol start="12">
<li>curl 명령으로 업데이트가 제대로 됐는지 확인</li>
</ol>
<ul>
<li>curl -l --silent [IP Address] | grep Server</li>
</ul>
<br>

<blockquote>
<h3 id="업데이트-실패-시-파드-복구">업데이트 실패 시 파드 복구</h3>
</blockquote>
<ol>
<li>확인을 위해 업데이트 버전을 의도적으로 변경</li>
</ol>
<ul>
<li>kubectl set image deployment rollout-nginx nginx=nginx:1.17.23 --record</li>
</ul>
<br>

<ol start="2">
<li>파드 정보 확인</li>
</ol>
<ul>
<li>kubectl get pods -o=custom=NAME:.metadata.name,IP:.status.podIP,STATUS:
.status.phase,NODE:.spec.nodeName
=&gt; 업데이트 한 파드의 상태가 Pending 상태로 유지되는 것을 확인할 수 있다.</li>
</ul>
<br>

<ol start="3">
<li>문제 확인을 위해 rollout status를 실행</li>
</ol>
<ul>
<li>kubectl rollout status deployment rollout-nginx
=&gt; 새로운 replicas는 생성했으나 Deployment를 배포하는 단계에서 대기 중(Waiting)으로
더 이상 진행되지 않는 것을 확인할 수 있다.</li>
</ul>
<br>

<ol start="4">
<li>Deployment를 생성하려고 여러 번 시도했지만 끝내 생성되지 않았다는
메시지가 출력된다.</li>
</ol>
<br>

<ol start="5">
<li>describe 명령으로 문제점 확인</li>
</ol>
<ul>
<li>kubectl describe deployment rollout-nginx
=&gt; 해당 명령은 쿠버네티스의 상태를 살펴볼 때 유용하다.</li>
</ul>
<br>

<ol start="6">
<li>정상적인 상태로 복구하는 방법을 알아보자.
업데이트 할 때 사용했던 명령들을 rollout history로 확인</li>
</ol>
<ul>
<li>kubectl rollout history deployment rollout-nginx</li>
</ul>
<br>

<ol start="7">
<li>rollout undo로 명령 실행을 취소해 마지막 단계(revision 3)에서 전 단계(revision 2)로 상태를 되돌리기</li>
</ol>
<ul>
<li>kubectl rollout undo deployment rollout-nginx</li>
</ul>
<br>

<ol start="8">
<li>파드 상태 확인</li>
</ol>
<ul>
<li>kubectl get pods -o=custom=NAME:.metadata.name,IP:.status.podIP,STATUS:
.status.phase,NODE:.spec.nodeName</li>
</ul>
<br>

<ol start="9">
<li>rollout history로 실행된 명령을 확인</li>
</ol>
<ul>
<li>revision 4가 추가되고, revision 2가 삭제됐다.
현재 상태를 revision 2로 되돌렸기 때문에 revision 2는 삭제되고, 가장 최근 상태는
revision 4가 된다.</li>
</ul>
<br>

<ul>
<li>kubectl rollout history deployment rollout-nginx</li>
</ul>
<br>

<ol start="10">
<li>배포된 컨테이너의 nginx 버전을 curl -l로 확인</li>
</ol>
<ul>
<li>curl -l --silent [IP Address] | grep Server</li>
</ul>
<br>

<ol start="11">
<li>rollout status 명령으로 변경이 정상적으로 적용됐는지 확인</li>
</ol>
<ul>
<li>kubectl rollout status deployment rollout-nginx</li>
</ul>
<br>

<ol start="12">
<li>describe 명령으로 현재 디플로이먼트 상태도 세부적으로 점검</li>
</ol>
<ul>
<li>kubectl describe deployment rollout-nginx</li>
</ul>
<br>

<blockquote>
<h3 id="특정-시점으로-파드-복구">특정 시점으로 파드 복구</h3>
</blockquote>
<ol>
<li>처음 상태인 revision 1로 돌아가기</li>
</ol>
<ul>
<li>kubectl rollout undo deployment rollout-nginx --to-revision=1</li>
</ul>
<br>

<ol start="2">
<li>새로 생성된 파드들의 IP를 확인</li>
</ol>
<ul>
<li>kubectl get pods -o=custom=NAME:.metadata.name,IP:.status.podIP,STATUS:
.status.phase,NODE:.spec.nodeName</li>
</ul>
<br>

<ol start="3">
<li>curl -l로 nginx 컨테이너의 버전 확인</li>
</ol>
<ul>
<li>curl -l --silent [IP Address] | grep Server</li>
</ul>
<br>

<ol start="4">
<li>다음 단계 진행을 위해 배포한 rollout-nginx 디플로이먼트 삭제</li>
</ol>
<ul>
<li>kubectl delete -f ./_Book_k8sInfra/ch3/3.2.10/rollout-nginx.yaml</li>
</ul>
<br>

<ol start="5">
<li>배포된 파드가 없는지 확인</li>
</ol>
<ul>
<li>kubectl get pods</li>
</ul>
<br>

<blockquote>
<h2 id="쿠버네티스-연결을-담당하는-서비스">쿠버네티스 연결을 담당하는 서비스</h2>
</blockquote>
<p>일반적으로 서비스라고 하면 웹 서비스나 네트워크 서비스처럼 운영체제에 속한 서비스
데몬 또는 개발 중인 서비스 등을 떠올릴 수 있다.</p>
<p>하지만 쿠버네티스의 서비스는 외부에서 쿠버네티스 클러스터에 접속하는 방법을 의미한다.</p>
<p>서비스를 &#39;소비를 위한 도움을 제공한다&#39;는 관점으로 바라본다면 쿠버네티스가 외부에서
쿠버네티스 클러스터에 접속하기 위한 &#39;서비스&#39;를 제공한다고 볼 수 있다.</p>
<p>=&gt; Mini Kube의 경우 LocalHost Address가 Cluster Address가 된다.</p>
<br>

<blockquote>
<h2 id="가장-간단하게-연결하는-노드포트">가장 간단하게 연결하는 노드포트</h2>
</blockquote>
<p>외부에서 클러스터 내부에 접속하는 가장 쉬운 방법은 노드포트 서비스를 이용하는 것
노드포트 서비스를 설정하면 모든 워커 노드의 특정 포트(노드포트)를 열고, 여기로 오는
모든 요청을 노드포트 서비스로 전달한다.</p>
<br>

<p>외부에서 클러스터 내부 파드에 직접 연결이 아닌, 노드포트를 통해 연결되는 이유는 각각의
파드가 가진 IP 주소는 외부에서 재응답 시 사용할 수 있는 포트가 아니기 때문이다.
또한, 통신의 검증을 위해 노드포트가 방화벽 역할을 하기도 한다.</p>
<br>

<blockquote>
<h3 id="노드포트-서비스로-외부에서-접속">노드포트 서비스로 외부에서 접속</h3>
</blockquote>
<ol>
<li>디플로이먼트로 파드를 생성</li>
</ol>
<p>-kubectl create deployment np-pods --image=sysnet4admin/echo-hname</p>
<br>

<ol start="2">
<li>배포된 파드 확인</li>
</ol>
<ul>
<li>kubectl get pod / pods</li>
</ul>
<br>

<ol start="3">
<li>kubectl create로 노드포트 서비스를 생성</li>
</ol>
<ul>
<li>kubectl create -f ~/_Book_k8sInfra/ch3/3.3.1/nodeport.yaml</li>
</ul>
<br>

<ul>
<li>nodeport.yaml 파일 내용<pre><code>apiVersion: v1
kind: Service
metadata:
name: np-svc
spec:
selector:
  app: np-pods 
ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30000
type: NodePort
</code></pre></li>
</ul>
<p>=&gt; 서비스는 모든 수신 포트를 targetPort에 매핑할 수 있는데, 기본적으로 그리고
편의상 targetPort는 port 필드와 같은 값으로 설정된다.</p>
<pre><code>
&lt;br&gt;

4. 생성된 서비스 확인

- kubectl get service / services

&lt;br&gt;

5. 쿠버네티스 클러스터의 워커 노드 IP 확인

- kubectl get nodes -o wide

&lt;br&gt;

6. 웹에서  접근하여 확인

- localhost:3000

&lt;br&gt;

- 노드포트 서비스의 INTERNAL-IP 주소로 접근
[INTERNAL-IP]:30000

&lt;br&gt;

&gt;## 부하 분산 테스트

디플로이먼트로 생성된 파드 1개에 접속하고 있는 중 파드가 3개로 증가하면
접속 상태가 어떻게 바뀌는지 확인
즉, 부하가 어떻게 분산 되는지를 확인한다.

&lt;br&gt;

1. cmd -&gt; powershell 켜기

- 명령어 입력</code></pre><p>PS C:\Users\tjoeun&gt; $I=0;while($true)</p>
<blockquote>
<blockquote>
<p>{
% { $i++; write-host -NoNewLine &quot;$i $_&quot; }
(Invoke-RestMethod &quot;<a href="http://localhost:30000&quot;)-replace">http://localhost:30000&quot;)-replace</a> &#39;\n&#39;, &quot; &quot;
}</p>
</blockquote>
</blockquote>
<p>=&gt; 명령 실행 시 현재 접속한 호스트 이름을 순서대로 출력함.</p>
<pre><code>
&lt;br&gt;

2. powershell로 코드 실행 후 쿠버네티스 마스터 노드에서 scale을 실행해
파드를 3개로 증가

- kubectl scale deployment np-pods --replicas=3

&lt;br&gt;

3. 파워 셸에서 1번 명령어를 재입력하여 부하 분산을 확인

- 배포된 파드 3개가 돌아가면서 표시되는 것을 확인할 수 있다.

- 어떻게 추가된 파드를 외부에서 추적해 접속하는 것일까?
이는 노드포트와 오브젝트 스펙에 적힌 파드명과 디플로이먼트명을 확인하여
동일할 경우 같은 파드라고 간주하기 때문이다.

&lt;br&gt;
</code></pre><p>노드포트의 오브젝트 스펙인 nodeport.yaml 파일 일부</p>
<p>spec:
   selector:
        app: np-pods</p>
<pre><code>
&lt;br&gt;

4. np-pods를 yaml 파일로 열기

- kubectl get deployment np-pods -o yaml &gt; np-pods.yaml

- code np-pods.yaml

&lt;br&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Kubernetes] 쿠버네티스 이해하기 1]]></title>
            <link>https://velog.io/@bb-seok/Kubernetes-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1</link>
            <guid>https://velog.io/@bb-seok/Kubernetes-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1</guid>
            <pubDate>Thu, 22 Aug 2024 07:59:50 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="pod--cluster">Pod &amp; Cluster</h2>
</blockquote>
<p><a href="https://kubernetes.io/ko/docs/home/">쿠버네티스</a>
<br></p>
<ol>
<li>Pod(파드)</li>
</ol>
<ul>
<li><p>쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다.</p>
</li>
<li><p>하나 이상의 컨테이너 그룹을 의미하며, 이 그룹은 스토리지 및 네트워크를 공유하고
해당 컨테이너를 구동하는 방식에 대한 명세를 갖는다.</p>
<br>
</li>
</ul>
<ol start="2">
<li>Cluster(클러스터)</li>
</ol>
<ul>
<li><p>애플리케이션 컨테이너를 실행하기 위한 일련의 노드 머신이다.</p>
</li>
<li><p>쿠버네티스를 실행 중이라면 클러스터를 실행하고 있는 것이다.</p>
</li>
<li><p>클러스터는 컨트롤 플레인 및 하나 이상의 컴퓨팅 머신 또는 노드를 포함하고 있다.</p>
<pre><code>  Control Plane
  어느 애플리케이션을 실행하고 애플리케이션이 어느 컨테이너 이미지를 사용할지와
  같이 클러스터를 원하는 상태로 유지 관리한다.</code></pre></li>
</ul>
<p>클러스터는 쿠버네티스의 핵심 장점으로써 물리 머신, 가상 머신, 온프레미스, 클라우드에
구애받지 않고 머신 그룹 전체에서 컨테이너를 예약하고 실행할 수 있다.
<br></p>
<ol start="3">
<li>Node</li>
</ol>
<ul>
<li>애플리케이션과 워크로드를 실제로 구동 및 실행</li>
</ul>
<br>

<blockquote>
<h3 id="kubetcl">Kubetcl</h3>
</blockquote>
<ul>
<li><p>쿠버네티스 API를 사용하여 쿠버네티스 클러스터의 컨트롤 플레인과 통신하기 위한
커맨드라인 툴</p>
<br>
</li>
<li><p>구성을 위해 kubectl은 config 파일을 $HOME/.kube에서 찾는다.
KUBECONFIG 환경 변수를 설정하거나 --kubeconfig 플래그를 설정하여 다른 
kubeconfig 파일을 지정할 수 있다.</p>
<br>

</li>
</ul>
<blockquote>
<h3 id="kubectl-실습하기">Kubectl 실습하기</h3>
</blockquote>
<ol>
<li>XShell로 Worker Node 연결</li>
</ol>
<ul>
<li>w2-k8s 세션 연결<br>
</li>
</ul>
<ol start="2">
<li>kubectl 명령어로 노드 확인</li>
</ol>
<ul>
<li>kubectl get nodes
해당 명령을 실행하면 아래와 같은 문구가 뜨게 된다.<pre><code>The connection to the server localhost:8080 was refused - did you specify the right 
host or port?</code></pre></li>
</ul>
<p>명령을 실행해도 쿠버네티스의 노드들에 대한 정보가 표시되지 않는 것을 확인할 수 있는데
이는 쿠버네티스 클러스터의 정보를 kubectl이 알지 못하기 때문이다.</p>
<p>kubectl은 API 서버를 통해 쿠버네티스에 명령을 내린다.
따라서 kubectl이 어디에 있더라도 API 서버의 접속 정보만 있다면 어느 곳에서든
쿠버네티스 클러스터에 명령을 내릴 수 있다.
<br></p>
<ol start="3">
<li>쿠버네티스 클러스터의 정보를 마스터 노드에서 scp 명령으로 워커 노드의 현재 
디렉터리에 받아온다.</li>
</ol>
<ul>
<li><p>클러스터 정보 : /etc/kubernetes/admin.conf</p>
</li>
<li><p>Worker Node : w2-k8s</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/f15dbfe4-afae-4f77-8852-95c4095e065e/image.png" alt="">
<br></p>
<ol start="4">
<li>kubectl get nodes 명령에 추가로 쿠버네티스 클러스터 정보를 입력받는 옵션과
마스터 노드에서 받아온 admin.conf를 입력하고 실행</li>
</ol>
<ul>
<li>kubectl get nodes --kubeconfig admin.conf
<img src="https://velog.velcdn.com/images/bb-seok/post/328936d1-f817-4612-8489-a5d3cc548916/image.png" alt=""><br>
</li>
</ul>
<ol start="5">
<li>노드 정보가 정상적으로 표시되는지 확인</li>
</ol>
<br>


<blockquote>
<h3 id="kubelet">kubelet</h3>
</blockquote>
<ul>
<li><p>각 노드에서 실행되는 기본 &quot;노드 에이전트&quot;이다.</p>
</li>
<li><p>호스트 이름, 호스트 이름을 재정의하는 플래그 또는 클라우드 공급자의 특정 로직 중
하나를 사용하여 api server에 노드를 등록할 수 있다.</p>
<br>

</li>
</ul>
<h3 id="kubelet으로-배포하기">kubelet으로 배포하기</h3>
<ol>
<li>Master Node를 루트 계정으로 접근 후 리스트 불러오기</li>
</ol>
<ul>
<li><p>sudo -i</p>
</li>
<li><p>ls</p>
<br>
</li>
</ul>
<ol start="2">
<li>cat 내려받은 예제 내용 출력</li>
</ol>
<ul>
<li>cat _Book_k8sInfra/ch3/3.1.6/nginx-pod.yaml<br>
</li>
</ul>
<ol start="3">
<li>파드 생성</li>
</ol>
<ul>
<li>kubectl create -f ~/_Book_k8sInfra/ch3/3.1.6/nginx-pod.yaml</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/004fbf95-f43d-4721-8269-791c15256dbd/image.png" alt="">
<br></p>
<ol start="4">
<li>생성된 파드 확인</li>
</ol>
<ul>
<li><p>kubectl get pod / pods</p>
</li>
<li><p>파드 상세 정보 확인 : kubectl get pod -o wide
=&gt; 파드의 위치인 워커 노드를 확인</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/3a1d1dc6-55dc-45ca-a6ba-dc5cfb6162da/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/703dc0da-fdc4-47a0-ad10-6e77af9a48c5/image.png" alt="">
<br></p>
<ol start="5">
<li>w3-k8s 워커 노드에서 아래 명령 실행</li>
</ol>
<ul>
<li>systemctl stop kubelet
=&gt; kubelet 정지시키기</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/3d7a4456-ff11-41af-9446-6af8e40d7010/image.png" alt="">
<br></p>
<ol start="6">
<li>Master Node로 돌아와 이전에 생성한 파드 삭제</li>
</ol>
<ul>
<li>kubectl delete pod nignx-pod
삭제 명령 시 삭제가 되지 않고 동작하지 않는 것을 확인할 수 있는데
이러한 이유는 직전에 kubelet을 정지시킴으로써 워커 노드의 동작 관리를
할 수 없기 때문이다.<br>
</li>
</ul>
<ol start="7">
<li>kubelet 실행(worker node)</li>
</ol>
<ul>
<li>systemctl start kubelet
<img src="https://velog.velcdn.com/images/bb-seok/post/2c956b0c-5a25-41df-8211-4b17715a551e/image.png" alt=""></li>
</ul>
<br>

<ol start="8">
<li>마스터 노드에서 파드 확인</li>
</ol>
<ul>
<li>kubectl get pod / kubectl delete pod nginx-pod
정상적으로 삭제되는 것을 확인할 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/c672ca90-cf11-4438-ad85-997d6191ba7a/image.png" alt="">
<br></p>
<blockquote>
<h3 id="kube-proxy">kube-proxy</h3>
</blockquote>
<ol>
<li>파드 재배포 &amp; 상세정보 확인</li>
</ol>
<ul>
<li><p>kubectl create -f ~/_Book_k8sInfra/ch3/3.1.6/nginx-pod.yaml</p>
</li>
<li><p>kubectl get pod -o wide</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/507509c7-bce8-40b0-8f2c-ddbf72246151/image.png" alt="">
<br></p>
<ol start="2">
<li>curl 명령으로 웹 서버 메인 페이지 내용 확인</li>
</ol>
<ul>
<li>curl [IP Address] 명령으로 터미널에서 내용 확인</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/2269e76e-50b0-48bf-84f8-052da0124ae7/image.png" alt="">
<br></p>
<ol start="3">
<li>문제 상황 만들기</li>
</ol>
<ul>
<li><p>modprobe -f br_netfilter</p>
</li>
<li><p>systemctl restart network</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/cec966ae-2742-443a-af22-9126cccb6025/image.png" alt="">
<br></p>
<ol start="4">
<li><p>curl 명령으로 다시 웹 서버 페이지 정보 받아오기</p>
<br>
</li>
<li><p>파드 상태 확인</p>
</li>
</ol>
<ul>
<li>kubectl get pod -o wide</li>
</ul>
<ol start="6">
<li>다시 웹 서버 페이지 정보를 받아올 수 있도록 설정</li>
</ol>
<ul>
<li><p>modprobe br_netfilter</p>
</li>
<li><p>reboot</p>
<br>
</li>
</ul>
<ol start="7">
<li>마스터 노드에서 파드 상태 확인</li>
</ol>
<ul>
<li>kubectl get pod -o wide
=&gt; RESTARTS 숫자가 1 증가한 것을 확인할 수 있다.<br>
</li>
</ul>
<ol start="8">
<li>curl 명령으로 파드로부터 정보를 받아오는지 확인</li>
</ol>
<ul>
<li>curl [IP Address]<br>
</li>
</ul>
<ol start="9">
<li>배포한 파드 삭제</li>
</ol>
<ul>
<li>kubectl delete -f ~/_Book_k8sInfra/ch3/3.1.6/nginx-pod.yaml<br>

</li>
</ul>
<blockquote>
<h3 id="쿠버네티스-기본-사용법">쿠버네티스 기본 사용법</h3>
</blockquote>
<p><strong>파드 생성 방법</strong></p>
<ol>
<li>파드 생성</li>
</ol>
<ul>
<li>kubectl run nginx-pod --image=nginx<br>
</li>
</ul>
<ol start="2">
<li>생성된 파드 확인</li>
</ol>
<ul>
<li>kubectl get pods<br>
</li>
</ul>
<ol start="3">
<li>run이랑 비교하여 create로 파드 생성하기</li>
</ol>
<ul>
<li>kubectl create nginx --image=nginx
=&gt; 명령 실행 시 에러 발생
Error : Unknown flag: --image<br>
</li>
</ul>
<ol start="4">
<li>기존 파드와 중복 이름을 피하고자 파드의 이름을 dpy-nginx로
지정하여 생성</li>
</ol>
<ul>
<li>kubectl create deployment dpy-nginx --image=nginx<br>
</li>
</ul>
<ol start="5">
<li>생성된 파드 확인</li>
</ol>
<ul>
<li>kubectl get pods<br>
</li>
</ul>
<ol start="6">
<li>생성된 파드의 IP 확인</li>
</ol>
<ul>
<li>kubectl get pods -o wide<br>
</li>
</ul>
<ol start="7">
<li>curl 명령으로 웹 페이지 정보 불러오기</li>
</ol>
<ul>
<li>curl [IP Address]<br>
</li>
</ul>
<ol start="8">
<li>웹 페이지가 정상적으로 동작하는지 확인<br>

</li>
</ol>
<blockquote>
<h3 id="mini-kube-설치하기">Mini Kube 설치하기</h3>
</blockquote>
<ol>
<li><p>Docker Desktop 설치 후 열기</p>
<br>
</li>
<li><p>우측 상단에 설정(톱니바퀴) 클릭</p>
<br>
</li>
<li><p>Kubernetes 클릭</p>
<br>
</li>
<li><p>다운로드</p>
</li>
</ol>
<ul>
<li>Enable Kubernetes 체크 후 우측 하단에 Apply&amp;Restart 클릭<br>
</li>
</ul>
<ol start="5">
<li>설치 확인</li>
</ol>
<ul>
<li><p>Docker Desktop 메인에서 좌측 Images 탭 클릭</p>
</li>
<li><p>kubernetes 관련된 것들이 설치 되었다면 정상적으로 완료 !!</p>
<br>
</li>
</ul>
<ol start="6">
<li><p>미니 쿠베 설치 후에 위 예제에서 했던 파드 생성하기 진행
=&gt; 그래도 안된다면 그냥 docker pull nginx 명령으로 nginx 이미지 설치</p>
<br>
</li>
<li><p>kubernetes 문제 발생 시 미니 쿠베를 이용하면 해당 문제를 해결할 수 있다.</p>
<br>

</li>
</ol>
<blockquote>
<h3 id="오브젝트object">오브젝트(Object)</h3>
</blockquote>
<p>파드와 디플로이먼트는 스펙(spec)과 상태(status) 등의 값을 가지고 있다.
이러한 값을 가지고 있는 파드와 디플로이먼트를 개별 속성을 포함해 부르는 단위를
오브젝트라고 한다.
<br></p>
<p><strong>기본 오브젝트</strong></p>
<ol>
<li>Pod</li>
</ol>
<ul>
<li>쿠버네티스에서 실행되는 최소 단위, 즉 웹 서비스를 구동하는데 필요한 최소 단위
독립적인 공간과 사용 가능한 IP를 가지고 있다.<br>
</li>
</ul>
<ol start="2">
<li>namespace</li>
</ol>
<ul>
<li>쿠버네티스 클러스터에서 사용되는 리소스들을 구분해 관리하는 그룹이다.<pre><code>특별히 설정하지 않으면 기본으로 할당되는 default
쿠버네티스 시스템에서 사용되는 kube-system
온프레미스에서 쿠버네티스를 사용할 경우 외부에서 쿠버네티스 클러스터 내부로
접속하게 도와주는 컨테이너들이 속해있는 metallb-system</code></pre><br>
</li>
</ul>
<ol start="3">
<li>Volume</li>
</ol>
<ul>
<li><p>파드가 생성될 때 사용할 수 있는 디렉터리를 제공한다.</p>
<br>
</li>
<li><p>기본적으로 파드는 영속성 개념이 아닌 제공되는 디렉터리도 임시로 사용한다.</p>
<br>
</li>
<li><p>파드가 사라지더라도 저장과 보존이 가능한 디렉터리를 볼륨 오브젝트를 통해
생성하고 사용할 수 있다.</p>
<br>
</li>
</ul>
<ol start="4">
<li>service</li>
</ol>
<ul>
<li><p>파드는 클러스터 내에서 유동적이기 때문에 접속 정보가 고정일 수 없다.
reboot 실행 시마다 해당 파드의 IP 주소가 바뀌는 것을 확인할 수 있음</p>
<br>
</li>
<li><p>파드 접속을 안정적으로 유지하도록 서비스를 내/외부로 연결한다.</p>
<br>
</li>
<li><p>기존 인프라에서 Load Balancer, Gateway와 비슷한 역할을 한다.</p>
<br>
</li>
</ul>
<ol start="5">
<li>deployment</li>
</ol>
<ul>
<li><p>쿠버네티스를 좀 더 효율적으로 작동하도록 기능들을 조합하고 추가해 구현하는 것이
디플로이먼트이다.
이외에도 데몬셋, 컨피그맵, 레플리카셋, PV, PVC, 스테이트풀셋 등이 있으며
앞으로도 요구사항에 따라 목적에 맞는 오브젝트들이 추가될 것이다.</p>
<br>
</li>
<li><p>쿠버네티스에서 가장 많이 쓰이는 디플로이먼트 오브젝트는 파드에 기반을 두고 있으며,
레플리카셋 오브젝트를 합쳐놓은 형태이다.</p>
<br>
</li>
<li><p>실제로 API 서버와 컨트롤러 매니저는 단순히 파드가 생성되는 것을 감시하는 것이 아니라
디플로이먼트처럼 레플리카셋을 포함하는 오브젝트의 생성을 감시한다.</p>
<br>

</li>
</ul>
<blockquote>
<h3 id="deployment-실습">Deployment 실습</h3>
</blockquote>
<ol>
<li>디플로이먼트 생성</li>
</ol>
<ul>
<li>kubectl create deployment dpy-hname --image=sysnet4admin/echo-hname<br>
</li>
</ul>
<ol start="2">
<li>디플로이먼트를 통해 생성된 파드 확인</li>
</ol>
<ul>
<li>kubectl get pod<br>
</li>
</ul>
<ol start="3">
<li>에러 발생 시 pull로 수동 설치</li>
</ol>
<ul>
<li>docker pull sysnet4admin/echo-hname<br>
</li>
</ul>
<ol start="4">
<li><p>디플로이먼트 재생성</p>
<br>
</li>
<li><p>파드 확인</p>
<br>

</li>
</ol>
<blockquote>
<h3 id="레플리카셋으로-파드-수-관리">레플리카셋으로 파드 수 관리</h3>
</blockquote>
<ol>
<li>배포된 파드 상태 확인</li>
</ol>
<ul>
<li>kubectl get pod<br>
</li>
</ul>
<ol start="2">
<li>dpy-nginx를 scale 명령으로 3개 증가시키기</li>
</ol>
<ul>
<li>kubectl scale deployment dpy-nginx --replicas=3</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/0f0fbad8-f23c-458e-b191-4631ea9dd32b/image.png" alt="">
<br></p>
<ol start="3">
<li>생성된 결과 확인</li>
</ol>
<ul>
<li>kubectl get pods<br>
</li>
</ul>
<ol start="4">
<li>레플리카셋을 이용하여 생성과 동시에 파드 수 늘리기</li>
</ol>
<ul>
<li>kubectl create deployment dpy-nginx2 --replicas=3 --image=nginx<br>
</li>
</ul>
<ol start="5">
<li>scale을 이용하여 deployment 사이즈 조정하기</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/fc7f25dd-d1a3-41a0-907f-31dfeacfbca9/image.png" alt="">
<br></p>
<blockquote>
<h3 id="스펙을-지정해-오브젝트-생성">스펙을 지정해 오브젝트 생성</h3>
</blockquote>
<ol>
<li>VS Code로 yaml 파일 열기</li>
</ol>
<ul>
<li>code echo-hname.yaml<br>
</li>
</ul>
<ol start="2">
<li>echo-hname.yaml 파일 작성</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/0c3bf6d7-887f-4ad6-a700-4d82ed0b2902/image.png" alt=""></p>
<pre><code>apiVersion: apps/v1   # API 버전
kind: Deployment      # 오브젝트 종류
metadata:             # 메타데이터
  name: echo-hname    # 오브젝트 이름
  labels:             # 레이블 설정
    app: nginx
spec:                 # 스펙
  replicas: 3         # 몇 개의 파드를 생성할지 결정
  selector:           # 레플리카 설정을 할 대상 지정
    matchLabels:
      app: nginx
  template:           # 템플릿 설정
    metadata:         # 템플리 메타데이터
      labels:
        app: nginx
    spec:             # 템플릿 스펙
      containers:
      - name: echo-hname
        image: sysnet4admin/echo-hname    # 사용되는 이미지</code></pre><br>

<ol start="3">
<li>API 버전 확인 명령어</li>
</ol>
<ul>
<li>kubectl api-versions</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/ad594630-5b57-4d18-9aa9-a245427b0990/image.png" alt="">
<br></p>
<ol start="4">
<li>생성</li>
</ol>
<ul>
<li>kubectl create -f echo-hname.yaml</li>
</ul>
<br>

<blockquote>
<h3 id="vs-code로-디플로이먼트-생성">VS Code로 디플로이먼트 생성</h3>
</blockquote>
<ol>
<li>test.yaml 파일 생성</li>
</ol>
<ul>
<li>code test.yaml<br>
</li>
</ul>
<ol start="2">
<li>파일 작성</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/1d3bf127-b156-412a-82f1-affbf85d4546/image.png" alt="">
<br></p>
<ol start="3">
<li>생성</li>
</ol>
<ul>
<li>kubectl create -f test.yaml</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/f52589f3-c423-40d4-b58b-f190c286b3fc/image.png" alt="">
<br></p>
<blockquote>
<h3 id="기본-속성값을-포함하여-파일을-만들고-수정하기">기본 속성값을 포함하여 파일을 만들고 수정하기</h3>
</blockquote>
<ul>
<li><p>kubectl create deployment output --image=nginx -o yaml &gt; output.yaml</p>
</li>
<li><p>code output.yaml</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/637df673-c918-4f3a-8167-62b72a078901/image.png" alt="">
<br></p>
<p>위의 명령어를 참고해서 yaml 파일 작성</p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/1a07c828-8791-4387-9a9a-001fd052f70a/image.png" alt="">
<br></p>
<blockquote>
<h3 id="파드의-컨테이너-자동-복구-방법">파드의 컨테이너 자동 복구 방법</h3>
</blockquote>
<ol>
<li>현재 오브젝트 상태 확인</li>
</ol>
<ul>
<li>kubectl get pods -o wide<br>
</li>
</ul>
<ol start="2">
<li>파드 컨테이너 셸 접속</li>
</ol>
<ul>
<li>kubectl exec -it nginx-pod -- /bin/bash
&quot;--&quot;는 exec에 대한 인자 값을 나누고싶을 때 사용한다.
명령어와 파드를 구분하기 위함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/c18bd466-b0af-4506-8231-2c36cc28ea8b/image.png" alt="">
<br></p>
<ol start="3">
<li>프로세스 생성 시간 확인</li>
</ol>
<ul>
<li>ls -l /run/nginx.pid
=&gt; UTC 기준<br>
</li>
</ul>
<ol start="4">
<li>터미널을 총 2개 띄운 다음 두 번째 터미널은 IP에서 돌아가는 웹 페이지를
1초마다 한 번씩 요청하는 스크립트 실행</li>
</ol>
<pre><code>- i=1; while true; do sleep 1; echo $((i++)) `curl --silent [pod IP] | grep
title` ; done</code></pre><br>

<ol start="5">
<li>bash shell에서 nginx 프로세스인 PID 1번을 kill 명령으로 종료</li>
</ol>
<ul>
<li>kill 1<br>
</li>
</ul>
<ol start="6">
<li><p>기존 터미널에서 nginx 웹 페이지를 받아오는 스크립트가 1초마다 잘 동작하는지
확인하고, 자동으로 복구되는 것도 함께 확인</p>
<br>
</li>
<li><p>nginx 웹 페이지가 복구된 것을 확인한 후에 다시 nginx-pod에 접속</p>
</li>
</ol>
<ul>
<li>kubectl exec -it nginx-pod -- /bin/bash<br>
</li>
</ul>
<ol start="8">
<li>ls 명령으로 리스트 확인</li>
</ol>
<ul>
<li>ls -l /run/nginx.pid<br>

</li>
</ul>
<blockquote>
<h3 id="파드의-동작-보증-기능">파드의 동작 보증 기능</h3>
</blockquote>
<ul>
<li><p>쿠버네티스는 파드 자체에 문제가 발생하면 파드를 자동 복구해서 파드가 항상 동작하도록
보장하는 기능도 있다.</p>
</li>
<li><p>레플리카셋을 이용하여 파드를 생성한 후에 삭제를 진행</p>
<pre><code>kubectl delete pods [pod name]
</code></pre></li>
</ul>
<p>kubectl get pods 명령을 통해 확인하면 이전에 delete를 이용해 삭제했지만
레플리카셋은 설정을 유지하기 위해 삭제와 동시에 새로 올리게 됨.</p>
<ul>
<li><p>레플리카셋의 경우 많으면 줄이고, 적으면 늘림으로써 상태를 유지한다.
  (상시 모니터링)</p>
</li>
<li><p>파드의 해시값이 기존 삭제했던 것과 다른 것을 확인할 수 있다.</p>
</li>
<li><p>완전한 삭제를 위해서는 deployment 자체를 삭제해야 한다.
kubectl delete deployment</p>
<pre><code>&lt;br&gt;
</code></pre></li>
</ul>
<blockquote>
<h3 id="노드-자원-보호">노드 자원 보호</h3>
</blockquote>
<p>노드는 쿠버네티스 스케줄러에서 파드를 할당받고 처리하는 역할을 한다.
그런데 최근에 몇 차례 문제가 생긴 노드에 파드를 할당하면 문제가 생길 가능성이 높다.
어쩔 수 없이 해당 노드를 사용해야 한다면 어떻게 해야 할까?
이런 경우 영향도가 적은 파드를 할당해 일정 기간 사용하면서 모니터링 해야 한다.
<br></p>
<ol>
<li>scale을 이용해 파드 사이즈 늘리기(기존 생성된 echo-hname)</li>
</ol>
<ul>
<li><p>kubectl scale deployment echo-hname --replicas=9</p>
</li>
<li><p>kubectl get pods -o 명령을 실행하여 특정 내용만 볼 수 있도록
지정할 수 있다.</p>
<br>
</li>
</ul>
<ol start="2">
<li>배포된 9개 파드의 여러가지 정보를 출력할 수 있도록 -o 옵션을 사용하여 출력</li>
</ol>
<ul>
<li>kubectl get pods \</li>
<li>o=custom-columns=NAME:.metadata<br>

</li>
</ul>
<blockquote>
<h3 id="노드-유지보수">노드 유지보수</h3>
</blockquote>
<p>쿠버네티스를 사용하다 보면 정기적 또는 비정기적인 유지보수를 위해 노드를 꺼야 하는
상황이 발생하게 된다.</p>
<p>이런 경우를 대비해 쿠버네티스는 drain 기능을 제공한다.
drain은 지정된 노드의 파드를 전부 다른 곳으로 이동시켜 해당 노드를 유지보수 할 수
있게 한다.
<br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Kubernetes] Vagrant 알아보기]]></title>
            <link>https://velog.io/@bb-seok/Kubernetes-Vagrant-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@bb-seok/Kubernetes-Vagrant-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Wed, 21 Aug 2024 07:43:58 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="vagrant-실습">Vagrant 실습</h2>
</blockquote>
<ol>
<li>code Vagrantfile 명령어 입력 시 VS Code로 파일 접근</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/1f433382-94a5-4a06-af8e-6d640157421f/image.png" alt="">
<br></p>
<ol start="2">
<li>Vagrantfile 파일의 이미지 설정 값 변경</li>
</ol>
<ul>
<li><p>config.vm.box = &quot;base&quot; 설정 값을
config.vm.box = &quot;sysnet4admin/CentOS-k8s&quot;로 변경하고 저장</p>
<br>
</li>
<li><p>변경 전</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/2a3fca69-32de-49bd-bb34-809d8ac3ffd9/image.png" alt="">
<br></p>
<ul>
<li>변경 후</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/9ba8b43a-beb4-4d8d-a6dc-e7b72ce59ff5/image.png" alt="">
<br></p>
<ol start="3">
<li>저장 후에 cmd에서 vagrant up 명령 실행</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/c4c853b4-93e4-4f42-9333-5e6bc9c8fae0/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/1498bbac-e829-47ce-acd7-3f16fc8fc13a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/a26b23d8-8266-4258-974b-07691c1eee8c/image.png" alt="">
<br></p>
<ol start="4">
<li>가상 머신 이미지 설치 확인</li>
</ol>
<ul>
<li><p>cmd 명령창에서 제대로 설치되는지 확인</p>
<br>
</li>
<li><p>설치 완료 후 Virtual Box 실행 후 확인
=&gt; HashiCorp_default (이름 변경도 가능하다)
=&gt; app.vagrantup.com 사이트도 DockerHub랑 비슷한 개념</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/6652996d-6e05-41b3-a676-3aa21b993cf6/image.png" alt="">
<br></p>
<ol start="5">
<li>CentOS 접속하기</li>
</ol>
<ul>
<li><p>vagrant ssh 명령 실행</p>
<br>
</li>
<li><p>uptime, cat etc/redhat-release 명령 실행</p>
<br>
</li>
<li><p>exit 명령으로 종료</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/e9ab7825-23f1-4e9d-b589-84aa8c21de15/image.png" alt="">
<br></p>
<ol start="6">
<li>가상 머신 삭제하기</li>
</ol>
<ul>
<li><p>vagrant destroy -f</p>
<br>
</li>
<li><p>Virtual Box에서 이전에 생성했던 가상 머신이 삭제됐는지 확인</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/2aa4a937-f001-4091-94e3-6022abf7f74a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/b7a80639-5a3f-4042-90f8-4565773d60a5/image.png" alt="">
<br></p>
<ol start="7">
<li>가상 머신에 필요한 설정 자동으로 구성하기</li>
</ol>
<ul>
<li><p>Vagrantfile 수정</p>
<br>
</li>
<li><p>수정 전</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/25e70e70-6b33-4af7-9bfb-027a22cdd50a/image.png" alt=""></p>
<p>=&gt; 모든 코드는 닫을 때 end를 사용한다.
=&gt; 들여쓰기로 부모, 자식 관계를 정의한다.
<br></p>
<ol start="8">
<li>변경한 내용을 저장하고 vagrant up으로 실행</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/86fc0e99-4460-4ef2-a7b3-d38f50cb05b9/image.png" alt="">
<br></p>
<ol start="9">
<li>Virtual Box에서 설정한 내용들로 실행되는지 확인</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/d9e25b97-d07f-4260-ae54-2a2ec7912298/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/5707ac49-dbff-494b-98c1-27ddbf2f5f51/image.png" alt="">
<br></p>
<ol start="10">
<li>포트 확인</li>
</ol>
<ul>
<li><p>vagrant port 명령으로 확인</p>
<br>
</li>
<li><p>포트가 실제로 사용 중인지 확인
netstat -an | findstr 60010 </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/0325d3d1-d0ae-4881-b070-e0e40262c9b9/image.png" alt="">
<br></p>
<ol start="11">
<li>가상 머신 접속</li>
</ol>
<ul>
<li><p>vagrant ssh</p>
<br>
</li>
<li><p>ip addr show eth1 명령으로 inet 상태 확인</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/52fa4d43-f293-4bf3-9d31-dc67b46a30af/image.png" alt="">
<br></p>
<ol start="12">
<li>호스트 네트워크 수정</li>
</ol>
<ul>
<li><p>vagrant destroy -f 명령으로 실행 중인 가상 머신 종료</p>
<br>
</li>
<li><p>Virtual Box -&gt; 좌측 상단 도구 탭 -&gt; 호스트 전용 네트워크 탭</p>
<br>
</li>
<li><p>하단 DHCP 서버 탭 클릭 서버 활성화 내용을 변경</p>
<br>
</li>
<li><p>어댑터 탭 클릭
=&gt; 자동으로 어댑터 설정
=&gt; 수동으로 어댑터 설정 시 IPv4 주소 지정</p>
<br>

</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/26bde646-d559-48fc-b652-655f2688e618/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/9ba96135-a3f2-4ab5-bd4f-c80bd5effd52/image.png" alt="">
<br></p>
<ol start="13">
<li><p>네트워크 설정이 끝났다면 컴퓨터 재부팅</p>
<br>
</li>
<li><p>Shell Provision 추가</p>
</li>
</ol>
<ul>
<li><p>code Vagranfile 열기</p>
<br>
</li>
<li><p>cfg.vm.synced_folder 아래에 코드 한 줄 추가</p>
<br>

</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/9697e4fc-7992-431d-ba5c-e043215683cf/image.png" alt="">
<br></p>
<ol start="15">
<li>install_pkg.sh 쉘 스크립트 생성</li>
</ol>
<ul>
<li>code install_pkg.sh</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/506df0a3-9c70-4c5f-9b67-a0c5156c5dab/image.png" alt="">
<br></p>
<ol start="16">
<li>쉘 스크립트 작성</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/74274891-4241-4c97-be07-19fbeecbce4f/image.png" alt="">
<br></p>
<ol start="17">
<li>provision 실행</li>
</ol>
<ul>
<li>vagrant provision 명령으로 실행
에러가 발생하기 때문에 Vagrantfile을 수정 및 코드 추가 해줘야 한다.<br>
</li>
</ul>
<ol start="18">
<li>Vagranfile 수정</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/fadd07d0-6e15-4a9e-bf05-1e984b62a80f/image.png" alt="">
<br></p>
<ol start="19">
<li>쉘 스크립트 생성 &amp; 작성</li>
</ol>
<ul>
<li>CentOS-repo-change.sh</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/13746836-fd95-4468-838c-b3d83e0d529f/image.png" alt="">
<br></p>
<ol start="20">
<li>설치</li>
</ol>
<ul>
<li>vagrant provision<br>
</li>
</ul>
<ol start="21">
<li>vagrant ssh 접근</li>
</ol>
<ul>
<li>yum repolist 명령으로 base, epel 확인<br>
</li>
</ul>
<ol start="22">
<li>삭제하기</li>
</ol>
<ul>
<li>vagrant destroy -f 명령으로 싹 날리도록 하자<br>

</li>
</ul>
<blockquote>
<h3 id="가상-머신-추가로-구성">가상 머신 추가로 구성</h3>
</blockquote>
<ul>
<li><p>이전에 구성했던 가상 머신은 Master Node</p>
<br>
</li>
<li><p>구성해야 할 가상 머신은 Worker Node</p>
<br>
</li>
</ul>
<ol>
<li>Vagrantfile 수정</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/35f84dc8-93a8-45e3-8127-aa761129811b/image.png" alt="">
<br></p>
<ol start="2">
<li>ping_2_nds.sh 쉘 스크립트 생성 및 작성</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/e1c15c07-b2cb-4bca-975d-30d89af82912/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/b0712fb1-0b24-42aa-8abb-a44df6697aac/image.png" alt="">
<br></p>
<ol start="3">
<li>config.sh 쉘 스크립트 생성 및 작성</li>
</ol>
<ul>
<li>code config.sh<br>

</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/cc50d41d-3f36-46e5-b412-5b579b6393e0/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/eecaad8c-0d17-4472-bd9d-7e83fbea37ea/image.png" alt="">
<br></p>
<ol start="4">
<li>실행하여 확인</li>
</ol>
<ul>
<li>vagrant up
=&gt; 실행하면 4대의 CentOS를 설치한다.<br>

</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/9dc9f192-8380-43ef-b001-9884388aa63c/image.png" alt="">
<br></p>
<ol start="5">
<li>vagrant ssh 명령 실행 시 에러 발생</li>
</ol>
<pre><code>This command requires a specific VM name to target in a multi-VM environment.</code></pre><br>

<ol start="6">
<li>총 4대의 CentOS가 존재하므로 뒤에 이름을 넣어줘야 한다.</li>
</ol>
<ul>
<li>vagrant ssh w1-k8s<br>
</li>
</ul>
<ol start="7">
<li>Virtual Box를 실행해서 Worker Node 생성 확인</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/1ba4fb03-fb0b-47ff-9f1f-ba9753cc2132/image.png" alt="">
<br></p>
<ol start="8">
<li>vagrant ssh m-k8s 접속</li>
</ol>
<ul>
<li>./ping_2_nds.sh 쉘 스크립트로 Ping Tests</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/0ca861aa-cd3b-41c0-bf3c-ce73d994b30f/image.png" alt="">
<br></p>
<ol start="9">
<li>포트 확인</li>
</ol>
<ul>
<li><p>vagrant port m-k9s</p>
<br>
</li>
<li><p>vagrant port w1-k8s</p>
<br>

</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/9743e756-7f29-4579-8d04-be2d51e63cf1/image.png" alt="">
<br></p>
<ol start="10">
<li>XShell로 접속하기</li>
</ol>
<p>10-1. ssh root@localhost:60010
<br></p>
<p>10-2. 창 뜨면 수락 및 저장 클릭</p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/508094fc-937e-4a70-bdaf-b3983feba32c/image.png" alt="">
<br></p>
<p>10-3. 비밀번호 : vagrant로 지정</p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/d721ef8a-0531-4a35-ae1b-afd14d35394a/image.png" alt="">
<br></p>
<ol start="11">
<li>XShell 세션 만들기</li>
</ol>
<p>11-1. Master Node</p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/1c07896b-0c78-46fa-a00e-20a52fae2dd5/image.png" alt="">
<br></p>
<p>11-2. Worker Node 1</p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/3ff778ba-8e8c-4384-a4b4-f720f035b01a/image.png" alt="">
<br></p>
<p>11-3. Worker Node 2</p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/ff475d1f-cc13-48cf-8080-94400e803acc/image.png" alt="">
<br></p>
<p>11-4. Worker Node 3</p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/ad6a7297-2ddf-4ef8-9c79-a1126d8c2f53/image.png" alt="">
<br></p>
<ol start="12">
<li>사용자 인증</li>
</ol>
<ul>
<li><p>사용자 이름 : root</p>
</li>
<li><p>패스워드 : vagrant</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/c8783dc3-0f83-48cb-b5bc-5df88940a001/image.png" alt="">
<br></p>
<blockquote>
<h3 id="vagrant-설치하기">Vagrant 설치하기</h3>
</blockquote>
<ol>
<li>이전에 생성했던 vagrant 모두 삭제</li>
</ol>
<ul>
<li>vagrant destroy -f<br>
</li>
</ul>
<ol start="2">
<li><p>예제의 경우 _Book_k8sInfra-main 내려받아서 사용</p>
<br>
</li>
<li><p>로컬C에 만들었던 HashiCorp 디렉터리 내부에 압축 해제</p>
<br>
</li>
<li><p>VS Code로 ch3 폴더 열기</p>
<br>
</li>
<li><p>ch3 디렉터리 내부에 쉘 스크립트 확인</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/b5134745-32f5-46da-811d-eba6a25d9ddb/image.png" alt="">
<br></p>
<ol start="6">
<li>파일 덮어쓰기</li>
</ol>
<ul>
<li><p>ch3 -&gt; 3.1.3 디렉터리 내부에 모든 파일을 복사</p>
<br>
</li>
<li><p>HashiCorp 디렉터리 내부에 덮어쓰기</p>
<br>
</li>
<li><p>덮어쓰기로 바뀐 Vagrantfile을 VS Code로 열기</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/01ebab11-026b-435c-bd47-83426da13b67/image.png" alt="">
<br></p>
<ul>
<li>cfg.vm.synced_folder 코드 아래에 추가</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/20e96a77-91ec-4193-b8a3-6dbcd1129a36/image.png" alt="">
<br></p>
<ol start="7">
<li><p>vagrant up 명령으로 설치
=&gt; 설치 시간 굉장히 오래 걸림</p>
<br>
</li>
<li><p>설치가 완료 후 연결된 것을 확인</p>
</li>
</ol>
<ul>
<li><p>vagrant ssh m-k8s</p>
<br>
</li>
<li><p>sudo kubectl get nodes</p>
<br>


</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Kubernetes] Vagrant 설치하기]]></title>
            <link>https://velog.io/@bb-seok/Kubernetes-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@bb-seok/Kubernetes-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Wed, 21 Aug 2024 06:16:52 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="kubernetes">Kubernetes</h2>
</blockquote>
<p><strong>가상 머신(Guest OS) - Vagrant 설치하기</strong></p>
<ul>
<li><a href="https://www.vagrantup.com/downloads">https://www.vagrantup.com/downloads</a>.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/3643864e-832e-4e53-a6e9-156316276eb9/image.png" alt="">
<br></p>
<ol>
<li>사이트 접속 후 운영체제에 맞는 탭 클릭</li>
</ol>
<ul>
<li>Linux OS</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/e23b4b8a-e2a8-4a24-a6ef-05c32f0fb814/image.png" alt="">
<br></p>
<ul>
<li>예제의 경우 Window OS 전용 AMD64 Download</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/5edee37a-bb9c-42ea-9218-193d26b44877/image.png" alt="">
<br></p>
<ol start="2">
<li>설치된 Setup.exe를 실행하면
=&gt; Vagrant가 설치 경로 설정도 못하게 냅다 설치를 진행한다.</li>
</ol>
<p><strong>1</strong>
<img src="https://velog.velcdn.com/images/bb-seok/post/dda3c5ec-8918-4eaa-a6f3-4f2b66b3a37a/image.png" alt="">
<br></p>
<p><strong>2</strong>
<img src="https://velog.velcdn.com/images/bb-seok/post/0cbf7a60-b929-455f-9986-5dee3b97f164/image.png" alt="">
<br></p>
<p><strong>3</strong>
<img src="https://velog.velcdn.com/images/bb-seok/post/fcf4ac86-4cef-4904-87b3-072af1b84a93/image.png" alt="">
<br></p>
<ol start="3">
<li>예제의 경우 C드라이브에 폴더 생성</li>
</ol>
<ul>
<li>HashiCorp 라는 이름의 폴더를 생성한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/dd26d812-32df-41f4-af11-ba876bbe0c54/image.png" alt="">
<br></p>
<ol start="4">
<li>설치가 완료된 후 Finish 버튼을 누르면 컴퓨터 재부팅 문구가 뜨는데
Vagrant를 사용하기 위해 재부팅 해주도록 하자.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/3b6479fc-a7fb-4703-a052-7f03dba61923/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/701a2746-a514-4958-a2ad-832d98efc370/image.png" alt="">
<br></p>
<ol start="5">
<li><p>재부팅 후 윈도우 cmd 창을 열어준다.</p>
<br>
</li>
<li><p>이전에 생성했던 HashiCorp 폴더로 이동</p>
</li>
</ol>
<ul>
<li>cd HashiCorp<br>
</li>
</ul>
<ol start="7">
<li>vagrant init 명령어를 실행</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/d61d143f-b660-422d-ad11-f9fefc2264b2/image.png" alt="">
<br></p>
<ol start="8">
<li>이후에 dir 명령어를 사용</li>
</ol>
<ul>
<li>Vagrantfile이 생성된 것을 확인할 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/caa4de12-f804-4b45-bb73-e3d82a2edda0/image.png" alt="">
<br></p>
<ol start="9">
<li>code Vagrantfile 명령 실행</li>
</ol>
<ul>
<li>VS Code로 Vagrant 파일을 열어준다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/4e1ab79f-03c3-4e2c-ab9c-46c465925f5e/image.png" alt="">
<br></p>
<ol start="10">
<li>Vagrant up 명령 실행</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/fa7853ca-6259-4fb1-93bb-c993ea0ea9eb/image.png" alt="">
<br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Docker] Docker Nginx]]></title>
            <link>https://velog.io/@bb-seok/Docker-Docker-Vagrant</link>
            <guid>https://velog.io/@bb-seok/Docker-Docker-Vagrant</guid>
            <pubDate>Wed, 21 Aug 2024 06:06:22 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="컨테이너-인프라-환경">컨테이너 인프라 환경</h2>
</blockquote>
<ol>
<li>하이퍼바이저</li>
</ol>
<ul>
<li>Virtual Box<br>
</li>
</ul>
<ol start="2">
<li>가상 머신(Guest OS)</li>
</ol>
<ul>
<li>CentOS, Ubuntu 등<br>
</li>
</ul>
<ol start="3">
<li>쿠버네티스(컨테이너 관리)</li>
</ol>
<ul>
<li><p>Master Node</p>
</li>
<li><p>Worker Node</p>
<br>
</li>
</ul>
<ol start="4">
<li>도커(컨테이너)</li>
</ol>
<ul>
<li>Docker<br>
</li>
</ul>
<ol start="5">
<li>젠킨스(CI/CD)</li>
</ol>
<ul>
<li>젠킨스를 이용한 지속적 통합 및 배포<br>
</li>
</ul>
<ol start="6">
<li>프로메테우스/그라파나(모니터링)</li>
</ol>
<ul>
<li>프로메테우스와 그라파나에 의해 모니터링되는 리소스<br>

</li>
</ul>
<blockquote>
<h3 id="docker-nginx-사용해보기">Docker nginx 사용해보기</h3>
</blockquote>
<ol>
<li>nginx 설치</li>
</ol>
<ul>
<li>docker pull nginx</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/e6b47da5-5571-4171-b235-497457a83a42/image.png" alt="">
<br></p>
<ol start="2">
<li>nginx:stable</li>
</ol>
<ul>
<li>docker pull nginx:stable</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/1b7a4275-7296-49a0-87ce-ced81fc168fc/image.png" alt=""></p>
<p>=&gt; 도커의 경우 동일한 이미지 레이어를 공유하므로 이전에 다운받은 레이어가 있는 경우
다시 내려받지 않아도 된다.
<br></p>
<ol start="3">
<li>이미지 생성 히스토리 확인하기</li>
</ol>
<ul>
<li>docker history nginx[:TagName]</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/c385de72-bb86-452e-b3e5-76bb3368dea7/image.png" alt="">
<br></p>
<ol start="4">
<li>추가로 경로 설정을 통해 정상적으로 컨테이너 실행하기</li>
</ol>
<ul>
<li>Virtual Box -&gt; NAT 네트워크 -&gt; nginx 포트포워딩 설정</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/f97e7e5c-ff45-4008-9062-51e248920e74/image.png" alt="">
<br></p>
<ul>
<li>docker run -d -p 8000:80 --name nginx-exposed --restart always nginx</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/5d36fbb8-bd23-4a7c-bde6-a640e99f564b/image.png" alt="">
<br></p>
<ol start="5">
<li>localhost:8000 접속</li>
</ol>
<ul>
<li>웹에서 Welcome Nginx가 화면에 보여지는 것을 확인</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/86f68e00-d652-4f45-b1fa-08c06014d6ad/image.png" alt="">
<br></p>
<ol start="6">
<li><p>DockerTest 디렉터리로 이동</p>
<br>
</li>
<li><p>html이라는 이름의 디렉터리 생성</p>
</li>
</ol>
<ul>
<li>mkdir html</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/0a60b2ed-295a-4bc0-9f9f-dac363e96fe3/image.png" alt="">
<br></p>
<ol start="8">
<li>nginx를 사용해서 html 연결하기(Volume 설정)</li>
</ol>
<ul>
<li><p>docker run -d -p 8080:80 -v 
/home/user1/DockerTest/html:/usr/share/nginx/</p>
</li>
<li><p>-restart always --name nginx-bind-mounts nginx</p>
</li>
<li><p>-v(Volume)</p>
<br>
</li>
</ul>
<ol start="9">
<li>html 접근</li>
</ol>
<ul>
<li><p>cd html</p>
<br>
</li>
<li><p>ll 명령 실행</p>
<br>

</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/60f4d4ac-c005-4ec4-9ad7-f5d5800b222a/image.png" alt="">
<br></p>
<ol start="10">
<li>localhost:8080 웹으로 접근</li>
</ol>
<ul>
<li>403 Forbidden 에러가 화면에 출력된다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/3db0cc6a-8e0b-41c3-8180-1c8ef99bb6ec/image.png" alt="">
<br></p>
<ol start="11">
<li>html 디렉터리 생성</li>
</ol>
<ul>
<li>DockerTest 디렉터리 내부에 html 디렉터리 생성</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/3cfffdba-3311-4c95-a9aa-a39f45f66827/image.png" alt="">
<br></p>
<ol start="12">
<li>index.html 파일 생성 및 작성</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/492290b3-c495-483f-8aff-57a130b05389/image.png" alt="">
<br></p>
<ol start="13">
<li>웹으로 접근하여 동작 확인</li>
</ol>
<ul>
<li>index.html을 작성함으로써 변경된 웹을 확인한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/32b21741-7817-4fbc-a772-389a2827abd4/image.png" alt="">
<br></p>
<ol start="14">
<li>컨테이너 내부 확인하기</li>
</ol>
<ul>
<li>docker exec nginx-bind-mounts cat /usr/share/nginx/html/index.html</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/7caec578-1af5-4fd2-9bf2-b948b6ed3a8f/image.png" alt="">
<br></p>
<ol start="15">
<li>볼륨 만들기</li>
</ol>
<ul>
<li>docker volume create nginx-volume</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/03563c5f-e3af-4d8f-9af3-48f3cbe63212/image.png" alt="">
<br></p>
<ol start="16">
<li>만들어진 볼륨 확인하기</li>
</ol>
<ul>
<li>docker volume ls</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/d69465cb-bf13-4ddd-b63d-cfe90e01b47b/image.png" alt="">
<br></p>
<ol start="17">
<li>특정 볼륨 상세 내용 출력하기</li>
</ol>
<ul>
<li>docker inspect nginx-volume
<img src="https://velog.velcdn.com/images/bb-seok/post/1e1df347-0f1f-42fa-9cda-7be55ff5cb5d/image.png" alt=""><br>
</li>
</ul>
<ol start="18">
<li>Mountpoint를 이용하여 볼륨 내용 확인하기</li>
</ol>
<ul>
<li>sudo ls -l sudo ls -l /var/lib/docker/volumes/nginx-volume/_data</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/9f2e0945-e809-4812-8111-d3cfc1aeafa6/image.png" alt=""></p>
<p>=&gt; 현재 어떠한 내용도 없기 때문에 total 0이 출력된다.
<br></p>
<ol start="19">
<li>nginx-volume 실행</li>
</ol>
<pre><code>- docker run -d -v nginx-volume:/usr/share/nginx/html \
&gt; -p 8081:80 --restart always --name nginx-volume nginx
d9538cc19ea5d8b9c2d812c9161365728c86890436e8d314fd5a6fc017d039aa</code></pre><p><img src="https://velog.velcdn.com/images/bb-seok/post/4001fce4-3f20-410b-8648-88380d92e99c/image.png" alt="">
<br></p>
<ol start="20">
<li>다시 마운트포인트로 볼륨 내용 확인</li>
</ol>
<ul>
<li>sudo ls -l sudo ls -l /var/lib/docker/volumes/nginx-volume/_data</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/93fe5278-7f5f-4100-b7fc-18b53163f496/image.png" alt="">
<br></p>
<ol start="21">
<li>vim 편집기로 index.html 열기</li>
</ol>
<ul>
<li>sudo vim /var/lib/docker/volumes/nginx-volume/_data/index.html</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/ae0abd8b-0815-435b-b5cd-1a7d60e8b482/image.png" alt="">
<br></p>
<ol start="22">
<li>index.html 내용 수정</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/767079d4-d796-415f-805f-ddabc6153c45/image.png" alt="">
<br></p>
<ol start="23">
<li>수정된 index.html을 8081 포트로 접속하여 확인</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/1cf16d31-ebb8-4cb4-a982-b271cbded26f/image.png" alt="">
<br></p>
<ol start="24">
<li>실행 중인 nginx 컨테이너 중지</li>
</ol>
<ul>
<li><p>docker ps -f ancestor=nginx 명령 실행</p>
</li>
<li><p>docker stop $(docker ps -f ancestor=nginx)
해당 명령으로 nginx 이름이 포함된 모든 컨테이너 중지</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/55ca8549-63c3-436e-a407-5fd7c65a8e5f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/43c8a3eb-93f8-470e-b546-e2e147b6924d/image.png" alt="">
<br></p>
<ol start="25">
<li>중지된 컨테이너 확인 및 삭제</li>
</ol>
<ul>
<li><p>docker ps -qa -f ancestor=nginx
=&gt; 해당 이름의 중지된 컨테이너 확인</p>
</li>
<li><p>docker rm $(docker ps -qa -f ancestor=nginx)</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/1e1acf80-dc6d-4203-a6cd-e3ac7a895afe/image.png" alt="">
<br></p>
<ol start="26">
<li>중지된 이미지 확인</li>
</ol>
<ul>
<li><p>docker images -q nginx
=&gt; nginx 이름이 포함된 중지된 이미지 확인</p>
</li>
<li><p>docker rmi $(docker images -q nginx)
=&gt; 해당 이름의 이미지 모두 삭제</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/f142179a-d1e8-4171-9e33-0848990151bf/image.png" alt="">
<br></p>
<ol start="27">
<li>이미지도 같은 방법으로 모두 삭제가 가능</li>
</ol>
<ul>
<li>docker images -q ubuntu*
=&gt; 와일드카드를 사용하여 ubuntu 이름이 포함된 모든 이미지를 보여준다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/4df96d80-81a2-4bd7-8624-e07da12dfc20/image.png" alt="">
<br></p>
<ul>
<li>docker rmi $(docker images -q ubuntu*)
=&gt; ubuntu 이름이 포함된 모든 이미지 삭제</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/9a02eab2-a413-470c-b7dc-3cff875850ac/image.png" alt="">
<br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Docker] Docker Compose]]></title>
            <link>https://velog.io/@bb-seok/Docker-Docker-Compose</link>
            <guid>https://velog.io/@bb-seok/Docker-Docker-Compose</guid>
            <pubDate>Wed, 21 Aug 2024 04:03:15 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="docker-compose-개념">Docker Compose 개념</h3>
</blockquote>
<ul>
<li><p>시스템 구축과 관련된 명령어를 하나의 텍스트 파일(정의 파일, ComposeFile)에 기재하여
시스템 전체를 실행하고 폐기까지 하도록 돕는 도구</p>
<br>
</li>
<li><p>시스템 구축을 위한 설정은 YAML 포맷으로 기재한 정의 파일을 사용
시스템을 일괄적으로 실행(up) 또는 종료(down)할 수 있다.</p>
<br>
</li>
<li><p>Docker Compose를 사용하면 여러 개의 명령어를 하나의 정의 파일로 실행 가능하다.</p>
<br>

</li>
</ul>
<blockquote>
<h3 id="docker-compose-구조">Docker Compose 구조</h3>
</blockquote>
<ol>
<li>정의 파일(Compose File)</li>
</ol>
<ul>
<li>컨테이너 볼륨을 어떤 설정으로 만들지에 대한 항목 뿐만 아니라 시스템에 대한
모든 정보를 기재하고, 작성 내용은 도커 명령어와 비슷하지만 다르다.<br>

</li>
</ul>
<p><strong>up 명령어</strong></p>
<ul>
<li><p>docker run과 비슷한 개념</p>
</li>
<li><p>정의 파일에 기재된대로 이미지를 내려받고, 컨테이너를 생성 및 실행한다.</p>
</li>
<li><p>정의 파일에는 네트워크, 볼륨에 대한 정의도 기재할 수 있어서 주변 환경을 한꺼번에
생성할 수 있다.</p>
<br>

</li>
</ul>
<p><strong>down 명령어</strong></p>
<ul>
<li><p>컨테이너와 네트워크를 정지 및 삭제</p>
</li>
<li><p>볼륨과 이미지는 삭제하지 않는다.</p>
</li>
<li><p>컨테이너와 네트워크 삭제없이 종료하고 싶은 경우에는 stop 커맨드를 사용한다.</p>
<br>

</li>
</ul>
<blockquote>
<h3 id="docker-compose-파일-작성">Docker Compose 파일 작성</h3>
</blockquote>
<ul>
<li>도커 컴포즈 정의 파일은 그대로 실행하는 역할을 수행하기 때문에 중요하다.<pre><code>ex1) apa000ex2 컨테이너를 실행하는 명령어와 아파치 컨테이너 컴포즈 파일의 비교</code></pre><br>

</li>
</ul>
<h3 id="docker-compose-파일-만들기">Docker Compose 파일 만들기</h3>
<ol>
<li>설치 확인</li>
</ol>
<ul>
<li>docker compose 명령어로 현재 설치 여부를 확인
<img src="https://velog.velcdn.com/images/bb-seok/post/039acb1e-a0ba-4c09-9c73-67bebb324cf5/image.png" alt=""><br>
</li>
</ul>
<ol start="2">
<li>디렉터리 및 파일 생성</li>
</ol>
<ul>
<li><p>mkdir dockercompose</p>
</li>
<li><p>compose.yaml</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/7331b4e8-2078-4563-92b4-6a80c69706a3/image.png" alt="">
<br></p>
<ol start="3">
<li>명령어를 통한 실행</li>
</ol>
<ul>
<li>docker run --name testhttp -d -p 8000:80 httpd
(httpd는 Redhat 계열(CentOS 등)에서 사용)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/10cc386b-91fa-44b8-a09a-4675f3a368cd/image.png" alt="">
<br></p>
<ol start="4">
<li>웹에서 접근하여 동작 여부 확인</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/9343ba71-ff30-477e-b737-4cf9df071eef/image.png" alt=""></p>
<p>=&gt; 웹에서 정상적으로 동작하면 httpd daemon이 정상적으로 실행중인 것이다.
<br></p>
<ol start="5">
<li>compose.yaml 작성</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/84eefb01-9ca7-40db-bc7e-248b49bbe4a5/image.png" alt="">
<br></p>
<ol start="6">
<li>이전에 실행했던 컨테이너 중지</li>
</ol>
<ul>
<li><p>docker ps : 실행 중인 컨테이너를 확인</p>
<br>
</li>
<li><p>docker container stop [Container ID] : 컨테이너 중지</p>
<br>
</li>
</ul>
<ol start="7">
<li>compose up 명령어 사용</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/88a8e0d7-60be-4c6d-9cf1-7cce026d970a/image.png" alt=""></p>
<ul>
<li>docker compose -f compose.yaml up
=&gt; -f 옵션으로 compose.yaml 파일을 가리키고 실행
=&gt; 이전에 docker run 명령어를 사용했을 떄와 마찬가지로 웹에서 같은 결과를 확인할 수 있다.<br>
</li>
</ul>
<ol start="8">
<li>compose down 사용</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/b3640478-8542-48ee-96e1-26c5d1df10e1/image.png" alt=""></p>
<ul>
<li><p>ctrl + c는 compose 종료</p>
</li>
<li><p>compose down은 compose 제거</p>
<br>

</li>
</ul>
<blockquote>
<h2 id="wordpress-사용하기">WordPress 사용하기</h2>
</blockquote>
<ol>
<li>wordpress 명령어로 실행 및 환경변수 설정</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/00ce98fc-373e-4198-82f5-aaec7490ffed/image.png" alt="">
<br></p>
<ol start="2">
<li>compose 파일 생성</li>
</ol>
<ul>
<li>compose-wordpress.yaml
<img src="https://velog.velcdn.com/images/bb-seok/post/64dec0f4-a4cf-491f-9c55-260470ff637d/image.png" alt=""></li>
</ul>
<br>

<ol start="3">
<li>파일 내용 작성</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/3e2f44b6-2769-4d04-ac04-018626b0cd69/image.png" alt="">
<br></p>
<ol start="4">
<li>이전에 만든 compose.yaml 파일 수정</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/2eb577be-5885-4836-bece-a27753c4f8c1/image.png" alt="">
<br></p>
<ol start="5">
<li>dockercompose 디렉터리 내에 mysql 디렉터리 생성</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/bd14aa58-4a9f-47c1-85e7-de4bf36748dd/image.png" alt="">
<br></p>
<ol start="6">
<li>compose.yaml 실행</li>
</ol>
<ul>
<li>docker compose -f compose.yaml up</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/6fc2301a-891a-403e-803f-8e8358e8497d/image.png" alt="">
<br></p>
<ol start="7">
<li>compose-wordpress.yaml 파일 수정</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/6cbcb543-9a0d-4bd9-a145-2365e8c960b3/image.png" alt="">
<br></p>
<ol start="8">
<li>ls -l mysql/ 명령어</li>
</ol>
<ul>
<li>위 명령어로 mysql 내부를 확인한다.
<img src="https://velog.velcdn.com/images/bb-seok/post/88820b38-ca0d-40af-a4c9-c3a2550787a0/image.png" alt=""><br>
</li>
</ul>
<ol start="9">
<li>wp 디렉터리 생성</li>
</ol>
<ul>
<li><p>mkdir wp</p>
</li>
<li><p>ls -l
<img src="https://velog.velcdn.com/images/bb-seok/post/5e60478e-dc6d-43c0-9328-793ede1a6940/image.png" alt=""></p>
<br>
</li>
</ul>
<ol start="10">
<li>wordpress 실행</li>
</ol>
<ul>
<li>docker compose -f compose-wordpress.yaml up
<img src="https://velog.velcdn.com/images/bb-seok/post/6ecb9e32-e80a-4108-8f40-cd8aad22b707/image.png" alt=""><br>
</li>
</ul>
<ol start="11">
<li>localhost:8080으로 접근 시 WordPress 사이트가 나오게 된다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/2314c381-eb22-4857-a950-98fb21e42dc2/image.png" alt="">
<br></p>
<ol start="12">
<li>양식 작성 및 설치</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/d7efa3d2-44de-4042-af6c-b438ae6bbe68/image.png" alt="">
<br></p>
<ol start="13">
<li>설치가 완료되면 localhost:8080으로 재접속 시 설치된 사이트 접근 가능</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/6b27f3aa-1c54-402f-9fe2-dcad47617b4f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/8aa8b4a3-d6f9-40ac-9b64-720a9dfd134a/image.png" alt="">
<br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Docker] CI/CD 도커 파일로 실행하기]]></title>
            <link>https://velog.io/@bb-seok/Docker-CICD-%EB%8F%84%EC%BB%A4-%ED%8C%8C%EC%9D%BC%EB%A1%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bb-seok/Docker-CICD-%EB%8F%84%EC%BB%A4-%ED%8C%8C%EC%9D%BC%EB%A1%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 21 Aug 2024 03:38:03 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="프로젝트-도커-파일로-실행하기">프로젝트 도커 파일로 실행하기</h3>
</blockquote>
<p>예제의 경우 Backend-CICD-test 라는 프로젝트를 도커 파일로 실행한다.
<br></p>
<ol>
<li>Ubuntu 실행</li>
</ol>
<ul>
<li>docker run -it ubuntu:22.04<br>
</li>
</ul>
<ol start="2">
<li>jdk 업데이트 &amp; 설치</li>
</ol>
<ul>
<li><p>apt-get update</p>
</li>
<li><p>apt-get install openjdk-17-jdk -y</p>
<br>
</li>
</ul>
<ol start="3">
<li>배포할 파일 복사(예제의 경우 build 파일)</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/8b170c7b-3ff1-4d08-91a2-01fd5f7ebe10/image.png" alt="">
<br></p>
<ul>
<li>ssh 설치
apt-get install ssh -y (서버, 클라이언트, scp 모두 포함됨)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/0fe1fe1b-24e7-4f3c-bfaa-a71c73496fd5/image.png" alt="">
<br></p>
<ul>
<li>scp user1@[Server1 IP]<pre><code>scp user1@192.168.15.101:~/backend-test-cicd-main
/build/libs/codepipeline-0.0.1-SNAPSHOT.jar ./app.jar</code></pre></li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/17ec420a-9f84-490e-8442-dd46be9a37d7/image.png" alt="">
<br></p>
<ol start="4">
<li>Dockerfile 만들기</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/4e557343-a6fc-45a1-b149-6c23e0f4735e/image.png" alt="">
<br></p>
<ol start="5">
<li>Dockerfile 빌드하기</li>
</ol>
<ul>
<li>docker build -t backend0808:big .
<img src="https://velog.velcdn.com/images/bb-seok/post/4ed9d5a5-5c09-47c5-9481-d2b559367144/image.png" alt=""><br>
</li>
</ul>
<ol start="6">
<li>Dockerfile 실행하기</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/f5b2c794-c180-4876-9434-6bf177b13092/image.png" alt="">
<br></p>
<ul>
<li>docker run -d -p 5000:5000 backend0808:big
=&gt; 첫 번째 포트번호는 호스트 포트(도커 내부에서 사용하는 포트)
=&gt; 두 번째 포트번호는 게스트 포트
(Dockerfile에서 설정한 Docker 내부에서 외부로 전달하고, 
외부에서 접근할 수 있는 포트번호)<br>

</li>
</ul>
<p>6-2. 웹으로 접근하여 확인</p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/d97cdb51-2920-47c8-88c0-53614be7ded3/image.png" alt="">
<br></p>
<ol start="7">
<li>최적화</li>
</ol>
<ul>
<li>최적화를 위해 이전에 작성한 Dockerfile을 수정</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/be4b09ed-fc60-430a-b894-19d94e70a7f4/image.png" alt="">
<br></p>
<ol start="8">
<li>수정한 Dockerfile 빌드</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/df12d620-cc2b-4e8b-b49e-422e7cc8ff42/image.png" alt="">
<br></p>
<ol start="9">
<li>이미지 용량 확인</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/09244005-48dd-4a36-a85d-4bc28541383b/image.png" alt="">
<br></p>
<ol start="10">
<li>실행하고 웹에서 접근</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/40e757de-5478-44e4-ab1d-108c5448a650/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/be2fae28-8011-4118-95d6-a6ca22ce50c5/image.png" alt=""></p>
<p>=&gt; 이미지 사이즈가 줄어도 결과는 같은 것을 확인할 수 있다.
<br></p>
<blockquote>
<h3 id="도커-파일로-이미지-연결-작업">도커 파일로 이미지 연결 작업</h3>
</blockquote>
<ol>
<li>Dockerfile 수정</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/4d1ab780-e048-4e05-9367-c9699e2907c2/image.png" alt="">
<br></p>
<ol start="2">
<li>수정 후 빌드</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/f56fa1ee-132a-4939-958e-d6394b09c42b/image.png" alt="">
<br></p>
<ol start="3">
<li>실행</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/2129e33f-d538-46d0-9c3d-4a54a974f2be/image.png" alt="">
<br></p>
<ol start="4">
<li>이미지 용량 확인</li>
</ol>
<ul>
<li>동일 프로젝트로 다양한 사이즈의 이미지를 생성할 수 있다.
<img src="https://velog.velcdn.com/images/bb-seok/post/9f1aac72-5e99-46de-9bda-ec585da01b76/image.png" alt=""><br>

</li>
</ul>
<blockquote>
<h3 id="frontend-프로젝트를-도커로-빌드--실행하기">Frontend 프로젝트를 도커로 빌드 &amp; 실행하기</h3>
</blockquote>
<ul>
<li>예제의 경우 welcome-to-docker 라는 프로젝트를 사용하여 진행<br>
</li>
</ul>
<ol>
<li><p>welcome-to-docker 프로젝트를 DockerTest 디렉터리에 복사</p>
<br>
</li>
<li><p>압축 해제</p>
</li>
</ol>
<ul>
<li>unzip welcome-to-docker.zip<br>
</li>
</ul>
<ol start="3">
<li>Dockerfile 작성</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/9b4afb74-2199-46fd-a593-c176c6e0d184/image.png" alt="">
<br></p>
<ol start="4">
<li>Backend와 마찬가지로 Dockerfile 작성 후 빌드 및 실행</li>
</ol>
<ul>
<li><p>docker build -t welcome[:TagName] .(빌드할 디렉터리 위치)</p>
</li>
<li><p>docker run -d -p 3000:3000 welcome[:TagName]</p>
<br>
</li>
</ul>
<ol start="5">
<li>실행까지 완료했다면 정상적으로 동작하는지 웹에서 확인<br>

</li>
</ol>
<h3 id="docker-linux-사이즈-확장">Docker Linux 사이즈 확장</h3>
<ul>
<li><p>사용 중인 볼륨 사이즈 확인
sudo lvdisplay</p>
<br>
</li>
<li><p>용량 확인 명령어
df -h
<img src="https://velog.velcdn.com/images/bb-seok/post/a8220de9-cfbf-45e7-82d8-df472388a881/image.png" alt=""></p>
<br>
</li>
<li><p>명령어를 통해 ubuntu 사이즈 확장</p>
<pre><code>sudo lvextend -L +20G /dev/ubuntu-vg/ubuntul-lv
</code></pre></li>
</ul>
<p>sudo e2fsck -f /dev/ubuntu-vg/ubuntu-lv</p>
<p>sudo resize2fs -f /dev/ubuntu-vg/ubuntu-lv</p>
<pre><code>&lt;br&gt;

- pv(physical volume), vg(volume group) 확인 명령어</code></pre><p>sudo pvscan</p>
<p>sudo vgscan</p>
<pre><code>&lt;br&gt;

### 같은 이름의 컨테이너를 한 번에 종료하고 삭제하기

- docker ps -aq --filter ancestor=[컨테이너 이름]</code></pre><p>ex) docker ps -aq --filter ancestor=ubuntu:22.04</p>
<pre><code>&lt;br&gt;

- docker container rm $(docker ps -aq --filter ancestor=[컨테이너 이름]

![](https://velog.velcdn.com/images/bb-seok/post/83ec6d3e-de9c-41a5-ba52-365e5f98c15d/image.png)
&lt;br&gt;
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Docker] 도커 이해하기 1]]></title>
            <link>https://velog.io/@bb-seok/Docker-%EB%8F%84%EC%BB%A4-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1</link>
            <guid>https://velog.io/@bb-seok/Docker-%EB%8F%84%EC%BB%A4-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1</guid>
            <pubDate>Wed, 21 Aug 2024 02:54:19 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="docker란">Docker란?</h2>
</blockquote>
<p>도커(Docker)는 컨테이너 기반 가상화 플랫폼으로, 응용 프로그램과 그 종속성을 격리된
환경인 컨테이너로 패키징하여 실행하는 기술이다.</p>
<pre><code>컨테이너(Container)
가상화 기술을 이용하여 어플리케이션과 개발 환경을 격리된 공간에서 실행하는 단위</code></pre><br>

<p><strong>1단계 : 도커 GPG 키 및 레포지토리 등록 생성</strong></p>
<ul>
<li><p>Docker Home
<img src="https://velog.velcdn.com/images/bb-seok/post/89e33fab-4242-47fd-82fa-9315327586a9/image.png" alt=""></p>
<br>
</li>
<li><p>Create apt Repository
<img src="https://velog.velcdn.com/images/bb-seok/post/e49a1ef3-62d1-4c83-b29d-ad03b94bdae3/image.png" alt=""></p>
<br>

</li>
</ul>
<pre><code># Add Docker&#39;s official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;&amp; echo &quot;$VERSION_CODENAME&quot;) stable&quot; | \
  sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null
sudo apt-get update</code></pre><br>

<p><img src="https://velog.velcdn.com/images/bb-seok/post/96f0c1f9-91f0-44d9-89c0-e26337570353/image.png" alt="">
<br></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/e0388870-8057-4d3e-8f49-50c8dbc16c9f/image.png" alt="">
<br></p>
<p><strong>2단계 : 도커 엔진 관련 패키지 설치</strong></p>
<ul>
<li>sudo apt-get install docker-ce docker-ce-cli containered.io 
docker-buildx-plugin docker-compose-plugin<br>

</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/8e4ecee1-438d-4ba2-a567-d6da4ac67315/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/4e35d00c-f447-410f-a9a9-af430e26610f/image.png" alt=""></p>
<br>

<p><strong>3단계 : 도커 엔진 구동 확인</strong></p>
<ul>
<li>sudo docker run hello-world<br>

</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/a7483275-6b3d-4407-b142-d6534aa69b25/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/77b5865c-0818-441e-8fee-0f9fde87d0e4/image.png" alt=""></p>
<br>

<p><strong>4단계 : 도커 설치 후 작업</strong></p>
<p>Manage Docker as a non-root user</p>
<ol>
<li>그룹 추가</li>
</ol>
<ul>
<li>user1@myserver01:~$ sudo groupadd docker
groupadd: group &#39;docker&#39; already exists<br>
</li>
</ul>
<ol start="2">
<li>도커 그룹에 사용자 추가</li>
</ol>
<ul>
<li>user1@myserver01:~$ sudo usermod -aG docker $USER<br>
</li>
</ul>
<ol start="3">
<li>사용자의 그룹 아이디를 docker로 변경 -&gt; 지금 현재 사용자의 그룹을 변경
로그아웃 후에 다시 docker 실행 시 권한 문제가 발생했을 경우에 아래 명령을 실행</li>
</ol>
<ul>
<li>user1@myserver01:~$ newgrp docker<br>
</li>
</ul>
<ol start="4">
<li>도커 테스트</li>
</ol>
<ul>
<li>user1@myserver01:~$ docker run hello-world\</li>
</ul>
<pre><code>Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the &quot;hello-world&quot; image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/</code></pre><br>

<blockquote>
<h2 id="docker-개념">Docker 개념</h2>
</blockquote>
<p>도커(Docker)는 컨테이너를 실행하기 위한 실행 환경(컨테이너 런타임)및 툴 킷.
쿠버네티스는 도커 이외의 컨테이너 런타임도 지원하도록 개발되어 있다.
때문에 쿠버네티스를 사용할 경우 도커에 대한 학습이 반드시 필요한 것은 아니다.
<br></p>
<p>주로 필요한 내용은 도커 이미지에 대한 지식들이 필요하다.
도커 이미지가 아닌 OCI 표준 컨테이너 이미지를 사용하는 방법이나 다른 도구에서 도커 이미지를
빌드하는 방법들도 존재한다.
하지만, 아직도 도커 이미지를 많이 사용하고 있고, 도커 이미지 작성 메뉴얼인 도커 파일을 사용해
이미지를 생성하는 경우가 많다.
때문에 도커 이미지를 제대로 만들어 도커 이미지 보관/배포 서버인 도커 레지스트리로 푸시(업로드)하는
방법을 알아두면 편리하게 작업할 수 있다.
<br></p>
<p>알아볼 섹션은 다음과 같다.</p>
<p><strong>1. 도커 컨테이너 설계</strong></p>
<p><strong>2. 도커 파일 작성법</strong></p>
<p><strong>3. 도커 이미지 빌드</strong></p>
<p><strong>4. 도커 레지스트리로 이미지 푸시</strong>
<br></p>
<blockquote>
<h3 id="docker-container-설계">Docker Container 설계</h3>
</blockquote>
<p><strong>도커 컨테이너란?</strong></p>
<ul>
<li><p>도커 이미지를 기반으로 실행되는 프로세스를 의미한다.</p>
<br>
</li>
<li><p>도커 이미지만 있다면 환경의 영향을 받지 않고 다양한 환경에서 컨테이너를 기동할 수
있기 때문에 &#39;이식성&#39;이 높다.</p>
<br>
</li>
<li><p>이렇게 빌드된 도커 이미지는 어느 환경에서도 동일한 동작을 보장받을 수 있다.</p>
<br>


</li>
</ul>
<pre><code>이식성
소프트웨어가 한 컴퓨터 시스템이나 환경에서 다른 시스템이나 환경으로 쉽게 옮겨질 수 있는 성질</code></pre><br>

<p><strong>도커 컨테이너의 특징을 정리하자면 다음과 같다.</strong></p>
<ul>
<li><p>이식성이 높고, 동일한 동작을 보장한다.</p>
<br>
</li>
<li><p>가볍고, 시작과 중지가 빠르다는 장점을 가지고 있다.</p>
<br>

</li>
</ul>
<p><strong>도커 컨테이너 생성 시 주의사항</strong></p>
<ol>
<li><p>컨테이너 당 1개의 프로세스(관리의 불편함과 에코 시스템 이슈)</p>
<br>
</li>
<li><p>변경 불가능한 인프라 이미지로 생성(외부 영향에 따른 변경이 일어나지 않게)</p>
<br>
</li>
<li><p>경량 도커 이미지로 생성(외부에서 쉽게 다운받아 사용할 수 있게)</p>
</li>
</ol>
<ul>
<li><p>dnf/yum, apt 패키지 설치 후에 저장소 패키지 목록 등의 캐시 파일 삭제</p>
</li>
<li><p>최대한 경량 배포판 이미지를 사용(alpine Linux, Deistorless 등)</p>
</li>
<li><p>도커 파일 최적화에 따른 레이어 줄이기, 도커 이미지 생성 시 시퀸스 사용</p>
<br>
</li>
</ul>
<ol start="4">
<li>실행 계정은 root이외의 사용자로 한다.(계정 권한 최소화)<br>

</li>
</ol>
<blockquote>
<h3 id="docker-commands도커-명령어">Docker Commands(도커 명령어)</h3>
</blockquote>
<p>Docker 공식사이트에 Docker Hub로 가면 필요한 이미지를 찾아서 사용할 수 있다.
<img src="https://velog.velcdn.com/images/bb-seok/post/088df62d-5a85-4b83-b162-5174b411ffa1/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/84028ff7-6bb9-4599-bad1-69a93077de44/image.png" alt="">
<br></p>
<h3 id="1-docker-searchdocker-hub에서">1. docker search(Docker Hub에서)</h3>
<ul>
<li><p>이미지를 검색하는 명령어</p>
</li>
<li><p>STARS : 좋아요</p>
</li>
<li><p>OFFICIAL : 공식 이미지</p>
<br>

</li>
</ul>
<p><strong>docker search 사용법</strong></p>
<pre><code>사용법 : docker search [OPTION] TERM

Options :
  -f, --filter filter      Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int   Max number of search results
      --no-trunc   Don&#39;t truncate output</code></pre><br>

<ul>
<li><p>docker search alpine
<img src="https://velog.velcdn.com/images/bb-seok/post/78682832-d5ab-4e7a-a6be-c0e6fa7647cf/image.png" alt=""></p>
<br>
</li>
<li><p>docker search mysql
<img src="https://velog.velcdn.com/images/bb-seok/post/8ec05b4d-ece1-4474-8c54-2686cdf29f36/image.png" alt=""></p>
<br>

</li>
</ul>
<h3 id="2-docker-pull">2. docker pull</h3>
<ul>
<li>도커 이미지 다운로드 명령어<br>

</li>
</ul>
<p><strong>docker pull 사용법</strong></p>
<pre><code>- 사용법 : docker pull [OPTIONS] NAME[:TAG][DIGEST]
=&gt; Digest는 이미지의 해시값을 의미함
=&gt; 이미지를 검색해서 들어가면 나오는 OS/ARCH는 사용자의 
    OS를 가리키는게 아닌 해당 이미지의 OS를 의미함.

Options:
  -a, --all-tags                   Download all tagged images in the repository
      --disable-content-trust    Skip image verification (default true)
      --platform string            Set platform if server is multi-platform capable
  -q, --quiet               Suppress verbose output</code></pre><p><img src="https://velog.velcdn.com/images/bb-seok/post/0f5a9602-abfb-48b1-ade0-3a34c2e79f14/image.png" alt="">
<br></p>
<h3 id="3-docker-images">3. docker images</h3>
<ul>
<li>다운받은 이미지를 확인하는 명령어<br>

</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/d27ee629-692b-4740-b29c-b71976fcfd76/image.png" alt="">
<br></p>
<h3 id="4-docker-login">4. docker login</h3>
<ul>
<li><p>말 그대로 Docker 로그인 명령어이다.</p>
</li>
<li><p>해당 명령어 사용 시 ID, PW를 입력하면 터미널에서도 도커에 로그인 할 수 있다.</p>
<br>

</li>
</ul>
<h3 id="5-docker-image-rm">5. docker image rm</h3>
<ul>
<li><p>도커 이미지 삭제 명령어</p>
</li>
<li><p>이미지는 삭제 시 이미지를 식별하는 digest를 정확하게 입력한다.
(latest의 경우 이미지 이름만 적어도 삭제가 가능)</p>
<br>

</li>
</ul>
<p><strong>사용법</strong></p>
<ul>
<li><p>docker image rm [삭제할 이미지 이름] / docker rmi [삭제할 이미지 이름]</p>
<br>
</li>
<li><p>docker image rm
<img src="https://velog.velcdn.com/images/bb-seok/post/d96c6e8d-a546-4eab-9b82-d26145d60beb/image.png" alt=""></p>
<br>
</li>
<li><p>docker rmi
<img src="https://velog.velcdn.com/images/bb-seok/post/7ab1ab25-aeae-4a42-863c-36f471164fd1/image.png" alt=""></p>
<br>

</li>
</ul>
<h3 id="6-docker-run">6. docker run</h3>
<ul>
<li>이미지 구동(컨테이너 생성)<br>

</li>
</ul>
<p><strong>사용법</strong></p>
<pre><code>docker [container] run [OPTIONS] IMAGE [COMMAND] [ARG...]

$ docker run -it alpine:latest    =&gt; -it 옵션은 터미널 옵션

** --rm 옵션을 사용하면 컨테이너 종료시 자동 삭제... </code></pre><br>

<h3 id="6-2-docker-ps">6-2. docker ps</h3>
<ul>
<li>구동 중인 컨테이너를 확인하는 명령어(= docker [container] ls)<br>

</li>
</ul>
<p><strong>사용법</strong></p>
<ul>
<li>docker ps [OPTIONS]<br>

</li>
</ul>
<h3 id="7-docker-container-stop--kill">7. docker container stop &amp; kill</h3>
<ul>
<li><p>docker container stop
컨테이너를 정상 종료하는 명령어</p>
<br>
</li>
<li><p>docker container kill
컨테이너 강제 종료 명령어</p>
<br>

</li>
</ul>
<blockquote>
<h3 id="도커-파일-작성법">도커 파일 작성법</h3>
</blockquote>
<p><em>*도커 파일로 이미지 만들기</em></p>
<ol>
<li>docker pull</li>
</ol>
<ul>
<li>만들어진 이미지를 가져온다.<br>
</li>
</ul>
<ol start="2">
<li>docker commit</li>
</ol>
<ul>
<li>컨테이너 구동 후에 변경사항을 이미지로 만들 때 사용한다.<br>

</li>
</ul>
<p><strong>Dockerfile을 이용하여 빌드하는 방법</strong></p>
<ul>
<li>Dockerfile은 이미지를 생성하는 것</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/309ffc92-acf5-460f-b879-7d7aa604fb23/image.png" alt=""></p>
<br>

<ol>
<li>docker run -it ubuntu:22.04 &amp; docker commit</li>
</ol>
<ul>
<li>docker commit : 컨테이너 구동 후에 변경사항을 이미지로 만들 때 사용한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/aa88b296-c7d7-4dba-8598-d8e887f3653f/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/752dff20-01f2-492c-bfeb-a647d0daac3f/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/fdb2442a-482c-437b-ad2e-fa3940cc3c0d/image.png" alt=""></p>
<br>

<ol start="2">
<li>apt-get install apache2 -y</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/218ce4ce-5ce0-4587-80d1-a8e73dc8acc5/image.png" alt="">
<br></p>
<ol start="3">
<li>apachectl -D FOREGROUND(포그라운드 설정으로 웹에서 보이게끔 설정한다.)</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/92980130-eac1-40e9-86fb-2149b6847ded/image.png" alt="">
<br></p>
<ol start="4">
<li>Virtual Box 포트포워딩</li>
</ol>
<ul>
<li>apache 8000</li>
</ul>
<ul>
<li>8000:80
=&gt; 8000 포트는 외부에서 들어올 때 허용할 포트번호
=&gt; 80 포트는 서비스 포트(Docker에게 80번 포트를 공개(허용)한 것)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/755415f4-5c30-4cf2-99a7-574323a579f4/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/1ab29f0f-aef6-4083-aed2-9ed03b091d82/image.png" alt="">
<br></p>
<blockquote>
<h3 id="dockerfile-사용-가능-명령들">Dockerfile 사용 가능 명령들</h3>
</blockquote>
<ol>
<li>FROM</li>
</ol>
<ul>
<li>base image 지정<br>
</li>
</ul>
<ol start="2">
<li>MAINTAINER</li>
</ol>
<ul>
<li>컨테이너 이미지 관리자 정보를 기입
(현재는 MAINTAINER 대신 LABEL을 사용함)<br>
</li>
</ul>
<ol start="3">
<li>LABEL</li>
</ol>
<ul>
<li>컨테이너 이미지 메타데이터를 키(key):값(value) 형식으로 지정<pre><code>ex) LABEL maintainer=&quot;hidro cho&lt;hidro1234@naver.com&gt;&quot;</code></pre><br>
</li>
</ul>
<ol start="4">
<li>USER</li>
</ol>
<ul>
<li>명령어 실행 계정 지정<br>
</li>
</ul>
<ol start="5">
<li>WORKDIR</li>
</ol>
<ul>
<li>명령어를 실행할 작업 디렉터리를 지정
(만약, 디렉터리가 없다면 생성하고 작업을 진행한다.)<br>
</li>
</ul>
<ol start="6">
<li>EXPOSE</li>
</ol>
<ul>
<li>컨테이너 실행 시 Listen 할 포트를 지정<br>
</li>
</ul>
<ol start="7">
<li>COPY</li>
</ol>
<ul>
<li>로컬에 있는 파일을 컨테이너로 복사<br>
</li>
</ul>
<ol start="8">
<li>ADD</li>
</ol>
<ul>
<li>로컬에 있는 tar.gz 파일 압축을 풀고 파일을 컨테이너로 복사<br>
</li>
</ul>
<ol start="9">
<li>RUN</li>
</ol>
<ul>
<li>컨테이너 안에서 명령 실행<br>
</li>
</ul>
<ol start="10">
<li>ENTRYPOINT</li>
</ol>
<ul>
<li>컨테이너 기동 시에 실행할 명령어<br>
</li>
</ul>
<ol start="11">
<li>CMD</li>
</ol>
<ul>
<li>컨테이너 기동 시에 실행할 명령어 인수<br>

</li>
</ul>
<blockquote>
<h3 id="docker-git-설치하기">Docker git 설치하기</h3>
</blockquote>
<ol>
<li>apt-get update</li>
</ol>
<ul>
<li>항상 설치 전 업데이트를 통해 최신 상태로 설치할 수 있게 한다.
<img src="https://velog.velcdn.com/images/bb-seok/post/b296d53e-307e-4a68-b02c-fe1c935e23f6/image.png" alt=""><br>
</li>
</ul>
<ol start="2">
<li>apt-get install git</li>
</ol>
<ul>
<li>git 설치
<img src="https://velog.velcdn.com/images/bb-seok/post/3ba870d0-d5da-4556-b920-949a54bdbe81/image.png" alt=""><br>

</li>
</ul>
<blockquote>
<h3 id="docker-build">Docker Build</h3>
</blockquote>
<ul>
<li>docker build -t [이미지명:태그명] [빌드할 디렉터리 경로]
=&gt; 태그명 뒤에는 디렉터리 경로를 반드시 넣어줘야 한다.
=&gt; -t는 build 옵션 중에 태그에 해당하는 옵션이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/244acc19-c2ee-4db9-9b98-565cc74f4d19/image.png" alt=""></p>
<br>

<blockquote>
<h3 id="dockerfile-만들기">Dockerfile 만들기</h3>
</blockquote>
<p><strong>1.</strong> ubuntu 이미지에 git이 설치된 ubuntu-git 이미지를 만드는 Dockerfile 생성</p>
<ul>
<li>Dockerfile1 디렉터리에 Dockerfile 생성 후 이미지 만들기<br>

</li>
</ul>
<p>1-1. mkdir Dockerfile1
<br></p>
<p>1-2. Dockerfile1 디렉터리 안에 Dockerfile 생성</p>
<pre><code>FROM ubuntu

RUN apt-get update
RUN apt-get install -y git</code></pre><p><img src="https://velog.velcdn.com/images/bb-seok/post/c284f7ac-1a96-4015-9c44-43af134b0252/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/5be0e1d4-9275-4c6a-ac4a-f25348ca4a6b/image.png" alt="">
<br></p>
<p>1-3. docker images를 사용하여 생성된 이미지 확인
<br></p>
<p>1-4. docker ps -a | grep ubuntu-git</p>
<ul>
<li><p>확인 후 컨테이너 아이디로 삭제하기</p>
</li>
<li><p>docker container rm [컨테이너 ID]
=&gt; 만약 컨테이너가 실행 중이라면 docker container stop [컨테이너 ID] 명령을 먼저 실행
후 삭제해야 한다.</p>
</li>
<li><p>docker ps로 컨테이너가 삭제됐는지 확인</p>
<br>

</li>
</ul>
<p><strong>도커 컨테이너 기동에 대한 기본 명령어</strong></p>
<ul>
<li><p>각각의 컨테이너는 독립적으로 작동한다.</p>
</li>
<li><p>이미지의 구성이 같더라도 서로에게 영향을 미치지 않는다.</p>
<br>
</li>
</ul>
<ol>
<li>컨테이너 실행 명령어</li>
</ol>
<ul>
<li>docker container start[Container ID]<br>
</li>
</ul>
<ol start="2">
<li>컨테이너 종료 명령어</li>
</ol>
<ul>
<li>docker container stop [Container ID]<br>
</li>
</ul>
<ol start="3">
<li>컨테이너 삭제 명령어</li>
</ol>
<ul>
<li>docker container rm [Container ID]<br>

</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS] DevOps]]></title>
            <link>https://velog.io/@bb-seok/AWS-DevOps</link>
            <guid>https://velog.io/@bb-seok/AWS-DevOps</guid>
            <pubDate>Tue, 20 Aug 2024 09:06:16 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="aws-devops">AWS DevOps</h2>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/848f44c3-0f2c-4c8d-8253-2a7dc6cf9cfc/image.png" alt=""></p>
<p><a href="https://aws.amazon.com/ko/devops/what-is-devops/">https://aws.amazon.com/ko/devops/what-is-devops/</a>
<br></p>
<h3 id="1-devops-방식">1. DevOps 방식</h3>
<p>1-1. 지속적 통합(CI; Continuous Integration)</p>
<ul>
<li><p>빌드 및 테스트가 완료된 코드들을 중앙 레포지토리에 정기적으로
병합하는 소프트웨어 개발 방식</p>
</li>
<li><p>개발 및 테스트 ~ 통합</p>
<br>

</li>
</ul>
<p>1-2. 지속적 전달(CD; Continuous Dilivery OR COntinuous Deploy)</p>
<ul>
<li><p>프로덕션에 릴리즈(배포)하기 위한 코드 변경이 자동으로 빌드, 테스트 및
준비되는 소프트웨어 개발 방식</p>
</li>
<li><p>프로덕션 ~ 배포</p>
<br>

</li>
</ul>
<p>1-3. 마이크로 서비스
<br></p>
<p>1-4. 코드형 인프라
<br></p>
<p>1-5. 모니터링 및 로깅
<br></p>
<p>1-6. 커뮤니케이션 및 협업
<br></p>
<blockquote>
<h4 id="devops를-사용하는-이유는">DevOps를 사용하는 이유는?</h4>
</blockquote>
<ul>
<li>사이트 참조
<a href="https://aws.amazon.com/ko/devops/">https://aws.amazon.com/ko/devops/</a><br>

</li>
</ul>
<blockquote>
<h3 id="cicd-on-aws-workshopcode-pipeline">CI/CD on AWS Workshop(Code Pipeline)</h3>
</blockquote>
<p><a href="https://catalog.workshops.aws/cicdonaws/ko-KR">https://catalog.workshops.aws/cicdonaws/ko-KR</a>
<br></p>
<ol>
<li>구조</li>
</ol>
<p>Source -&gt; Build &amp; Test -&gt; Deploy</p>
<ul>
<li><p>Source(AWS Code Commit)</p>
</li>
<li><p>Build(AWS Code Build)</p>
</li>
<li><p>Test(AWS Code Build &amp; third party)</p>
</li>
<li><p>Deploy(AWS Code Deploy)</p>
<br>
</li>
</ul>
<ol start="2">
<li>지속적 통합 과정</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/995135f9-8dd8-458e-9e37-28f6ad87efbe/image.png" alt=""></p>
<br>

<ul>
<li><p>지속적인 통합을 통해 개발자는 Git과 같은 버전 관리 시스템을 사용하여 공유 저장소에 커밋.</p>
</li>
<li><p>각 커밋 전 개발자는 통합 전에 추가 검증 단계로 로컬 단위 테스트를 실행할 수 있다.</p>
</li>
<li><p>지속적 통합 서비스는 새 코드 변경사항을 자동으로 빌드하고, 단위 테스트를 실행하여
오류를 빠르게 발견한다.</p>
</li>
<li><p>지속적 통합은 소프트웨어 릴리스 프로세스의 빌드 및 단위 테스트 단계를 나타낸다.</p>
</li>
<li><p>커밋된 모든 리비전은 자동화된 빌드 및 테스트를 실행</p>
</li>
<li><p>지속적 전달을 통해 코드 변경 사항은 자동으로 빌드, 테스트 및 프로덕션 릴리스를 위해
준비된다.</p>
</li>
<li><p>빌드 단계 이후에 테스트 환경 또는 프로덕션 환경에 모든 코드 변경사항을 배포함으로써
지속적인 통합을 확장한다.</p>
<br>
</li>
</ul>
<ol start="3">
<li>지속적 전달 과정</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/2502607e-3f9f-42ef-9ae8-c97cde2d10e8/image.png" alt="">
<br></p>
<ul>
<li><p>지속적 배포를 통해 개발자는 단순한 단위 테스트 이상의 테스트를 자동화할 수 있으므로
고객에게 배포하기 전에 여러 차원에서 애플리케이션 업데이트를 확인할 수 있다.</p>
</li>
<li><p>테스트의 종류에는 UI 테스트, 부하 테스트, 통합 테스트, API 안정성 테스트 등이 있다.</p>
</li>
<li><p>다양한 테스트를 통해 개발자는 업데이트를 보다 철저하게 검증하고 문제를 사전에 발견할 수
있다.</p>
</li>
<li><p>클라우드를 사용하면 이전에는 온프레미스에서 수행하기 어려웠던 테스트를 위해 여러 환경의
생성 및 복제를 쉽고 비용 효율적으로 자동화할 수 있다.</p>
</li>
</ul>
<pre><code>온프레미스(On-Premis)
기업의 서버를 클라우드와 같은 원격 환경에서 운영하는 방식이 아닌, 자체적으로
보유한 서버에 직접 설치해 운영하는 방식을 의미한다.</code></pre><br>

<blockquote>
<h3 id="cicd-test">CI/CD Test</h3>
</blockquote>
<ol>
<li>예제 프로젝트 backend-test-cicd-main 압축 풀기</li>
</ol>
<ul>
<li>unzip backend-test-cicd-main.zip
<img src="https://velog.velcdn.com/images/bb-seok/post/343b6cc0-62f9-4ede-a547-c2cb5df82f28/image.png" alt=""><br>
</li>
</ul>
<ol start="2">
<li>압축 해제된 프로젝트 확인
<img src="https://velog.velcdn.com/images/bb-seok/post/dc4c7dc7-32aa-4d29-82d6-8a618a460425/image.png" alt=""></li>
</ol>
<ol start="3">
<li><p>Virtual Box 포트포워딩 tomcat port:5000으로 변경
<img src="https://velog.velcdn.com/images/bb-seok/post/0e195061-76ae-4607-92ec-93ea3239546b/image.png" alt=""></p>
<br>
</li>
<li><p>backend-test-cicd-main 접근해서 빌드</p>
</li>
</ol>
<ul>
<li><p>sh ./gradlew build
<img src="https://velog.velcdn.com/images/bb-seok/post/020bb21e-921d-43f9-99cf-7e6f21eda98c/image.png" alt=""></p>
<br>
</li>
<li><p>java -jar ./build/libs/codepipeline-0.0.1-SNAPSHOT.jar
<img src="https://velog.velcdn.com/images/bb-seok/post/45e9b101-19d7-4a0c-9189-bc4af84d8811/image.png" alt=""></p>
<br>
</li>
</ul>
<ol start="4">
<li><p>접속 확인
<img src="https://velog.velcdn.com/images/bb-seok/post/89e0eb46-7c86-48e8-94f0-48f7bb84bc17/image.png" alt=""></p>
<br>
</li>
<li><p>깃허브 연동하기</p>
</li>
</ol>
<ul>
<li>github.com 접속하여 backend-cicd Repository 생성
<img src="https://velog.velcdn.com/images/bb-seok/post/755697f1-9f95-488b-b1cc-686f857e734e/image.png" alt=""><br>
</li>
</ul>
<ol start="6">
<li>프로젝트 터미널에서 연동 명령어</li>
</ol>
<pre><code>- echo &quot;# backend-cicd&quot; &gt;&gt; README.md

- git init

- git branch -M main

- git remote add origin [Repository URL]

- git add -A &amp; git add .

- git commit -m &quot;Commit Message&quot;

- git push -u origin main</code></pre><p><img src="https://velog.velcdn.com/images/bb-seok/post/a3e9bd23-d2b7-4f09-90ed-dc9175881752/image.png" alt="">
<br></p>
<blockquote>
<h2 id="aws-code-pipeline">AWS Code Pipeline</h2>
</blockquote>
<ol>
<li>AWS -&gt; Code Pipeline으로 이동</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/367311ac-da8b-46fa-8d0f-d5f39e0d5c1c/image.png" alt="">
<br></p>
<ol start="2">
<li>파이프라인 생성 클릭</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/581ba1ad-9f94-43fd-9725-e7f78d2e77ae/image.png" alt="">
<br></p>
<p>3-1. 1단계 - 파이프라인 기본 설정 추가</p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/c81fadde-ea25-4d25-b2a1-7914b91b1c18/image.png" alt="">
<br></p>
<p>3-2. 변수 설정 &amp; 고급 설정</p>
<ul>
<li><p>기본값이 없을 경우 첫 번째 파이프라인 실행이 실패</p>
</li>
<li><p>아티팩트 스토어
기본 위치 또는 사용자 지정 위치를 설정하여 S3를 생성하거나 위치를 선택</p>
</li>
<li><p>암호화 키
기본 AWS 관리형 키 or 고객 관리형 키</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/274bb284-f2c9-4298-8b57-82182a9ff9bc/image.png" alt="">
<br></p>
<blockquote>
<h3 id="4-source-설정">4. Source 설정</h3>
</blockquote>
<ul>
<li><p>Git 또는 Source Stage라고 하는 중앙(통합) 레파지토리를 추가</p>
<br>
</li>
<li><p>소스 공급자 설정(예제의 경우 GitHub ver2)
GitHub ver1과 ver2 차이점 : 깃허브 앱 사용 여부(ver1의 경우 ID, PW만 입력)</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/43c22598-dbc5-4472-b3e0-7e3b768b6d13/image.png" alt="">
<br></p>
<ul>
<li>GitHub 연결
만들고자 하는 연결명 설정 후 깃허브에 연결</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/5187a894-1d84-4af5-a3dc-23bc172d8c60/image.png" alt=""></p>
<pre><code>- All Repository
현재 파이프라인으로 내 깃허브 모든 레파지토리 연결

- Only Select Repository
특정 레파지토리만 연결
=&gt; 나중에 수정하여 추가가 가능하다.

- 출력 아티팩트 형식
CodePipeline 기본 값 : zip 형태 사용

- 전체 복제
GitHub에 대한 메타데이터 전달(CodeBuild 시 사용이 가능)</code></pre><br>

<blockquote>
<h4 id="트리거trigger">트리거(Trigger)</h4>
</blockquote>
<p>소스 코드에 어떤 변화가 있을 경우에 동작을 위한 설정</p>
<ul>
<li>트리거 유형
필터 없음 : 모든 푸시에 파이프라인 시작
(푸시가 있으면 무조건 자동화 동작 시작)<br>
</li>
</ul>
<ol>
<li><p>필터 없음</p>
</li>
<li><p>필터 지정
특정 필터에 대해서만 파이프라인 시작(Commit Copy)</p>
</li>
<li><p>변경 사항 감지 안함
파이프라인을 자동으로 트리거 하지 않음(수동으로 실행)</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/bc92268c-d7e8-4582-83d2-02dee07943bc/image.png" alt="">
<br></p>
<blockquote>
<h3 id="5-빌드-스테이지-추가">5. 빌드 스테이지 추가</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/fb1d6177-f1fd-43fc-94b9-a53c10b0548c/image.png" alt=""></p>
<p><strong>빌드 공급자 선택</strong></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/3e846fa9-668c-421f-9412-1ae687e62a4f/image.png" alt="">
<br></p>
<p>AWS Codebuild
Jenkins 추가 : Jenkins Server 지정
<br></p>
<p><strong>환경</strong></p>
<ol>
<li>관리형 이미지(AWS CodeBuild 이미지 사용)</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/19c9f84f-c147-459c-8663-8c1ef1d41035/image.png" alt=""></p>
<ul>
<li><p>운영체제
Amazon Linux
Ubuntu</p>
<br>
</li>
<li><p>런타임
Standard</p>
<br>
</li>
<li><p>이미지 및 이미지 버전</p>
<br>
</li>
<li><p>서비스 역할(새 서비스, 기존 서비스)
만들기가 매우 귀찮음</p>
<br>
</li>
</ul>
<ol start="2">
<li>사용자 지정 이미지(도커 이미지 지정)</li>
</ol>
<ul>
<li><p>환경 유형</p>
<br>
</li>
<li><p>Buildspec
1). 빌드 명령 삽입
편집기에 직접 명령어를 삽입하여 실행시킬 수 있다.</p>
<br>
```
version: 0.2

</li>
</ul>
<p>phases:
  install:
    runtime-versions:
      java: corretto17
      # name: version
  build:
    commands:
      - chmod 755 ./gradlew
      - ./gradlew build
      - mv build/libs/*.jar app.jar</p>
<p>artifacts:
  files:
    - app.jar</p>
<p>```
<br></p>
<p>2). buildspec 파일 사용
<br></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/03410e56-34e3-4039-bc3c-0bf978ba8ee4/image.png" alt=""></p>
<p>3). 배치 구성
<img src="https://velog.velcdn.com/images/bb-seok/post/f1a5906a-3744-4f24-a884-479a8de713ea/image.png" alt="">
<br></p>
<p>4). 로그
<br></p>
<blockquote>
<h3 id="6-배포-스테이지-추가">6. 배포 스테이지 추가</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/eb5ba773-0cba-4cc3-b6a7-0f77976f7962/image.png" alt=""></p>
<ol>
<li><p>배포 공급자
AWS Elastic beanstalk</p>
<br>
</li>
<li><p>리전
아시아 태평양(서울)</p>
<br>
</li>
<li><p>애플리케이션 이름</p>
<br>
</li>
<li><p>환경 이름</p>
<br>

</li>
</ol>
<p><strong>7. 검토 후 파이프라인 생성 클릭</strong></p>
<ul>
<li>검토
<img src="https://velog.velcdn.com/images/bb-seok/post/0a7775db-35ae-4f35-af31-34582f86512a/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/71181a29-4183-4c7c-afd7-73126a620c93/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/4cf29173-464f-4496-a2a7-3af736e6cc26/image.png" alt=""><br>
</li>
</ul>
<ol start="8">
<li>파이프라인이 생성되면 Source -&gt; Build -&gt; Deploy 순서로 진행되면서
성공 여부를 확인<br>
</li>
</ol>
<ul>
<li><p>Source
<img src="https://velog.velcdn.com/images/bb-seok/post/bc87dd86-46ce-41fe-9416-30f23bb50e1c/image.png" alt=""></p>
<br>
</li>
<li><p>Build
<img src="https://velog.velcdn.com/images/bb-seok/post/fc53cae3-39e1-4132-8874-f994c6e10d3d/image.png" alt=""></p>
<br>
</li>
<li><p>Deploy
<img src="https://velog.velcdn.com/images/bb-seok/post/48ddac0e-80e8-4a66-af85-f80c093d41ea/image.png" alt=""></p>
<br>
</li>
<li><p>파이프라인 생성 성공</p>
<br>
</li>
</ul>
<ol start="9">
<li>8번까지 완료됐으면 Elastic beanstalk로 들어가서 도메인으로 접속 후
정상적으로 동작하는지 확인(배포 시에는 포트 번호를 변경하면 안됨 !!)<br>

</li>
</ol>
<blockquote>
<h3 id="소스---빌드---배포-테스트">소스 - 빌드 - 배포 테스트</h3>
</blockquote>
<ol>
<li>프로젝트 내용 수정
(예제의 경우 Hello Controller 수정)</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/af6a672e-1f86-4e71-8f33-63c3ac0f5b24/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/934984f4-84fe-4e65-a384-3c908acbca48/image.png" alt="">
<br></p>
<ol start="2">
<li>git commit &amp; push</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/1d29e643-b24e-401d-86fa-54660259a62d/image.png" alt="">
<br></p>
<ol start="3">
<li>Code Pipeline 자동화 진행 상태 확인</li>
</ol>
<ul>
<li><p>자동화 진행 중
<img src="https://velog.velcdn.com/images/bb-seok/post/632b07da-a037-4833-940d-9ef73fc2dbf2/image.png" alt=""></p>
<br>
</li>
<li><p>자동화 성공
<img src="https://velog.velcdn.com/images/bb-seok/post/2ce76ef9-0f7c-43c9-8fd1-07a2558965b0/image.png" alt=""></p>
<br>
</li>
</ul>
<ol start="4">
<li>진행 상태가 완료되면 해당 로컬로 재접속하여 확인</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/3e45516a-9b10-45c4-8c16-9b9467bacae9/image.png" alt="">
<br></p>
<blockquote>
<h3 id="파이프라인-편집">파이프라인 편집</h3>
</blockquote>
<ol>
<li><p>좌측 상단 편집하기 클릭
<img src="https://velog.velcdn.com/images/bb-seok/post/8d297aea-8711-4fb6-a9e5-b756d9842497/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/dfd8e556-dde1-4ea7-b834-123451c86e3e/image.png" alt=""></p>
<br>
</li>
<li><p>파이프라인 속성 수정
<img src="https://velog.velcdn.com/images/bb-seok/post/c584a804-cfb8-498e-8abf-5ffbd2088516/image.png" alt=""></p>
<br>
</li>
<li><p>변수 설정 수정
<img src="https://velog.velcdn.com/images/bb-seok/post/ce1eb2bb-bbb5-4a5f-8caf-d9765240e4a1/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/656339d1-c32c-4526-aa1a-03356cd52e8e/image.png" alt=""></p>
<br>
</li>
<li><p>트리거 수정
<img src="https://velog.velcdn.com/images/bb-seok/post/e5495a08-62f0-4cb9-a2e5-26e49f9f9ecd/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/23d1830a-38df-4544-9e49-42a4d5c2f1b5/image.png" alt=""></p>
<br>
</li>
<li><p>Source 수정
<img src="https://velog.velcdn.com/images/bb-seok/post/17da9d18-08ef-435d-8d10-7dc3bf7b6688/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/0cd3bf24-c626-43da-a7a1-394f2a74cdfa/image.png" alt=""></p>
<br>
</li>
<li><p>Build 수정
<img src="https://velog.velcdn.com/images/bb-seok/post/d06812d1-8868-4f08-9da1-a0a8d421f7af/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/40decd2b-b831-47b8-ab1f-877b05d0bc32/image.png" alt=""></p>
<br>
</li>
<li><p>Deploy 수정
<img src="https://velog.velcdn.com/images/bb-seok/post/2134c201-2de2-4caf-b263-80a798ba298e/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/f782fa7f-a6c4-4bcb-9c09-1d6ed425a34b/image.png" alt=""></p>
<br>
</li>
<li><p>편집 완료 시 변경사항 릴리즈
<img src="https://velog.velcdn.com/images/bb-seok/post/341f3a3b-0053-4604-9030-1be5fe8f0e9a/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/e4949e7e-ef79-4613-8ef8-f6a0b94f121c/image.png" alt=""></p>
<br></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS] Backend & Frontend Deploy]]></title>
            <link>https://velog.io/@bb-seok/AWS-Frontend-%EB%8F%99%EC%9E%91-%EB%B0%A9%EC%8B%9D</link>
            <guid>https://velog.io/@bb-seok/AWS-Frontend-%EB%8F%99%EC%9E%91-%EB%B0%A9%EC%8B%9D</guid>
            <pubDate>Tue, 20 Aug 2024 07:36:26 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="webapp">webapp</h3>
</blockquote>
<ul>
<li>/var/app/current/[배포할 때 전달된 code]
=&gt; node_modules : npm install 동작 시 다운받아서 동작
=&gt; Procfile : 실행
<img src="https://velog.velcdn.com/images/bb-seok/post/8846d94a-31f7-4eec-852d-4b2e50e043c3/image.png" alt=""></li>
</ul>
<br>

<ul>
<li><p>코드에는 .jar, tomcat 등</p>
<br>
</li>
<li><p>/var/log/web.~~(실제 애플리케이션이 동작했을 때 로그)
=&gt; Cloud watch를 통해 개발자에게 전달해준다</p>
<br>

</li>
</ul>
<blockquote>
<h3 id="내도메인한국">내도메인.한국</h3>
</blockquote>
<p>예제의 경우 내도메인.한국 사이트를 이용함.
<br></p>
<ul>
<li><p>dev.[내도메인] cname으로 eb에 있는 backend 주소를 넣어준다.
이때 &quot;http://&quot;, 뒤에 &quot;/&quot;는 삭제해준다.</p>
</li>
<li><p>www.[내도메인] cname으로 eb에 있는 frontend 주소를 넣어준다.
위와 동일하게 프로토콜과 &quot;/&quot;는 삭제한다.</p>
<br>

</li>
</ul>
<p>이후에 backend에서 WebSecurityconfig에 있는 CORS 설정에 등록된 frontend의 도메인
주소를 추가하고, frontend에서는 api-config.js에서 else 이후에 있는 backendHost 부분을
backend 도메인 주소로 변경해준다.</p>
<p>마지막에 &quot;/&quot;가 들어가지 않도록 주의한다.
<br></p>
<blockquote>
<h3 id="deploy">Deploy</h3>
</blockquote>
<ol>
<li>.platform/hooks/predeploy/01_serve_install.sh
=&gt; serve 프로그램 설치 : 간이 웹 서버 역할</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/ac6b8135-522b-427d-87d2-da3398f66988/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/297a3b97-78ed-44be-a9b2-0f64edca2010/image.png" alt="">
<br></p>
<ol start="2">
<li>Procfile 생성 =&gt; 배포 후 실행 명령</li>
</ol>
<ul>
<li>web: serve -s build -l 8080
<img src="https://velog.velcdn.com/images/bb-seok/post/43b9dbb8-72fc-4f25-9f90-f89c5905b76a/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/a30376f9-9426-4878-b2f0-f2dcc93f516a/image.png" alt=""><br>
</li>
</ul>
<ol start="3">
<li>.gitignore에서 /build 삭제</li>
</ol>
<ul>
<li>3번과 4번 사이에 npm run build를 통해서 배포 파일을 만들기
<img src="https://velog.velcdn.com/images/bb-seok/post/b872fc50-6747-4027-8ed7-d76eeb4719d9/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/f579a1bf-89b8-4f2a-9d9a-18f9f37035c3/image.png" alt=""><br>
</li>
</ul>
<ol start="4">
<li>모든 작업 후에 git 처리 후 배포</li>
</ol>
<ul>
<li><p>git add -A &amp;&amp; git commit -m &quot;frontend deployment&quot;
<img src="https://velog.velcdn.com/images/bb-seok/post/3e9f8868-cda0-4c4a-9c29-81ee348a4732/image.png" alt=""></p>
<br>
</li>
<li><p>eb deploy 또는 eb create
<img src="https://velog.velcdn.com/images/bb-seok/post/1ac37ff7-ae93-4f07-946e-41fc5f846113/image.png" alt="">
=&gt; Not Found 에러 발생 시 ./elasticbeanstalk/config.yml에서
main - environment 부분을 변경한다.</p>
<br>

</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/2c671b11-c2f9-44ec-88b8-d7041a726969/image.png" alt=""></p>
<br>

<ol start="5">
<li>todo-backend 디렉터리로 이동</li>
</ol>
<ul>
<li><p>WebSecurityConfig - CorsConfiguration 설정에 frontend 환경 도메인을 추가
<img src="https://velog.velcdn.com/images/bb-seok/post/d0f60b5f-9d2b-4c91-bc10-dd28265b19a6/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/89086d8a-ba8f-4a8d-8d96-d52f5a8971b3/image.png" alt=""></p>
<br>
</li>
<li><p>bash ./gradlew build</p>
<br>
</li>
<li><p>sh ./gradlew release
<img src="https://velog.velcdn.com/images/bb-seok/post/0c480e39-f904-4ec3-9597-f77686f8a2c6/image.png" alt=""></p>
<br>
</li>
<li><p>Environment update completed successfully 문구가 뜨면 성공 !
<img src="https://velog.velcdn.com/images/bb-seok/post/fd3ca127-e485-4a1a-8e28-2f61a8bf5887/image.png" alt=""></p>
</li>
</ul>
<br>

<blockquote>
<h3 id="backend--frontend-도메인-주소-설정">Backend &amp; Frontend 도메인 주소 설정</h3>
</blockquote>
<ol>
<li><p>한글 도메인 사이트 이동</p>
<br>
</li>
<li><p>도메인 관리 탭 - 이전에 만들어둔 도메인 수정 클릭</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/e1f2735b-8fd1-47e2-b11d-50c4bd1b8f61/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/de022558-70b4-44ee-8abe-ed06446aa3a2/image.png" alt="">
<br></p>
<ol start="3">
<li><p>백 서버, 프론트 서버 둘 다 별칭(Alias)으로 생성했기 때문에
고급설정(DNS)에 별칭을 체크</p>
<br>
</li>
<li><p>AWS 환경에 백, 프론트 도메인 주소 복사 후 입력
이때, http와 같은 프로토콜은 제외하고 입력한다.</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/77d488cc-4f64-4e0a-aa5d-1492bbad3b60/image.png" alt="">
<br></p>
<ol start="5">
<li>수정 완료 후 브라우저를 열어 해당 도메인 주소로 접속되는지 확인</li>
</ol>
<ul>
<li><p>backend
<img src="https://velog.velcdn.com/images/bb-seok/post/2bd2c9e1-c9bb-4e5b-a68f-40911a22238d/image.png" alt=""></p>
<br>
</li>
<li><p>frontend
<img src="https://velog.velcdn.com/images/bb-seok/post/ade3ea6c-7589-4b52-8a0c-cec3778ae755/image.png" alt=""></p>
<br>

</li>
</ul>
<blockquote>
<h3 id="backend--frontend-config-수정">Backend &amp; Frontend config 수정</h3>
</blockquote>
<ol>
<li>Frontend 프로젝트로 돌아와서 api-config 설정에
이전에 해두었던 backendHost 주소를 dev.bumseok.r-e.kr로 설정 변경</li>
</ol>
<ul>
<li><p><a href="http://dev.bumseok.r-e.kr">http://dev.bumseok.r-e.kr</a>(백엔드 도메인 주소)
<img src="https://velog.velcdn.com/images/bb-seok/post/112da677-bf89-49b5-9b14-f5d0605ad465/image.png" alt=""></p>
<br>
</li>
<li><p>npm run build
<img src="https://velog.velcdn.com/images/bb-seok/post/b6c50448-6c82-49bc-9771-303cbc352536/image.png" alt=""></p>
<br>
</li>
<li><p>git add -A &amp;&amp; git commit -m &quot;frontend deployment&quot;
<img src="https://velog.velcdn.com/images/bb-seok/post/1c4cb0f5-8544-43aa-b7ec-1cb0f7df1a62/image.png" alt=""></p>
<br>
</li>
<li><p>eb deploy</p>
<br>
</li>
</ul>
<ol start="2">
<li>Backend도 마찬가지로 WebSecurityConfig 설정에서
web.bumeseok.r-e.kr로 변경</li>
</ol>
<ul>
<li><p><a href="http://web.bumseok.r-e.kr">http://web.bumseok.r-e.kr</a>(프론트 도메인 주소)
<img src="https://velog.velcdn.com/images/bb-seok/post/9c4bab45-0ffb-42e6-9bb7-e905ad938d39/image.png" alt=""></p>
<br>
</li>
<li><p>sh ./gradlew release
<img src="https://velog.velcdn.com/images/bb-seok/post/ce9c24de-fa48-4d20-a40d-9eac9639c2be/image.png" alt=""></p>
<br>
</li>
<li><p>eb deploy
<img src="https://velog.velcdn.com/images/bb-seok/post/1b30b675-352a-4289-8d2a-51cf04fe61b3/image.png" alt=""></p>
<br>
</li>
</ul>
<ol start="3">
<li>배포 후 웹으로 Frontend 접근
<img src="https://velog.velcdn.com/images/bb-seok/post/452aaafe-b82c-4e40-a136-922170a1c929/image.png" alt=""><br>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS] Elastic beanstalk 2]]></title>
            <link>https://velog.io/@bb-seok/AWS-Elastic-beanstalk-2</link>
            <guid>https://velog.io/@bb-seok/AWS-Elastic-beanstalk-2</guid>
            <pubDate>Tue, 20 Aug 2024 06:47:14 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="elasitc-beanstalk-cli-설치">Elasitc beanstalk CLI 설치</h2>
</blockquote>
<p><a href="https://github.com/aws/aws-elastic-beanstalk-cli-setup">https://github.com/aws/aws-elastic-beanstalk-cli-setup</a>
<br></p>
<p><strong>1. 설치 전 환경 구성하기</strong></p>
<p>1-1. Git 설치</p>
<p>1-2. Python 설치(예제의 경우 Python 3)</p>
<p>1-3. virtualenv 설치
<br></p>
<p><strong>2. EB CLI 설치 및 업그레이드</strong></p>
<p>2-1. Linux/Mac OS</p>
<ul>
<li>python ./aws-elastic-beanstalk-cli-setup/scripts/ebcli_installer.py<br>

</li>
</ul>
<p>2-2. Windows</p>
<ul>
<li>python.\aws-ealstic-beanstalk-cli-setup\scripts\ebcli_installer.py<br>

</li>
</ul>
<p><strong>3. Path 설정</strong></p>
<pre><code>- echo &#39;export PATH=&quot;/home/user1/.ebcli-virtaul-env/executables:$PATH&quot;&#39;
        &gt;&gt; ~/.bash_profile &amp;&amp; source ~/.bash_profile</code></pre><br>

<p><strong>4. Python3 -&gt; Python</strong></p>
<ul>
<li>EB를 실행하기 위해 Python3를 Python으로 Symbolic 설정
sudo ln -s /usr/bin/python3 /usr/bin/python
<img src="https://velog.velcdn.com/images/bb-seok/post/457ebe52-1f3d-4ac6-95d0-97d6c2be272e/image.png" alt=""></li>
</ul>
<br>

<p><strong>5. 모든 환경 구성이 완료된 후 EB 명령을 실행하면 Elastic beanstalk에 관한
내용들이 나오게 된다.</strong>
<img src="https://velog.velcdn.com/images/bb-seok/post/2211e9cc-26d9-4335-85fd-19b48c9ba00d/image.png" alt=""></p>
<br>

<blockquote>
<h3 id="프로젝트-넣고-환경-구성하기">프로젝트 넣고, 환경 구성하기</h3>
</blockquote>
<ol>
<li>User1에 사용할 프로젝트를 넣고 ls 명령을 통해 확인</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/0e5552ce-cb76-4caf-ae7f-9af93e7d0e87/image.png" alt="">
<br></p>
<ol start="2">
<li>명령어를 통한 unzip 설치</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/143cb6a7-5436-4206-a651-f26ea0f92636/image.png" alt="">
<br></p>
<ol start="3">
<li>unzip으로 프로젝트 압축 해제</li>
</ol>
<ul>
<li><p>todo-backend.zip
<img src="https://velog.velcdn.com/images/bb-seok/post/2a505e96-56e8-4e98-b17b-dc6a32afd137/image.png" alt=""></p>
<br>
</li>
<li><p>todo-frontend.zip
<img src="https://velog.velcdn.com/images/bb-seok/post/fb53e676-8fc6-40d0-9322-07e1302e6a46/image.png" alt=""></p>
<br>
</li>
</ul>
<ol start="4">
<li>압축 해제된 백엔드, 프론트엔드 폴더 열기</li>
</ol>
<ul>
<li><p>backend
<img src="https://velog.velcdn.com/images/bb-seok/post/783eabf0-2065-48fe-a435-f389b6b16f8b/image.png" alt=""></p>
</li>
<li><p>frontend
<img src="https://velog.velcdn.com/images/bb-seok/post/d7fbb7de-8311-49d1-b69d-8ccb8f9086f2/image.png" alt=""></p>
<br>
</li>
</ul>
<ol start="5">
<li>데이터베이스 생성하기(MySQL)</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/543b7662-0603-45ac-a5f2-ba4ecc8afbec/image.png" alt=""></p>
<ul>
<li><p>todo 계정 생성
create user todoAdmin identified by &#39;todoAdmin&#39;;</p>
</li>
<li><p>todos 데이터베이스 생성
create database todos;</p>
</li>
<li><p>todos에 관한 생성(todoAdmin에 대한)
grant all privileges on todo.* todoAdmin;</p>
<br>
</li>
</ul>
<ol start="6">
<li>todo-backend</li>
</ol>
<p>6-1. src/main/resources</p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/7db1fde3-bcfe-4ba7-a5c8-1216b89fa82b/image.png" alt=""></p>
<ul>
<li><p>application-dev.yml(개발용/develop)</p>
</li>
<li><p>application-prod.yml(배포용/product)</p>
</li>
</ul>
<p>yml은 Python 기반으로 Python은 들여쓰기가 강제된다(매우 중요함!!!)
스프링부트의 application-properties와는 다른 방식
<br></p>
<p>6-2. application-dev.yml의 Database URL 설정</p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/75b03f11-c604-49f0-92fb-3dd1fbbc5a16/image.png" alt="">
<br></p>
<p>6-3. sh ./gradlew build</p>
<ul>
<li>쉘스크립트를 이용하여 빌드하기
<img src="https://velog.velcdn.com/images/bb-seok/post/363e783e-0f65-4dfc-88e6-7399948641d2/image.png" alt=""><br>
</li>
</ul>
<ol start="7">
<li>빌드 후 jar 파일을 실행(/build/libs/.jar)</li>
</ol>
<ul>
<li>java -jar ./build/libs/todo-0.0.1-SNAPSHOT.jar
해당 디렉터리 경로를 확인해서 jar 파일명을 정확하게 입력해야 한다.
<img src="https://velog.velcdn.com/images/bb-seok/post/22c9b8f4-321c-4fcd-85b6-8a426023297c/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/c4fb61c0-8abb-47dd-9e61-662d9f3a8ff1/image.png" alt=""><br>
</li>
</ul>
<ol start="8">
<li>active default 설정</li>
</ol>
<ul>
<li>java -jar ./build/libs/todo-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
<img src="https://velog.velcdn.com/images/bb-seok/post/92723a70-167e-4a62-bcde-7fab893d307f/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/a2afd63a-477a-4770-bd1f-825c225a341e/image.png" alt=""></li>
</ul>
<br>

<ol start="9">
<li>Virtual Box 포트포워딩 설정</li>
</ol>
<ul>
<li><p>기존 tomcat의 호스트 포트 8080 -&gt; 8090</p>
</li>
<li><p>todo-backend 테스트를 위한 포트 추가 8080
<img src="https://velog.velcdn.com/images/bb-seok/post/8504bbc5-a9d3-4124-8fe1-bebe4a3d48a2/image.png" alt=""></p>
<br>
</li>
</ul>
<ol start="10">
<li>Postman으로 테스트</li>
</ol>
<ul>
<li><p>/auth/signup =&gt; 회원가입</p>
<pre><code>[post] localhost:8090/auth/signup
[body]
{
  &quot;username&quot;:&quot;testuser1@test.com&quot;,
  &quot;password&quot;:&quot;testuser1&quot;
}</code></pre><br>
</li>
<li><p>/auth/login =&gt; 로그인</p>
<pre><code>[post] localhost:8090/auth/signin
[body]
{
  &quot;username&quot;:&quot;testuser1@test.com&quot;,
  &quot;password&quot;:&quot;testuser1&quot;
}

</code></pre></li>
</ul>
<p>출력 결과
{
    &quot;token&quot;: &quot;eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJmZjgwODE4MTkxMDg3NzdiMDE5MTA4N2RiNmVlMDAwMCIsImlzcyI6InRvZG8gYXBwIiwiaWF0IjoxNzIyNDI0NTExLCJleHAiOjE3MjI1MTA5MTF9.K1gBzj4RUZsOb4JfkL2OINxFfB7cLEoI2AkXVnyHaAThyzGPFh-dnyLl6XeeqAfPYHg9FUrjWGfZHsM8OfhsGw&quot;,
    &quot;username&quot;: &quot;<a href="mailto:testuser1@test.com">testuser1@test.com</a>&quot;,
    &quot;password&quot;: null,
    &quot;id&quot;: &quot;ff8081819108777b0191087db6ee0000&quot;
}</p>
<pre><code>&lt;br&gt;

**Todo Test**

- create</code></pre><p>[post] localhost:8090/todo
[body]
{
    &quot;title&quot;:&quot;todo1 입니다.&quot;
}</p>
<p>출력 결과
{
    &quot;error&quot;: null,
    &quot;data&quot;: [
        {
            &quot;id&quot;: &quot;ff8081819108777b01910884f4b40001&quot;,
            &quot;title&quot;: &quot;todo1 입니다.&quot;,
            &quot;done&quot;: false
        }
    ]
}</p>
<pre><code>&lt;br&gt;

- reads</code></pre><p>[get] localhost:8090/todo</p>
<p>출력 결과
{
    &quot;error&quot;: null,
    &quot;data&quot;: [
        {
            &quot;id&quot;: &quot;ff8081819108777b01910884f4b40001&quot;,
            &quot;title&quot;: &quot;todo1 입니다.&quot;,
            &quot;done&quot;: false
        },
        {
            &quot;id&quot;: &quot;ff8081819108777b01910886e5480002&quot;,
            &quot;title&quot;: &quot;todo2 입니다.&quot;,
            &quot;done&quot;: false
        },
        {
            &quot;id&quot;: &quot;ff8081819108777b01910886faa20003&quot;,
            &quot;title&quot;: &quot;todo3 입니다.&quot;,
            &quot;done&quot;: false
        },
        {
            &quot;id&quot;: &quot;ff8081819108777b019108870f100004&quot;,
            &quot;title&quot;: &quot;todo4 입니다.&quot;,
            &quot;done&quot;: false
        }
    ]
}</p>
<pre><code>&lt;br&gt;

- update</code></pre><p>[put] localhost:8090/todo
[body]
{
    &quot;id&quot;: &quot;ff8081819108777b01910886e5480002&quot;,
    &quot;title&quot;: &quot;todo2 수정입니다. 하핳....&quot;,
    &quot;done&quot;: true
}</p>
<p>출력 결과
{
    &quot;error&quot;: null,
    &quot;data&quot;: [
        {
            &quot;id&quot;: &quot;ff8081819108777b01910884f4b40001&quot;,
            &quot;title&quot;: &quot;todo1 입니다.&quot;,
            &quot;done&quot;: false
        },
        {
            &quot;id&quot;: &quot;ff8081819108777b01910886e5480002&quot;,
            &quot;title&quot;: &quot;todo2 수정입니다. 하핳....&quot;,
            &quot;done&quot;: true
        },
        {
            &quot;id&quot;: &quot;ff8081819108777b01910886faa20003&quot;,
            &quot;title&quot;: &quot;todo3 입니다.&quot;,
            &quot;done&quot;: false
        },
        {
            &quot;id&quot;: &quot;ff8081819108777b019108870f100004&quot;,
            &quot;title&quot;: &quot;todo4 입니다.&quot;,
            &quot;done&quot;: false
        }
    ]
}</p>
<pre><code>&lt;br&gt;

- delete</code></pre><p>[delete] localhost:8090/todo
[body]
{
    &quot;id&quot;: &quot;ff8081819108777b019108870f100004&quot;
}</p>
<p>출력 결과
{
    &quot;error&quot;: null,
    &quot;data&quot;: [
        {
            &quot;id&quot;: &quot;ff8081819108777b01910884f4b40001&quot;,
            &quot;title&quot;: &quot;todo1 입니다.&quot;,
            &quot;done&quot;: false
        },
        {
            &quot;id&quot;: &quot;ff8081819108777b01910886e5480002&quot;,
            &quot;title&quot;: &quot;todo2 수정입니다. 하핳....&quot;,
            &quot;done&quot;: true
        },
        {
            &quot;id&quot;: &quot;ff8081819108777b01910886faa20003&quot;,
            &quot;title&quot;: &quot;todo3 입니다.&quot;,
            &quot;done&quot;: false
        }
    ]
}</p>
<pre><code>&lt;br&gt;

11. todo-frontend 이동

11-1. Node.js 설치

- http://nodejs.org/en/download/package-manager
![](https://velog.velcdn.com/images/bb-seok/post/b8157ec4-b6c2-4e0d-ac78-982a8bb0aab9/image.png)
&lt;br&gt;

11-2. todo-frontend 명령창에 복붙

![](https://velog.velcdn.com/images/bb-seok/post/b77ce4b2-e5fa-4c03-a860-d8a4a29ef578/image.png)
&lt;br&gt;

12. npm install

![](https://velog.velcdn.com/images/bb-seok/post/7a8f7c59-fa1c-4ee6-b55c-59f2ab54d97a/image.png)
&lt;br&gt;

13. todo-frontend 실행

- npm start
&lt;br&gt;

14. todo-frontend 포트포워딩(Port : 3000)

![](https://velog.velcdn.com/images/bb-seok/post/b2ce9ecf-c819-494d-b3fb-078e10f9f916/image.png)

=&gt; 포트포워딩 설정 후에 웹에서 localhost:3000으로 접근하여 backend 서버와 연동된
것을 확인
&lt;br&gt;

15. todo-backend로 돌아와서 EB 명령어 실행하고 각 옵션을 설정

![](https://velog.velcdn.com/images/bb-seok/post/06e72dc6-3249-4109-9320-254e06da6bfa/image.png)
![](https://velog.velcdn.com/images/bb-seok/post/df6142a9-1883-4ae9-944d-226902fbfc90/image.png)
&lt;br&gt;

16. application-prod.yml 설정

- server port 확인

- datasource-url, username, password 값은 환경 변수를 의미한다.

![](https://velog.velcdn.com/images/bb-seok/post/10935862-0b26-4e4a-8143-1884a1cb78b2/image.png)
&lt;br&gt;

17. Controller-HomeController(Health Check)

- Elastic beanstalk가 HomeController를 확인하고 실행
![](https://velog.velcdn.com/images/bb-seok/post/4b498826-9b4e-48a7-a4a0-e981ca18cfcf/image.png)
![](https://velog.velcdn.com/images/bb-seok/post/95b83e93-9b26-48ba-a9fd-60436d7d951b/image.png)
&lt;br&gt;

18. Elastic beanstalk - config.yml 코드 추가
</code></pre><p>deploy :
    artifact: build/libs/todo-0.0.1-SNAPSHOT.jar</p>
<pre><code>
![](https://velog.velcdn.com/images/bb-seok/post/883b7b34-1b26-4863-a42c-de937737eab8/image.png)
![](https://velog.velcdn.com/images/bb-seok/post/767930e9-1519-4101-8726-f92fd13686db/image.png)
&lt;br&gt;

19. EB 생성

- create --database --elb-type application --instance-type t3.micro

- elb-type : Load Balancing Type

- instance-type : EC2 Type

이후에 Environment Name, DNS CNAME Prefix, RDS DB username, password 등을 설정
&lt;br&gt;

20. eb setenv SPRING_PROFILES_ACTIVE=prod

- user1@myserver01:~/todo-backend$ eb setenv SPRING_PROFILES_ACTIVE=prod
&lt;br&gt;

&gt;#### release 태스크 작업(build.gradle)

- build.gradle에 코드를 추가
</code></pre><p>task(&quot;release&quot;) {</p>
<pre><code>dependsOn(&quot;build&quot;)

doLast {
    def stdout = new ByteArrayOutputStream()
    exec {
        /* $ eb setenv SPRING_PROFILES_ACTIVE=prod */
        commandLine &#39;eb&#39;, &#39;setenv&#39;, &#39;SPRING_PROFILES_ACTIVE=prod&#39;
        standardOutput = stdout
    }
    /* 결과 로깅을 위한 작업 */
    println &quot;eb setnev SPRING_PROFILES_ACTIVE=prod :\n$stdout&quot;;
    exec {
        /* eb deploy =&gt; .elasticbeanstalk/config.yml에 있는 설정으로 배포 처리. */
        commandLine &#39;eb&#39;, &#39;deploy&#39;
        standardOutput = stdout
    }
    println &quot;eb deploy :\n$stdout&quot;;
    println &quot;Release succeeded.&quot;;
}</code></pre><p>}</p>
<pre><code>
이후에 sh ./gradlew release 명령어 실행
&lt;br&gt;

&gt;### Todo-frontend 설정(backend 설정과 같음)

1. eb init TodoApplication-frontend

- Command Not Found 에러가 발생하면 Source ../.bash_prqofile

![](https://velog.velcdn.com/images/bb-seok/post/c220e8a3-bd96-4929-865a-153ef8618161/image.png)

![](https://velog.velcdn.com/images/bb-seok/post/2d4c797e-9e6a-4d6c-9841-1a9cfb52f3c4/image.png)

&lt;br&gt;

2. npm start
&lt;br&gt;

3. 웹으로 접근

- 로딩 중이 뜨면 backend와 연동 설정을 해야 한다.
&lt;br&gt;

&gt;### Swap Memory 설정

1. 디렉터리 생성

- mkdir -p .platform/hooks/prebuild

![](https://velog.velcdn.com/images/bb-seok/post/62760ea0-e0c6-41d6-853f-74913328928e/image.png)

&lt;br&gt;

2. 쉘 스크립트 생성

- prebuild 안에 01_configure_swap_space.sh 

![](https://velog.velcdn.com/images/bb-seok/post/984601e4-3238-48ad-a0de-1b10d6a8a724/image.png)
&lt;br&gt;

3. 쉘 스크립트 안에 코드 작성

![](https://velog.velcdn.com/images/bb-seok/post/0cb25907-dc72-40f9-959a-2644b2615e67/image.png)
&lt;br&gt;

4. 실행 권한 설정

- chmod +x .platform/hooks/prebuild/01_configure_swap_space
![](https://velog.velcdn.com/images/bb-seok/post/c7578342-dfd9-409c-8eb5-bc0575d41609/image.png)
&lt;br&gt;

5. npm run build 명령 실행

- 위 명령어를 통해 frontend - build 라는 폴더 안에 생성한다.
&lt;br&gt;

6. 빌드 완료 후 Commit

- git add -A &amp;&amp; git commit -m &quot;frontend deployment&quot;

- Repository가 없는 경우 git init을 통한 초기화를 해야 한다.
![](https://velog.velcdn.com/images/bb-seok/post/4e77245b-1daa-4889-89a4-227fd4d6acd8/image.png)
&lt;br&gt;

7. eb 생성

- eb create --elb-type application --instance-type t3.micro

- backend와 마찬가지로 Elastic beanstalk 설정

- 완료되면 Elastic beanstalk - 구성 - 생성환 환경 클릭

- 도메인 링크를 클릭하여 잘 작동되는지 확인
![](https://velog.velcdn.com/images/bb-seok/post/a1513a82-88fe-4bf0-82ad-3a46e55d6e3e/image.png)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS] Elastic beanstalk 1]]></title>
            <link>https://velog.io/@bb-seok/AWS-Elastic-beanstalk-1</link>
            <guid>https://velog.io/@bb-seok/AWS-Elastic-beanstalk-1</guid>
            <pubDate>Tue, 20 Aug 2024 05:33:02 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="aws-보안-강화">AWS 보안 강화</h2>
</blockquote>
<ol>
<li>보안 그룹 설정</li>
</ol>
<ul>
<li><p>AWS에서는 여러가지 보안 구조를 가지고 있는데 그 중에 처음이 바로 보안 그룹이다.</p>
<br>
</li>
<li><p>보안 그룹은 EC2를 비롯한 각 리소스에 설정하는 가상 방화벽과 같은 개념이다</p>
<br>
</li>
<li><p>보안 그룹에는 허용할 트래픽을 등록하고, 그 내용을 인스턴스에 적용하는 것이다.</p>
<br>
</li>
<li><p>하나의 룰에는 &quot;Procotocol&quot;과 &quot;Source&quot;를 인바운드/아웃바운드 별로 지정하여
허용할 트래픽을 설정한다.</p>
<br>
</li>
</ul>
<ol start="2">
<li>EBS 암호화(**)</li>
</ol>
<ul>
<li><p>볼륨 암호화는 cryptsetup 명령어나 서드파티(third party)도구 등 여러가지 방법이 있지만,
EBS에는 볼륨을 암호화하는 옵션이 준비되어 있다.</p>
<br>
</li>
<li><p>EBS 암호화 기능에는 사용자의 키 관리나 암호화/복호화를 신경쓰지 않아도 된다.</p>
<br>
</li>
<li><p>EBS를 암호화 하려면 EBS Volumes 메뉴에서 Create Volume을 클릭하고, 볼륨 생성 메뉴에서
Encrypt this Volume을 선택하면 된다.
이렇게 생성된 암호화된 EBS 볼륨에서 생성된 스냅샷이나 그 스냅샷으로 복원된 볼륨은 똑같이 암호화 된다.</p>
<br>
</li>
<li><p>EBS 암호화를 사용할 수 있는 인스턴스 타입은 AWS 문서를 참고하자<br><a href="https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/EBSEncryption.html">https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/EBSEncryption.html</a></p>
<br>

</li>
</ul>
<p><strong>IAM</strong></p>
<ul>
<li>AWS에서 사용자와 인증 정보, 리소스 액세스 제어 등을 관리하기 위한
IAM(Identity and Access Management) 서비스<br>

</li>
</ul>
<p><strong>VPC(Virtual Private Cloud)</strong></p>
<ul>
<li><p>AWS 내부에 정의할 수 있는 가상 네트워크</p>
</li>
<li><p>VPC를 이용하면 네트워크 게이트웨이나 서브넷, VPN, 라우팅 제어 등 보다 상세한 네트워크
레벨의 보안 설정이 가능하다.</p>
<br>

</li>
</ul>
<p><strong>CloudHSM</strong></p>
<ul>
<li><p>AWS에서는 CloudHSM(Cloud Hardware Security Module)이라는 서비스가 존재한다.</p>
</li>
<li><p>전용 하드웨어 기업과 법률적으로 컴플라이언스 요건을 만족하는 데이터 보안</p>
<br>

</li>
</ul>
<p><strong>서드 파티 보안 도구</strong></p>
<ul>
<li><p>AWS 이외에 벤더 제품도 AWS 안에서 그대로 사용할 수 있다.</p>
</li>
<li><p>AWS에서 사용할 수 있게 AWS 환경에서 최적화된 보안용 제품을 제공한다.</p>
</li>
</ul>
<pre><code>- 안티 바이러스
인스턴스 OS에 바이러스 감염을 방지. Trend Micro Server Portect 등 제품


- IDS/IPS
DMZ나 사내 시스템에 대한 네트워크 패킷 감시 등을 하고 부정침입을 확인하여 차단하는 시스템
웹 서버 등에 직접 설치하는 타입과 전용 인스턴스를 가지고 네트워크를 감시하는 타입이 존재
DoS 공격, Syn Flooding 공격 등을 방지.

Trend Micro Deep Security, Snort, Imperva, SecureSphere, CheckPoint Virtual Application 제품.


- WAF(Web Application Firewall)
AWS 기능으로 할 수 없는 애플리케이션 레이어에서 통신을 감시하고, 부정 공격을 감지/방어하는
시스템.
노출되어 있는 웹 서버 등에 대한 SQL 인젝션이나 XSS, OS 명령어 인젝션 등을 방지.
Barracuda WAF, F5 BIG-IP ASM, Imperva SecureSphere WAF, SiteGuard 등의 제품.
(2015년 말에 AWS WAF 서비스가 출시되어  CloudFront와 연동하여 사용이 가능)


- UTM
방화벽, 안티 바이러스, IDS/IPS, WAF 등 기능을 하나의 상품으로 통합한 보안 시스템.
(Sophos UTM, FortiGate 등 제품)

=&gt; 이런 제품들이 AWS에서 사용할 수 있게 최적화된 제품에는 아마존 마켓 플레이스에서
AMI 형태로 판매되는 제품도 있다.
</code></pre><br>

<blockquote>
<h3 id="route53-개요">Route53 개요</h3>
</blockquote>
<p>웹 사이트와 웹 시스템을 구축할 때에 외부에 그 사이트를 공개한다.
이때 공개 시에 공개용 IP를 할당하여 사용하고, 이를 외부에서 접속하게 만들어준다.</p>
<p>IP 숫자는 기억하기 어렵고, 문자는 기억하기 쉽다는 특징을 이용한 서비스가 DNS이다.
때문에 DNS 서비스를 통해서 외부 웹사이트에 쉽게 접속할 수 있다.
<br></p>
<p><strong>AWS의 Route53은 이런 웹 기반 DNS 서비스를 의미한다.</strong></p>
<ul>
<li><p>Route53은 EC2와 같이 리전 별로 제공되는 서비스가 아닌 전세계에 설치되어 있는 Edge Location 기반으로 제공되는 서비스이다.</p>
<br>
</li>
<li><p>Anycast IP 주소 구조를 이용하여 전 세계의 Edge Location 중 가장 가까운 로케이션에서
응답을 주게 되어있어 아주 빠르고, 가용성이 높으며 확장성이 뛰어난 구조를 가지고 있다.</p>
<br>
</li>
<li><p>Route53도 다른 서비스와 마찬가지로 API로 조작이 가능하다. (AWS CLI)</p>
<br>
</li>
<li><p>BIND의 경우 nsupdate 명령어를 위해 손이 많이 가는 설정을 해야하거나 MyDNS처럼 백엔드에
RDBMS(Relational DataBase Management System)를 가진 DNS 서버로 관리해야 하는
불편함이 있었다.</p>
<br>
</li>
<li><p>Route53은 이 설정들을 API로 할 수 있어 초기 비용이나 운용 비용을 고려해도 매우 좋은
서비스라고 할 수 있다.
기존 DNS 서버 운용에서 패치 등의 작업으로 어려움이 있는 경우에 추천할 서비스이다.</p>
<br>

</li>
</ul>
<blockquote>
<h3 id="route53-주요-개념">Route53 주요 개념</h3>
</blockquote>
<ol>
<li><p>Hosted Zone
Hosted Zone은 다른 DNS 시스템에 있는 Zone파일과 같이 관리되는 DNS 레코드의 집합이다.</p>
<pre><code>DNS 레코드란?
DNS 질의에 응답을 위해서 알고있는 정보를 저장한 데이터를 말한다.
(A, AAAA, MX, NS, SRV, CNAME, ...)</code></pre><br>
</li>
<li><p>Record Set
DNS 레코드로 Routing Policy와 Set ID, Health Check 설정과 Record를 전부 포함한다.</p>
<br>
</li>
<li><p>Routing Policy
Route53이 Record Set에 대해서 어떻게 라우팅할지 결정하는 것.
일반적으로 &#39;Simple&#39;이라는 정책을 이용하면 일반적인 DNS 서버와 같게 동작한다.
&#39;Weighted(가중치 기반)&#39;, &#39;Latency(지연 시간 기반 라우팅)&#39;, &#39;Failover(DNS Failover),
&#39;Geolocation(Geo Routing)&#39;</p>
<br>
</li>
<li><p>Set ID
Routing Policy를 이용해 복수의 Record Set을 같은 이름으로 설정한 경우, 각각을 구별하여
인식하기 위해서 설정하는 ID</p>
<br>
</li>
<li><p>Health Check
호스트 상태를 확인하기 위한 설정
DNS Failover를 사용하는 경우 Health Check가 필요하다.
(HTTP/HTTPS/TCP)</p>
<br>

</li>
</ol>
<blockquote>
<h3 id="route53-주요-기능">Route53 주요 기능</h3>
</blockquote>
<ul>
<li><p>Route53이 제공하는 것은 IP 주소와 도메인명 매핑 등을 관리하는 데이터베이스로서의 역할인
&#39;권한 네임 서버&#39; 기능이다.</p>
<br>
</li>
<li><p>권한 네임 서버에 들어오는 질의 결과를 캐시하는 기능인 &#39;캐시 네임 서버&#39;로의 기능은 제공하지
않는다.</p>
<br>
</li>
<li><p>BIND에서는 설정에 따라서 두 기능을 모두 제공하지만, Route53은 권한 네임 서버 기능만
있다는 것을 기억하자.</p>
<br>
</li>
<li><p>Route53은 권한 네임 서버로의 기능 뿐만 아니라 웹 사이트나 웹 시스템을 서비스로 제공할 때에 편리한 기능을 가지고 있다.
DNS 레지스트리 기능도 제공하고 있어 &#39;.com&#39;이나 &#39;.jp&#39; 등 구매할 수 있는 도메인이라면
Route53으로 등록이 가능하다.
또, 다른 DNS 레지스트리에서 도메인을 이관(transfer)하는 것도 가능하여 도메인에 관한
모든 것을 Route53에서 집중 관리할 수 있다.</p>
<br>

</li>
</ul>
<p><strong>1. 지연 시간 기반 라우팅(LBR; Latency Based Routing)</strong></p>
<ul>
<li>Record Set의 Routing Policy를 &#39;Latency&#39;로 설정
같은 이름으로 된 여러 리전에 존재하는 EC2 인스턴스 공인 IP 주소나 ELB에 대해 보다 빠른
리전을 선택하여 요청을 라우팅 해주는 기능.
복잡한 설정은 없고, Route53만으로 전 세계의 어떤 사용자에게도 가장 빠른 응답이 가능하다.<br>

</li>
</ul>
<p><strong>2. 가중치 라운드 로빈(WRR; Weighted Round Robin)</strong></p>
<ul>
<li>Record set의 Routing Policy를 &#39;Weighted&#39;로 설정
지연 시간 기반 라우팅에서는 같은 이름이 설정된 대상에 대해서 Route53이 지연 시간에 따라
분배하는데, 가중치 라운드 로빈에서는 대상의 가중치를 두어 총 합계에서 지정한 가중치의 시간
비율로 전송 비율을 결정.
가중치를 0으로 하면 라우팅이 되지 않는다.
웹 사이트의 이전 작업 등에서 천천히 사이트를 이전하고 싶은 경우 사용할 수 있다.</li>
</ul>
<p>=&gt; DB 접속이 필요한 경우에는 별도의 데이터 동기 방법도 검토해야 한다.
<br></p>
<p><strong>3.DNS Failover</strong></p>
<ul>
<li>Record Set의 Routing Policy를 &#39;Failover&#39;로 설정하며 구현
Record Set을 설정할 때에 같은 이름으로 Primary와 Secondary 두 가지 세트를 생성하면
평소에는 Primary로 라우팅이 되고, 이 때에 Primary 설정된 쪽에 Health Check에 문제가
발생하면 Secondary로 라우팅한다.</li>
</ul>
<p>=&gt; 이 기능을 사용하면 서비스 중인 서버나 서버 군에 장애가 발생하더라도 Sorry 페이지를
제공할 수 있도록 별도로 준비한 서버로 라우팅을 간단히 만들 수 있다.
<br></p>
<p><strong>4. Geo Routing</strong></p>
<ul>
<li>Record Set의 Routing Policy를 &#39;Geolocation&#39;으로 설정하며 구현.
지연 시간 기반 라우팅이 엔드포인트와 지연 시간을 줄이도록 라우팅해 주었다면, Geo Routing에선 DNS 질의가 있는 장소에 따라 대상을 바꿀 수 있다.<br>

</li>
</ul>
<pre><code>예를 들어 아시아에서의 요청이라면 서울 리전 EC2로 전송하고, 북아메리카에서 요청하면 버지니아
리전의 EC2로 전송하도록 설정할 수 있다.
지정한 장소와 맞지 않는 경우를 대비하여 기본 설정을 해두는 것이 좋다.</code></pre><br>

<blockquote>
<h3 id="aws-서비스와-연계">AWS 서비스와 연계</h3>
</blockquote>
<p>Route53은 DNS 서비스 자체만으로도 좋은 서비스이지만, S3나 CloudFront, ELB와 조합하여
사용하면 보다 편리한 이용이 가능하다.
이런 경우를 위해 사용하는 기능이 Route53 자체 레코드 타입인 ALIAS 레코드다.
<br></p>
<pre><code>- ALIAS Record

CNAME 레코드와 같이 별명으로 지정하면서도 A Record와 같은 직접 IP 주소와 매핑을 하는 것이다.
ALIAS Record가 지정할 수 있는 것은 AWS가 제공되는 서비스에 할당된 일부 DNS명에 대해서
가능하다.</code></pre><br>

<p><strong>지원하는 레코드 타입</strong></p>
<ol>
<li>A(Address Record)</li>
</ol>
<ul>
<li>호스트명과 IPv4의 IP 주소를 매핑<br>
</li>
</ul>
<ol start="2">
<li>AAAA(IPv5 Address Record)</li>
</ol>
<ul>
<li>호스트명과 IPv6의 IP 주소를 매핑
(AWS 서비스에서는 IPv6를 지원하는 것은 EC2-Classic ELB만 지원)<br>
</li>
</ul>
<ol start="3">
<li>CNAME(Cannonical Name Record)</li>
</ol>
<ul>
<li>다른 DNS 별명을 설정한다.<br>
</li>
</ul>
<ol start="4">
<li>MX(Mail Exchange Record)</li>
</ol>
<ul>
<li>메일 서버명 목록을 설정한다.<br>
</li>
</ul>
<ol start="5">
<li>NS(Name Server Record)</li>
</ol>
<ul>
<li><p>도메인의 위임된 네임 서버(권한 네임서버)명을 설정</p>
</li>
<li><p>Route53에서는 Zone Apex의 NS레코드가 기본으로 설정되어 평소에는 변경할 필요가 없다.</p>
</li>
<li><p>서브 도메인을 다른 계정이나 다른 Hosted Zone으로 관리하는 경우, 서브 도메인을 NS레코드로
설정해야 한다.</p>
<br>
</li>
</ul>
<ol start="6">
<li>PTR(Pointer Record)</li>
</ol>
<ul>
<li><p>주로 역질의(IP 주소를 DNS 명으로 매핑)를 한다.
실제 IP 주소를 직접 지정하지 않는다.</p>
</li>
<li><p>aaa.bbb.ccc.ddd라면 ddd.ccc.bbb.aaa.in.addr.arpa.와 같은 형식으로 다른 DNS명으로
별칭 지정한다.</p>
<br>
</li>
</ul>
<ol start="7">
<li>SOA(Start of Authority Record)</li>
</ol>
<ul>
<li>Zone에 관한 정보를 지정.
Primary Name Server, 도메인 관리자의 이메일 주소, 시리얼 번호, 갱신 간격과 캐시 유효기간
등을 지정한다.<br>
</li>
</ul>
<ol start="8">
<li>SPF(Sender Policy Framework Record)</li>
</ol>
<ul>
<li>IP 주소로 전자 메일의 송신 도메인 인증 기술인 SPF에 관해 기술한다.
RFC4408에서는 SPF레코드 사용이 추천되지만, SPF레코드가 지원하는 DNS 서버와 resolver가
존재하여 TXT레코드에서도 같은 내용을 지정하는 것이 좋다.<br>
</li>
</ul>
<ol start="9">
<li>SRV(Service Locator Record)</li>
</ol>
<ul>
<li><p>RFC2219에 기록되어 있는 서비스와 별칭 지원은 well known port 이외의 포트로 운영되는
경우 포트 번호를 알 수 없다.</p>
</li>
<li><p>SRV레코드에서는 포트 번호 통지뿐 아니라 MX레코드처럼 부하 분산과 이중화 구성이 가능하다.</p>
</li>
<li><p>Active Directory에서는 이 SRV레코드가 이용된다.</p>
<br>
</li>
</ul>
<ol start="10">
<li>TXT(Text Record)</li>
</ol>
<ul>
<li><p>텍스트 정보를 제공하기 위한 레코드.
최근에는 SPF나 전자 서명을 이용한 송신 도메인 인증인 DKIM(DomainKeys Identified Mail)를 설정하기 위해 이용된다.</p>
</li>
<li><p>Route53에서는 255문자를 넘는 TXT레코드를 1 레코드로 기술하는 경우 주의가 필요하다.</p>
<br>

</li>
</ul>
<blockquote>
<h3 id="gui로-설정하기">GUI로 설정하기</h3>
</blockquote>
<ol>
<li><p>AWS Elastic beanstalk로 이동</p>
<br>
</li>
<li><p>Application 생성</p>
</li>
</ol>
<ul>
<li><p>애플리케이션 정보 : 애플리케이션의 이름을 입력</p>
</li>
<li><p>환경 정보
환경 이름 확인 또는 수정
도메인을 사용하고 싶은 경우에 값을 입력한 후 &quot;가용성 확인&quot; 버튼으로 확인</p>
</li>
<li><p>플랫폼
배포 환경에 맞는 플랫폼 선택
예제가 Tomcat인 관계로 해당 내용으로 플랫폼 설정</p>
<br>
</li>
<li><p>애플리케이션 코드
샘플 애플리케이션 선택
만약 버전 및 다른 설정이 되어 있다면, 환경에 맞게 코드 사용</p>
<br>
</li>
<li><p>사전 설정
현 상황에 맞는 내용을 선택(현재는 단일 인스턴스)</p>
<br>
</li>
</ul>
<ol start="3">
<li>네트워킹, 데이터베이스 및 태그 설정</li>
</ol>
<pre><code>&gt; Virtual Private Cloud 설정
=&gt; 기존 VPC 혹은 새롭게 생성

&gt; 인스턴스 설정
    - 퍼블릭 IP 주소 : 활성화됨
    - 인스턴스 서브넷 : 전체 선택

&gt; 데이터베이스
    -&gt; 활성화 (사용할 경우)
    DB 설정 정보 입력</code></pre><br>

<ol start="4">
<li><p>인스턴스 트래픽 및 크기 조정 구성</p>
<pre><code>&gt; 인스턴스
&gt; 용량</code></pre><br>
</li>
<li><p>업데이트, 모니터링 및 로깅 구성</p>
<pre><code>&gt; 모니터링
&gt; 관리형 플랫폼 업데이트
&gt; 이메일 알림
&gt; 롤링 업데이트 및 배포
&gt; 플랫폼 소프트웨어
 - Nginx 서버로 설정 - apache를 사용해도 된다.</code></pre></li>
</ol>
<p>=&gt; 동작 확인 후 정상적인 배포가 끝나면 샘플 웹 페이지가 동작한다.
<br></p>
<p><strong>배포할 war파일의 설정을 확인</strong></p>
<ul>
<li>HealthTest를 위한 Controller를 설정
=&gt; webroot로 접근 시 접속 확인을 통한 서버 동작 확인. 이를 위한 설정.</li>
</ul>
<pre><code>&gt;&gt; HealthController
package com.zerock.springex.controller;

import org.springframework.web.bind.annotation.*;

@RestController
public class HealthController {

  @GetMapping(&quot;/&quot;)  //GET방식일 때...
  public String health() {
      return &quot;this server is running&quot;;
  }
}</code></pre><p>=&gt; 환경에서 &quot;배포 업데이트&quot; 버튼 클릭. 배포할 파일을 선택한 후에 처리
<br></p>
<p>예제의 경우 DB문제가 발생해서 다음과 같이 EC2에 접근하여 DB내용을 추가하였다.</p>
<pre><code>============MySQL 명령=================
&gt; 1.  설치(mysql client 설치)
sudo yum install mariadb105

&gt; 2. DB연결
mysql -h [db주소-엔드포인트 주소] -u [계정] -p 
패스워드 입력

&gt; 3. DB생성
&gt; create database webdb;

&gt; 4. DB 이동하기
&gt; use webdb;

&gt; 5. sql파일 임포트 하기
MySQL [webdb]&gt; source Dump20240725/webdb_apiuser.sql
MySQL [webdb]&gt; source Dump20240725/webdb_board.sql
...
또는 파일 내용을 복사 붙여넣기</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 리눅스 쉘 스크립트 2]]></title>
            <link>https://velog.io/@bb-seok/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%89%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-2</link>
            <guid>https://velog.io/@bb-seok/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%89%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-2</guid>
            <pubDate>Tue, 20 Aug 2024 03:10:57 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="while문">While문</h2>
</blockquote>
<p>조건식이 참인 동안 계속 반복하는 구문
<br></p>
<pre><code>[형식]
  while [ 조건식 ]
  do
     반복할 내용들....
  done</code></pre><br>

<p>1-1. while문 테스트
<img src="https://velog.velcdn.com/images/bb-seok/post/47596650-19c8-4bb8-9a39-ab10a889dc5f/image.png" alt=""></p>
<p><strong>조건식이 거짓인 경우 : 값이 없는 경우, 비교 연산 자체가 틀린경우</strong>
<br></p>
<p>1-2. 결과 출력
<img src="https://velog.velcdn.com/images/bb-seok/post/d81c2414-f243-4fcc-bcbd-ce19842f37ed/image.png" alt="">
<br></p>
<p>2-1. while문2 테스트
<img src="https://velog.velcdn.com/images/bb-seok/post/af845f91-b5b6-4213-8c58-a026d02c7299/image.png" alt="">
<br></p>
<p>2-2. 결과 출력
<img src="https://velog.velcdn.com/images/bb-seok/post/cae6b50f-d2b8-496e-bfb5-4961bf7ac6cd/image.png" alt="">
<br></p>
<blockquote>
<h3 id="until">until</h3>
</blockquote>
<p>while문과 용도와 동작의 거의 비슷하다.
단, 조건식이 참이 아닌 거짓일 경우에 반복한다.
<br></p>
<ul>
<li><p>until 테스트
<img src="https://velog.velcdn.com/images/bb-seok/post/70e1c295-9518-43f2-8d69-8587845a8bf0/image.png" alt=""></p>
<br>
</li>
<li><p>결과 출력
<img src="https://velog.velcdn.com/images/bb-seok/post/34382069-358f-4cb9-8bae-b9c5bd00c072/image.png" alt=""></p>
<br>

</li>
</ul>
<blockquote>
<h3 id="break-continue-exit-return">break, continue, exit, return</h3>
</blockquote>
<ul>
<li><p>break
주로 반복문에서 사용하고 종료할 경우에 사용</p>
<br>
</li>
<li><p>continue
반복문의 조건식으로 되돌리는 경우 사용</p>
<br>
</li>
<li><p>break 테스트
<img src="https://velog.velcdn.com/images/bb-seok/post/8761ab54-45cf-44f7-a58e-ee92478fbc13/image.png" alt=""></p>
<br>
</li>
<li><p>결과 출력
<img src="https://velog.velcdn.com/images/bb-seok/post/7641912d-b0c7-4755-9205-cd1826e3bc8e/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>continue 테스트
<img src="https://velog.velcdn.com/images/bb-seok/post/670bab20-15d1-4b5a-981c-35986f3be60e/image.png" alt=""></p>
<br>
</li>
<li><p>결과 출력
<img src="https://velog.velcdn.com/images/bb-seok/post/082611b5-9726-4c9b-9896-893e376b7473/image.png" alt=""></p>
<br>

</li>
</ul>
<blockquote>
<h3 id="사용자정의-함수">사용자정의 함수</h3>
</blockquote>
<p>사용자가 직접 함수를 작성하고 호출하여 사용</p>
<pre><code>[형식]
    =함수정의=
   함수이름 () {
      함수에서 동작할 내용들.... 
   }

    =함수호출=
   함수이름</code></pre><br>

<ul>
<li><p>사용자정의 함수 테스트 1
<img src="https://velog.velcdn.com/images/bb-seok/post/be547d77-e395-4154-97eb-3a0bd37aaf0b/image.png" alt=""></p>
<br>
</li>
<li><p>출력 결과
<img src="https://velog.velcdn.com/images/bb-seok/post/bfe8f919-995a-4879-a56f-d294860ac028/image.png" alt=""></p>
<br>

</li>
</ul>
<blockquote>
<h3 id="parameter인자를-이용하는-함수">Parameter(인자)를 이용하는 함수</h3>
</blockquote>
<ul>
<li><p>함수의 파라미터를 사용하면 함수를 호출할 때 뒤에 파라미터를 붙여서 호출</p>
</li>
<li><p>넘겨진 파라미터 사용은 $1, $2, $3, ...으로 특수한 변수 값을 이용하여 불러와 사용한다.</p>
</li>
</ul>
<pre><code>[형식]
   ==함수 정의==
   함수이름 () {
      $1, $2, $3과 같이 특수변수를 사용하여 
      함수 동작 내용을 작성  
   }

   ==함수 호출==
   함수이름 인자1 인자2 인자3 ....</code></pre><br>

<ul>
<li><p>파라미터를 이용한 함수 테스트
<img src="https://velog.velcdn.com/images/bb-seok/post/f84267e2-26bc-497d-8523-d0bd0b2d1323/image.png" alt=""></p>
<br>
</li>
<li><p>출력 결과
<img src="https://velog.velcdn.com/images/bb-seok/post/054111b3-ac6c-49ea-8b69-901982423ffd/image.png" alt=""></p>
<br>

</li>
</ul>
<blockquote>
<h3 id="eval">eval</h3>
</blockquote>
<ul>
<li><p>문자열을 명령문으로 인식하고 실행시키는 명령</p>
<br>
</li>
<li><p>eval 테스트
<img src="https://velog.velcdn.com/images/bb-seok/post/9fbcbbf6-37ab-4b13-a0e8-4d973948be6b/image.png" alt=""></p>
<br>
</li>
<li><p>출력 결과
<img src="https://velog.velcdn.com/images/bb-seok/post/7bca4aff-a6e8-4efd-98a7-96f8f403a071/image.png" alt=""></p>
<br>

</li>
</ul>
<blockquote>
<h3 id="export">export</h3>
</blockquote>
<ul>
<li><p>외부 변수로 선언한다.
선언된 변수를 다른 프로그램에서도 사용할 수 있게 한다.</p>
<br>
</li>
<li><p>export를 사용했을 때와 사용하지 않았을 때 차이
<img src="https://velog.velcdn.com/images/bb-seok/post/3808fb88-9579-4582-9d6f-7ab5d3bde747/image.png" alt="">
<img src="https://velog.velcdn.com/images/bb-seok/post/5ed3253a-2b10-4d3c-8c51-4a57721120d7/image.png" alt=""></p>
<br>
</li>
<li><p>출력 결과
<img src="https://velog.velcdn.com/images/bb-seok/post/441d5a45-b685-451c-ba11-c3e5cfd94198/image.png" alt=""></p>
<br>

</li>
</ul>
<blockquote>
<h3 id="printf">printf</h3>
</blockquote>
<p>C언어의 printf() 함수와 비슷하게 형식을 지정하여 사용할 수 있다.
<br></p>
<ul>
<li><p>printf 테스트
<img src="https://velog.velcdn.com/images/bb-seok/post/9d268576-7095-43e0-9398-246efce71124/image.png" alt=""></p>
<br>
</li>
<li><p>결과 출력
<img src="https://velog.velcdn.com/images/bb-seok/post/5b439a64-73b9-4444-a36c-c594cfea9a56/image.png" alt=""></p>
</li>
</ul>
<p>** 주의 !!
왜 &quot;$var2&quot;라고 했을까?
이유는 문자열의 공백이 구분값으로 동작하기 때문에 &quot;&quot;, &quot;로 묶어서 사용해야 한다.
<br></p>
<blockquote>
<h3 id="set과-명령">set과 $(명령)</h3>
</blockquote>
<p>리눅스 명령을 결과로 사용하려면 &#39;$(명령)&#39; 형식을 사용해야 한다.
또, 결과를 파라미터로 사용하고자 할 때에는 set 명령과 함께 사용한다.
<br></p>
<ul>
<li><p>$(명령)과 set 테스트
<img src="https://velog.velcdn.com/images/bb-seok/post/dd683db1-fa7c-447c-808e-2371b14378ae/image.png" alt=""></p>
<br>
</li>
<li><p>출력 결과
<img src="https://velog.velcdn.com/images/bb-seok/post/f75688b3-7421-4f58-a563-316cba58ed60/image.png" alt=""></p>
<br>

</li>
</ul>
<blockquote>
<h3 id="shift">shift</h3>
</blockquote>
<p>파라미터 변수를 왼쪽으로 한 단계씩 아래로 이동시키는 명령어
<br></p>
<ul>
<li><p>shift 테스트
<img src="https://velog.velcdn.com/images/bb-seok/post/c33d532e-be14-4ad6-b959-5087f53ad489/image.png" alt=""></p>
<br>
</li>
<li><p>출력 결과
<img src="https://velog.velcdn.com/images/bb-seok/post/b3002537-2cac-41b4-974b-aff07ace5d26/image.png" alt=""></p>
<br>








</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 리눅스 쉘 스크립트 1]]></title>
            <link>https://velog.io/@bb-seok/Linux-Linux-Shell-Script</link>
            <guid>https://velog.io/@bb-seok/Linux-Linux-Shell-Script</guid>
            <pubDate>Tue, 20 Aug 2024 02:43:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="리눅스의-쉘-스크립트">리눅스의 쉘 스크립트</h2>
</blockquote>
<ul>
<li>bash, tsch, zsh, ... 등의 쉘을 이용한 프로그래밍을 의미한다.<br>

</li>
</ul>
<p><strong>쉘 프로그래밍을 위한 변수와 특수 변수</strong></p>
<ol>
<li>일반 변수</li>
</ol>
<ul>
<li><p>변수의 선언 및 초기화</p>
<pre><code>변수명 = 값
ex) # hello = 안녕하세요</code></pre><br>
</li>
<li><p>변수값 참조(변수 불러오기)</p>
<pre><code>$변수명, $(변수명)</code></pre><br>
</li>
<li><p>expr
문자형 변수를 정수처럼 형변환하여 계산이 가능하게 만들어준다.
이 명령어를 사용하지 않으면 문자로 처리한다.</p>
<br>
</li>
</ul>
<ol start="2">
<li>특수 변수</li>
</ol>
<ul>
<li>일반적인 변수와 다르게 이미 정해진 의미를 가지고 이용되는 변수들이 있다.<pre><code>#!/bin/bash
=&gt; 실행하려는 스크립트를 지정하고 동작하게 해준다.</code></pre><br>

</li>
</ul>
<p><strong>- 특수 변수 종류</strong></p>
<ol>
<li><p>$#
명령 입력 라인에서 입력된 인자의 갯수를 저장</p>
<br>
</li>
<li><p>$*
명령 입력 라인에서 입력된 인자 전체가 저장</p>
<br>
</li>
<li><p>$@
명령 입력 라인에서 입력된 인자 전체 저장</p>
<br>
</li>
<li><p>$$
쉘 프로그램이 실행되면 사용된 프로세스 ID값을 저장하는 변수</p>
<br>
</li>
<li><p>$!
쉘 프로그램이 실행되면서 실행시킨 백그라운드 프로세스 ID 값을 저장하는 변수</p>
<br>
</li>
<li><p>$?
최근 실행된 명령어의 리턴값을 저장하고 있다.</p>
<br>

</li>
</ol>
<p><strong>- 특수 변수의 사용 예시</strong>
<img src="https://velog.velcdn.com/images/bb-seok/post/6c5761e8-74b0-4720-a177-be6451d016c7/image.png" alt=""></p>
<ul>
<li>출력 결과
<img src="https://velog.velcdn.com/images/bb-seok/post/a85edd59-1a4b-4db4-a831-fe1a1bb80d46/image.png" alt=""></li>
</ul>
<br>

<ol start="3">
<li>환경 변수</li>
</ol>
<ul>
<li>시스템 구동 시 사용하는 운영을 위한 변수
(bash의 주요 환경 변수)<br>

</li>
</ul>
<p><strong>- 환경 변수의 종류</strong></p>
<pre><code>HOME   : 현재 사용자의 홈디렉터리

PATH   : 실행파일을 찾는 디렉터리 경로

LANG   : 기본 지원되는 언어

PWD   : 사용자의 현재 작업 디렉터리

TERM   : 로그인 터미널 타입

SHELL   : 로그인해서 사용하는 쉘

USER   : 현재 사용자의 이름

DISPLAY   : X디스플레이 이름

COLUMNS : 현재 터미널의 컬럼 수 

LINES   : 현재 터미널의 라인 수 

PS1   : 1차 명령 프롬프트 변수

PS2   : 2차 명령 프롬프트(대개는 &quot;&gt;&quot;)

BASH   : bash쉘의 경로

BASH_VERSION : bash버전

HISTFILE   : 히스토리 파일의 경로

HISTSIZE   : 히스토리 파일에 저장되는 개수

HOSTNAME : 호스트의 이름

USERNAME : 현재 사용자의 이름

LOGNAME : 로그인 이름

LS_COLORS : ls 명령어의 확장 색상 옵션

MAIL   : 메일을 보관하는 경로

OSTYPE   : 운영체제 타입</code></pre><br>

<ul>
<li>사용 예시</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/c7f6f8ea-3c15-4d19-9c5d-0e69f9bd0d5d/image.png" alt=""></p>
<br>

<blockquote>
<h3 id="조건문-if문과-case문">조건문 (if문과 case문)</h3>
</blockquote>
<ul>
<li>기본 if문
조건식의 참과 거짓을 판별
조건이 참이면 실행<br>

</li>
</ul>
<pre><code>[형식]
  if [ 조건 ]
  then
     참일 경우 실행 내용
  fi
**주의] 조건 부분인 &quot;[ 조건 ]&quot; 각 내용 사이에는 공백 이 존재함. </code></pre><br>

<p>if문 스크립트 작성
<img src="https://velog.velcdn.com/images/bb-seok/post/39743369-5fe2-4370-8dfa-c55f12a4cc84/image.png" alt="">
<br></p>
<p>if문 출력 결과
<img src="https://velog.velcdn.com/images/bb-seok/post/6a9b4389-41a5-49a8-a5bc-eec15b9500cf/image.png" alt=""></p>
<ul>
<li>if ~ else문<pre><code>[형식]
if [ 조건 ] 
then
  참일 경우 실행 내용
else
  거짓인 경우 실행 내용
fi</code></pre><br>

</li>
</ul>
<p>if ~ else문 스크립트 작성
<img src="https://velog.velcdn.com/images/bb-seok/post/00ab1419-844c-466c-b05e-9842c1550a6d/image.png" alt="">
<br></p>
<p>if ~ else문 출력 결과
<img src="https://velog.velcdn.com/images/bb-seok/post/43b431f7-895a-4c31-b475-0143d64d83ab/image.png" alt="">
<br></p>
<ul>
<li><p>조건문에 들어가는 비교 연산자</p>
<pre><code>[문자열 비교]
  &quot;A&quot;   ==   &quot;B&quot;   : 두문자열이 같으면 참 
  &quot;A&quot;   !=    &quot;B&quot;   : 두문자열이 다르면 참
  -n &quot;A&quot;   : 문자열이 NULL이 아니면 참
  -z &quot;A&quot;   :  문자열이 NULL이면 참

         *NULL : 빈문자

</code></pre></li>
</ul>
<p>[산술 비교]
   수식1 -eq 수식2   : 두 수식이 같으면 참
   수식1 -ne 수식2   : 두 수식이 다르면 참
   수식1 -gt 수식2   : 수식1이 크다면 참
   수식1 -ge 수식2   : 수식1이 크거나 같으면 참
   수식1 -lt 수식2   : 수식1이 작다면 참
   수식1 -le 수식2   : 수식1이 작거나 같다면 참
        !수식   : 수식이 거짓이면 참           </p>
<pre><code>&lt;br&gt;

비교연산자 사용 예시
![](https://velog.velcdn.com/images/bb-seok/post/3f696bb7-63e8-4eb6-a4ef-7e673b94abe3/image.png)
&lt;br&gt;

출력 결과
![](https://velog.velcdn.com/images/bb-seok/post/28116bbe-abc8-4332-9da4-8ba7b4626c2b/image.png)


&lt;br&gt;

- 파일과 관련된 조건</code></pre><p>  -d 파일이름   : 파일이 디렉터리면 참
  -e 파일이름   : 파일이 존재하면 참
  -f 파일이름   : 파일이 일반 파일이면 참
  -g 파일이름   : 파일에 set-group-id가 설정되면 참
  -r 파일이름   : 파일이 읽기 가능하면 참
  -s 파일이름   : 파일 크기가 0이 아니면 참
  -u 파일이름   : 파일에 set-user-id가 설정되면 참
  -w 파일이름   : 파일이 쓰기 가능한 상태면 참
  -x 파일이름   : 파일이 실행 가능 상태면 참</p>
<pre><code>&lt;br&gt;

파일 조건 테스트
![](https://velog.velcdn.com/images/bb-seok/post/6bfb171f-ecf1-45d6-9c01-dfcb7852a3fc/image.png)
&lt;br&gt;

출력 결과
![](https://velog.velcdn.com/images/bb-seok/post/93e848c3-1197-4c13-af0b-d9b07cbd66d4/image.png)


&lt;br&gt;

&gt;### case ~ esac문

- if문은 참과 거짓이라는 두 가지 경우에만 사용한다.
여러가지 경우의 수를 가지고 작업할 경우에 if를 중복해서 사용해야 하는데, 이때 if 대신
사용하는 것이 case문이고 다중 분기라고도 한다.
&lt;br&gt;

1-1. case문 사용 예시
![](https://velog.velcdn.com/images/bb-seok/post/2cb0e641-1e81-4a99-9ac4-3030e7346fea/image.png)
&lt;br&gt;

1-2. case문 출력 결과
![](https://velog.velcdn.com/images/bb-seok/post/fcee32c6-01df-4ce4-b2cd-03827c0f0bd3/image.png)
&lt;br&gt;

2-1. case문 사용 예시 2
![](https://velog.velcdn.com/images/bb-seok/post/ad393a39-b813-4f30-a4f5-0445212cdeb1/image.png)
&lt;br&gt;

2-2. case문 2 출력 결과
![](https://velog.velcdn.com/images/bb-seok/post/dd287dfb-f192-4f56-b17f-b7d3dc99f8b1/image.png)
&lt;br&gt;

&gt;### 반복문

1. for ~ in문

- for ~ in 구문은 각 변수의 값을 집어 넣은 후에 do에 있는 내용을 실행
이때 do는 반복 시 실행할 내용
</code></pre><p>[형식]
     for 변수 in 값1 값2 값3 값4 .... 
     do 
        반복할 문장....
     done</p>
<pre><code>&lt;br&gt;

1-1. for ~ in문 테스트

![](https://velog.velcdn.com/images/bb-seok/post/2a5e8fb6-aad8-4055-97c9-f417849de2de/image.png)
&lt;br&gt;

1-2. 출력 결과
![](https://velog.velcdn.com/images/bb-seok/post/20da2312-1161-40f6-b58c-36fd52f3ef77/image.png)
&lt;br&gt;

2-1. for ~ in문 2
![](https://velog.velcdn.com/images/bb-seok/post/620e3f5a-b216-44f9-8101-db7ced5f03e1/image.png)
&lt;br&gt;

2-2. 출력 결과
![](https://velog.velcdn.com/images/bb-seok/post/1b4559e7-3960-49f3-9e92-092d2828ce30/image.png)
&lt;br&gt;

&gt;## AWS CLI 설치하기(Home Directory)

1. python 설치(예제의 경우 python3)
&lt;br&gt;

2. curl &quot;https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip&quot; -o &quot;awscliv2.zip&quot;
&lt;br&gt;

3. unzip awscliv2.zip
=&gt; 이때 unzip이 not found이면 설치 - sudo apt install unzip
&lt;br&gt;

4. ls -ld aws*

- awscliv2가 압축 해제된 것을 확인한다.
&lt;br&gt;

5. sudo ./aws/install
&lt;br&gt;

6. aws --version 명령어 입력

- 버전과 함께 Python 정보가 출력되면 정상적으로 설치된 것이다.
&lt;br&gt;

&gt;### AWS CLI를 사용하기 위한 설정

1. AWS 홈페이지에서 IAM을 검색
&lt;br&gt;

2. 좌측 액세스 관리 탭에서 사용자 클릭
&lt;br&gt;

3. 사용자 생성 버튼 클릭
&lt;br&gt;

4-1. 사용자 이름 설정

4-2. 권한 설정(필요한만큼)

- 예제의 경우 AdministratorAccess 정책만 추가

4-3. 검토 및 생성
&lt;br&gt;

5. 생성한 사용자를 클릭
&lt;br&gt;

6-1. 액세스 키 생성
&lt;br&gt;

6-2. 액세스 키의 경우 Access Key/Secret Access Key 둘 다 생성된다.

- Secret Access Key의 경우 cvg 파일을 다운받던지 사용자가 알아서 관리해야 함
&lt;br&gt;

7. CLI 명령창에 aws configure 입력
&lt;br&gt;

8. AWS CLI 설정

- AWS Access Key ID(액세스 키)

- AWS Secret Access Key(비밀 액세스 키)

- Default region name(서울의 경우 ap-northeast-2)

- Default output format : json
&lt;br&gt;

&gt;### AWS CLI를 이용한 EC2 생성

1. key-pair 생성(ec2-create-keypair)</code></pre><p>[리눅스]</p>
<blockquote>
<p>aws ec2 create-key-pair --key-name test_cli_key --query &quot;KeyMaterail&quot; 
--output text &gt; test_cli_key.pem (test_cli_key.pem 생성확인)</p>
</blockquote>
<pre><code>&lt;br&gt;

2. security-group 생성(ec2 -&gt; create-security-group)
&lt;br&gt;

2-1. 그룹 생성</code></pre><blockquote>
<p>aws ec2 create-security-group --group-name cli_aws_securitygrp 
--description cli_aws_security_group</p>
</blockquote>
<p>{
    &quot;GroupId&quot;: &quot;sg-04129ec44e372a040&quot;
}</p>
<pre><code>&lt;br&gt;

2-2. 규칙 생성</code></pre><blockquote>
<p>aws ec2 authorize-security-group-ingress --group-id sg-0cdd74c92a19e3ad2 --protocol tcp --port 22 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id sg-0cdd74c92a19e3ad2 --protocol tcp --port 80 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id sg-0cdd74c92a19e3ad2 --protocol tcp --port 3000 --cidr 0.0.0.0/0</p>
</blockquote>
<pre><code>&lt;br&gt;

3. EC2 기동(aws ec2 run-instances)</code></pre><p>(기본 필요 옵션)
  --image-id : AMI ID -&gt; ami-04ea5b2d3c8ceccf8
  --instance-type : 인스턴스 타입  -&gt; t2.micro
  --security-group-ids : 보안 그룹 ID  -&gt; sg-04129ec44e372a040
  --key-name : 키 이름(key-pair)  -&gt; test_cli_key(.pem 생략 가능)
  --subnet-id : 서브넷 ID(VPC내에 있는 subnet을 구분하는 값)
    -&gt; subnet-07fef6c1eff10a532</p>
<blockquote>
<p>aws ec2 run-instances --image-id ami-04ea5b2d3c8ceccf8 --instance-type t2.micro 
    --security-group-ids sg-0cdd74c92a19e3ad2 --key-name test_cli_key2(.pem) 
    --subnet-id subnet-2577e34e</p>
</blockquote>
<pre><code>&lt;br&gt;

4. EC2 인스턴스 기동을 위한 태그 설정(aws ec2 create-tag)</code></pre><blockquote>
<p>aws ec2 create-tags --resources i-0fc7378442e12938a(인스턴스아이디) 
    --tags Key=Name,Value=First-ec2-CLI</p>
</blockquote>
<pre><code>&lt;br&gt;

5. EIP(Elastic IP) 할당 및 연결

- 할당 : aws ec2 allocate-address</code></pre><p>aws ec2 allocate-address</p>
<p>(결과)
{
    &quot;PublicIp&quot;: &quot;3.37.34.211&quot;,
    &quot;AllocationId&quot;: &quot;eipalloc-0313ee548d683413a&quot;,
    &quot;PublicIpv4Pool&quot;: &quot;amazon&quot;,
    &quot;NetworkBorderGroup&quot;: &quot;ap-northeast-2&quot;,
    &quot;Domain&quot;: &quot;vpc&quot;
}</p>
<pre><code>&lt;br&gt;

- 할당된 EIP와 인스턴스 연결(aws ec2 associate-address)</code></pre><blockquote>
<p>aws ec2 associate-address --allocation-id eipalloc-0313ee548d683413a 
    --instance-id i-0a12243dea8c2eab6</p>
</blockquote>
<p>(결과)
{
    &quot;AssociationId&quot;: &quot;eipassoc-04fe7116b36aa74cb&quot;
}    </p>
<pre><code>&lt;br&gt;

6. 인스턴스 정보 확인

- aws ec2 describe-instances (인스턴스 리스트 전체)
&lt;br&gt;

- aws ec2 describe-instances --instance-id [인스턴스 id]
&lt;br&gt;

** 참고 문서

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/
&lt;br&gt;


**주의사항 !!!**

- 키페어 유실 시 해당 키페어를 사용하는 인스턴스는 백업 이미지를 생성한 후에
다시 백업 이미지를 이용한 인스턴스를 생성하여 사용해야 한다.
&lt;br&gt;

7. EC2 정지, 삭제, 재시작
</code></pre><ul>
<li>정지(stop-instances)<blockquote>
<p>aws ec2 stop-instances --instance-ids i-0a12243dea8c2eab6</p>
</blockquote>
</li>
</ul>
<ul>
<li>삭제(terminate-instances)<blockquote>
<p>aws ec2 terminate-instances --instance-ids i-0a12243dea8c2eab6</p>
</blockquote>
</li>
</ul>
<ul>
<li>재시작(reboot-instances)<blockquote>
<p>aws ec2 reboot-instances --instance-ids i-0a12243dea8c2eab6</p>
</blockquote>
</li>
</ul>
<ul>
<li>시작(중지 상태의 인스턴스 : start-instances)<blockquote>
<p>aws ec2 start-instances --instance-ids i-0a12243dea8c2eab6</p>
</blockquote>
</li>
</ul>
<pre><code>&lt;br&gt;
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 서비스 올리기]]></title>
            <link>https://velog.io/@bb-seok/Linux-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%98%AC%EB%A6%AC%EA%B8%B0</link>
            <guid>https://velog.io/@bb-seok/Linux-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%98%AC%EB%A6%AC%EA%B8%B0</guid>
            <pubDate>Tue, 20 Aug 2024 01:41:40 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="tomcat-서버-설치하기">Tomcat 서버 설치하기</h2>
</blockquote>
<ol>
<li>톰캣 다운로드(톰캣 10)</li>
</ol>
<pre><code>wget https://archive.apache.org/dist/tomcat
/tomcat-9/v9.0.91/bin/apache-tomcat-9.0.91.tar.gz</code></pre><br>

<ol start="2">
<li>tar 압축 해제</li>
</ol>
<pre><code>tar -zxvf apache-tomcat-9.0.91.tar.gz</code></pre><br>

<ol start="3">
<li>/usr/local/lib로 이동</li>
</ol>
<pre><code>sudo mv apache-tomcat-9.0.91 /usr/local/lib/</code></pre><br>

<ol start="4">
<li>이름 변경</li>
</ol>
<pre><code>sudo mv /usr/local/lib/apache-tomcat-9.0.91/ /usr/local/lib/tomcat</code></pre><br>

<ol start="5">
<li>/etc/profile 설정 추가</li>
</ol>
<ul>
<li>sudo vim /etc/profile</li>
</ul>
<pre><code>... 아래에 
if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto

CATALINA_HOME=/usr/local/lib/tomcat

PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

export JAVA_HOME
export CATALINA_HOME
export LANG=ko_KR.UTF-8
</code></pre><br>

<ol start="6">
<li>tomcat 서버 실행 확인</li>
</ol>
<pre><code>sudo /usr/local/lib/tomcat/bin/startup.sh 

ss -antlp | grep 8080

netstat -antup | grep 8080</code></pre><br>

<ol start="7">
<li>톰캣 중지</li>
</ol>
<pre><code>sudo /usr/local/lib/tomcat/shutdown.sh</code></pre><br>

<ol start="8">
<li>외부에서 접속이 가능하게 포워드 설정(Virtual Box 포트포워딩)</li>
</ol>
<ul>
<li><p>8080 호스트 포트</p>
</li>
<li><p>게스트 ip : 192.168.15.102</p>
</li>
<li><p>게스트 포트 : 8080</p>
<br>

</li>
</ul>
<blockquote>
<h3 id="myserver02에서-설정할-내용">myserver02에서 설정할 내용</h3>
</blockquote>
<ol>
<li>myserver02에 sudo 접근 시 패스워드 생략 설정</li>
</ol>
<ul>
<li>ssh를 통한 명령어 실행 시 패스워드 입력 처리와 관련해서 없어도 sudo 사용이 가능하게
설정하기 위함이다.</li>
</ul>
<ol start="2">
<li>Ubuntu에서 sudo 상요 시 패스워드 생략</li>
</ol>
<pre><code>$sudo visudo

#Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) NOPASSWD: ALLa</code></pre><br>

<blockquote>
<h3 id="myserver01에서-myserver02에게-파일-전송-및-명령어-실행">myserver01에서 myserver02에게 파일 전송 및 명령어 실행</h3>
</blockquote>
<ol>
<li>scp를 이용한 파일 전송</li>
</ol>
<pre><code>user1@myserver01:~/springex$ scp -i ~/.ssh/id_rsa ./build/libs/springex-1.0-SNAPSHOT.war 
user1@192.168.15.102:~/app.war
springex-1.0-SNAPSHOT.war                                                            100%   20MB  42.1MB/s   00:00    
cd</code></pre><br>

<ol start="2">
<li>전송된 app.war를 /usr/local/lib/tomcat/wepapps/ 경로로 이동</li>
</ol>
<pre><code>user1@myserver01:~/springex$ ssh -i ~/.ssh/id_rsa 
user1@192.168.15.102 sudo mv app.war /usr/local/lib/tomcat/webapps/</code></pre><br>

<ol start="3">
<li>tomcat 서버 중지</li>
</ol>
<pre><code>user1@myserver01:~/springex$ ssh -i ~/.ssh/id_rsa user1@192.168.15.102 sudo /usr/local/lib/tomcat/bin/shutdown.sh

NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED
 --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED -
-add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED</code></pre><br>

<ol start="4">
<li>tomcat 서버 시작</li>
</ol>
<pre><code>user1@myserver01:~/springex$ ssh -i ~/.ssh/id_rsa user1@192.168.15.102 sudo /usr/local/lib/tomcat/bin/startup.sh</code></pre><br>

<blockquote>
<h3 id="프록시-설정--nginx">프록시 설정 : Nginx</h3>
</blockquote>
<ol>
<li>nginx 설치</li>
</ol>
<ul>
<li><p>sudo apt-get-update</p>
</li>
<li><p>sudo apt install nginx -y</p>
<br>
</li>
</ul>
<ol start="2">
<li>설정하기</li>
</ol>
<pre><code>user1@myserver02:~$ sudo vim /etc/nginx/sites-available/default 
...
     location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;
                proxy_pass http://localhost:8080;
        }
...</code></pre><br>

<ol start="3">
<li>nginx 서버 재시작</li>
</ol>
<ul>
<li>systemctl restart nginx<br>
</li>
</ul>
<ol start="4">
<li>이후에 80번 포트로 접속하는 것은 8080포트의 데몬으로 전달하여 처리한다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] Virtual Box & Ubuntu]]></title>
            <link>https://velog.io/@bb-seok/Linux-Virtual-Box-Ubuntu</link>
            <guid>https://velog.io/@bb-seok/Linux-Virtual-Box-Ubuntu</guid>
            <pubDate>Tue, 20 Aug 2024 01:12:46 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="ubuntu-설치-2204-ver">Ubuntu 설치 (22.04 ver)</h2>
</blockquote>
<ol>
<li>Virtual Box 설치하기 </li>
</ol>
<ul>
<li><p><a href="https://www.virtualbox.org/">https://www.virtualbox.org/</a> 사이트로 접속
<img src="https://velog.velcdn.com/images/bb-seok/post/0262da00-0e01-45c0-b877-31418963f2f7/image.png" alt=""></p>
</li>
<li><p>좌측 탭에 Downloads를 클릭하여 본인의 운영체제(OS)에 맞게 다운로드
<img src="https://velog.velcdn.com/images/bb-seok/post/3b029f51-2497-4992-8ad5-85d2630662d0/image.png" alt=""></p>
<br>
</li>
</ul>
<ol start="2">
<li>Virtual Box 호스트 키 조합</li>
</ol>
<ul>
<li><p>Virtual Box를 다운로드 후 실행하고 좌측 상단에 도구 - 환경 설정 클릭 - 입력 탭
<img src="https://velog.velcdn.com/images/bb-seok/post/ae107a3b-5c03-4875-928c-9a0f507682a6/image.png" alt=""></p>
</li>
<li><p>기본값으로 설정된 단축키를 Ctrl + Alt로 변경
<img src="https://velog.velcdn.com/images/bb-seok/post/ccfd7433-e8eb-47f0-a60a-6603d1bc39f7/image.png" alt=""></p>
<br>
</li>
</ul>
<ol start="3">
<li>메인 - 도구 - 네트워크 탭 클릭</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/43fc97bf-7c81-43cf-bb1d-5de83131ba86/image.png" alt="">
<br></p>
<ol start="4">
<li>NAT 네트워크 탭 클릭</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/ab7fe095-db0b-4410-b281-979e55dfb6ce/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/d245c8c2-f172-46a3-ac76-c4f6d0ca28a3/image.png" alt="">
<br></p>
<ol start="5">
<li>하단에 포트포워딩 탭을 클릭하여 IPv4 추가</li>
</ol>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/743a4ad2-8cd7-42ca-b842-b3fb65621c80/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/20bc044c-692e-422a-997d-1783cb4aaa31/image.png" alt="">
<br></p>
<ol start="6">
<li>Virtual Machine 만들기</li>
</ol>
<ul>
<li><p>좌측 상단 머신 탭 - 새로 만들기 클릭
<img src="https://velog.velcdn.com/images/bb-seok/post/2f4063eb-792a-486b-8d28-a8b7a2ffca8b/image.png" alt=""></p>
</li>
<li><p>이름 및 경로 설정
<img src="https://velog.velcdn.com/images/bb-seok/post/a9e09a9f-9f5e-418c-bcfc-1d891f5962d7/image.png" alt=""></p>
</li>
<li><p>하드웨어 메모리 설정
<img src="https://velog.velcdn.com/images/bb-seok/post/85acb55f-0ba1-4542-b8cd-6fb3ef509648/image.png" alt=""></p>
</li>
<li><p>가상 하드 디스크 설정
<img src="https://velog.velcdn.com/images/bb-seok/post/fc6ac0d2-217d-4fb0-96e8-f6c2cf4a3aa9/image.png" alt=""></p>
<br>
</li>
</ul>
<ol start="7">
<li>생성된 내용들을 확인
<img src="https://velog.velcdn.com/images/bb-seok/post/311350d6-67ba-4bc4-9681-22600896b1d5/image.png" alt=""></li>
</ol>
<ul>
<li><p>생성된 가상 머신 좌측 옵션 클릭
<img src="https://velog.velcdn.com/images/bb-seok/post/cd4aa23f-b778-48a7-8d58-9dc4abae89a4/image.png" alt=""></p>
</li>
<li><p>저장소 탭 - 컨트롤러 : IDE 확인
<img src="https://velog.velcdn.com/images/bb-seok/post/8e55af46-d3ab-4689-87c7-b6e8b82d642f/image.png" alt=""></p>
</li>
<li><p>속성 - 광학 드라이브 우측 디스크 모양 클릭 - 가상 광 디스크 선택 클릭
<img src="https://velog.velcdn.com/images/bb-seok/post/def94e72-a491-428d-b605-67f617846066/image.png" alt=""></p>
</li>
<li><p>컨트롤러 : IDE를 추가</p>
</li>
<li><p><img src="https://velog.velcdn.com/images/bb-seok/post/44aed948-fc67-4868-96a3-ef0300956360/image.png" alt=""></p>
</li>
<li><p>확인 후 상단에 시작 버튼을 클릭
<img src="https://velog.velcdn.com/images/bb-seok/post/f2e05be0-e77c-49a3-b05e-efafed802542/image.png" alt=""></p>
<br>
</li>
</ul>
<ol start="8">
<li>실행 확인</li>
</ol>
<ul>
<li><img src="https://velog.velcdn.com/images/bb-seok/post/2d773024-710e-4440-ada2-bed34a410d85/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="ubuntu-설치를-위한-기본-설정">Ubuntu 설치를 위한 기본 설정</h3>
</blockquote>
<p>1번
<img src="https://velog.velcdn.com/images/bb-seok/post/700741ea-4ef8-4414-aef1-1ccaa91b748a/image.png" alt="">
<br></p>
<p>2번
<img src="https://velog.velcdn.com/images/bb-seok/post/54e95e34-c770-4b01-8117-e92269290b2e/image.png" alt="">
<br></p>
<p>3번
<img src="https://velog.velcdn.com/images/bb-seok/post/8c29121a-2750-48c1-aec3-ef38e951689f/image.png" alt="">
<br></p>
<p>4번
<img src="https://velog.velcdn.com/images/bb-seok/post/1b79f7f5-a75c-4280-b5e2-4819b0aecfc9/image.png" alt="">
<br></p>
<p>5번
<img src="https://velog.velcdn.com/images/bb-seok/post/a3b01246-cad3-4f2a-8d76-bea3dddb35f0/image.png" alt="">
<br></p>
<p>6번
<img src="https://velog.velcdn.com/images/bb-seok/post/b0a82ac0-5313-4a7a-9744-048ad3dec3b2/image.png" alt="">
<br></p>
<p>7번
<img src="https://velog.velcdn.com/images/bb-seok/post/75c12267-6301-45f7-9781-a0a40ae049e4/image.png" alt=""></p>
<ul>
<li>Subnet</li>
<li>Address</li>
<li>Gateway</li>
<li>NameServers<br>

</li>
</ul>
<p>8번
<img src="https://velog.velcdn.com/images/bb-seok/post/00eaa144-9969-4bad-a5a0-f3f2d41f0030/image.png" alt="">
<br></p>
<p>9번
<img src="https://velog.velcdn.com/images/bb-seok/post/a302de1f-c819-4551-90ff-6a287d9a5555/image.png" alt="">
<br></p>
<p>10번
<img src="https://velog.velcdn.com/images/bb-seok/post/3cf031d0-fe2c-4362-8ae9-9ba659f6cafe/image.png" alt="">
<br></p>
<p>11번
<img src="https://velog.velcdn.com/images/bb-seok/post/7ca4852e-f018-4c1c-8a7e-d68596b650ac/image.png" alt="">
<br></p>
<p>12번
<img src="https://velog.velcdn.com/images/bb-seok/post/e34ecda3-46cc-4dcf-9a9c-2f694b928e4d/image.png" alt="">
<br></p>
<p>13번
<img src="https://velog.velcdn.com/images/bb-seok/post/448ffd23-5795-40b4-9210-90bfb5cd99c3/image.png" alt="">
<br></p>
<blockquote>
<h3 id="설정-후-vs-code에서의-작업">설정 후 VS Code에서의 작업</h3>
</blockquote>
<ol>
<li>Ubuntu 설치 후 재부팅 진행 - 유틸 설치</li>
</ol>
<ul>
<li><p>sudo apt-get update</p>
</li>
<li><p>sudo apt install net-tools vim nano git iputils-ping</p>
<br>
</li>
</ul>
<ol start="2">
<li>VS Code 설정</li>
</ol>
<ul>
<li>원격 탐색기 - SSH 설정</li>
</ul>
<p><img src="https://velog.velcdn.com/images/bb-seok/post/eefe9539-9e20-4c41-b8dd-4ad9bb9e8f22/image.png" alt=""></p>
<p>위 사진과 같이 설정을 한다.
<br></p>
<ol start="3">
<li>연결이 완료된 후 터미널 입력
```</li>
</ol>
<ul>
<li><p>sudo ls -l /etc/ssh/</p>
</li>
<li><p>sudo vim /etc/ssh/sshd_config</p>
</li>
</ul>
<pre><code>![](https://velog.velcdn.com/images/bb-seok/post/86b65e63-b53f-4e8e-b30c-5226cb2ab49c/image.png)

&lt;br&gt;

4. VS Code 확장 프로그램

- Extension Pack for Java
![](https://velog.velcdn.com/images/bb-seok/post/13816f80-43f1-4081-b2c7-6241eda71b79/image.png)

![](https://velog.velcdn.com/images/bb-seok/post/a1a53216-9704-4008-af30-e34852e3f051/image.png)

&lt;br&gt;

- Gradle for Java
![](https://velog.velcdn.com/images/bb-seok/post/fc1b98fd-c164-4698-8ac5-698595151016/image.png)


위의 두 확장 프로그램을 설치
&lt;br&gt;

5. VS Code 연결 후 user1@MyServer01에 프로젝트 추가
&lt;br&gt;

&gt;### Xshell - Ubuntu 연결하기

1. ssh user1@localhost

- Ubuntu에 user1 계정을 연결하기 위해 명령어 입력
&lt;br&gt;

2. 1번 입력 시 password를 입력하는 창이 뜨게 된다.

![](https://velog.velcdn.com/images/bb-seok/post/0ec9265a-29b1-46e2-89dd-24aa8e88438a/image.png)


- password 창이 뜨기 전에 다른 창이 뜨면 수락 및 저장을 눌러준다.
</code></pre><p>Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-117-generic x86_64)</p>
<ul>
<li>Documentation:  <a href="https://help.ubuntu.com">https://help.ubuntu.com</a></li>
<li>Management:     <a href="https://landscape.canonical.com">https://landscape.canonical.com</a></li>
<li>Support:        <a href="https://ubuntu.com/pro">https://ubuntu.com/pro</a></li>
</ul>
<p>This system has been minimized by removing packages and content that are
not required on a system that users do not log into.</p>
<p>To restore this content, you can run the &#39;unminimize&#39; command.
Last login: Thu Jul 25 02:53:27 2024 from 192.168.15.2
user1@myserver01:~$</p>
<pre><code>- 연결 성공 시 위와 같은 내용이 출력된다.
&lt;br&gt;

&gt;### VS Code로 연결하기

1. 확장 프로그램 Remote SSH 설치하기

2. 설치 후 원격 탐색기를 클릭하여 SSH 설정(이름 좌측 톱니바퀴) 클릭

3. .ssh/config/ 클릭 후 Host, HostName, User, Port 설정 후 저장
![](https://velog.velcdn.com/images/bb-seok/post/ba78b2f2-e0f5-47dd-b958-a61a81a96c24/image.png)

4. 원격 탐색기를 새로고침 시 Ubuntu가 연결된 것을 확인할 수 있다.
&lt;br&gt;

&gt;### VS Code로 연결 후 Java 설치하기

1. 사이트 접속 후 터미널에서 설치할 수 있는 명령어를 찾는다

https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/amazon-linux-install.html

&lt;br&gt;

2. Debian 기반 시스템에서 Corretto APT 저장소를 사용하기 위해 Corretto 공개 키를
가져온 후 명령어를 사용하여 저장소를 시스템 목록에 추가</code></pre><p>wget -O - <a href="https://apt.corretto.aws/corretto.key">https://apt.corretto.aws/corretto.key</a> | 
sudo gpg --dearmor -o /usr/share/keyrings/corretto-keyring.gpg &amp;&amp; <br>echo &quot;deb [signed-by=/usr/share/keyrings/corretto-keyring.gpg] 
<a href="https://apt.corretto.aws">https://apt.corretto.aws</a> stable main&quot; | 
sudo tee /etc/apt/sources.list.d/corretto.list</p>
<pre><code>&lt;br&gt;

3. repo 추가 후 명령어를 사용하여 Corretto 17 version 설치

- sudo apt-get update; sudo apt-get install -y java-17-amazon-corretto-jdk
&lt;br&gt;

4. 터미널에서 설치된 Corretto 버전 확인

- java -version
&lt;br&gt;

5. 버전까지 확인했다면 환경변수 설정하기

- which java 또는 whereis java로 확인

- ls -l /usr/bin/java 로 확인 =&gt; symbolic 형태 
(/usr/bin/java -&gt; /etc/alternatives/java)

- ls -l /etc/alternatives/java 경로 확인 =&gt; 이 또한 symbolic 형태
(/etc/alternatives/java -&gt; /usr/lib/jvm/java-17-amazon-corretto/bin/java)

- /usr/lib/jvm/java-17-amazon-corretto 까지만 복사

- vim .bashrc로 접근해서 위의 복사했던 부분을 넣고 저장한다
export JAVA_HOME=&quot;/usr/lib/jvm/java-17-amazon-corretto&quot;

- source .bashrc

- 설치가 완료되면 VS Code 하단에 Java:Ready 라고 표시된다
&lt;br&gt;

&gt;### 이전에 user1에 넣었던 프로젝트로 접근

1. 파일 - 폴더 열기

- /home/user1/해당 프로젝트
&lt;br&gt;

2. VS Code 창 좌측 맨 아래에 Java:Ready가 되면 탐색기 탭 하단에
JAVAPROJECTS 라는 이름의 탭이 생성된다.
&lt;br&gt;

3. Build.Gradle을 사용할 경우 확장 프로그램에서 Gradle For Java 설치
&lt;br&gt;

&gt;### 프로젝트를 확인 후 해당 프로젝트에 문제가 없는지 테스트

1. bash ./gradlew test

또는 

2. VS Code 좌측 Gradle탭 클릭 -&gt; Tasks - verification -&gt; check 또는 test 실행

3. 프로젝트 크기에 따라 테스트 시간이 상이하다.

4. 테스트 중 에러가 발생하거나 문제가 있는 파일들을 수정한다.

5. 다시 테스트 후 Build Successful이 뜨면 빌드가 성공적으로 완료된 것이다.
(bash ./gradlew build 명령어로도 빌드 테스트가 가능하다)

6. 윈도우의 경우 bash ./gradlew test 또는 bash ./gradlew build 명령어 실행 시
command not found 에러가 발생할 수 있는데 이때 sed -i &#39;s/\r$//&#39; gradlew 명령어를
사용하여 정상적으로 인식할 수 있게 해준다.
&lt;br&gt;

&gt;### 이전에 생성했던 Ubuntu01 서버를 2개로 나누기

1. Ubuntu01 서버 종료
&lt;br&gt;

2. Virtual Box - Ubuntu01 우클릭
&lt;br&gt;

3. 복제 선택
&lt;br&gt;

4. 이름과 경로, MAC 주소 정책을 확인하여 선택 후 설정
![](https://velog.velcdn.com/images/bb-seok/post/4cbe784e-a907-4f0d-ba38-4e3c4fad9bd8/image.png)
![](https://velog.velcdn.com/images/bb-seok/post/4ecb945d-ae1d-4702-b6dc-c344d045d038/image.png)
&lt;br&gt;

5. 다음으로 이동 후 복제 방식을 선택(예제의 경우 완전한 복제)
=&gt; 개발 서버와 웹 서버를 따로 두기 위함이다.
![](https://velog.velcdn.com/images/bb-seok/post/2cea256e-e596-430d-b8fb-636da74f30a3/image.png)
&lt;br&gt;

&gt;### 복제 후 Ubuntu01 설정

![](https://velog.velcdn.com/images/bb-seok/post/4a704995-2a57-4f1b-95b1-3851e22987ec/image.png)
![](https://velog.velcdn.com/images/bb-seok/post/cfb50d75-0447-40b9-bc04-cfaea8cf2ec8/image.png)
![](https://velog.velcdn.com/images/bb-seok/post/d28b6ef5-850d-437d-9556-c5522aacd9e3/image.png)


&lt;br&gt;

&gt;### Ubuntu02 서버 설정

1. Virtual Box에서 Ubuntu02를 실행
&lt;br&gt;

2. VS Code 실행 후 user1로 접근
&lt;br&gt;

3. sudo -i로 권한 설정
&lt;br&gt;

4. vim /etc/hostname
=&gt; Ubuntu01과 구분하기 위해 Ubuntu02로 변경
&lt;br&gt;

5. vim /etc/netplan/00-installer-config.yaml
&lt;br&gt;

6. address를 Virtual Box에서 설정했던 주소와 맞춰줌
&lt;br&gt;

7. SSH 설정

- C\Users\.ssh\config에서 Ubuntu02에 대한 추가 설정

- Host, HostName, User, Port 설정 후 저장
&lt;br&gt;

8. reboot 명령어로 재시작
&lt;br&gt;

9. 원격 탐색기에서 Ubuntu02가 연결된 것을 확인 후 접근
&lt;br&gt;

10. Open Folder - /home/user1로 접근했을 때
Ubuntu02와 같은 파일들이 출력되면 완료 !!
&lt;br&gt;

&gt;### 전체적인 구조

![](https://velog.velcdn.com/images/bb-seok/post/cd430045-d499-4e9f-b3cf-49c5d446f949/image.png)</code></pre>]]></description>
        </item>
    </channel>
</rss>