{"componentChunkName":"component---src-templates-blog-post-js","path":"/infra/200716-Docker/","result":{"data":{"site":{"siteMetadata":{"title":"Junbyeol Blog","author":"Junsung Yoon","siteUrl":"https://junbyeol.github.io","comment":{"disqusShortName":"","utterances":"junbyeol/junbyeol.github.io"},"sponsor":{"buyMeACoffeeId":"junbyeol"}}},"markdownRemark":{"id":"238a29a1-6a1e-5b38-bff5-45221daff73c","excerpt":"이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.\n기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다. : 컨테이너 기반의 오픈소스 가상화 플랫폼 초보를 위한 도커 안내서 - 도커란 무엇인가? 가상화 : Hypervisor를 이용, 하나의 물리적 머신에 다수의 가상 머신을 만드는 기술 컨테이너 : 가상화 기술의 하나로써, 격리된 공간에서 프로세스가 동작하는 기술 탄생 배경  VMware…","html":"<blockquote>\n<p>이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.\n기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.</p>\n</blockquote>\n<p>: 컨테이너 기반의 오픈소스 가상화 플랫폼</p>\n<p><a href=\"https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html#%EC%A0%95%EB%A6%AC\">초보를 위한 도커 안내서 - 도커란 무엇인가?</a></p>\n<h3 id=\"가상화\" style=\"position:relative;\"><a href=\"#%EA%B0%80%EC%83%81%ED%99%94\" aria-label=\"가상화 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>가상화</h3>\n<p>: Hypervisor를 이용, 하나의 물리적 머신에 다수의 가상 머신을 만드는 기술</p>\n<h1 id=\"컨테이너\" style=\"position:relative;\"><a href=\"#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88\" aria-label=\"컨테이너 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>컨테이너</h1>\n<p>: 가상화 기술의 하나로써, 격리된 공간에서 프로세스가 동작하는 기술</p>\n<h3 id=\"탄생-배경\" style=\"position:relative;\"><a href=\"#%ED%83%84%EC%83%9D-%EB%B0%B0%EA%B2%BD\" aria-label=\"탄생 배경 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>탄생 배경</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1200px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 61.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAAC00lEQVQoz3WSaU8TURSG+7/85gej0WCUqERUNBqVGDSicQFxF3cRMUrELSogrlVQoyKo0HYo0BakQDfojFPaMqUFSm2hy+MtdcEPnuRN5tx7z3Pee+bqEJHJZEgLZSMxO4vb4yGVTs/nmV8Sh+bPZSMt9hRFwev1Eo/H+c3Ihu73x58Q+ZjPB6lkDpVJ52ALirJAVVWRZZlEIvEvMHvYKjbah4cxuFy0OZz4gh4i2pAA2wkGBolF5D8OMwuc/vXwd12XXWix27krSTyxWKg1SFjdvSgTDno9NhzjDiYnR3JO/xML8bpUNIqpu5tWk4nPXRLvDUYc/SZG7SaG+0y4Bs2E3VbSsRmmxXwjsdi8psXs5uJTpOMRmJ0i9WOCdDKObi4YxO2VGZAVhsSgBxSV4LiPyUgATfMRCgf4Ma4w4/fxUDSul7po7O7hXsdXUdeD+7sF66CB0e9mZiZlAQxpDKs++sb8DPj9WD2jYnYjhEMKQQHToiESUwFigTFe2qzoLT3orRaeSQZktQ+v5sKhDqIE7cSn1RzQ7vJgGnJgFuo2SrikThSbJJ6GE1lxEVY9zIib1Pc5abI5edrvotFix+zsp/ObmdZeI59tRnEbvwBqGp/aO3j4opmmV295/ekrLSLXf2jjsb6FB8/0dElmouMhSr5oFL5V2dMe4FBHgNI2lbIOPztbx1jbrNDqjaJLhifQP2qg5nI1N67W0HDnPvqGJu7X3ubm1etUX6qi7VUzMdF459GzFO4to2h/Bfsqqyi/coPiiko2iXx18T4+dkq5Z1N+spIlq9aSV7CJdVu2U1RcwuoNW1i5vojFefnU1NYxN5ckf/M2luQXsHTNetZt3UHhjl0sL9jICqFFy/J4/e59Dlj3qJHSY6c4ePocJ4XTGuGy4vxlDp85z54jJ3j+5h3JVIrjF6s4IJpnde7aTapv3eWwqCk7c4HdZccwir//EwWPL522o6hhAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"200716%20Docker%20624974caa13940a79420267d34712318/Untitled.png\"\n        title=\"200716%20Docker%20624974caa13940a79420267d34712318/Untitled.png\"\n        src=\"/static/02b42c622f5f4cea6104bf2e89152e8f/c1b63/200716-1.png\"\n        srcset=\"/static/02b42c622f5f4cea6104bf2e89152e8f/5a46d/200716-1.png 300w,\n/static/02b42c622f5f4cea6104bf2e89152e8f/0a47e/200716-1.png 600w,\n/static/02b42c622f5f4cea6104bf2e89152e8f/c1b63/200716-1.png 1200w,\n/static/02b42c622f5f4cea6104bf2e89152e8f/7a18f/200716-1.png 1284w\"\n        sizes=\"(max-width: 1200px) 100vw, 1200px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<ul>\n<li>\n<p>VMware, VirtualBox</p>\n<ul>\n<li>OS를 가상화</li>\n<li>호스트 OS 위에 게스트 OS를 구동시킴</li>\n<li>간단하지만 오버헤드 심함</li>\n</ul>\n</li>\n<li>\n<p>KVM(Kernel-based Virtual Machine)</p>\n<ul>\n<li>CPU를 가상화</li>\n</ul>\n</li>\n<li>\n<p>Xen</p>\n<ul>\n<li>반가상화(Paravirtualization)</li>\n</ul>\n</li>\n</ul>\n<p>→ 하지만 근본적으로 모두 추가적인 OS 설치가 필요! 성능문제 여전</p>\n<p><strong>→ 프로세스를 격리하자!</strong></p>\n<h1 id=\"이미지image\" style=\"position:relative;\"><a href=\"#%EC%9D%B4%EB%AF%B8%EC%A7%80image\" aria-label=\"이미지image permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>이미지(image)</h1>\n<p>: 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 밑그림</p>\n<ul>\n<li>컨테이너를 실행하기 위한 모오오오오든 것을 가지고 있어 의존성 관리가 매우 편리하다!</li>\n</ul>\n<h3 id=\"dockerfile-작성하기\" style=\"position:relative;\"><a href=\"#dockerfile-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0\" aria-label=\"dockerfile 작성하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>DockerFile 작성하기</h3>\n<ul>\n<li>Dockerfile은 image를 생성하기 위한 일련의 instruction 집합!</li>\n<li>\n<p>GitHub에 Dockerfile을 올려두면</p>\n<p>→ 다른 개발자들은 그걸 받아 이미지로 뜨고</p>\n<p>→ 컨테이너를 만들기만 하면 모든 개발자가 같은 세팅에서 작업 가능!</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"docker\"><pre class=\"language-docker\"><code class=\"language-docker\"><span class=\"token comment\">#baseImage는 가벼울수록 좋다!</span>\n<span class=\"token comment\">#ubuntu를 사용하면 유사시에 컨테이너에 직접 접근해서 컨트롤하기가 용이</span>\n<span class=\"token comment\">#무거운 ubuntu대신 alpine 등 경량화된 이미지용 OS(?)도 있다.</span>\n\n<span class=\"token instruction\"><span class=\"token keyword\">FROM</span> ubuntu:xenial-20191024 </span>\n<span class=\"token instruction\"><span class=\"token keyword\">LABEL</span> maintainer=<span class=\"token string\">\"web@devsisters.com\"</span></span>\n\n<span class=\"token instruction\"><span class=\"token keyword\">RUN</span> apt-get -yqq update</span>\n<span class=\"token instruction\"><span class=\"token keyword\">RUN</span> apt-get install -y --no-install-recommends curl ca-certificates build-essential</span>\n\n<span class=\"token comment\">#nodejs의 버전관리</span>\n<span class=\"token instruction\"><span class=\"token keyword\">RUN</span> curl -SL https://deb.nodesource.com/setup_12.x | bash - &amp;&amp;<span class=\"token operator\">\\</span>\n  apt-get -yqq update &amp;&amp;<span class=\"token operator\">\\</span>\n  apt-get install -y nodejs &amp;&amp;<span class=\"token operator\">\\</span>\n  rm -rf /var/lib/apt/lists/*</span>\n<span class=\"token comment\"># 마지막 과정은 apt-get이 만드는 메타데이터들을 삭제하여 이미지의 크기를 줄인다</span>\n\n<span class=\"token instruction\"><span class=\"token keyword\">COPY</span> package*.json ./</span>\n<span class=\"token instruction\"><span class=\"token keyword\">RUN</span> npm install --production --silent</span>\n\n<span class=\"token instruction\"><span class=\"token keyword\">COPY</span> . .</span>\n<span class=\"token comment\">#위의 package*.json 을 COPY하는 과정은 이 과정에서도 한번 더 일어나는데?</span>\n<span class=\"token comment\">#cache에 관한 문제를 해결하기 위함 </span>\n\n<span class=\"token instruction\"><span class=\"token keyword\">CMD</span> npm start</span>\n<span class=\"token instruction\"><span class=\"token keyword\">EXPOSE</span> 8000</span></code></pre></div>\n<p><a href=\"https://github.com/heowc/programming-study/issues/90\">[docker] 헷갈리는 Dockerfile 명령어 · Issue #90 · heowc/programming-study</a></p>","frontmatter":{"title":"Docker","date":"February 07, 2020"}}},"pageContext":{"slug":"/infra/200716-Docker/","previous":{"fields":{"slug":"/infra/201008-Kubernetes/"},"frontmatter":{"title":"Kubernetes"}},"next":{"fields":{"slug":"/language/200207-SOLID/"},"frontmatter":{"title":"SOLID"}}}}}