Docker Container


1. Docker Container Lifecycle

이미지가 생성되면 이미지를 바탕으로 컨테이너를 생성할 수 있다. 컨테이너의 Lifecycle은 아래와 같다.

Docker Container Lifecycle

1.1. 컨테이너 생성(docker create)

Docker 이미지로 컨테이너를 생성한다. docker create 명령어를 실행하면 이미지에 포함된 linux 디렉토리 및 파일 집합의 스냅샷을 만든다.

1.2. 컨테이너 생성 및 구동(docker run)

Docker 이미지에서 컨테이너를 생성하여 컨테이너상에서 프로로세스를 구동한다.

1.2.1. 생성 및 구동

옵션설명

-a, –attach=[STDIN or STDOUT or STDERR]

표준입력(STDIN), 표준출력(STDOUT), 표준 에러 출력(STDERR)을 연결

–cidfile="file name"

컨테이너 ID를 파일로 출력

-d, –detach=false

컨테이너를 생성하여 백그라운드에서 실행

-i, –interactive=false

컨테이너 표준 입력 열기

-t, –tty=false

tty(단말 디바이스)를 사용

–name

컨테이너 명

docker run -it --name "testCal" centos /bin/cal

test calendar

docker run -it --name "testBash" centos /bin/bash

test bash

1.2.2. 백그라운드 실행

docker run [option] <image>[:tag] [cmd]
옵션설명

-d,–detach

백그라운드에서 실행

-u,–user="사용자명"

사용자명을 입력

–restart=[no or on-failure or on-failure:횟수n or always]

커맨드 실행 결과에 따라 재기동

–rm

커맨드 실행 완료 후 컨테이너 자동 삭제

docker run -d centos /bin/ping localhost

docker run background

실행이 완료된 후 컨테이너를 자동으로 삭제하고자 할 때에는 rm옵션을 사용한다. 또한, 커맨드 실행 결과에 따라 컨테이너를 재구동시키고자 할때에는 restart 옵션을 사용한다.

restart옵션은 아래와 같다.

설명

no

재구동하지 않음

on-failure

종료 status가 0이 아닌 경우 재구동

on-failure:횟수n

종료 status가 0이 아닌 경우 n번 재구동

always

항상 재구동

1.2.3. 컨테이너 네트워크 설정

docker run [option] <image>[:tag] [cmd]
옵션설명

–add-host=[Host Name:IP Address]

컨테이너의 /etc/hosts에 Host Name과 IP Address를 설정

–dns=[IP Address]

DNS 서버의 IP Address를 설정

–expose=[Port Number]

Port Number 할당

–mac-address=[MAC Address]

Container의 MAC Address 설정

–net=[bridge or none or container:'name or d' or host]

컨테이너 네트워크 설정

-h, –hostname=[Host Name]

컨테이너의 Host Name 설정

-P, –publish-all=[true or false]

임의의 포트를 컨테이너에 할당

-p [Host Port Number]:[Container Port Number]

Host와 Container의 Port를 매핑

–link=[컨테이너명:alias]

다른 컨테이너에서 액세스 시 이름 설정

Port Mapping

docker run -d -p 9000:80 httpd

호스트 포트 9000과 컨테이너 포트80에 매핑한다. 호스트 9000으로 액세스 하면 컨테이너 상의 80포트로 연결된다. 임의의 포트를 할당할 때에는 P 옵션을 사용한다.

DNS Server

docker run --dns=192.168.1.1 httpd

MAC Address

docker run -it --mac-address="92:d0:c6:0a:29:33" centos

Host Name

docker run -it --add-host=test.com:192.168.1.1 centos

net option

설명

bridge

bridge 접속(default) 사용

none

네트워크에 접속하지 않음

container:[name or id]

다른 컨테이너의 네트워크를 사용

host

컨테이너가 호스트 OS의 네트워크를 사용

1.2.4. 리소스 설정

docker run [option] <image>[:tag] [cmd]

option

optiondescription

-c,–cpu-shares=0

CPU resource 분배

-m,–memory=[usage]

