<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Kyunglim_Khang.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 05 Jul 2021 01:05:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Kyunglim_Khang.log</title>
            <url>https://images.velog.io/images/kyunglim_khang/profile/d53e2242-ce19-466d-bcd5-4b3f733fab0f/바탕.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Kyunglim_Khang.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/kyunglim_khang" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[gitlab에서 github로 옮기기]]></title>
            <link>https://velog.io/@kyunglim_khang/gitlab%EC%97%90%EC%84%9C-github%EB%A1%9C-%EC%98%AE%EA%B8%B0%EA%B8%B0</link>
            <guid>https://velog.io/@kyunglim_khang/gitlab%EC%97%90%EC%84%9C-github%EB%A1%9C-%EC%98%AE%EA%B8%B0%EA%B8%B0</guid>
            <pubDate>Mon, 05 Jul 2021 01:05:52 GMT</pubDate>
            <description><![CDATA[<p>이 방법을 통해서 저장소를 옮기게 되면 단순히 파일만 복사하는 것이 아니라,
그동안 작업했던 branch, commit log, 그리고 잔디밭(!)까지 복사할 수 있다.</p>
<ol>
<li>터미널 열기</li>
<li>이전 위치인 gitlab 저장소의 bare clone 생성<pre><code>git clone --bare https://gitlab.com/exampleuser/old-repository.git</code></pre></li>
<li>이사 갈 저장소 github 로 mirror-push<pre><code>cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git</code></pre></br> 

</li>
</ol>
<p><strong>+) 잔디밭이 옮겨지지 않는 경우</strong></p>
<p>위 방법으로 저장소와 커밋 로그 등의 정보들은 전부 잘 이사갔는데, 잔디밭에 반영이 안 됐다.
gitlab과 github 이메일이 달라서 발생한 문제이다.</p>
<p>settings-Emails 에서
<img src="https://images.velog.io/images/kyunglim_khang/post/5bd66a9d-f2a7-425e-947e-b8fc56ea05cf/image.png" alt="">
gitlab 이메일을 추가해주니까 잔디밭까지 잘 옮겨졌다. 뿌듯.</p>
<p>+) 처음에 이메일 추가하려고 하니, alreay used ~ error 가 떴음.
해당 이메일로 github 가입이 돼있어서 그런 거였다. 그래서 해당 계정 삭제해주고 추가해줬음!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ports와 expose 차이]]></title>
            <link>https://velog.io/@kyunglim_khang/ports%EC%99%80-expose-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@kyunglim_khang/ports%EC%99%80-expose-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Mon, 24 May 2021 13:18:42 GMT</pubDate>
            <description><![CDATA[<h1 id="ports">ports</h1>
<p><img src="https://images.velog.io/images/kyunglim_khang/post/60662dc5-8e82-4cd1-ba9b-1e45f59a630a/image.png" alt="ports"><em>이미지와 함께 보자면, 호스트OS 내부를 &#39;WORLD INSIDE DOCKER&#39;로 보시면 되고 외부 호스트를 &#39;WORLD OUTSIDE DOCKER&#39;로 보시면 됩니다.
<br>출처: <a href="https://stackoverflow.com/questions/40801772/what-is-the-difference-between-docker-compose-ports-vs-expose">https://stackoverflow.com/questions/40801772/what-is-the-difference-between-docker-compose-ports-vs-expose</a></em>
<br></p>
<p>ports는 호스트OS와 컨테이너의 포트를 바인딩 시켜줍니다. (ports 3306:3306)</p>
<p>ports는 호스트 포트와 컨테이너 포트를 모두 노출시키기 때문에,
호스트 내부의 컨테이너끼리는 컨테이너 포트로 특정 컨테이너에 접근할 수 있고, 
호스트 외부에서는 컨테이너 포트와 바인딩된(연결된) 호스트 포트를 통해 특정 컨테이너에 접근할 수 있습니다.
<br></p>
<ul>
<li>형식: &quot;host:container&quot; 또는 &quot;container&quot;</li>
</ul>
<pre><code class="language-yaml">#&quot;host:container&quot;
ports:
    - &quot;8080:8080&quot;

#또는 &quot;container&quot; =&gt; 이 경우 host는 랜덤한 값으로 정해짐
ports:
    - &quot;8080&quot;</code></pre>
<h1 id="expose">expose</h1>
<p><img src="https://images.velog.io/images/kyunglim_khang/post/fe816d6b-1dec-412d-abd6-153634f6c614/image.png" alt="expose"><em>이미지와 함께 보자면, 호스트OS 내부를 &#39;WORLD INSIDE DOCKER&#39;로 보시면 되고 외부 호스트를 &#39;WORLD OUTSIDE DOCKER&#39;로 보시면 됩니다.
<br>출처: <a href="https://stackoverflow.com/questions/40801772/what-is-the-difference-between-docker-compose-ports-vs-expose">https://stackoverflow.com/questions/40801772/what-is-the-difference-between-docker-compose-ports-vs-expose</a></em>
<br>
expose는 호스트 포트를 공개하지 않고 컨테이너의 포트만 공개합니다 (expose 3306)</p>
<p>호스트 내부의 컨테이너끼리는 컨테이너 포트로 특정 컨테이너에 접근할 수 있지만,
호스트 외부의 경우, 외부 호스트에서 특정 컨테이너에 접근하려고 할 때, 그 컨테이너 포트와 바인딩된(연결된) 호스트 포트가 없기 때문에 해당 컨테이너에 접근할 수 없습니다.
이러한 특징 때문에 expose는 도커 내부에서 컨테이너 간의 통신만 필요한 경우에 주로 사용됩니다.</p>
<pre><code class="language-yaml">expose:
    - &quot;8080&quot;</code></pre>
<h1 id="정리">정리</h1>
<p>ports 와 expose는 모두 컨테이너 포트를 노출시키는 역할을 한다는 점에서는 동일합니다.
단, expose로 노출시키는 경우, 호스트 내부에서만 접근이 가능합니다. 
반면, ports로 노출시키는 경우에는 호스트 외부의 다른 호스트들도 ports 에 설정한 호스트 포트를 통해 접근이 가능합니다.</p>
<p>ex) A 컨테이너의 expose 를 &quot;8080&quot; 으로 설정해줬다면, 같은 호스트 내부의 B 컨테이너가 8080 포트로 A 컨테이너에 접근 가능. 단, 외부 호스트들은 A 컨테이너에 접근 불가.
ex) A 컨테이너의 ports 를 &quot;3307:3006&quot; 으로 설정해줬다면, 컨테이너의 3306 포트가 호스트의 3307 포트로 매핑된 것 ⇒ 외부 호스트가 해당 호스트의 3307 포트를 통해 A 컨테이너에 접근 가능</p>
<p>즉, 외부 호스트들은 컨테이너의 포트만으로는 컨테이너에 접근할 수 없고, 컨테이너 포트와 매핑된 호스트 포트를 통해서만 호스트 내부의 컨테이너에 접근할 수 있습니다.
이때, 호스트 포트와 컨테이너 포트를 매핑시켜 컨테이너 포트를 노출시키는 것이 ports 이고, 이때 공개된 호스트 포트를 통해 외부 호스트들도 컨테이너에 접근할 수 있습니다.
반면, 호스트 포트를 공개하지 않고 컨테이너 포트만 노출시키는 것이 expose 이고, 공개된 호스트 포트가 없기 때문에 외부 호스트들은 컨테이너에 접근할 수 없습니다.</p>
<h1 id="참고">참고</h1>
<p><a href="https://stackoverflow.com/questions/40801772/what-is-the-difference-between-docker-compose-ports-vs-expose">What is the difference between docker-compose ports vs expose</a></p>
<p><a href="https://growd.tistory.com/77">[Docker] ports와 expose의 차이</a></p>
<p><a href="https://nirsa.tistory.com/80">[Docker CE] docker-compose 문법 간단 정리 (2) (ports, expose, depends_on, nevironment, env_file, container_name, labels, volumes, volumes_from)</a></p>
<p>🧐도커 관련해서 가장 좋은 참고 자료는 공식 문서</p>
<p><a href="https://docs.docker.com/compose/compose-file/compose-file-v3/">Compose file version 3 reference</a></p>
<p>기능이나 옵션에 대해 궁금한 게 있다면 1차적으로 공식 문서 참고,</p>
<p>그 다음은 직접 테스트해보기 추천.</p>
<h3 id="추가로-궁금한-것">추가로 궁금한 것</h3>
<ul>
<li><p>expose에서  -p 옵션을 활용하면 ports와 똑같이 사용할 수가 있다고 함. 이 부분 자세히 모르겠음. (근데 우선은 expose로 설정하고 -p 옵션을 붙여서 ports 처럼 사용하거나 말거나를 추후에 결정하면 될 듯?)</p>
</li>
<li><p>A라는 컨테이너가 있고, 이 컨테이너는 H1 라는 호스트에 있을 때, H2라는 외부 호스트가 A라는 컨테이너에 접근할 수 없는 상황은 어떤 건지....? (구체적인 상황이 떠오르지가 않음)</p>
</li>
<li><p>그래서 어떤 상황에서 호스트 포트를 공개해야 할 지, 아니면 공개하지 말아야 할 지도 감이 안 잡히는 듯</p>
 <br/>
 <br/>

