<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>thisiseunjin</title>
        <link>https://velog.io/</link>
        <description>싹난 독든 감자의 성장일지</description>
        <lastBuildDate>Wed, 01 Nov 2023 15:45:08 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>thisiseunjin</title>
            <url>https://velog.velcdn.com/images/silver-true/profile/afdf6fc9-5b35-417e-b40e-3ea7c9171feb/image.PNG</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. thisiseunjin. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/silver-true" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Jenkins] GitLab 자동 배포(2) : 자동 배포 진행하기]]></title>
            <link>https://velog.io/@silver-true/Jenkins-GitLab-%EC%9E%90%EB%8F%99-%EB%B0%B0%ED%8F%AC2-%EC%9E%90%EB%8F%99-%EB%B0%B0%ED%8F%AC-%EC%A7%84%ED%96%89%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@silver-true/Jenkins-GitLab-%EC%9E%90%EB%8F%99-%EB%B0%B0%ED%8F%AC2-%EC%9E%90%EB%8F%99-%EB%B0%B0%ED%8F%AC-%EC%A7%84%ED%96%89%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 01 Nov 2023 15:45:08 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<p>앞의 기본 설정 단계를 모두 진행했다는 가정하에 진행하겠다!
<a href="https://velog.io/@silver-true/Jenkins-GitLab-%EC%9E%90%EB%8F%99-%EB%B0%B0%ED%8F%AC1-%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95">[Jenkins] GitLab 자동 배포(1) : 기본 설정</a></p>
<h3 id="0-새로운-item-등록">0. 새로운 Item 등록</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/silver-true/post/97e36066-c7b8-4879-b706-57607eea5ac6/image.png" alt="">
기본 단계별로 확인할 수 있는 Pipeline으로 생성하겠다!
<img src="https://velog.velcdn.com/images/silver-true/post/b161c01f-289e-47d9-bce1-875af4002b39/image.png" alt=""></p>
<h3 id="1-general">1. General</h3>
<blockquote>
</blockquote>
<p>GitLab Connection에 자신이 설정해놓은 깃랩이 잘 연결되어 있는지 확인해준다.
<img src="https://velog.velcdn.com/images/silver-true/post/b33579b1-f023-453e-a4ed-c2b540b3b0bd/image.png" alt=""></p>
<h3 id="2-build-triggers">2. Build Triggers</h3>
<blockquote>
</blockquote>
<p>노란색 칠해진 곳의 url은 gitlab에서 사용되니 잘  적어두자!
<img src="https://velog.velcdn.com/images/silver-true/post/b74d28f6-9d82-4092-af79-c0edf461c398/image.png" alt="">
그리고 <strong><code>고급</code></strong>에서 추가 설정을 진행해준다.
<img src="https://velog.velcdn.com/images/silver-true/post/33f0e9ff-0f87-4c86-9aaf-d47da540fc53/image.png" alt="">
아래의 Generate버튼을 눌러 Key값을 발급 받는다 이또한 gitlab에서 사용될것이기 때문에 잘 적어두자!
그럼 이제 Pipeline이 생성 완료 되었다.</p>
<h3 id="3-pipeline-코드-작성하기">3. pipeline 코드 작성하기</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/silver-true/post/ed948a84-578b-4d14-bdb5-548410a6629b/image.png" alt=""></p>
<pre><code class="language-javascript">pipeline {
    agent {
        any {
            // 젠킨스에서 사용할 Docker 이미지 설정
            // 여기서는 Gradle과 Java가 설치된 이미지를 사용합니다.
            image &#39;gradle:jdk11&#39;
        }
    }

    environment {
        // 빌드 결과물이 저장될 경로
        BUILD_DIR = &quot;/var/{경로}/backend&quot;
        DOCKER_CONTAINER_NAME = &quot;{컨테이너 이름}&quot;
    }

    stages {

      //첫 번째 단계 : git clone
        stage(&#39;Git Clone&#39;) {
            steps {
                git branch: &#39;{clone 하고자 하는 branch 이름}&#39;,
                credentialsId: &#39;{발급 받은 개인 accesstoken의 이름}&#39;,
                url: &#39;https://{gitlab의 url}&#39;
            }
        }

      // 두번째 단계 : spring boot파일 빌드!
        stage(&#39;Build&#39;) {
            steps {
                sh &#39;pwd&#39;
                sh &#39;ls -al&#39;

                // jar 파일 삭제
                sh &#39;rm build/libs/*.jar | true&#39;

                dir(&#39;{git에서 해당 파일 경로}&#39;){
                    // 스프링 빌드
                    sh &#39;pwd&#39;
                    sh &#39;ls -al&#39;
                    sh &#39;chmod +x gradlew&#39;
                    sh &#39;./gradlew clean build&#39;

                    // 도커 이미지 빌드
                    sh &#39;docker build -t {USERNAME}/{IMAGE_NAME}:latest .&#39;

                    sh &#39;docker images&#39;
                }
            }
        }


        //서버에 배포 단계
        stage(&#39;Deploy&#39;) {
            steps {
                // 기존 서버 중지
                sh &quot;docker stop $DOCKER_CONTAINER_NAME || true&quot;  // 기존 컨테이너가 없을 경우를 위해 무시

                sh &quot;docker rm $DOCKER_CONTAINER_NAME || true&quot;  //중지된 서버 삭제


                // 빌드된 파일을 원하는 위치로 배포
                // 예: 서버에 배포하는 경우
                sh &quot;whoami&quot;
                sh &quot;groups&quot;


                // 새로운 서버 실행
                sh &quot;docker run -d -p {포트번호}:{포트번호} -e TZ=Asia/Seoul --name $DOCKER_CONTAINER_NAME {USERNAME}/{IMAGE_NAME}&quot;

                // 쓰레기 이미지 삭제
                sh &#39;docker images -f dangling=true -q | xargs -r docker rmi&#39;
            }
        }
    }
}</code></pre>
<h3 id="4-gitlab에서-gitlab에서-webhook을-등록하고-jenkins-와-연결">4. Gitlab에서 gitlab에서 webhook을 등록하고 jenkins 와 연결</h3>
<blockquote>
</blockquote>
<p>위에서 노란색 부분이었던 곳의 URL을 입력하고 발급 받은 빨간색 칸에 있는 토큰을 작성한다.
이때     <code>Trigger</code>을 <code>All branches</code>로 한다면 push 될때마다 자동배포가 실쟁되니 <code>wildcard patten</code>을 이용해서 branch이름을 적어주면 해당 branch에 push될때마다 배포가 진행된다!
<img src="https://velog.velcdn.com/images/silver-true/post/6996c134-47a0-4404-9990-f237da527940/image.png" alt="">
아래 선택 사항에서 <code>push envents</code>을 선택해준다</p>
<h3 id="5-webhook-test">5. Webhook test</h3>
<blockquote>
</blockquote>
<p>Test - push events를 클릭하면 테스트가 진행되고 위에 결과가 http 200이면 연결이 성곤한 것이다!
<img src="https://velog.velcdn.com/images/silver-true/post/18c1aa96-00d1-4d3a-9163-0f71e57c5f04/image.png" alt=""></p>
<h3 id="6-jenkins-확인">6. Jenkins 확인</h3>
<blockquote>
</blockquote>
<p>아래와 같이 성공적으로 배포가 완료 되면 끝이다!
<img src="https://velog.velcdn.com/images/silver-true/post/0af4f0b1-db61-4af3-bce0-293fc169f73c/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Jenkins] GitLab 자동 배포(1) : 기본 설정]]></title>
            <link>https://velog.io/@silver-true/Jenkins-GitLab-%EC%9E%90%EB%8F%99-%EB%B0%B0%ED%8F%AC1-%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@silver-true/Jenkins-GitLab-%EC%9E%90%EB%8F%99-%EB%B0%B0%ED%8F%AC1-%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Wed, 01 Nov 2023 15:26:11 GMT</pubDate>
            <description><![CDATA[<h3 id="0-docker로-jenkins를-설치한다">0. Docker로 Jenkins를 설치한다.</h3>
<blockquote>
</blockquote>
<p>$ <code>sudo apt update</code>
$ <code>docker pull jenkins/jenkins</code></p>
<h3 id="1-jenkins-실행">1. Jenkins 실행</h3>
<blockquote>
</blockquote>
<pre><code class="language-javascript">docker run \
--name jenkins \
-d \
-p 9090:9090 \
-p 50000:50000 \
-v /home/ubuntu/jenkins:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-u root \
-d jenkins/jenkins:lts</code></pre>
<h3 id="2-jenkins안에-docker-설치하기">2. Jenkins안에 Docker 설치하기</h3>
<blockquote>
</blockquote>
<pre><code class="language-javascript">docker exec -it jenkins bash
apt update
apt install -y docker.io</code></pre>
<h3 id="3-포트-열어주기">3. 포트 열어주기</h3>
<blockquote>
</blockquote>
<ol>
<li>ufw 상태 확인 : <code>sudo ufw status</code></li>
<li>사용할 포트 허용하기 (ufw inactive 상태) : <code>sudo ufw allow 9090</code></li>
<li>등록한 포트 조회하기 (ufw inactive 상태) : <code>sudo ufw show added</code></li>
<li>ufw 활성화 하기 : <code>sudo ufw enable</code></li>
</ol>
<h3 id="4-jenkins-접속하기">4. Jenkins 접속하기</h3>
<blockquote>
</blockquote>
<p>현재 9090 port로 열어두었기 때문에 도메인:9090으로 접속하면 된다!
<img src="https://velog.velcdn.com/images/silver-true/post/cf19ddd7-9301-49e6-97bb-b0342e97b613/image.png" alt="">
이런 화면이 나온다면 <code>docker logs jekins</code>혹은 해당 경로에서 key값을 확인해주면 된다!</p>
<h3 id="5-기본-플러그인-설치하기">5. 기본 플러그인 설치하기</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/silver-true/post/15361e1a-5965-40de-8cf1-7ac6d0743e96/image.png" alt=""></p>
<h3 id="6-계정-생성">6. 계정 생성</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/silver-true/post/2219cfac-87b0-4b7e-a10a-e1ddfcf811aa/image.png" alt=""></p>
<h3 id="7-추가-플러그인-설치">7. 추가 플러그인 설치</h3>
<blockquote>
</blockquote>
<p>gitlab을 사용할 것이기 때문에 
plugins -&gt; available plugins에서 gitlab과 ssh agent, docker를 설치를 추가로 해준다.</p>
<h3 id="8-gitlab을-사용-시-gitlab을-연결하기-위한-토큰을-생성">8. gitlab을 사용 시 gitlab을 연결하기 위한 토큰을 생성</h3>
<p><img src="https://velog.velcdn.com/images/silver-true/post/9455404e-1726-4a69-82c5-0313f1ce76e1/image.png" alt=""></p>
<h3 id="8-인증-권한-등록하기">8. 인증 권한 등록하기</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/silver-true/post/1f217cf4-277c-48d4-ab9c-354a4d02630f/image.png" alt="">
새로운 Credential을 생성해준다.
<img src="https://velog.velcdn.com/images/silver-true/post/0b54b90b-8aae-47b5-abde-6e69d0d6152c/image.png" alt="">
발급 받은 토큰을 jenkins에 등록해준다. 이때 Kind : GitLab API Token으로 설정해준다.
<img src="https://velog.velcdn.com/images/silver-true/post/56461f54-f58a-4b81-a081-ee3c03c0e354/image.png" alt="">
그리고 gitlab에서 개인 accesstoken을 발급받아 1개 추가로 더 증록해준다.
<code>Kind=Username with password</code> 이며, <code>Username=Gitlab ID</code>, <code>Password : 토큰</code> 으로 작성한다</p>
<h3 id="9-깃랩-연결하기">9. 깃랩 연결하기</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/silver-true/post/3b4a5d0b-ac8a-4682-a834-0b8b427db1f7/image.png" alt="">
아래의 작업을 진행하고 Test Connection으로 연결 확인을 진행한다.
<img src="https://velog.velcdn.com/images/silver-true/post/2225481a-e733-4ed2-85b4-bbd94965fc4b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Docker] EC2에 java 설치하기]]></title>
            <link>https://velog.io/@silver-true/Docker-EC2%EC%97%90-java-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@silver-true/Docker-EC2%EC%97%90-java-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 01 Nov 2023 15:06:13 GMT</pubDate>
            <description><![CDATA[<h3 id="1-openjdk-11-jdk-설치">1. openjdk-11-jdk 설치</h3>
<blockquote>
</blockquote>
<p><code>sudo apt-get install openjdk-11-jdk</code></p>
<h3 id="2-설치-확인">2. 설치 확인</h3>
<blockquote>
</blockquote>
<p><code>java -version</code></p>
<h3 id="3-환경-변수-설정">3. 환경 변수 설정</h3>
<blockquote>
<p><code>$ vim ~/.bashrc</code></p>
</blockquote>
<blockquote>
</blockquote>
<pre><code class="language-javascript"># ~/.bashrc
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
export PATH=$PATH:$JAVA_HOME/bin</code></pre>
<blockquote>
</blockquote>
<p><code>$ source ~/.bashrc</code> 변경한 설정을 현재 실행된 쉘에 적용한다.</p>
<blockquote>
<p>설치 확인하기
<code>$ echo $JAVA_HOME</code></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Docker] docker-compose.yml 작성하기]]></title>
            <link>https://velog.io/@silver-true/Docker-docker-compose.yml-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@silver-true/Docker-docker-compose.yml-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 01 Nov 2023 14:54:12 GMT</pubDate>
            <description><![CDATA[<h3 id="docker-composeyml">Docker-compose.yml</h3>
<p>이미지 여러개를 pull받고 docker로 올리는 작업은 생각보다 많은 시간을 소요한다..
이런 일을 한번에 할수 있도록 하는것이 Docker-compose.yml파일이다!
그럼 이제 EC2에 docker-compose.yml 파일을 작성해보자!</p>
<h3 id="docker-composeyml파일-생성하기">docker-compose.yml파일 생성하기</h3>
<blockquote>
<p><img src="https://velog.velcdn.com/images/silver-true/post/eac42d26-d828-4f3e-a84e-5ac2fac4a47c/image.png" alt="">
파일의 최상단에 <code>vi docker-compose.yml</code> 명령어를 사용해서 작성하면 된다
내용 입력 : <code>i</code>를 누르고 시작
저장하고 나가기 : <code>esc</code> -&gt; <code>wq!</code>
저장하지 않고 나가기 : <code>q!</code></p>
</blockquote>
<h3 id="docker-composeyml-작성하기">docker-compose.yml 작성하기</h3>
<pre><code class="language-javascript">version: &#39;3&#39;
services:
  [컨테이너 명]:
    image: {YOUR_NAME/IMAGE_NAME}
    ports:
      - &quot;8080:8080&quot;    //포트 번호 지정
    networks:
      - service_network //네트워크 지정

  [컨테이너 명]:
    image: {YOUR_NAME/IMAGE_NAME}
    ports:
      - &quot;8081:8080&quot;    //포트 번호 지정
    networks:
      - service_network     //네트워크 지정
    depends_on:        //실행 시작 순서를 조정한다. 
      - first-server     //first-server을 실행 후 실행하겠다는 뜻이다/
 [컨테이너 명]:
    image: {YOUR_NAME/IMAGE_NAME}
    ports:
      - &quot;8081:8080&quot;    //포트 번호 지정
     environment:
      - DISCOVERY_SERVICE_URL=http://server-name  //만약 다른 discorvery 를 사용할꺼면 추가!
    networks:
      - service_network     //네트워크 지정
    depends_on:        //실행 시작 순서를 조정한다. 
      - first-server     //first-server을 실행 후 실행하겠다는 뜻이다/

networks:
  service_network:</code></pre>
<h3 id="일괄-pull">일괄 pull</h3>
<blockquote>
</blockquote>
<p><code>docker-compose pull</code> 명령어를 실행한다면 yml파일에 있는 이미지를 모두 pull한다.</p>
<h3 id="일괄-startstop">일괄 start/stop</h3>
<blockquote>
</blockquote>
<p><code>docker-compose up</code>를 통해서 모두 시작할 수 있다.
<code>docker-compose down</code>를 통해서 모두 중지할 수 있다.
혹시 몇몇개의 container가 정상 구동이 되지 않았다면 모두 up하지말고
docker start {컨테이너 ID}를 실행해서 개별로 다시 올려주는것을 추천한다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Docker] 로컬에서 도커를 사용하여 배포하기]]></title>
            <link>https://velog.io/@silver-true/Docker-Docker-Imgae-%EC%97%85%EB%A1%9C%EB%93%9C</link>
            <guid>https://velog.io/@silver-true/Docker-Docker-Imgae-%EC%97%85%EB%A1%9C%EB%93%9C</guid>
            <pubDate>Wed, 25 Oct 2023 05:03:46 GMT</pubDate>
            <description><![CDATA[<h3 id="0-가장-먼저-docer를-실행해서-로그인을-진행한다">0. 가장 먼저 docer를 실행해서 로그인을 진행한다.</h3>
<p><img src="https://velog.velcdn.com/images/silver-true/post/0316d64a-043b-4583-84c2-5c26f6a0b54c/image.png" alt="">
이 <strong>docker desktop을 실행해주고</strong> 로그인을 진행하면 된다!
(window의 경우 이 docker desktop이 없으면 동작하지 않는다.)
이제 cmd창에서 <code>docker login</code>을 사용해 로그인이 되어있는지 확인하고 되어 있지 않다면 로그인을 진행해주면 된다.
이때 id는 docker의 닉네임을 작성해주면 된다. <em>(가입한 이메일 아님)</em>
로그인이 완료가 되면 아래와 같이 뜰 것이다.
<img src="https://velog.velcdn.com/images/silver-true/post/b816fc7a-5f37-41ed-b355-51b9efd94997/image.png" alt=""></p>
<h3 id="1-spring-boot-docker-파일-생성한다">1. spring boot docker 파일 생성한다.</h3>
<p><img src="https://velog.velcdn.com/images/silver-true/post/b41b457d-e3b4-40c5-8597-9a2b6fd0c295/image.png" alt="">
사진과 같은 위치에 파일을 생성해주면 된다. 파일을 생성할때 Dockerfile이라고 이름을 붙이면 된다. (확장자 없음)</p>
<pre><code class="language-javascript">FROM adoptopenjdk/openjdk11
LABEL authors=&quot;authors_name&quot;
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT [&quot;java&quot;,&quot;-jar&quot;,&quot;/app.jar&quot;]</code></pre>
<h3 id="2-spring-boot-파일의-jar파일을-생성한다">2. Spring boot 파일의 jar파일을 생성한다.</h3>
<p><img src="https://velog.velcdn.com/images/silver-true/post/f78da1a6-2de5-4cd7-9d19-b1a1d0fba234/image.png" alt="Spring boot jar 파일 생성 법"></p>
<h3 id="3-docker로-jar파일-이미지-빌드하기">3. Docker로 jar파일 이미지 빌드하기</h3>
<h4 id="step1-jar파일을-만든-파일-위치에서-cmd를-실행한다">STEP1) jar파일을 만든 파일 위치에서 CMD를 실행한다.</h4>
<blockquote>
<p><img src="https://velog.velcdn.com/images/silver-true/post/17d66c1e-ec44-418e-ae37-bcd4460bd811/image.png" alt=""></p>
</blockquote>
<h4 id="step2-docker-build--t-your_nameapp_name-">STEP2) <code>docker build -t [YOUR_NAME]/[APP_NAME] .</code></h4>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/silver-true/post/90578036-b163-44e5-afd1-8e392566863e/image.png" alt="">
이런 화면이 뜨면 성공이다!!</p>
<h4 id="step3-올라간-이미지-확인하기">STEP3) 올라간 이미지 확인하기</h4>
<blockquote>
<p><code>docker images</code>로 올라간 imgae들을 확인할 수 있다.
 <img src="https://velog.velcdn.com/images/silver-true/post/6357f9f4-7344-481b-9a21-c95381f4fab4/image.png" alt=""></p>