메모리 사용량 제한(단위는 b, k, m, g)

-v,–volume=[host directory]:[container directory]

호스트와 컨테이너의 디렉토리 공유

cpu & memory

docker run --cpu-shares=512 --memory=512m centos

Docker 리소스를 제한하는 기능은 linuxcgroups 기능을 사용한다.

Host OSContainer내의 디렉토리를 공유하고자 할 때는 volume option을 사용한다.

volume

docker run -v /c/Users/user/workspace:/var/www/html httpd

1.2.5. 환경 설정

docker run [option] <image>[:tag] [cmd]
optiondescription

-e, –env=[환경변수]

환경변수 설정

–env-file=[파일명]

파일에서 환경변수 설정

–privileged=[true or false]

privileged 모드에서 구동(호스트의 커널 기능도 사용 가능)

–read-only=[true or false]

컨테이너의 파일 시스템을 read-only로 설정

-w, –workdir=[경로]

컨테이너의 작업 디렉토리를 설정

docker run -it -e foo=bar centos /bin/bash
docker run -it --env-file=env_list centos /bin/bash

1.3. 컨테이너 목록 확인(docker ps)

docker ps [option]

option

optiondescription

-a, –all=false

구동, 중지 상태의 모든 컨테이너를 표시

–before=""

입력한 컨테이너명 또는 ID보다 이전에 구동된 컨테이너를 표시 –since=""

입력한 컨테이너명 또는 ID보다 이후에 구동된 컨테이너를 표시

-l, –latest=false

마지막에 구동된 컨테이너를 표시

-f, –filter '[key]=[value]'

목록에 표시할 컨테이너를 필터링

–format '[key]=[value]'

폭록에 표시할 포맷을 설정

–no-trunc=false

생략된 정보 없이 모두 표시

-q, –quiet=false

컨테이너 ID만 표시

-s, –size=false

result(option key)

itemdescription

CONTAINER ID

컨테이너 ID

IMAGE

컨테이너 기반이 된 이미지

COMMAND

컨테이너에서 실행중인 커맨드

CREATED

컨테이너 생성 후 경과 시간

STATUS

컨테이너 상태(restarting or running or paused or exited)

PORTS

할당된 포트

NAMES

컨테이너 명

format

placeholderdescription

.ID

컨테이너 ID

.Image

컨테이너의 기반이 된 이미지

.Command

실행 커맨드

.CreatedAt

컨테이너가 생성된 시간

.RunningFor

컨테이너 구동 시간

.Ports

할당된 포트

.Status

컨테이너 상태

.Size

컨테이너 디스크 사이즈

.Labels

컨테이너의 모든 라벨

.Label

컨테이너 라벨

docker ps -a --format "table {{.ID}}\t{{.Status}}"

1.4. 컨테이너 구동 확인(docker stats)

docker stats <컨테이너명 또는 ID>

result

itemdescription

CONTAINER

컨테이너명 또는 ID

CPU %

CPU 사용률

MEM USAGE/LIMIT

메모리 사용량/컨테이너에서 사용할 수 있는 메모리 제한

MEM %

메모리 사용률

NET I/O

네트워크 I/O

1.5. 컨테이너 구동(docker start)

중지중인 컨테이너를 구동한다. 컨테이너명 또는 ID를 입력하여 구동한다.

docker start [option] <컨테이너명 또는 ID>

option

optiondescription

-a, –attach=false

표준 출력, 표준 에러를 연결

-i, –interactive=false

컨테이너 표준 입력을 연결

1.6. 컨테이너 중지(docker stop)

구동중인 컨테이너를 중지한다. 컨테이너명 또는 ID를 입력하여 중지한다.

docker stop [option] <컨테이너명 또는 ID>

option

optiondescription

-t, –time=10

컨테이너 중지 시간을 지정(default: 10)

1.7. 컨테이너 재시작(docker restart)

docker restart [option] <컨테이너명 또는 ID>

option

optiondescription

-t, –time=10

컨테이너 재시작 시간을 지정(default: 10)

1.8. 컨테이너 삭제(docker rm)

