ThinkAboutSoftware / OnlineSelfCodingGroup

Online coding and study group at every Saturday at 10:30 am.
MIT License
18 stars 4 forks source link

71th online meetup, 2022-03-26 #110

Closed jongfeel closed 2 years ago

jongfeel commented 2 years ago

https://meet.google.com/jyx-mxnq-kpk

참여 방법:

Assignees에 자신의 github 계정을 self로 추가 2시간 분량의 할 내용에 대해 댓글 작성 (최소 모임 시작 전까지) 빛의 속도 혹은 (주말, 휴일 포함) 최소 3일 내에 구글 캘린더 등록 메일 확인 모임 시간에 각자 개발 관련된 공부 진행

모임 끝난 후 공부한 내용 정리 & 링크 추가 => 최소 다음 모각코 전까지 확인 가능해야 함.

주의: 회사일 혹은 마감 기한 임박한 일 처리의 경우는 최대한 자제해 주세요. 주말 아침에 일하면 우울하니까요. ㅜㅜ

jongfeel commented 2 years ago

오브젝트 읽고 정리하기

chichoon commented 2 years ago

이번주 금요일은 절대 술 안마십니다.. 저번주에 하늘 노래지고 후회한 지최입니다

이번주 할 일

exgs commented 2 years ago

할 일

지금까지 배워왔던 C# 정리 notion을 보면서, 다시금 리마인드하기 (정리는 가장 기억에 남는 것 몇개를 남기는 것으로 함!)


Delegate에서는 ref parameter를 받는 대리자를 설정할 수 있고, Action과 Func에서는 ref parameter를 받지 못한다고 한다. 10년전에 질문이지만, 현재 버전에서도 동작하지않음. (.NET framwork v4.8) Action과 Func이 Delegate를 단순 wrapping 한 것이라고 생각하고 사용하였으나 그렇지 않을 수 있겠다는 생각이 듦.

JSY8869 commented 2 years ago

할 일

leetcode 코딩 테스트 풀기!

743. Network Delay Time

from collections import defaultdict
import heapq

class Solution:
    def networkDelayTime(self, times: list[list[int]], n: int, k: int) -> int:
        graph = defaultdict(list)
        visited = set()
        result = 0

        for start, destination, time in times:
            graph[start].append((time, destination))

        heap = [(0,k)]

        while heap:
            time, now = heapq.heappop(heap)

            if now in visited:
                continue

            visited.add(now)

            result = max(result, time)

            for nextTime, nextNode in graph[now]:
                heapq.heappush(heap, (nextTime + result, nextNode))

        if len(visited) != n:
            return -1
        return result
wjrmffldrhrl commented 2 years ago

Kill Docker Network

도커 네트워크를 죽여봅시다 👍

Docker Network Structure

도커는 컨테이너에 내부 IP를 순차적으로 할당하며, 이 IP는 컨테이너를 재시작할 때마다 변경될 수 있습니다.
이 내부 IP는 도커가 설치된 호스트, 즉 내부 망에서만 쓸 수 있는 IP이므로 외부와 연결될 필요가 있습니다.

도커는 각 컨테이너에 외부와의 네트워크를 제공하기 위해 컨테이너마다 가상 네트워크 인터페이스를 호스트에 생성하며 이 인터페이스의 이름은 veth로 시작합니다.

veth 인터페이스뿐 아니라 docker0이라는 브리지도 존재합니다.
docker0 브리지는 각 veth 인터페이스와 바인딩돼 호스트의 eth0 인터페이스와 이어주는 역할을 합니다.

위와 같이 구성되어 있으며 컨테이너의 eth0 인터페이스는 호스트의 veth...라는 인터페이스와 연결되고, veth인터페이스는 docker0 브리지와 바인딩돼 외부와 통신할 수 있습니다.

Docker Network Function

컨테이너를 생성하면 기본적으로 docker0 브리지를 통해 외부와 통신할 수 있는 환경을 사용할 수 있지만 사용자의 선택에 따라 여러 네트워크 드라이버를 사용할 수 있습니다.

도커가 자체적으로 제공하는 대표적인 네트워크 드라이버는 아래와 같습니다.

docker network ls 명령을 통해 네트워크 목록을 확인할 수 있습니다.

> docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
644b5223fb80   bridge    bridge    local
e8a33470c6b5   host      host      local
3f6662f642f3   none      null      local

기본적으로 브리지, 호스트, 논 네트워크가 존재합니다.

Bridge Network

브리지 네트워크는 컨테이너를 생성할 때 자동으로 연결되는 docker0 브리지를 활용하도록 설정되어 있습니다. 브리지 네트워크는 172.17.0.x IP 대역을 컨테이너에 순차적으로 할당합니다. docker network inspect 명령을 통해 더 자세한 정보를 확인할 수 있습니다.

> docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "644b5223fb80b9b70553f06168849509b9c4499783b255a46da52ec2dd4ea5d4",
        "Created": "2022-03-26T01:53:54.77347925Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        ...생략...
    }
]

Config 항목의 서브넷과 게이트웨이가 172.17.0.0/16과 172.17.0.1로 되어있습니다.
아무런 설정을 하지 않고 컨테이너를 생성하면 컨테이너는 자동으로 docker0 브리지를 사용합니다.

새로운 사용자 정의 브리지를 생성할 수도 있습니다.

> docker netwrok create --driver bridge mybridge
> docker run -it -n mynetwork_container \
--net mybrdige \
ubuntu:14.04