</blockquote>
<h4 id="step4-docker-hub로-push하기">STEP4) Docker Hub로 Push하기</h4>
<blockquote>
<p><code>docker push [USER_NAME]/[APP_NAME]</code>
지금 까지의 작업들은 로컬에서 진행되었기 때문에 docker hub로 push를 해야 ec2에서 pull을 통해 사용할 수 있다.</p>
</blockquote>
<h3 id="4-ec2에서-docker-image-pull받기">4. EC2에서 Docker image pull받기</h3>
<blockquote>
</blockquote>
<p><code>docker pull [YOUR_NAME]/[APP_NAME]:버전</code>
항상 최신 버전을 받고 싶다면 버전에 latest를 작성하면 된다!</p>
<h3 id="5-ec2에서-docker-image로-docker-container생성하기">5. EC2에서 Docker image로 Docker Container생성하기</h3>
<blockquote>
</blockquote>
<p><code>docker create -i -t --name {컨테이너 이름} {YOUR_NAME}/{APP_NAME}:버전</code>
<em><code>{YOUR_NAME}/{APP_NAME}:버전</code></em> 이미지를 사용하여 _{컨테이너 이름}_의 컨테이너를 만드는데 컨테이너와 상호 입출력을 가능하게 하겠다는 명령어(-i, -t)이다.</p>
<h3 id="6-ec2에서-docker-container-실행하기">6. EC2에서 Docker Container 실행하기</h3>
<blockquote>
</blockquote>
<p><code>docker start {컨테이너 이름}</code></p>
<h3 id="7-컨테이너-생성과-동시에-실행하고싶다면">7. 컨테이너 생성과 동시에 실행하고싶다면?</h3>
<blockquote>
</blockquote>
<p><code>docker run &lt;OPTIONS&gt; --name{컨테이너 이름} -p 8080:8080 {이미지 이름}:버전</code>
-p 옵션을 사용하여 port번호를 지정해서 실행할 수 있다.</p>
<h3 id="8-기타-명령어들">8. 기타 명령어들</h3>
<h4 id="i-이미지-삭제">i) 이미지 삭제</h4>
<p><em><strong>해당 이미지를 컨테이너가 사용중일때는 삭제할 수 없음</strong></em></p>
<blockquote>
<p>단일 삭제 : <code>docker images rm {이미지ID}</code>
모두 삭제 : <code>docker rmi $(docker images -q) -f</code></p>
</blockquote>
<h4 id="ii-container-중지">ii) container 중지</h4>
<blockquote>
<p><code>docker stop {컨테이너 이름 or 컨테이너ID}</code></p>
</blockquote>
<h4 id="iii-container-삭제">iii) container 삭제</h4>
<blockquote>
<p><code>docker rm {컨테이너 이름 or 컨테이너ID}</code></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 1806 : 부분합 - JAVA, 자바]]></title>
            <link>https://velog.io/@silver-true/%EB%B0%B1%EC%A4%80-1806-%EB%B6%80%EB%B6%84%ED%95%A9-JAVA-%EC%9E%90%EB%B0%94</link>
            <guid>https://velog.io/@silver-true/%EB%B0%B1%EC%A4%80-1806-%EB%B6%80%EB%B6%84%ED%95%A9-JAVA-%EC%9E%90%EB%B0%94</guid>
            <pubDate>Mon, 30 Jan 2023 14:56:15 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://www.acmicpc.net/problem/1806">https://www.acmicpc.net/problem/1806</a></p>