컨테이너를 삭제한다. 삭제하는 컨테이너는 사용 중지중이어야 한다.

docker rm [option] <컨테이너명 또는 ID>

option

optiondescription

-f, –force=false

구동 중인 컨테이너를 강제 삭제

-v –volume=false

할당된 볼륨을 삭제

1.9. 컨테이너 일시정지 및 재시작(docker pause/docker unpause)

docker pause <컨테이너명 또는 ID>
docker unpause <컨테이너명 또는 ID>

2. Docker Container Usage

2.1. 컨테이너 접속(docker attach)

docker attach <컨테이너명 또는 ID>

Ctrl + P, Ctrl + Q로 종료

2.2. 컨테이너의 프로세스 실행(docker exec)

docker exec [option] <컨테이너명 또는 ID> <cmd> [value]

option

optiondescription

-d, –detach=false

커맨드를 백그라운드에서 실행

-i, –interactive=false

컨테이너 표준 입력 열기

-t, –tty=false

tty(단말디바이스) 사용

2.3. 컨테이너의 프로세스 확인(docker top)

docker top <컨테이너명 또는 ID>

2.4. 컨테이너의 포트 상태 확인(docker port)

docker port <컨테이너명 또는 ID>

2.6. 컨테이너 내에서 파일 복사

docker cp <컨테이너명 또는 ID>:<컨테이너 내의 파일 경로> <호스트 디렉토리 경로>
docker cp <호스트 파일> <컨테이너명 또는 ID>:<컨테이너 내의 파일 경로>

2.7. 컨테이너 내에서 파일 변경 이력 확인(docker diff)

docker diff <컨테이너명 또는 ID>

구분

구분description

A

파일 추가

D

파일 삭제

C

파일 변경

2.8. docker version

Docker의 버전 확인

docker version

2.9. Docker 실행 환경 확인(docker info)

$ docker info
Containers: 6
 Running: 0
 Paused: 0
 Stopped: 6
Images: 7
Server Version: 1.12.3
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 71
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: null bridge host overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 4.4.27-moby
Operating System: Alpine Linux v3.4
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.951 GiB
Name: moby
ID: LRQA:PHWE:COK5:5FCF:7KYP:ZWQ2:346W:PP5A:GMHM:N3WP:AKV4:YYRZ
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 16
 Goroutines: 29
 System Time: 2016-12-17T05:47:28.308350112Z
 EventsListeners: 1
No Proxy: *.local, 169.254/16
Registry: https://index.docker.io/v1/
WARNING: No kernel memory limit support
Insecure Registries:
 127.0.0.0/8

3. 컨테이너에서 이미지 생성

3.1. 컨테이너에서 이미지 생성(docker commit)

docker commit [option] <컨테이너명 또는 ID> [image][:tag]

option

optiondescription

-a, –author=""

생성자 -m, –message=""

메시지

-p, –pause=true

3.2. 컨테이너를 tar 파일로 저장(docker export)

docker export <컨테이너명 또는 ID>

3.3. tar 파일에서 이미지 생성(docker import)

docker import <파일 또는 URL> - [image][:tag]

3.4. 이미지 저장(docker save)

docker save [option] <file> [image]

Docker 기본 사용법


1. 기본 사용 Command

1.1. 이미지 다운로드(docker pull)

docker pull [옵션] <이미지명>[:태그명]

Ubuntu Download

docker pull ubuntu

tag를 붙이지 않으면 자동으로 최신 버전을 다운받는다.

docker pull registry.hub.docker.com/ubuntu

위와 같이 url도 지정할 수 있다.

1.2. 이미지 목록 출력(docker images)

docker images [옵션] [repository명]

Docker Images

위와같이 docker images 명령어를 사용해 다운받은 전체 이미지 목록을 출력할 수 있다.

AttributeDescription

REPOSITORY

Docker 이미지 명

TAG

Docker 이미지 태그명

IMAGE ID

Docker 이미지 ID

CREATED

생성일

VIRTUAL SIZE

사이즈

1.3. 이미지 세부 정보 확인(docker inspect)