브리지 네트워크는 docker network disconnectdocker network connect를 통해 유동적으로 연결하거나 끊을 수 있습니다.

> docker network disconnect bridge mynetwork_container
> docker network connect bridge mynetwork_container

논, 호스트와 같은 특별한 네트워크는 사용할 수 없습니다.

Host Network

네트워크를 호스트로 설정하면 호스트의 네트워크 환경을 그대로 사용할 수 있습니다.

> docker run -it -n network_host \
--net host \
ubuntu:14.04

컨테이너 내부에서 네트워크 환경을 확인하면 호스트와 같은것을 알 수 있으며, 호스트 머신에서 설정한 호스트 이름도 컨테이너가 물려받기 때문에 컨테이너의 호스트 이름도 무작위 16진수가 아닌 도커 엔진이 설치된 호스트 머신의 호스트 이름으로 설정됩니다.

not host network

❯ docker run -it ubuntu:14.04 /bin/bash
root@40c11d8cf93c:

host network

❯ docker run -it --net host ubuntu:14.04 /bin/bash
root@docker-desktop:

컨테이너의 네트워크를 호스트로 지정하면 컨테이너 내부의 에플리케이션을 별도의 포트 바인딩 없이 바로 서비스할 수 있습니다.

None Network

논 네트워크는 말 그대로 아무런 네트워크를 사용하지 않는 것을 의미합니다.
아래와 같이 컨테이너를 생성하면 외부와 단절됩니다.

> docker run -it -n network_none \
--net none \
ubuntu:14.04

Container Network

--net 옵션으로 container를 입력하면 다른 컨테이너의 네트워크 네임스페이스 환경을 공유할 수 있습니다.

--net 옵션의 값으로 container:[other-container-id] 와 같이 입력합니다.

> docker run -it -d -n network_container_1 ubuntu:14.04

> docker run -it -d -n network_container_2 \
--net container:network_container_1 \
ubuntu:14.04

위와 같이 다른 컨테이너의 네트워크 환경을 공유하면 내부 IP를 새로 할당받지 않으며 호스트에 veth로 시작하는 가상 네트워크 인터페이스도 생성되지 않습니다.

Bridge network & --net-alias

브리지 타입의 네트워크와 run 명령어의 --net-alias옵션을 사용하면 특정 호스트 이름으로 컨테이너 여러 개에 접근할 수 있습니다.

> docker run -it -d -n network_alias_container1 \
--net mybridge \
--net-alias alicek106 ubuntu:14.04 

> docker run -it -d -n network_alias_container2 \
--net mybridge \
--net-alias alicek106 ubuntu:14.04 

> docker run -it -d -n network_alias_container3 \
--net mybridge \
--net-alias alicek106 ubuntu:14.04 

inspect 명령어로 컨테이너의 IP 주소를 확인하면 172.18.0.3으로 나옵니다.

> docker inspect network_alias_container1 |  grep IPAddress 
"IPAddress": "172.18.0.3"

그렇다면 나머지 컨테이너들은 각각 172.18.0.4, 172.18.0.5 일 것입니다.

이후 세 컨테이너에 접근할 컨테이너를 생성하고 내부에서 alicek106이라는 호스트에 ping을 수행하면 아래와 같이 컨테이너 3개의 IP로 각각 ping이 전송되는걸 확인할 수 있습니다.

> docker run -it -n network_alias_ping \
--net mybridge \
ubuntu:14.04

root@1c1c0c952f0c:/# ping -c 1 alicek106
PING t1 (172.18.0.2) 56(84) bytes of data.
64 bytes from nac1.mybridge (172.18.0.2): icmp_seq=1 ttl=64 time=0.491 ms

--- alicek106 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.491/0.491/0.491/0.000 ms
root@1c1c0c952f0c:/# ping -c 1 alicek106
PING t1 (172.18.0.3) 56(84) bytes of data.
64 bytes from nac2.mybridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.085 ms

--- alicek106 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.085/0.085/0.085/0.000 ms
root@1c1c0c952f0c:/# ping -c 1 alicek106
PING t1 (172.18.0.4) 56(84) bytes of data.
64 bytes from nac3.mybridge (172.18.0.4): icmp_seq=1 ttl=64 time=0.316 ms

--- alicek106 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.316/0.316/0.316/0.000 ms

매번 달라지는 IP를 결정하는 것은 별도의 알고리즘이 아닌 라운드 로빈 방식입니다.

Reference

jongfeel commented 2 years ago

할 일

지금까지 배워왔던 C# 정리 notion을 보면서, 다시금 리마인드하기 (정리는 가장 기억에 남는 것 몇개를 남기는 것으로 함!)

Delegate에서는 ref parameter를 받는 대리자를 설정할 수 있고, Action과 Func에서는 ref parameter를 받지 못한다고 한다. �10년전에 질문이지만, 현재 버전에서도 동작하지않음. (.NET framwork v4.8) Action과 Func이 Delegate를 단순 wrapping 한 것이라고 생각하고 사용하였으나 그렇지 않을 수 있겠다는 생각이 듦.

Action, Func는 ref parameter로 선언되어 있지 않아서 그런 겁니다. Custom delegate는 ref parameter로 정의할 수 있으니까 Action, Func랑 동작이 동일하다고 해도 다른 거죠. delegate는 아래 3개의 요소가 정확하게 일치해야 동작을 합니다.