<p> =&gt; 내부적으로 컨테이너 연결만이 목적이라면 expose로 충분. 내부적으로만 쓸 목적이라면 외부로부터의 접근은 불필요하기 때문. (필요한 만큼 최소한으로만 공개를 하는 것이 보안상으로 좋다)</p>
 <br/>
 <br/>
 ex) 장고 컨테이너와 db 컨테이너를 compose로 띄우는 상황.
db의 경우 외부로 노출하지 않는 것이 좋고, 컨테이너끼리의 연결만으로 충분하기 때문에 expose를 활용하면 이점이 더 많을 것!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 스택 10828번]]></title>
            <link>https://velog.io/@kyunglim_khang/%EB%B0%B1%EC%A4%80-%EC%8A%A4%ED%83%9D-10828%EB%B2%88</link>
            <guid>https://velog.io/@kyunglim_khang/%EB%B0%B1%EC%A4%80-%EC%8A%A4%ED%83%9D-10828%EB%B2%88</guid>
            <pubDate>Mon, 10 May 2021 13:10:44 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/10828">https://www.acmicpc.net/problem/10828</a></p>
<pre><code class="language-python">import sys

input = sys.stdin.readline

n = int(input())

stack = []

for i in range(n):
    cmd = input().split()

    if cmd[0] == &quot;push&quot;:
        stack.append(int(cmd[1]))

    elif cmd[0] == &quot;pop&quot;:
        if len(stack) == 0:
            print(-1)
        else: 
            print(stack.pop())

    elif cmd[0] == &quot;size&quot;:
        print(len(stack))

    elif cmd[0] == &quot;empty&quot;:
        if len(stack) == 0:
            print(1)
        else:
            print(0)

    elif cmd[0] == &quot;top&quot;:
        if len(stack) == 0:
            print(-1)
        else:
            print(stack[-1])</code></pre>
<ul>
<li><p>처음엔 시간 초과가 떴었는데,
input()을 sys.stdin.readline() 이걸로 바꿔줬더니 시간 단축되면서 해결.</p>
</li>
<li><p>입력 하나만 받을 때는 input()도 상관없는데, 반복문으로 여러줄 받을 때는 반드시 sys.stdin.readline() 을 사용해야 시간 초과가 발생하지 않는다.</p>
</li>
<li><p>단, 숫자가 아닌 문자열로 입력을 받는 경우엔 줄바꿈(\n)까지 입력으로 받으니
input().strip() 을 사용하거나 input().strip().split() 을 사용하는 게 좋음.</p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>