docker inspect [옵션] <컨테이너 또는 이미지의 이름, ID>

Docker 이미지의 세부정보를 확인할 수 있다.

$ docker inspect ubuntu
[
    {
        "Id": "sha256:4ca3a192ff2a5b7e225e81dc006b6379c10776ed3619757a65608cb72de0a7f6",
        "RepoTags": [
            "ubuntu:latest"
        ],
        "RepoDigests": [
            "ubuntu@sha256:3b64c309deae7ab0f7dbdd42b6b326261ccd6261da5d88396439353162703fb5"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2016-11-29T20:04:37.391061223Z",
        "Container": "924f68d3d4b6ae0fe9e35ec75d745b12863d8f0eb3f3d054ca4427a789d72d69",
        "ContainerConfig": {
            "Hostname": "6766fe1c072d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:9ab52bdd7c391413c7e0d83b56df4f6a0a6d2f03cb4c609fca1884ab2e63dab4",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "1.12.3",
        "Author": "",
        "Config": {
            "Hostname": "6766fe1c072d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:9ab52bdd7c391413c7e0d83b56df4f6a0a6d2f03cb4c609fca1884ab2e63dab4",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 128206574,
        "VirtualSize": 128206574,
        "GraphDriver": {
            "Name": "aufs",
            "Data": null
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:d29d52f94ad5aa750bd76d24effaf6aeec487d530e262597763e56065a06ee67",
                "sha256:dfcc17ddae9e5bab2da074f94856a2a1a42b21e402b49815bb4f87b048082ca5",
                "sha256:1c53295311c1505bddc4d07d5992434de18243951059ab5ea7b2daf9cec1488a",
                "sha256:18568efa7ad4beb199f7a9dc211b33fb2b165dcc0966c4c74af3f5ae396f3ec3",
                "sha256:0d45be5b95d86888d2f6beda0fddb089ba61a3ddc514fdb0a4fd022aad19a392"
            ]
        }
    }
]

주요 정보는 다음과 같다.

  • Image ID

  • 생성일

  • Docker version

  • Image creator

  • CPU

1.4. 이미지 태그 설정(docker tag)

docker tag <image>[:tag] <docker hub 사용자명>/<image명>[:tag명]

Docker Hub에 생성된 이미지를 등록한다. 여기서 docker images 커맨드를 통해서 IMAGE ID가 같음을 확인할 수 있는데, 두 개의 이미지가 이름은 다르나 동일 이미지를 사용한다는 것을 확인 할 수 있다.

Docker Tag

docker search [옵션] <검색 키워드>

Docker Hub에 공개된 이미지를 검색할 때 사용되는 커맨드다.

옵션설명

–automated=false

Automated Build만 표시

–no-trunc=false

모든 결과 표시

-s[–stars=0]

특정 개수 이상의 별 수

항목설명

NAME

Docker Image명

DESCRIPTION

Docker Image 설명

STARS

해당 이미지가 받은 별 수

OFFICIAL

공식 이미지 여부

AUTOMATED

Dockerfile을 기반으로 자동 생성된 이미지 여부

Docker Search

1.6. 이미지 삭제(docker rmi)

docker rmi [옵션] <이미지명>

Docker Image를 삭제할 때 사용한다. 여러 이미지를 삭제하고자 할 때는 공백으로 여러 이미지명을 구분하여 입력한다.

옵션설명

-f, –force=false

이미지 강제 삭제

–no-prune=false

태그가 없는 부모 이미지를 삭제하지 않음

Docker RMI

1.7. Docker Hub에 로그인(docker login)

docker login [옵션] [서버명]

Docker Hub에 업로드 할 때 docker login 커맨드를 사용해 Docker Hub에 로그인 한다. 서버명을 입력하지 않으면 Docker Hub에 액세스한다. 다른 repository로 로그인 할 경우에는 해당 서버명을 입력한다.

옵션설명

-u, –username=""

사용자명 -p, –password=""

패스워드 -e, –email=""

이메일 주소

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you dont have a Docker ID, head over to https://hub.docker.com to create one.
Username: 사용자명
Password: 패스워드
Login Succeeded

1.8. 이미지 업로드(docker push)

docker push <이미지명>[:태그명]

Docker Hub에 이미지를 업로드할 때 docker push 커맨드를 사용한다. docker push 커맨드 사용을 위해서는 docker login을 해야한다.

$ docker push nuti0102/ubuntu:1.0
The push refers to a repository [docker.io/nuti0102/ubuntu]
0d45be5b95d8: Mounted from library/ubuntu
18568efa7ad4: Mounted from library/ubuntu
1c53295311c1: Mounted from library/ubuntu
dfcc17ddae9e: Mounted from library/ubuntu
d29d52f94ad5: Mounted from library/ubuntu
1.0: digest: sha256:3b64c309deae7ab0f7dbdd42b6b326261ccd6261da5d88396439353162703fb5 size: 1357

Docker Push

1.9. Docker Hub에서 로그아웃(docker logout)

docker logout [서버명]

Docker Hub에서 로그아웃할 때 docker logout 커맨드를 사용한다.

$ docker logout
Remove login credentials for https://index.docker.io/v1/

TensorFlow Intro


1. 딥러닝이란?

  • 사람의 학습 능력을 모방하기 위해 다양한 컴퓨터 알고리즘과 방법론을 연구하는 분야

  • 신경망 알고리즘을 주로 사용하는 머신 러닝의 한 분야

  • 인공 신경망이라는 표현이 조금 더 적절할 수 있으나 포괄적인 의미로서 딥 러닝이라고 불림

  • 신경세포의 구조에서 착안하여 고안된 알고리즘을 사용

  • 신경세포의 특징을 바탕으로 1957년 프랭크 로젠블랫(Frank Rosenblatt)이 개발한 퍼셉트론 알고리즘이 딥 러닝과 많은 머신 러닝 알고리즘의 기초가 됨

2. Perceptron

  • 하나의 퍼셉트론은 하나의 신경세포를 인공적으로 모델링한 뉴런(neuron)이라 표현한다.

  • 입력값 X1, X2가 있을 때 각각 가중치 W1, W2를 곱한 후 더한다.

  • X1 x W1 + X2 x W2

  • 만족스로운 결과가 나올 떄 까지 가중치 W1, W2를 조정한다.

3. 신경망 구조

  • 신경세포 하나가 처리하는 정보는 단순하지만, 수천 억에서 1조 개에 달하는 많은 수의 신경세포가 거미줄처럼 얽혀 있어 복잡한 정보를 가공할 수 있다.

  • 신경망은 여러 개의 뉴런이 하나의 계층을 형성하며, 이런 계층을 다시 어러 개 쌓아 올린다.

  • 연결된 뉴런끼리 얼마만큼 정보를 주고받을지의 가중치를 매번 조절하여 신경망에 있는 모든 뉴런간의 연결을 최적화 하는 과정을 학습 또는 훈련이라 한다.

계층description

입력계층

신경망에서 데이터를 입력받는 계층

출력계층

결과값을 만들어내는 계층

은닉계층

입력계층은닉계층 사이에 끼어있는 계층

구조description

심층 신경망(DNN)

입력계층, 출력계층, 은닉계층으로 나누어짐

합성곱 신경망(CNN)

이미지 안의 물체를 인식하거나 이미지의 장면을 글로 요약하는데 많이 사용됨

순환 신경망(RNN)

???

4. References

  1. 조르디 토레스 . 박해선 텐서플로우 첫걸음 . 한빛미디어, pp. 23-31


NapuCon 2016 Review


1. NapuCon 2016 후기

지금까지 컨퍼런스를 그렇게 많이 다닌 것은 아니지만 여태까지 참석한 컨퍼런스중에 가장 만족스러운 컨퍼런스였다.

작은 기업에서 사수가 없는 개발자로 생활을 하면서 서적, 블로그, 커뮤니티 등을 통해 습득한 지식을 나름대로 적용하고, 적용 여부를 검토하곤 했었는데 내가 잘 하고 있는 것이 맞나? 라는 생각과 누군가가 조언을 해 줄 사람이 있었으면 좋겠다는 생각에 답답해 하고 있었는데, 이번 컨퍼런스에서 그 답답함을 해결해 줬다.

케빈님을 통해서는 그 전에 케빈TV 를 보면서도 느꼇지만 역시 개발자는 잔실수로 삽질을 자주 하는구나 라는 것을 깨닫게 되었고, Rakuten의 전민수, 심재민 Architect님들을 통해 큰 규모에서는 저런식으로 요구사항을 맞춰가고, 어떤식으로 처리하는 지에 대해 알게되어 너무 좋았다. 데니스 님을 통해서는 요즘 관심이 있어 공부를 시작한 Docker에 대해 들어서 트렌드를 잘 쫓아가고 있는 지에 대해 검증을 받은 느낌이어서 좋았다.

개인적으로 세번째 세션과 마지막 세션, 치즈님과 박미정님의 발표가 가장 좋았다.

치즈님의 발표를 통해서 지금까지 개인적으로 공부하고, 적용하고 있는 부분들이 잘 하고있는지를 검토받은 느낌이 들었다. 그리고, 초고수가 되기 위해 본인이 했던 일들에 대해 들은 것이 나에게 많은 자극이 되었다. 개발자로써 성장하고 싶지만 아직까지 그렇게 많은 노력을 하고있진 않다는 것을 깨닫게 해주셨다.

박미정님의 발표는 스타트업에 합류한 이후 본인이 기존의 문제를 해결해 나가는 과정을 설명해주셔서 너무 좋았다. 물론 회사 대표를 잘 설득을 해야 된다는 큰 어려움이 있지만, 그 어려움을 극복하고 문제를 해결한 모습이 너무 대단해 보였다. 박미정님의 발표 마지막에 질문으로 아무리 노력을 해도 대표가 설득이 되지 않고, 거리가 좁혀지지 않을 경우 박미정님은 어떤 선택을 할 지에 대한 답변은 정말 현실적인 답변이어서 웃기기도 했지만, 앞으로 내가 어떻게 할지에 대해 다시한번 생각해보게 되는 계기가 되었다.

어떻게 보면 자바8 스승님인 케빈님과 사진을 찍지 않은 것이 뒤늦게 후회가 되지만 정말 좋은 컨퍼런스였고, 많은 것을 배우게 되었다.


NapuCon 2016


1. Session 1 - Kevin Lee

1.1. Funtional Programming

  • 함수형 언어란

  • 수학의 함수와 같은 의미

  • 함수형 언어를 사용해야 하는 이유(함수형 언어의 장점)

  • 동시성 - 유휴자원을 최소화 하여 서버를 최대한 활용하기 위함

  • 간결 - 코드의 질과 가독성이 높아짐

  • 명확 - 기능별 분리 및 메소드의 관심사가 명확해짐

  • 테스트가 간결해진다 - 레거시 코드 양산 방지

  • Side Effect가 OOP보다 줄어든다

  • 재미가 있음?????????

1.2. ETC

  • Test Case 작성의 필수라고 생각되는 Mock을 사용하지 않고 Interpreter Pattern을 통해 Test Code 작성하는 방법이 있음

2. Session 2 - Rakuten 전민수 Lead Architect, Rakuten 심재민 Architect

2.1. Rakuten의 구조 및 업무 프로세스 - Rakuten 심재민 Architect

  • Application Layer Architect + System Layer Architect

  • 각 영역의 Architect가 설계

  • 누군가는 기술 검증 및 적용 여부 검토를 해서 적용

  • 잘 적용하고있는지, 바르게 사용하고 있는지 피드백 및 교육을 진행

  • 레거시 방지를 위해서 일정 부분에 대해서는 룰을 정해서 룰을 따라감

  • 업무 관련 Software

  • JIRA

  • Bitbucket

  • Confluence

  • HipChat

  • Integrated Development Environment Tool

  • Eclipse

  • IntelliJ

  • Persistence Middleware

  • MySQL

  • Oracle

  • MongoDB

  • Redis

  • Hadoop

  • Cassandra

  • Web (Application) Server

  • Apache

  • Apache Tomcat

  • Programming Language & Framework

  • Spring Framework

  • Laravel Framework

  • Angular JS

  • Software Development Methodology

  • Agile과 Waterfall을 혼용

2.2. Rakuten의 Realtime Search Platform 적용 사례 - Rakuten 전민수 Lead Architect

2.2.1. Verifications

  • Horizontal Scale Out

  • Low Latency

  • Trouble Shooting

  • Service Level Agreement 99.95%

  • Fault Tolerance

  • Cost Efficiency

  • Flexibility

  • Sync with Master Data

2.2.2. Target Middleware

  • MongoDB

  • 적합 판정으로 채택

  • MemSQL

  • 검증 결과 부적합 판정으로 제외

  • Cassandra

  • Java에서 Cassandra 사용에 대한 어려움이 존해

  • 특정 상황에서 퍼포먼스가 떨어지는 현상이 있음

  • Oracle Coherence

  • 비용 문제로 인하여 제외

  • ActiveMQ

  • 검증 결과 부적합 판정으로 제외

  • RabbitMQ

  • 적합 판정으로 채택

  • Redis

  • 당시 Clustering지원이 되지 않아 고민 후 자체 기술력으로 해결

2.2.3. How To

  • Front Response 2,000ms

  • Backend Response 500ms

  • Master - Slave Cache Memory DB

  • 지속적으로 Logging 및 Tracking

  • 지속적으로 Monitoring APM Management

  • Release Service include build CI / CD pipeline

2.2.4. Result

  • Provides reliable NoSQL-based search

  • 99.98% guarantee data Sync with Master DB

  • Removing repetitive tasks in Automation

  • Supports 11 languages

3. Session 3 - Kakao 서지연(Cheese)

3.1. 아름다운 코드 작성 습관

3.1.1. 룰을 정하자

  • 가독성이 좋아야 한다

  • 유지보수를 생각해야 된다

  • 코드확장을 고려해야 된다

  • style guide

3.1.2. 코드 리뷰

  • sonarqube

  • 정적 코드 분석 및 가시화

  • 잠재 위험 코드 파악

  • pull request로 진행

  • pull approve

3.1.3. Git Branch

  • 기본적인 Branch 구조는 지키자

  • master - 운영 환경 적용 및 버전 관리용

  • develop - 개발 서버 적용 및 테스트 진행용

  • hotfix - 긴급 수정 적용사항으로 master에서 파생하여 master와 develop에 바로 병합

  • feature - 신규 개발 진행용

3.2. 자동 검증 습관

  • CI / CD tool을 활용

  • 빌드 / 배포 자동화

  • 테스트 자동화

  • CI / CD tool

  • go

  • Travis CI

  • Jenkins

  • Code Coverage

  • CODACY

  • 레거시를 줄이자

3.3. 성장하는 습관

  • SNS Follow

  • Community 활동

  • 스스로 노력

  • 발표하기

4. Session 4 - Makeus 김호광(Dennis) CTO

4.1. Serverless Architecture

  • 경주 지진 시 국민안전처 홈페이지 다운

  • 동시접속자가 늘어나 Bandwith를 감당하지 못한 것으로 추측

  • 공기관 홈페이지가 클라우드로 이전하는 것은 거의 불가능

  • AWS는 SLA가 없음

  • 1,000건 중 2건정도 유실되는 것으로 확인

  • 결론은 Docker를 사용하자

5. Session 5 - I/O Inc 박미정 CTO

5.1. 스타트업 극복기

  • 스타트업 조인 시 이미 레거시로 가득

  • 걷어낼 목록 정리

  • 우선순위 결정

  • 점진적인 개선

5.2. 함수형 언어 적용기

  • 현재까지는 함수형으로 따라가는 중

  • 한번에 변화하려 하지 않고, 조금씩 천천히 장점 파악 및 실제 적용 여부 검토중

  • 다른 사람들에게 변화를 강요하지 않고 스스로 받아들일 수 있도록 시도


Pagination