<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Container on Kelly Dev</title><link>https://kelly-chui.github.io/tags/container/</link><description>Recent content in Container on Kelly Dev</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 09 Oct 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://kelly-chui.github.io/tags/container/index.xml" rel="self" type="application/rss+xml"/><item><title>Docker. 내 애플리케이션 Dockerizing 하기</title><link>https://kelly-chui.github.io/posts/devops-docker-06-dockerizing/</link><pubDate>Thu, 09 Oct 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/devops-docker-06-dockerizing/</guid><description>&lt;h2 id="0-기반-파일"&gt;0. 기반 파일&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/nice-card/express-example"&gt;https://github.com/nice-card/express-example&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="1-프로젝트-위치-확인"&gt;1. 프로젝트 위치 확인&lt;/h2&gt;
&lt;p&gt;현재 경로를 프로젝트 경로로 설정하고 확인하기&lt;/p&gt;
&lt;img alt="image.png" loading="lazy" src="https://kelly-chui.github.io/posts/devops-docker-06-dockerizing/image-001-optimized-image.webp"&gt;&lt;h2 id="2--dockerfile-dockerignore-추가"&gt;2. Dockerfile, .dockerignore 추가&lt;/h2&gt;
&lt;p&gt;프로젝트 루트에 Dockerfile을 새로 만들기.&lt;/p&gt;
&lt;h3 id="dockerfile"&gt;Dockerfile&lt;/h3&gt;
&lt;p&gt;프로젝트 루트에 만들기.&lt;/p&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-docker" data-lang="docker"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# === build stage ===&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; package*.json ./&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; npm ci &lt;span class="c1"&gt;# dev 포함 (tsc 사용)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; . .&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; npm run build &lt;span class="c1"&gt;# dist/ 생성&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# === runtime stage ===&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; &lt;span class="nv"&gt;NODE_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; package*.json ./&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; npm ci --omit&lt;span class="o"&gt;=&lt;/span&gt;dev &lt;span class="c1"&gt;# 런타임에 필요한 것만&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 빌드 결과만 가져오기&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; --from&lt;span class="o"&gt;=&lt;/span&gt;build /app/dist ./dist&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CMD&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;npm&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# package.json의 &amp;#34;start&amp;#34;: &amp;#34;node dist/index.js&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id="dockerignore"&gt;.dockerignore&lt;/h3&gt;
&lt;p&gt;불필요한 파일이 이미지에 안 들어가게 막는 용도&lt;/p&gt;</description></item><item><title>Docker. Docker Desktop 실습해보기</title><link>https://kelly-chui.github.io/posts/devops-docker-03-docker-desktop-lab/</link><pubDate>Wed, 08 Oct 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/devops-docker-03-docker-desktop-lab/</guid><description>&lt;h2 id="설치하기"&gt;설치하기&lt;/h2&gt;
&lt;p&gt;공식 문서에 설치 가이드 설명 잘 되어있으니 알아서&amp;hellip;&lt;/p&gt;
&lt;h2 id="첫-번째-컨테이너-실행하기"&gt;첫 번째 컨테이너 실행하기&lt;/h2&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -p 8080:80 docker/welcome-to-docker&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://localhost:8080"&gt;http://localhost:8080&lt;/a&gt; 에서 이 컨테이너의 프론트엔드 방문 가능.&lt;/p&gt;
&lt;img alt="image.png" loading="lazy" src="https://kelly-chui.github.io/posts/devops-docker-03-docker-desktop-lab/image-001-optimized-image.webp"&gt;&lt;h2 id="docker-desktop-사용해보기"&gt;Docker Desktop 사용해보기&lt;/h2&gt;
&lt;img alt="image.png" loading="lazy" src="https://kelly-chui.github.io/posts/devops-docker-03-docker-desktop-lab/image-002-optimized-image.webp"&gt;&lt;h3 id="컨테이너-탭"&gt;컨테이너 탭&lt;/h3&gt;
&lt;img alt="image.png" loading="lazy" src="https://kelly-chui.github.io/posts/devops-docker-03-docker-desktop-lab/image-006-optimized-image.webp"&gt;&lt;ul&gt;
&lt;li&gt;Logs — &lt;code&gt;docker logs &amp;lt;container-name&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;컨테이너 내부에서 실행 중인 프로세스의 표준 출력을 그대로 보여줌.&lt;/li&gt;
&lt;li&gt;디버깅할 때 많이 사용하는 부분&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Inspect — &lt;code&gt;docker inspect &amp;lt;container-name&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;컨테이너의 환경 변수, 포트 바인딩, 실행 명령, 마운트 경로, 네트워크, 상태 등 메타데이터를 JSON으로 보여줌&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bind mounts
&lt;ul&gt;
&lt;li&gt;로컬 호스트와 컨테이너 사이의 폴더 연결 정보를 보여줌
&lt;ul&gt;
&lt;li&gt;ex) &lt;code&gt;-v ~/project:/app&lt;/code&gt; → 내 컴퓨터의 &lt;code&gt;~/project&lt;/code&gt; 폴더가 컨테이너 내부 &lt;code&gt;/app&lt;/code&gt;에 연결됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;로컬 파일 수정 시 컨테이너에 즉시 반영되기 때문에 개발할 때 자주 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Exec — &lt;code&gt;docker exec -it &amp;lt;container-name&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;실행 중인 컨테이너 내부에 직접 명령어를 입력할 수 있는 쉘 세션을 엶.&lt;/li&gt;
&lt;li&gt;컨테이너 내부 구조 탐색, 빠른 테스트, 수동 디버깅에 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Files — &lt;code&gt;docker cp&lt;/code&gt;, &lt;code&gt;docker exec ls&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;컨테이너 내부의 파일 시스템 탐색&lt;/li&gt;
&lt;li&gt;호스트 ↔ 컨테이너 간 파일을 복사할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Stats: &lt;code&gt;docker stats &amp;lt;container-name&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;컨테이너의 실시간 리소스 사용량(CPU, 메모리, 네트워크, I/O) 등을 모니터링&lt;/li&gt;
&lt;li&gt;성능 문제나 리소스 병목을 추적할 때 사용&lt;/li&gt;
&lt;li&gt;여러 컨테이너 동시 모니터링 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="직접-컨테이너를-사용해서-개발해보기"&gt;직접 컨테이너를 사용해서 개발해보기&lt;/h2&gt;
&lt;h3 id="0-프로젝트-클론"&gt;0. 프로젝트 클론&lt;/h3&gt;
&lt;p&gt;우선 Docker에서 제공하는 예제 앱 가져오기&lt;/p&gt;</description></item><item><title>Docker. Docker 시작하기</title><link>https://kelly-chui.github.io/posts/devops-docker-01-getting-started/</link><pubDate>Wed, 08 Oct 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/devops-docker-01-getting-started/</guid><description>&lt;h2 id="docker"&gt;Docker&lt;/h2&gt;
&lt;p&gt;애플리케이션 개발, 배포 및 실행을 위한 개방형 플랫폼&lt;/p&gt;
&lt;h2 id="특징"&gt;특징&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Note.&lt;/p&gt;
&lt;p&gt;컨테이너는 개발 환경 자체가 아니라 애플리케이션를 실행하는 격리된 프로세스다. 일반적으로 개발은 호스트 환경에서 이루어지고, 컨테이너는 실행 및 테스트 환경으로 사용된다.&lt;/p&gt;
&lt;p&gt;-&amp;gt; 그런데 vscode에서 쓰는 dev container는&amp;hellip;?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="컨테이너를-사용한-앱-개발"&gt;컨테이너를 사용한 앱 개발&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Docker 컨테이너 안에서 앱을 띄우기 때문에 “환경이 달라서 동작하지 않는다”와 같은 문제 해결&lt;/li&gt;
&lt;li&gt;ex. Node, Python, MySQL같은 것을 도커로 묶어서 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="컨테이너는-완전한-실행-단위"&gt;컨테이너는 완전한 실행 단위&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;컨테이너 하나는 완전한 실행 단위이기 때문에 QA, 테스트, CI/CD 환경에서 그대로 사용&lt;/li&gt;
&lt;li&gt;같은 이미지 → 같은 코드, 같은 환경 → 어디서든 일관된 실행이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="애플리케이션을-컨테이너-형태로-배포"&gt;애플리케이션을 컨테이너 형태로 배포&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;클라우드나 로컬 서버로 그대로 옮겨서 실행하면 된다.&lt;/li&gt;
&lt;li&gt;수명 주기 관리
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;build&lt;/code&gt;, &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;stop&lt;/code&gt;, &lt;code&gt;rm&lt;/code&gt;, &lt;code&gt;push&lt;/code&gt; 모든 것을 Docker가 명령어 단위로 관리해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="반응형-배포-및-확장"&gt;반응형 배포 및 확장&lt;/h3&gt;
&lt;p&gt;Docker는 어디서나 똑같이 돌고, 원하면 즉시 늘리거나 줄일 수 있다.&lt;/p&gt;</description></item><item><title>Docker. 컨테이너와 이미지</title><link>https://kelly-chui.github.io/posts/devops-docker-02-containers-and-images/</link><pubDate>Wed, 08 Oct 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/devops-docker-02-containers-and-images/</guid><description>&lt;h2 id="컨테이너"&gt;컨테이너&lt;/h2&gt;
&lt;p&gt;애플리케이션의 구성 요소(프론트엔드, API, DB 등)을 각각 격리된 프로세스로 실행하는 환경.&lt;/p&gt;
&lt;h3 id="특징"&gt;특징&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;호스트의 어떤 환경에도 의존하지 않고, 필요한 라이브러리와 설정을 모두 포함한 독립된 환경으로 존재한다.&lt;/li&gt;
&lt;li&gt;서로 다른 컨테이너는 격리되어 있어서 하나가 망가져도 다른 컨테이너에 영향을 주지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="컨테이너-vs-vm"&gt;컨테이너 vs. VM&lt;/h3&gt;
&lt;p&gt;VM은 자체 커널, 드라이버, 프로그램을 갖춘 완전한 운영체제이기 때문에, 단일 애플리케이션을 분리하기 위해 VM을 사용하는 것은 오버헤드가 크다.&lt;/p&gt;
&lt;p&gt;컨테이너는 실행에 필요한 모든 파일을 갖춘 고립된 프로세스이다. 여러 컨테이너를 실행하더라도 모두 동일한 커널을 공유하므로, 더 적은 인프라에서 많은 애플리케이션을 실행할 수 있다.&lt;/p&gt;</description></item></channel></rss>