{
    "componentChunkName": "component---src-templates-post-tsx",
    "path": "/docker/",
    "result": {"data":{"logo":null,"markdownRemark":{"html":"<h1>Docker 란?</h1>\n<p>도커는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 배가 물건을 컨테이너에 넣어 운반하는 것처럼, 도커도 여러 가지 원하는 프로그램들을 컨테이너에 넣어 배포할 수 있다는 점이 비슷합니다.</p>\n<img src=\"https://user-images.githubusercontent.com/54731898/136175057-671761a9-710d-4c86-a001-02fa7b6ad754.png\" width=\"600\"> \n<h1>Docker 주요 개념</h1>\n<h2>1. 이미지(Image)</h2>\n<p><img src=\"https://user-images.githubusercontent.com/54731898/136189202-23a30f1d-0668-4f13-ba36-02a88c22413e.PNG\" alt=\"1\">\n사진은 <a href=\"https://hub.docker.com/\">Docker hub</a>에서 가져온 사진입니다.<br>\n위의 사진에 있는 것처럼 각각 하나의 프로그램을 <strong>이미지</strong>라고 부릅니다.</p>\n<p>이미지는 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있고 변하지 않습니다. 즉, 같은 이미지로 여러 개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 존재합니다.<br>\n예를 들어, ubuntu 이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있고, MySQL 이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보 등을 가지고 있습니다.</p>\n<p>이러한 Docker 이미지는 <a href=\"https://hub.docker.com/\">Docker hub</a>에 등록하거나 Docker Registry 저장소를 직접 만들어서 관리할 수 있습니다. 현재 공개된 도커 이미지는 50만개가 넘고, Docker hub의 이미지 다운로드 수는 80억회에 이른다고 합니다.</p>\n<br>\n<p>❓ <strong>Docker hub 와  Docker Registry 차이점</strong><br>\nDocker Hub에서는 이미지를 저장하고 관리해줍니다. 그래서 많은 회사들이 Docker로 소프트웨어를 배포하고, 공개된 이미지들을 공유할 수 있습니다.<br>\nGitHub와 동일하게 Docker Hub를 통해 이미지를 pull하여 사용할 수 있습니다.</p>\n<p>Docker Registry는 공개된 방식이 아닌 비공개적으로 격리된 사설 저장소입니다.\nDocker Registry 관련하여 더 자세한 내용은 <a href=\"https://www.redhat.com/ko/topics/cloud-native-apps/what-is-a-container-registry\">여기</a>를 참고해주세요.</p>\n<br>\n<h2>2. 컨테이너(Container)</h2>\n<p>도커의 이미지가 실행된 상태입니다. OS를 가상화하는 것이 아니라 프로세스가 격리된 공간에서 동작하는 기술입니다.</p>\n<h3><strong>Virtual Machine</strong></h3>\n<p><img src=\"https://user-images.githubusercontent.com/54731898/136199998-b7459daf-4878-4362-9208-1411b6af2e1e.PNG\" alt=\"2\"><br>\n호스트 OS위에 게스트 OS를 가상화하여 사용하는 방식입니다.<br>\n이 방식은 여러가지 OS를 가상화 할 수 있고 비교적 사용법이 간단하지만 무겁고 느리다는 단점이 있습니다. 왜냐하면 Virtual Machine이 OS를 자체적으로 가지고 있어야해서 용량이 커지기 때문입니다.<br>\n사진에 있는 Hypervisor는 VMware Workstation, Oracle VirtualBox 같은 것들 입니다.</p>\n<br>\n<h3><strong>컨테이너(Container)</strong></h3>\n<p><img src=\"https://user-images.githubusercontent.com/54731898/136199993-874fd26a-6b60-45b4-b71d-a486ec473302.PNG\" alt=\"3\"><br>\nOS레벨은 공유하고, 프로세스를 격리 하는 방식입니다.<br>\n즉, 어플리케이션 레벨에서는 각각의 어플리케이션을 격리해서 실행 할 수 있습니다. 그래서 하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행할 수 있고, CPU나 메모리는 프로세스가 필요한 만큼만 추가로 사용하기 때문에 성능적으로도<br>\n거의 손실이 없습니다.<br>\n참고로 리눅스에서는 이 방식을 리눅스 컨테이너(LXC)라고 하고 더 자세한 내용은 <a href=\"https://linuxcontainers.org/\">여기</a>를 참고해주세요.</p>\n<br>\n<h1>Docker 설치</h1>\n<ul>\n<li><a href=\"https://goddaehee.tistory.com/251\">Window10</a></li>\n<li><a href=\"https://kplog.tistory.com/288\">Mac</a></li>\n<li><a href=\"https://khj93.tistory.com/entry/Docker-Docker-%EC%84%A4%EC%B9%98%EB%B6%80%ED%84%B0-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%8B%A4%ED%96%89%EA%B9%8C%EC%A7%80-%EA%B8%B0%EB%B3%B8-%EC%82%AC%EC%9A%A9%EB%B2%95\">Linux</a></li>\n</ul>\n<br>\n<h1>Docker 사용 방법</h1>\n<p><img src=\"https://user-images.githubusercontent.com/54731898/136222615-1d1c44ff-a0fe-412c-89cb-79a5a552f233.PNG\" alt=\"4\"></p>\n<h3>1. Image를 Docker hub에서 받아서 컨테이너 생성</h3>\n<h4>Docker Image Pull 받기</h4>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker pull [Image Name]</code></pre></div>\n<p>pytorch_lightning 같은 경우는 <code class=\"language-text\">docker pull pytorchlightning/pytorch_lightning</code> 입니다.<br>\nDocker image는 <a href=\"https://hub.docker.com/\">Docker Hub</a>에서 확인할 수 있고, version 명시가 없을시 latest(최신버전)으로 pull 됩니다.</p>\n<br>\n<p><img src=\"https://user-images.githubusercontent.com/54731898/136233888-04cd5df2-6d50-4a01-8c26-fa78e08f714c.png\" alt=\"image\"></p>\n<br>\n<p>사실 run 명령어를 실행했을 때 사용할 이미지가 저장되어 있지 않다면 다운로드(pull)를 한 후, 컨테이너를 생성(create)하고 시작(start)됩니다. 그러면 언제 pull을 사용하는 것일까요?<br>\ngit과 동일하게 최신 버전으로 다시 받을 때 사용합니다.</p>\n<br>\n<h3>Docker Image list 확인</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker images\n\n\nREPOSITORY        TAG                           IMAGE ID       CREATED        SIZE\nubuntu            16.04                         b6f507652425   5 weeks ago    135MB\npytorch/pytorch   1.7.1-cuda11.0-cudnn8-devel   7554ac65eba5   8 months ago   12.9GB</code></pre></div>\n<h3>Docker Image 삭제하기</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker rmi [IMAGE_ID]</code></pre></div>\n<h3>컨테이너 실행하기</h3>\n<p>도커를 실행하는 명령어는 다음과 같습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker run [OPTIONS] [IMAGE] [COMMAND] [ARGS]</code></pre></div>\n<br>\n<p><strong>자주 사용하는 옵션들</strong><br>\n<img src=\"https://user-images.githubusercontent.com/54731898/136239050-c82f7b42-8199-4a95-80c5-1a7657b4ab12.png\" alt=\"image\"></p>\n<br>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker run ubuntu:16.04\n \nUnable to find image 'ubuntu:16.04' locally\n16.04: Pulling from library/ubuntu\n58690f9b18fc: Pull complete\nb51569e7c507: Pull complete\nda8ef40b9eca: Pull complete\nfb15d46c38dc: Pull complete\nDigest: sha256:454054f5bbd571b088db25b662099c6c7b3f0cb78536a2077d54adc48f00cd68\nStatus: Downloaded newer image for ubuntu:16.04</code></pre></div>\n<p>이렇게 컨테이너를 생성하고 ubuntu:16.04 이미지가 없으면 자동적으로 다운로드(pull)를 하고 컨테이너를 생성합니다. 하지만 컨테이너에 명령어를 전달하지 않았기 때문에 컨테이너는 생성되자마자 종료됩니다.<br>\n왜냐하면 컨테이너는 프로세스이기 때문에, 실행중인 프로세스가 없으면 컨테이너는 종료됩니다.</p>\n<br>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker run --rm -it ubuntu:16.04 /bin/bash</code></pre></div>\n<p>이번에는 컨테이너 내부에 들어가기 위해 bash 쉘을 실행하고 키보드 입력을 위해 -it 옵션을 주고, 프로세스가 종료되면 컨테이너가 자동으로 삭제되도록 —rm 옵션도 추가해서 실행하였습니다.<br>\n다운로드가 되어있기 때문에 이미지를 다운로드 하는 화면 없이 바로 실행이 되고, exit로 bash 쉘을 종료하면 컨테이너도 같이 종료됩니다.</p>\n<br>\n<h3>컨테이너 목록 확인하기</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker ps       # 실행중인 컨테이너 목록\n\nCONTAINER ID   IMAGE          COMMAND       CREATED          STATUS         PORTS     NAMES\nc818c8466c46   ubuntu:16.04   \"/bin/bash\"   35 seconds ago   Up 4 seconds             kind_rosalind\n\n&lt;br>\n\n$ docker ps -a    # 실행중인 컨테이너와 종료된 컨테이너 목록\n\nCONTAINER ID   IMAGE                                         COMMAND       CREATED          STATUS                       PORTS     NAMES\nc818c8466c46   ubuntu:16.04                                  \"/bin/bash\"   42 seconds ago   Up 11 seconds                          kind_rosalind\n33db0c9e3d20   pytorch/pytorch:1.7.1-cuda11.0-cudnn8-devel   \"/bin/bash\"   18 minutes ago   Exited (130) 4 minutes ago             patrick</code></pre></div>\n<br>\n<h3>컨테이너 중지하기</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker stop [CONTAINER_ID]</code></pre></div>\n<h3>컨테이너 제거하기</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker rm [CONTAINER_ID]\n$ docker rm -v $(docker ps -a -q -f status=exited)  # 중지된 컨테이너 한번에 삭제</code></pre></div>\n<h3>컨테이너 명령어 실행하기</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker exec [OPTIONS] [CONTAINER_ID] [COMMAND] [ARGS]\n$ docker exec -it [CONTAINER_ID] /bin/bash </code></pre></div>\n<p>run은 컨테이너를 새로 만들어서 실행하고, exec는 실행중인 컨테이너에 명령어를 내린다는 차이점이 있습니다.\n그래서 run일 때 [IMAGE] 였던 것이 [CONTAINER_ID]로 바꼈습니다.</p>\n<br>\n<h2>Docker Compose</h2>\n<p>지금까지는 도커를 커맨드라인에서 명령어로만 작업을 하였습니다. 지금은 간단한 작업이였지만, 여러 가지 설정이 추가되면 명령어가 금방 복잡해질 것 입니다.<br>\n도커는 복잡한 설정을 쉽게 관리하기 위해 YAML방식의 설정파일을 이용한 <a href=\"https://docs.docker.com/compose/\">Docker Compose</a>라는 툴을 제공합니다.</p>\n<br>\n<h3>설치</h3>\n<p>Mac에서 Docker for Mac, Window에서 Docker for Windows를 설치했다면 자동으로 설치가 되고 리눅스의 경우에는 다음 명령어를 입력하여 설치하면 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ curl -L \"https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose\n$ chmod +x /usr/local/bin/docker-compose\n\n$ docker-compose version  \n\ndocker-compose version 1.9.0, build 2585387\ndocker-py version: 1.10.6\nCPython version: 2.7.9\nOpenSSL version: OpenSSL 1.0.1t  3 May 2016</code></pre></div>\n<br>\n<h3>사용 방법</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ vi docker-compose.yaml\n\nversion: '3.5'  # YAML 파일 포맷 버전\nservices:\n  patrick:  # 이름\n    image: 'pytorch/pytorch:1.7.1-cuda11.0-cudnn8-devel'\n    shm_size: '2gb'\n    command: 'nvidia-smi'   # 컨테이너가 실행될 때 수행할 명령어, docker run에 있는 command와 동일\n    runtime: nvidia\n    volumes:\n      - /home/patrick/:/home\n    environment:\n      - NVIDIA_VISIBLE_DEVICES=all</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">docker-compose up</code></pre></div>\n<br>\n<h3>정리</h3>\n<p>Huggingface transformers에서 모델을 쉽게 다운받아 사용할 수 있는 것처럼, docker도 hub에서 image를 쉽게 다운 받아 사용할 수 있습니다.</p>\n<br>\n<h2>2. Image를 직접 만들어서 컨테이너 생성</h2>\n<p>Dockerfile이라는 파일 자체 DSL(Domain-specific language)을 이용하여 이미지를 생성합니다.</p>\n<br>\n<h3>Dockerfile에 작성되는 명령 옵션</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">FROM : Docker Base Image (기반이 되는 이미지, &lt;이미지 이름>:&lt;태그> 형식으로 설정, ubuntu:18.04)\nMAINTAINER : 메인테이너 정보 (작성자 정보)\nRUN : Shell Script 또는 명령을 실행\nCMD : 컨테이너가 시작될 때마다 실행할 명령어, Dockerfile에서 한번만 사용할 수 있습니다.\nLABEL : 라벨 작성 (docker inspect 명령으로 label을 확인할 수 있습니다.)\nEXPOSE : 호스트와 연결할 포트 번호를 설정한다.\nENV : 환경변수 설정\nADD : 파일 / 디렉터리 추가\nCOPY : 파일 복사\nENTRYPOINT : 컨테이너가 시작되었을 때 스크립트 실행\nVOLUME : 볼륨 마운트\nUSER : 명령 실행할 사용자 권한 지정\nWORKDIR : \"RUN\", \"CMD\", \"ENTRYPOINT\" 명령이 실행될 작업 디렉터리\nARG : Dockerfile 내부 변수\nONBUILD : 다른 이미지의 Base Image로 쓰이는 경우 실행될 명령 수행\nSHELL : Default Shell 지정</code></pre></div>\n<h3>1) Dockerfile 작성</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ vi Dockerfile\n \n# 1. 우분투 설치\nFROM ubuntu:18.04\n# 2. 메타데이터 표시\nLABEL \"purpose\"=\"practice\"\n# 3. 업데이트\nRUN apt-get update\n# 4. 호스트에 있는 파일을 복사\nCOPY test.txt /var/www/html\n# 5. 포트 80번 노출 지정\nEXPOSE 80\n# 6. 컨테이너 시작될 때마다 실행할 명령어\nCMD /bin/bash</code></pre></div>\n<h3>2) Dockerfile 빌드(이미지 생성)</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker build -t mybuild:0.2 ./test_docker\n\nSending build context to Docker daemon  3.072kB\nStep 1/6 : FROM ubuntu:18.04\n ---> 5a214d77f5d7\nStep 2/6 : LABEL \"purpose\"=\"practice\"\n ---> Using cache\n ---> 29c3986addc2\nStep 3/6 : RUN apt-get update\n ---> Using cache\n ---> fa3808d331d9\nStep 4/6 : COPY test.txt /var/www/html/\n ---> f1430498cfa9\nStep 5/6 : EXPOSE 80\n ---> Running in 3cda5f1355bf\nRemoving intermediate container 3cda5f1355bf\n ---> c3936aca4620\nStep 6/6 : CMD /bin/bash\n ---> Running in 4ac0bfe9d777\nRemoving intermediate container 4ac0bfe9d777\n ---> c789deea53d4\nSuccessfully built c789deea53d4\nSuccessfully tagged mybuild:0.2</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker images\n\nREPOSITORY        TAG                           IMAGE ID       CREATED          SIZE\nmybuild           0.2                           c789deea53d4   59 seconds ago   101MB\nubuntu            18.04                         5a214d77f5d7   5 days ago       63.1MB\nubuntu            16.04                         b6f507652425   5 weeks ago      135MB\npytorch/pytorch   1.7.1-cuda11.0-cudnn8-devel   7554ac65eba5   8 months ago     12.9GB</code></pre></div>\n<h3>3) 컨테이너 실행</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker run -it --name patrick_build mybuild:0.2</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ docker ps -a\n\nCONTAINER ID   IMAGE                                         COMMAND                  CREATED              STATUS                            PORTS     NAMES\n8cd50c3112cc   mybuild:0.2                                   \"/bin/sh -c /bin/bash\"   About a minute ago   Exited (127) About a minute ago             patrick_build\nc818c8466c46   ubuntu:16.04                                  \"/bin/bash\"              52 minutes ago       Up 51 minutes                               kind_rosalind\n33db0c9e3d20   pytorch/pytorch:1.7.1-cuda11.0-cudnn8-devel   \"/bin/bash\"              About an hour ago    Exited (130) 56 minutes ago                 patrick</code></pre></div>\n<h2>Reference</h2>\n<ul>\n<li><a href=\"https://docs.docker.com/get-started/overview/\">https://docs.docker.com/get-started/overview/</a></li>\n<li><a href=\"https://hub.docker.com\">https://hub.docker.com</a></li>\n<li><a href=\"https://linuxcontainers.org/\">https://linuxcontainers.org/</a></li>\n</ul>","htmlAst":{"type":"root","children":[{"type":"element","tagName":"h1","properties":{},"children":[{"type":"text","value":"Docker 란?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"도커는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 배가 물건을 컨테이너에 넣어 운반하는 것처럼, 도커도 여러 가지 원하는 프로그램들을 컨테이너에 넣어 배포할 수 있다는 점이 비슷합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://user-images.githubusercontent.com/54731898/136175057-671761a9-710d-4c86-a001-02fa7b6ad754.png","width":600},"children":[]},{"type":"text","value":" \n"},{"type":"element","tagName":"h1","properties":{},"children":[{"type":"text","value":"Docker 주요 개념"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"1. 이미지(Image)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://user-images.githubusercontent.com/54731898/136189202-23a30f1d-0668-4f13-ba36-02a88c22413e.PNG","alt":"1"},"children":[]},{"type":"text","value":"\n사진은 "},{"type":"element","tagName":"a","properties":{"href":"https://hub.docker.com/"},"children":[{"type":"text","value":"Docker hub"}]},{"type":"text","value":"에서 가져온 사진입니다."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n위의 사진에 있는 것처럼 각각 하나의 프로그램을 "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"이미지"}]},{"type":"text","value":"라고 부릅니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이미지는 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있고 변하지 않습니다. 즉, 같은 이미지로 여러 개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 존재합니다."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n예를 들어, ubuntu 이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있고, MySQL 이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보 등을 가지고 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이러한 Docker 이미지는 "},{"type":"element","tagName":"a","properties":{"href":"https://hub.docker.com/"},"children":[{"type":"text","value":"Docker hub"}]},{"type":"text","value":"에 등록하거나 Docker Registry 저장소를 직접 만들어서 관리할 수 있습니다. 현재 공개된 도커 이미지는 50만개가 넘고, Docker hub의 이미지 다운로드 수는 80억회에 이른다고 합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"❓ "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Docker hub 와  Docker Registry 차이점"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nDocker Hub에서는 이미지를 저장하고 관리해줍니다. 그래서 많은 회사들이 Docker로 소프트웨어를 배포하고, 공개된 이미지들을 공유할 수 있습니다."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nGitHub와 동일하게 Docker Hub를 통해 이미지를 pull하여 사용할 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Docker Registry는 공개된 방식이 아닌 비공개적으로 격리된 사설 저장소입니다.\nDocker Registry 관련하여 더 자세한 내용은 "},{"type":"element","tagName":"a","properties":{"href":"https://www.redhat.com/ko/topics/cloud-native-apps/what-is-a-container-registry"},"children":[{"type":"text","value":"여기"}]},{"type":"text","value":"를 참고해주세요."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"2. 컨테이너(Container)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"도커의 이미지가 실행된 상태입니다. OS를 가상화하는 것이 아니라 프로세스가 격리된 공간에서 동작하는 기술입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Virtual Machine"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://user-images.githubusercontent.com/54731898/136199998-b7459daf-4878-4362-9208-1411b6af2e1e.PNG","alt":"2"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n호스트 OS위에 게스트 OS를 가상화하여 사용하는 방식입니다."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n이 방식은 여러가지 OS를 가상화 할 수 있고 비교적 사용법이 간단하지만 무겁고 느리다는 단점이 있습니다. 왜냐하면 Virtual Machine이 OS를 자체적으로 가지고 있어야해서 용량이 커지기 때문입니다."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n사진에 있는 Hypervisor는 VMware Workstation, Oracle VirtualBox 같은 것들 입니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"컨테이너(Container)"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://user-images.githubusercontent.com/54731898/136199993-874fd26a-6b60-45b4-b71d-a486ec473302.PNG","alt":"3"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nOS레벨은 공유하고, 프로세스를 격리 하는 방식입니다."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n즉, 어플리케이션 레벨에서는 각각의 어플리케이션을 격리해서 실행 할 수 있습니다. 그래서 하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행할 수 있고, CPU나 메모리는 프로세스가 필요한 만큼만 추가로 사용하기 때문에 성능적으로도"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n거의 손실이 없습니다."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n참고로 리눅스에서는 이 방식을 리눅스 컨테이너(LXC)라고 하고 더 자세한 내용은 "},{"type":"element","tagName":"a","properties":{"href":"https://linuxcontainers.org/"},"children":[{"type":"text","value":"여기"}]},{"type":"text","value":"를 참고해주세요."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h1","properties":{},"children":[{"type":"text","value":"Docker 설치"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://goddaehee.tistory.com/251"},"children":[{"type":"text","value":"Window10"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://kplog.tistory.com/288"},"children":[{"type":"text","value":"Mac"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://khj93.tistory.com/entry/Docker-Docker-%EC%84%A4%EC%B9%98%EB%B6%80%ED%84%B0-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%8B%A4%ED%96%89%EA%B9%8C%EC%A7%80-%EA%B8%B0%EB%B3%B8-%EC%82%AC%EC%9A%A9%EB%B2%95"},"children":[{"type":"text","value":"Linux"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h1","properties":{},"children":[{"type":"text","value":"Docker 사용 방법"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://user-images.githubusercontent.com/54731898/136222615-1d1c44ff-a0fe-412c-89cb-79a5a552f233.PNG","alt":"4"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"1. Image를 Docker hub에서 받아서 컨테이너 생성"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{},"children":[{"type":"text","value":"Docker Image Pull 받기"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker pull [Image Name]"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"pytorch_lightning 같은 경우는 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"docker pull pytorchlightning/pytorch_lightning"}]},{"type":"text","value":" 입니다."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nDocker image는 "},{"type":"element","tagName":"a","properties":{"href":"https://hub.docker.com/"},"children":[{"type":"text","value":"Docker Hub"}]},{"type":"text","value":"에서 확인할 수 있고, version 명시가 없을시 latest(최신버전)으로 pull 됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://user-images.githubusercontent.com/54731898/136233888-04cd5df2-6d50-4a01-8c26-fa78e08f714c.png","alt":"image"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"사실 run 명령어를 실행했을 때 사용할 이미지가 저장되어 있지 않다면 다운로드(pull)를 한 후, 컨테이너를 생성(create)하고 시작(start)됩니다. 그러면 언제 pull을 사용하는 것일까요?"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\ngit과 동일하게 최신 버전으로 다시 받을 때 사용합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Docker Image list 확인"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker images\n\n\nREPOSITORY        TAG                           IMAGE ID       CREATED        SIZE\nubuntu            16.04                         b6f507652425   5 weeks ago    135MB\npytorch/pytorch   1.7.1-cuda11.0-cudnn8-devel   7554ac65eba5   8 months ago   12.9GB"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Docker Image 삭제하기"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker rmi [IMAGE_ID]"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"컨테이너 실행하기"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"도커를 실행하는 명령어는 다음과 같습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker run [OPTIONS] [IMAGE] [COMMAND] [ARGS]"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"자주 사용하는 옵션들"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://user-images.githubusercontent.com/54731898/136239050-c82f7b42-8199-4a95-80c5-1a7657b4ab12.png","alt":"image"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker run ubuntu:16.04\n \nUnable to find image 'ubuntu:16.04' locally\n16.04: Pulling from library/ubuntu\n58690f9b18fc: Pull complete\nb51569e7c507: Pull complete\nda8ef40b9eca: Pull complete\nfb15d46c38dc: Pull complete\nDigest: sha256:454054f5bbd571b088db25b662099c6c7b3f0cb78536a2077d54adc48f00cd68\nStatus: Downloaded newer image for ubuntu:16.04"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이렇게 컨테이너를 생성하고 ubuntu:16.04 이미지가 없으면 자동적으로 다운로드(pull)를 하고 컨테이너를 생성합니다. 하지만 컨테이너에 명령어를 전달하지 않았기 때문에 컨테이너는 생성되자마자 종료됩니다."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n왜냐하면 컨테이너는 프로세스이기 때문에, 실행중인 프로세스가 없으면 컨테이너는 종료됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker run --rm -it ubuntu:16.04 /bin/bash"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이번에는 컨테이너 내부에 들어가기 위해 bash 쉘을 실행하고 키보드 입력을 위해 -it 옵션을 주고, 프로세스가 종료되면 컨테이너가 자동으로 삭제되도록 —rm 옵션도 추가해서 실행하였습니다."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n다운로드가 되어있기 때문에 이미지를 다운로드 하는 화면 없이 바로 실행이 되고, exit로 bash 쉘을 종료하면 컨테이너도 같이 종료됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"컨테이너 목록 확인하기"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker ps       # 실행중인 컨테이너 목록\n\nCONTAINER ID   IMAGE          COMMAND       CREATED          STATUS         PORTS     NAMES\nc818c8466c46   ubuntu:16.04   \"/bin/bash\"   35 seconds ago   Up 4 seconds             kind_rosalind\n\n<br>\n\n$ docker ps -a    # 실행중인 컨테이너와 종료된 컨테이너 목록\n\nCONTAINER ID   IMAGE                                         COMMAND       CREATED          STATUS                       PORTS     NAMES\nc818c8466c46   ubuntu:16.04                                  \"/bin/bash\"   42 seconds ago   Up 11 seconds                          kind_rosalind\n33db0c9e3d20   pytorch/pytorch:1.7.1-cuda11.0-cudnn8-devel   \"/bin/bash\"   18 minutes ago   Exited (130) 4 minutes ago             patrick"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"컨테이너 중지하기"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker stop [CONTAINER_ID]"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"컨테이너 제거하기"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker rm [CONTAINER_ID]\n$ docker rm -v $(docker ps -a -q -f status=exited)  # 중지된 컨테이너 한번에 삭제"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"컨테이너 명령어 실행하기"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker exec [OPTIONS] [CONTAINER_ID] [COMMAND] [ARGS]\n$ docker exec -it [CONTAINER_ID] /bin/bash "}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"run은 컨테이너를 새로 만들어서 실행하고, exec는 실행중인 컨테이너에 명령어를 내린다는 차이점이 있습니다.\n그래서 run일 때 [IMAGE] 였던 것이 [CONTAINER_ID]로 바꼈습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Docker Compose"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"지금까지는 도커를 커맨드라인에서 명령어로만 작업을 하였습니다. 지금은 간단한 작업이였지만, 여러 가지 설정이 추가되면 명령어가 금방 복잡해질 것 입니다."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n도커는 복잡한 설정을 쉽게 관리하기 위해 YAML방식의 설정파일을 이용한 "},{"type":"element","tagName":"a","properties":{"href":"https://docs.docker.com/compose/"},"children":[{"type":"text","value":"Docker Compose"}]},{"type":"text","value":"라는 툴을 제공합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"설치"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mac에서 Docker for Mac, Window에서 Docker for Windows를 설치했다면 자동으로 설치가 되고 리눅스의 경우에는 다음 명령어를 입력하여 설치하면 됩니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ curl -L \"https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose\n$ chmod +x /usr/local/bin/docker-compose\n\n$ docker-compose version  \n\ndocker-compose version 1.9.0, build 2585387\ndocker-py version: 1.10.6\nCPython version: 2.7.9\nOpenSSL version: OpenSSL 1.0.1t  3 May 2016"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"사용 방법"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ vi docker-compose.yaml\n\nversion: '3.5'  # YAML 파일 포맷 버전\nservices:\n  patrick:  # 이름\n    image: 'pytorch/pytorch:1.7.1-cuda11.0-cudnn8-devel'\n    shm_size: '2gb'\n    command: 'nvidia-smi'   # 컨테이너가 실행될 때 수행할 명령어, docker run에 있는 command와 동일\n    runtime: nvidia\n    volumes:\n      - /home/patrick/:/home\n    environment:\n      - NVIDIA_VISIBLE_DEVICES=all"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"docker-compose up"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"정리"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huggingface transformers에서 모델을 쉽게 다운받아 사용할 수 있는 것처럼, docker도 hub에서 image를 쉽게 다운 받아 사용할 수 있습니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"2. Image를 직접 만들어서 컨테이너 생성"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Dockerfile이라는 파일 자체 DSL(Domain-specific language)을 이용하여 이미지를 생성합니다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Dockerfile에 작성되는 명령 옵션"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"FROM : Docker Base Image (기반이 되는 이미지, <이미지 이름>:<태그> 형식으로 설정, ubuntu:18.04)\nMAINTAINER : 메인테이너 정보 (작성자 정보)\nRUN : Shell Script 또는 명령을 실행\nCMD : 컨테이너가 시작될 때마다 실행할 명령어, Dockerfile에서 한번만 사용할 수 있습니다.\nLABEL : 라벨 작성 (docker inspect 명령으로 label을 확인할 수 있습니다.)\nEXPOSE : 호스트와 연결할 포트 번호를 설정한다.\nENV : 환경변수 설정\nADD : 파일 / 디렉터리 추가\nCOPY : 파일 복사\nENTRYPOINT : 컨테이너가 시작되었을 때 스크립트 실행\nVOLUME : 볼륨 마운트\nUSER : 명령 실행할 사용자 권한 지정\nWORKDIR : \"RUN\", \"CMD\", \"ENTRYPOINT\" 명령이 실행될 작업 디렉터리\nARG : Dockerfile 내부 변수\nONBUILD : 다른 이미지의 Base Image로 쓰이는 경우 실행될 명령 수행\nSHELL : Default Shell 지정"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"1) Dockerfile 작성"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ vi Dockerfile\n \n# 1. 우분투 설치\nFROM ubuntu:18.04\n# 2. 메타데이터 표시\nLABEL \"purpose\"=\"practice\"\n# 3. 업데이트\nRUN apt-get update\n# 4. 호스트에 있는 파일을 복사\nCOPY test.txt /var/www/html\n# 5. 포트 80번 노출 지정\nEXPOSE 80\n# 6. 컨테이너 시작될 때마다 실행할 명령어\nCMD /bin/bash"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"2) Dockerfile 빌드(이미지 생성)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker build -t mybuild:0.2 ./test_docker\n\nSending build context to Docker daemon  3.072kB\nStep 1/6 : FROM ubuntu:18.04\n ---> 5a214d77f5d7\nStep 2/6 : LABEL \"purpose\"=\"practice\"\n ---> Using cache\n ---> 29c3986addc2\nStep 3/6 : RUN apt-get update\n ---> Using cache\n ---> fa3808d331d9\nStep 4/6 : COPY test.txt /var/www/html/\n ---> f1430498cfa9\nStep 5/6 : EXPOSE 80\n ---> Running in 3cda5f1355bf\nRemoving intermediate container 3cda5f1355bf\n ---> c3936aca4620\nStep 6/6 : CMD /bin/bash\n ---> Running in 4ac0bfe9d777\nRemoving intermediate container 4ac0bfe9d777\n ---> c789deea53d4\nSuccessfully built c789deea53d4\nSuccessfully tagged mybuild:0.2"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker images\n\nREPOSITORY        TAG                           IMAGE ID       CREATED          SIZE\nmybuild           0.2                           c789deea53d4   59 seconds ago   101MB\nubuntu            18.04                         5a214d77f5d7   5 days ago       63.1MB\nubuntu            16.04                         b6f507652425   5 weeks ago      135MB\npytorch/pytorch   1.7.1-cuda11.0-cudnn8-devel   7554ac65eba5   8 months ago     12.9GB"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"3) 컨테이너 실행"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker run -it --name patrick_build mybuild:0.2"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$ docker ps -a\n\nCONTAINER ID   IMAGE                                         COMMAND                  CREATED              STATUS                            PORTS     NAMES\n8cd50c3112cc   mybuild:0.2                                   \"/bin/sh -c /bin/bash\"   About a minute ago   Exited (127) About a minute ago             patrick_build\nc818c8466c46   ubuntu:16.04                                  \"/bin/bash\"              52 minutes ago       Up 51 minutes                               kind_rosalind\n33db0c9e3d20   pytorch/pytorch:1.7.1-cuda11.0-cudnn8-devel   \"/bin/bash\"              About an hour ago    Exited (130) 56 minutes ago                 patrick"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Reference"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://docs.docker.com/get-started/overview/"},"children":[{"type":"text","value":"https://docs.docker.com/get-started/overview/"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://hub.docker.com"},"children":[{"type":"text","value":"https://hub.docker.com"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://linuxcontainers.org/"},"children":[{"type":"text","value":"https://linuxcontainers.org/"}]}]},{"type":"text","value":"\n"}]}],"data":{"quirksMode":false}},"excerpt":"Docker 란? 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 배가 물건을 컨테이너에 넣어 운반하는 것처럼, 도커도 여러 가지 원하는 프로그램들을 컨테이너에 넣어 배포할 수 있다는 점이 비슷합니다. Docker 주요 개념…","fields":{"readingTime":{"text":"13 min read"}},"frontmatter":{"title":"Docker란?","userDate":"9 October 2021","date":"2021-10-09T10:00:00.000Z","tags":["toolkit","environment"],"excerpt":null,"image":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","backgroundColor":"#484848","images":{"fallback":{"src":"/static/bd7032b90cf791d74c551dad5e94b8e6/90018/docker.png","srcSet":"/static/bd7032b90cf791d74c551dad5e94b8e6/f503b/docker.png 750w,\n/static/bd7032b90cf791d74c551dad5e94b8e6/e4953/docker.png 1080w,\n/static/bd7032b90cf791d74c551dad5e94b8e6/c2802/docker.png 1366w,\n/static/bd7032b90cf791d74c551dad5e94b8e6/90018/docker.png 1720w","sizes":"100vw"},"sources":[{"srcSet":"/static/bd7032b90cf791d74c551dad5e94b8e6/77272/docker.webp 750w,\n/static/bd7032b90cf791d74c551dad5e94b8e6/317ed/docker.webp 1080w,\n/static/bd7032b90cf791d74c551dad5e94b8e6/b5c49/docker.webp 1366w,\n/static/bd7032b90cf791d74c551dad5e94b8e6/e0b55/docker.webp 1720w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.5232558139534883}}},"author":[{"id":"Soohwan Kim","bio":"Co-founder/A.I. engineer at TUNiB.","avatar":{"children":[{"gatsbyImageData":{"layout":"fullWidth","backgroundColor":"#282838","images":{"fallback":{"src":"/static/a9e6b445142b247ee4cfa66155398bb2/0d6f4/soohwan.png","srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/248f9/soohwan.png 40w,\n/static/a9e6b445142b247ee4cfa66155398bb2/fd435/soohwan.png 80w,\n/static/a9e6b445142b247ee4cfa66155398bb2/0d6f4/soohwan.png 120w","sizes":"100vw"},"sources":[{"srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/e7f45/soohwan.webp 40w,\n/static/a9e6b445142b247ee4cfa66155398bb2/589ec/soohwan.webp 80w,\n/static/a9e6b445142b247ee4cfa66155398bb2/71a38/soohwan.webp 120w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.6833333333333333}}]}}]}},"relatedPosts":{"totalCount":25,"edges":[{"node":{"id":"f2a32d9d-b206-5141-8c2d-5440e19caf65","excerpt":"llama.cpp (On device llm inference tool) 최근에 llama.cpp를 사용해봤는데, 상당히 편리하고 미래에 더 많이 쓰일 툴이라는 생각이 들어서 기록해둔다! llama.cpp란? 대표적인 오픈소스 LLM인 Meta…","frontmatter":{"title":"llama.cpp (On device llm inference tool)","date":"2024-09-07T10:00:00.000Z"},"fields":{"readingTime":{"text":"7 min read"},"slug":"/llama-cpp/"}}},{"node":{"id":"fa28b462-1fe2-5d0f-932b-f28e32f1da18","excerpt":"Elastic Search logstash - Nori 토크나이저 설정 이번에 회사에서 검색 기능을 구현하면서 Elastic Search를 다루게 됐다. 이 엔진을 다루면서 삽질을 많이 했는데, 다음에는 하지 않도록 기록용으로 남겨둔다. Elastic…","frontmatter":{"title":"[ELK] Elastic Search logstash - Nori 토크나이저 설정","date":"2024-08-24T10:00:00.000Z"},"fields":{"readingTime":{"text":"4 min read"},"slug":"/elastic-search/"}}},{"node":{"id":"d1f4a9ee-591d-5e95-a930-a1bf17701b0e","excerpt":"단 30줄로 ChatGPT 웹페이지 만들기 (Streamlit chat_message) Streamlit은 파이썬 기반의 오픈소스 웹 UI 라이브러리입니다. 매우 간단한 코드로 손쉽게 웹페이지를 띄울 수 있어서 간단한 데모나 PoC…","frontmatter":{"title":"단 30줄로 ChatGPT 웹페이지 만들기 (Streamlit chat_message)","date":"2024-05-01T10:00:00.000Z"},"fields":{"readingTime":{"text":"9 min read"},"slug":"/streamlit-chatgpt/"}}},{"node":{"id":"4e37b604-dce8-5e09-85e8-337d4f03f0cb","excerpt":"Terabyte(TB) 단위 데이터 셔플링 - terashuf 리눅스에서 TB 단위의 데이터를 line 기준으로 셔플링이 필요할 때가 (가끔) 있다. 직접 코딩해서 쓰기에는 메모리, 속도 등을 신경써야해서 생각보다 큰 작업인데, terashuf…","frontmatter":{"title":"Terabyte(TB) 단위 데이터 셔플링 - terashuf","date":"2024-03-20T10:00:00.000Z"},"fields":{"readingTime":{"text":"1 min read"},"slug":"/terashuf/"}}},{"node":{"id":"ec8327c3-3c4d-51da-9440-8cb74fd1effe","excerpt":"tmux - conf Tmux 설정을 위한 tmux configuraion 기록","frontmatter":{"title":"tmux - conf","date":"2024-02-15T10:00:00.000Z"},"fields":{"readingTime":{"text":"2 min read"},"slug":"/tmux-conf/"}}}]}},"pageContext":{"slug":"/docker/","prev":{"excerpt":"Page Rank 구글은 무엇을 기준으로 사이트를 보여주는 순서를 정할까요?? 구글에 특정 단어를 검색하면 다음과 같이 여러 사이트 들을 보여주는 것을 알 수 있습니다. 구글은 이런 사이트들에 점수를 부여해주는데, 여기서 부여된 점수들을 Page…","frontmatter":{"title":"Sooftware NLP - Page Rank란??","tags":["nlp","algorithm"],"date":"2021-10-08T10:00:00.000Z","draft":false,"excerpt":null,"image":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC/ElEQVQ4y1WT328UVRTHR0nkxTf/Cd40JghRi1jQRx5MsImkxkQf9KU2MQYibxpFE9EnanyAhB+2oihU2u5SSkHsD9ptd7d12+12od3WndlhZ2ZnOzvT+bnzMTtT2XqSm3Pv3G8+95w55wiEIWFrQeT/swlZ5+uFdb7PbbCkm9G3ZkvXDGKtVyfIf4X3oItg+QtCV4s0whOI79LcgV1Yldg/OMvBoXleujnHoeE57ojak8fwanijz+NcEXAHBJzLAl5yH6EtI7Tug7UsxY87IHubkgeHh1K8nszQeX2CI4PTvDI8T9f4IkpdR9UdtKkevH4B97dncH7dg/f73gjqZ3t3gOUC2c/eIsxPc1+zOTD4gDdHFzjw4zVevpTgyK0sbyTSLIgyngvGWCfeVYHGwNOkzwpYV/dEkXr3OtspS5IU+WXdpGMkzdFEms6hWY4Op3htJM2xWxkyKytsu2CnPsT9ScD8ZS/l809FvnX2Z99rAxuNBpZlRfvT08u8cGOGjkQmSnf/zTn60gXMmkLddPGNAv4fz+FeEfB/FnAvC7jXnyXcyrWBlmOz7TjYnosoy1xaFflgPEvPxBIDi0VkSYQAXHsbY8ujIaUIUt34U4fw57tp6tmdKjfj2nqrJcqnvkW9PRlV292qk88vU1NVDE2JNImHd/lk+kvuipNYVhNZMXAm0wSbenTfaikhDGKgfy9F5uBxKj/0U93SEf8ps1EqoSgKoiRRESt8dP80+/oO053sZU3aZHP8L1Y6TqCeOhsDw7CdcugHuLkiTWs7/gWA43momob8WGYp+zfn/rzAO8kerhVHsC0bS9XIn+lDujG6E2EzbpvdE9IyV37M0uffoKytI1UkqqpKpVZDlqsYptHub0I0s4Gi1wiMxv8nJRo/34/2ZvERqRPvU02OMXWsC3UmRab3JMpiLh7BVu9qNWbefpd6voDzaJ2xF1/FXN+II9xtu6P1FJXyxX7c0ia5nk8xCsVY04I2Gjw88x1maYPQdqgOJfFNk38BP9OAUlj0zHwAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/48f781cfe0664d01fb0b81d9e0c56e60/5088a/page_rank.png","srcSet":"/static/48f781cfe0664d01fb0b81d9e0c56e60/744c5/page_rank.png 750w,\n/static/48f781cfe0664d01fb0b81d9e0c56e60/5088a/page_rank.png 818w","sizes":"100vw"},"sources":[{"srcSet":"/static/48f781cfe0664d01fb0b81d9e0c56e60/7c11c/page_rank.webp 750w,\n/static/48f781cfe0664d01fb0b81d9e0c56e60/1c73b/page_rank.webp 818w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.6405867970660146}}},"author":[{"id":"Soohwan Kim","bio":"Co-founder/A.I. engineer at TUNiB.","avatar":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAADjElEQVQ4y23Oy48TdQDA8TExEaTttvSBfdHddru7bWc6bWd+8+i0u23n0SdlBRQXZGHDgiiLDwgqXjCIJEaC8cLBmHgwUU9EYzRqQuLJi/4NJB6NF+8evgbOHr7XT76SM5ix7s4QnRHnnm9yZzvBTIswN8JcP5bC67ZoWi7CdtFsn5bloZo+dSNAMYbIIqCmD6mJIVXdR3J6I7r9IQ3T59pZlW+uxzndCbPdC/HZXoq3TikowsfqBOjOmFZ7SrM9p2kfRbXn1O0jKNbsSbJ5BMnu9Gl3+qiiz4OPSvz0QRLHFGwOZH6+neLHT5YRbRerM0J0JrTas/8FZXNKzZgg2es+ZtvDdbs8+iHJl+9lWVP7OG2br26k+PvXJCfmFqoYIpwhTXtMwxpTN0coxhjFmCKbE2rGmKoYPQY9qi2fyzsq//4e5sNXi5TlLqbd5t6lPH/9kuDTG2usqgGi7dO0hzSsIXUzQDaGKGKMLEZUxZCKCJB02+PUpMH9vQwP7ybYnSxyfNrjwumA3dEiD94v8cfnK7xzWsbpujQtH9X0qBs+iuEjC5+a7lPVPSqai9SyelyYFbjkh5hqC3TkKOutLON2nkYpgtuMcT6IszdPslo8SLlcpmUH1A0XRQyQhUtNuFQ1l4o2QFI1h3OTVXbcg+grIfSVBRqlEGopgrYSRi0e4KiIse1mScSeopA/iLADmoZL3Rgg631q+oCq1qeq95FOzhQefpzn7eMpBmqcoBVj04pzwkky0eNMRYIdL8F3twusLe2nslrE6g5pGX1U8/FhD1nvUW1tUJK7SH9+n+DR1zF2vQSvH0lz88wiV45V2J1WuHqsxLXNAnuzNJdfWmK5/BylUgFhb6DZAxR9g7rpIos+Wttja2uE9M9vYb69k+DqfJErWzLOuoVqdKlpDo4jODms4zlFckuHObx4iHwuRi6fYqmYY201x/LqMrnFDNl8gRvvukhNdT9394rcOlNFMxrUhYFmW9imTEsp0mhWKC2nWSokyWSiFA7HSKcXiEb34fayyLVniUQk8rmn2drKIqlqiNcuVrh2ymQS1Nh8sc/GoMEbl7u8eb5D1yqTzkRJJsOkkiGymQVShyLE4yHWKnEq1RjpTIhmI8r2y3mkyloI38uha1n6bpVXrkw5+4LD/S/2uHnrIopaJhZ9hmQqwqHkAXJP8BDhyD46ZoWdMxOGcx/PNfECk/8AbxXdRjRliPoAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/a9e6b445142b247ee4cfa66155398bb2/7cf1f/soohwan.png","srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/34f77/soohwan.png 750w,\n/static/a9e6b445142b247ee4cfa66155398bb2/a94f6/soohwan.png 1080w,\n/static/a9e6b445142b247ee4cfa66155398bb2/7cf1f/soohwan.png 1148w","sizes":"100vw"},"sources":[{"srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/38420/soohwan.webp 750w,\n/static/a9e6b445142b247ee4cfa66155398bb2/7470d/soohwan.webp 1080w,\n/static/a9e6b445142b247ee4cfa66155398bb2/b5ef6/soohwan.webp 1148w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.6829268292682927}}}}]},"fields":{"readingTime":{"text":"7 min read"},"layout":"","slug":"/page_rank/"}},"next":{"excerpt":"한국어 Tacotron2 이번 포스팅에서는 Tacotron2 아키텍처로 한국어 TTS 시스템을 만드는 방법에 대해 다루겠습니다. Tacotron2 Tacotron2는 17년 12월 구글이 NATURAL TTS SYNTHESIS BY…","frontmatter":{"title":"Sooftware Speech - 한국어 Tacotron2","tags":["speech"],"date":"2021-10-10T10:00:00.000Z","draft":false,"excerpt":null,"image":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAADuUlEQVQ4ywXBDVATZACA4e8EUwkVtELr+rtOKco8OwRxO39OSyvoBI0iJD1EQbFlHmAqGgjJYDqlBogwIJIaTB0wkCGwCajEYCBjbANkgKAHhxZ22nUd9fY84u7YE2p6xgk29RF+e4h1RjuLyjvxK9Cgr0lhsPk4d7tSGByr43hbMaebf2V6UM3fAz+wq/wc4oyKpYVFnDfbePoPCGv/JF+32Ig0D7Pl5hCirAtJvppbhlRG2s/gaDmI3ZFJV805Gq7u4JZjN+N9aqZsWdzUfc/cdBUiS8F76lJu35tC6NrtfNrqRGadRFTcYedFJf3GRO73qWiviWekS0aTRUZDrB/DFd9iGSvD1fMjo9YUHlR9xRb5WcQpOfNPZxFWaUQomzuJsUxwsnuKNJ2cCfMB7jTsRVe2iUK5H4/qM/nzbBK1ylAqagMY6jjCpF3JPVs6bdeCyCjLwk1+HnEylTlnCxEJ1y3EmR30WtLo0WzEkLyKvIQgKk0RZKW8iSHpAIOLF+A6tQZb4x4e3D7CvWtJjOcm4NTF8cSaRrA6C/FdOs8oshGnjU00qqVc3TYf+Uoffn7rBfKkL6HdH4B273zKD8zFWbiRaUscU7b9/NG+m6nUWPRHQjA27uaRM5OcG9l4553AKycfkX7dQHKiLwUh8yja4UPaB89RKvPmyp5ZlB99heuZK7iRtp7qfYH0XdnLhCOGqhx/cktWU9u6lgH7Hs7Ub8NTEY1vyWVEntGMUKThIYtgtnQFgRIvSqPdKf5QIPd/lagFC7kYtJTG13wxb1jJmDODUqU/l7W+DFu2YywKxWd/IHOUciKqWxH1bVb81CWIE8cQn2xmc8jLFO10x5jkTtPBWWSv9+Ry6BKaIp6l4XM3OnIDsGvWMtEdwVNVFJXRUiQFX7C6SI+q24X4rdtBkq4ekZ2PR2IsC0KlLA98ncJwH6qPLsKk9MJR/Dwj1csZM/kzUrsGV2sk2vA1OBcvpS4sgNCCDBIae+ia/AvRaRuk9oaZcE0N4twF3I7FIz7bysp1ywhf7kH82160FgdRlxxIifxd6l70Rn9IQs43QcSFbSBKriJe30PV0EMePP4P0ds/THOnDY2hmUhtHR75ZSxUyPE8tA+P7e/z0aY3qJBJUXy5lrCQ2fwimUfqYX+S6z9mu7aMGEM/etdDhh/NMDH9L8LpGqejdwCT2cpP1Y3EVjbgXapn3SUNy87nIKJ3sVGyinciQ/E5HEVY8SmkF4pYcqmKYJODltFpRh/OcP/3GSYfz/A/R96nbYRN7vYAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/e9cad4ecf1e3aecef2e65e59546b10e3/7bcb3/taco.png","srcSet":"/static/e9cad4ecf1e3aecef2e65e59546b10e3/ea847/taco.png 750w,\n/static/e9cad4ecf1e3aecef2e65e59546b10e3/7bcb3/taco.png 1000w","sizes":"100vw"},"sources":[{"srcSet":"/static/e9cad4ecf1e3aecef2e65e59546b10e3/57584/taco.webp 750w,\n/static/e9cad4ecf1e3aecef2e65e59546b10e3/323e8/taco.webp 1000w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.666}}},"author":[{"id":"Soohwan Kim","bio":"Co-founder/A.I. engineer at TUNiB.","avatar":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAADjElEQVQ4y23Oy48TdQDA8TExEaTttvSBfdHddru7bWc6bWd+8+i0u23n0SdlBRQXZGHDgiiLDwgqXjCIJEaC8cLBmHgwUU9EYzRqQuLJi/4NJB6NF+8evgbOHr7XT76SM5ix7s4QnRHnnm9yZzvBTIswN8JcP5bC67ZoWi7CdtFsn5bloZo+dSNAMYbIIqCmD6mJIVXdR3J6I7r9IQ3T59pZlW+uxzndCbPdC/HZXoq3TikowsfqBOjOmFZ7SrM9p2kfRbXn1O0jKNbsSbJ5BMnu9Gl3+qiiz4OPSvz0QRLHFGwOZH6+neLHT5YRbRerM0J0JrTas/8FZXNKzZgg2es+ZtvDdbs8+iHJl+9lWVP7OG2br26k+PvXJCfmFqoYIpwhTXtMwxpTN0coxhjFmCKbE2rGmKoYPQY9qi2fyzsq//4e5sNXi5TlLqbd5t6lPH/9kuDTG2usqgGi7dO0hzSsIXUzQDaGKGKMLEZUxZCKCJB02+PUpMH9vQwP7ybYnSxyfNrjwumA3dEiD94v8cfnK7xzWsbpujQtH9X0qBs+iuEjC5+a7lPVPSqai9SyelyYFbjkh5hqC3TkKOutLON2nkYpgtuMcT6IszdPslo8SLlcpmUH1A0XRQyQhUtNuFQ1l4o2QFI1h3OTVXbcg+grIfSVBRqlEGopgrYSRi0e4KiIse1mScSeopA/iLADmoZL3Rgg631q+oCq1qeq95FOzhQefpzn7eMpBmqcoBVj04pzwkky0eNMRYIdL8F3twusLe2nslrE6g5pGX1U8/FhD1nvUW1tUJK7SH9+n+DR1zF2vQSvH0lz88wiV45V2J1WuHqsxLXNAnuzNJdfWmK5/BylUgFhb6DZAxR9g7rpIos+Wttja2uE9M9vYb69k+DqfJErWzLOuoVqdKlpDo4jODms4zlFckuHObx4iHwuRi6fYqmYY201x/LqMrnFDNl8gRvvukhNdT9394rcOlNFMxrUhYFmW9imTEsp0mhWKC2nWSokyWSiFA7HSKcXiEb34fayyLVniUQk8rmn2drKIqlqiNcuVrh2ymQS1Nh8sc/GoMEbl7u8eb5D1yqTzkRJJsOkkiGymQVShyLE4yHWKnEq1RjpTIhmI8r2y3mkyloI38uha1n6bpVXrkw5+4LD/S/2uHnrIopaJhZ9hmQqwqHkAXJP8BDhyD46ZoWdMxOGcx/PNfECk/8AbxXdRjRliPoAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/a9e6b445142b247ee4cfa66155398bb2/7cf1f/soohwan.png","srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/34f77/soohwan.png 750w,\n/static/a9e6b445142b247ee4cfa66155398bb2/a94f6/soohwan.png 1080w,\n/static/a9e6b445142b247ee4cfa66155398bb2/7cf1f/soohwan.png 1148w","sizes":"100vw"},"sources":[{"srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/38420/soohwan.webp 750w,\n/static/a9e6b445142b247ee4cfa66155398bb2/7470d/soohwan.webp 1080w,\n/static/a9e6b445142b247ee4cfa66155398bb2/b5ef6/soohwan.webp 1148w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.6829268292682927}}}}]},"fields":{"readingTime":{"text":"11 min read"},"layout":"","slug":"/korean_tacotron2/"}},"primaryTag":"toolkit"}},
    "staticQueryHashes": ["3170763342","3229353822"]}