<h3 id="풀이">풀이</h3>
<p>구간합 문제이다. for문을 여러번 사용하면 시간초과가 나므로 투포인트를 사용해서 풀어야한다!
<img src="https://velog.velcdn.com/images/silver-true/post/84f317e2-105a-43df-acff-ef659f1425b3/image.jpg" alt="">
위의 그림처럼 start와 end의 위치를 조정해서 문제를 풀이하면 된다.</p>
<pre><code class="language-java">import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class B1806 {
    static int N, S;
    static int result = 100001;
    static int sum = 0;
    static int start = 0;
    static int end = 0;
    static int nums[];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        S = Integer.parseInt(st.nextToken());

        nums = new int[N];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i &lt; N; i++) {
            nums[i] = Integer.parseInt(st.nextToken());
        }

        while (true) {
            if (sum &gt;= S) {
                sum -= nums[start];
                result = Math.min(result, end - start);
                start++;
            } else if (end == N) {
                break;
            } else {
                sum += nums[end++];
            }
        }

        if (result == 100001)
            System.out.println(0);
        else
            System.out.println(result);

    }

}</code></pre>
<p>위에서 아래의 코드를 사용한 이유는</p>
<pre><code class="language-java">    sum -= nums[start];
    result = Math.min(result, end - start);
    start++;</code></pre>
<p><img src="https://velog.velcdn.com/images/silver-true/post/9b41b0a4-c608-43c3-b707-f8344ab823a8/image.jpg" alt="">
아래와 같은 계산을 해주기 위해서이다!</p>
<h3 id="결과">결과</h3>
<p><img src="https://velog.velcdn.com/images/silver-true/post/aad4bbd3-b392-4f5a-80ee-ade8977cfc82/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>