Docker Image Container 간단정리(뇌피셜 틀린거 있으면 말해주세요...)
Docker Image는 사용자가 배포하는 레시피같은것
어떤 OS를 사용했는지 어떤 라이브러리를 사용했는지, 어떤 코드 실행을 통해서 해당 코드를 동작했는지 저장되어있는 것이다
마치 requirement.txt파일같은...


Docker Container는 사용자가 Docker Image를 다운받고 Docker run을 실행시키면, 해당 파일에 맞게 실행하도록 하는것
그렇다면 Docker에서 가상환경에서 실행시켜, 사용자들간 다른 Os를 사용하더라도, 무거운 OS를 가상환경으로 다운받아 모든 환경을 일치시키고 실행시킬 준비 없이, 간단하게 관리해 주는것!!!!!!!!!!!!
Docker는 Container(컨테이너)를 쉽게 만들고 실행하고 관리할 수 있도록 해주는 플랫폼이다
Docker가 왜 필요한가? => 개발자가 사용하는 개발 환경과 운영 환경이 다르기때문에, 개발자가 코드를 모두 개발하고, 개발자 컴퓨터에서 되니, 배포해야겠다.. 하면 사용자 개발 환경과 다르기 때문에 문제가 발생하게 된다

사실 개발 환경을 분리하는 기술은 존재했다. 그 기술은 VM구조 Virtual Machine으로 독립된 운영체제(OS)를 갖고, 어플리케이션이 그와 함께 통합되어있는것이다.
하지만 이렇게 배포하게되면 OS를 포함하기때문에 크기가 작고 실행 속도가 느리게된다
또한 VM 생성 후 개별로 변경 사항을 관리하기 떄문에 VM 간 구성이나 환경이 불일치하게 된다.
Container는 Layer 개념을 도입하여 Image(사진이 아니다.. Container를 실행하기 위한 실행 환경의 Snap Shot이다)

Image:실행 가능한 코드와 환경을 포함한 정적인 템플릿 / ex: 게임 설치 파일
Container:이미지를 실행한 동적인 인스턴스, 실제 앱이 동작하는 실행 환경 / ex: 실제로 실행하고있는 게임
Client(사용자)가 Dockerfile을 기반으로 명령어 docker build를 실행하게 된다
Docker pull은 외부에서 이미지를 가져오게된다
Docker run은 이미지가 준비되면 이를 기반으로 Container를 실행하게된다
Docker daeomon : 모든 docker 명령어를 처리하고 이미지 및 컨테이너 생성하는 핵심 벡엔드
Registry: 도커 이미지 저장소

Dockerfile을 작성하고 Build를 하게 되면 Docker Image가 생성되고, Image를 Container환경에서 Run 할수 있도록 한다
Docker 실습
docker run hello-world
docker를 통해 이미지를 다운받게 된다.
이미지가 없다면 Docker Hub에서 자동 다운로드 되고
PS C:\Users\dkskr\Documents\skala-gai\23-docker> docker run -d -p 8080:80 --name web nginx
c72ebe3065fd2207f0ab4581276edf2f7b04b3badbb41e39139cbcbd1d367f7c

docker run은 새 컨테이너를 실행하겠다는것이고
-d는 Detached mode: 백그라운드에서 실행하겟다는것
-p는 호스트의 8080 포트를 컨테이너 80포트에 연결하겠다는 것이다 -> 브라우저에서 localhost:8080으로 접속 가능하게된다
--name은 container 이름을 지정해 주는것이고
image 이름을 nginx로 설정해준다

docker ps를 통해 목록을 출력하면 contianer id , image , command , created, status(up) port, name으로 정렬되어있다

이게 메인이 아니니까 일단 web이라는 container를 중지해주고 중지된 contianer를 remove로 삭제한다
이후 확인해주기 위해 현재 실행 중인 컨테이너 목록을 docker ps로 확인해주게 된다.
어플리케이션의 시작점을 보면 Package.json에서 시작점을 지정해주게 된다
my-app/
├── package.json # 프로젝트 설정
├── app.js # ← 시작점 (entry point)
├── routes/
├── models/
└── node_modules/



Docker file은 Image를 만들기 위한 설명서와 같다
Docker file의 기본 구조
# 1
FROM node:18-alpine : FROM은 새로운 이미지를 생성하겠다는 것이고, node는 node.js(18version)를 기반으로 alpine Linux, 경량 리눅스 기반으로 포멧을 형성하겠다는 것이다
# 2
WORKDIR /app : 컨테이너 안에서 사용할 작업 디렉토리에 해당한다
# 3
RUN npm install : package.json 안에 있는 라이브러리들을 설치하겠다는 의미이다
# 4
COPY . . : 현재 디렉토리에 있는 파일을 모두 복사하겠다는 의미에 해당한다
# 5
CMD ["node", "app.js"] : 컨테이너가 실행될때 기본으로 실행되는 명령어에 해당한다

build된 이미지에 my-node-app이라는 이미지 이름을 형성하고, 현재 디렉토리에 있는 Dockerfile을 이용해서 build하겠다는 의미로 맨 뒤에 .을 붙이게 된다
docker volume create mariadb-data
데이터를 영구 저장할 볼륨을 생성한다. 컨테이너가 삭제되더라도 DB 데이터는 유지되도록한다
(볼륨이란?: 컨테이너가 종료되거나 삭제돼도 데이터가 유지되도록 하는 Docker의 영구 저장 공간)
docker run -d --name mariadb \
-e MYSQL_ROOT_PASSWORD=password123 \
-e MYSQL_DATABASE=skala \
-e MYSQL_USER=user \
-e MYSQL_PASSWORD=password123 \
--network bridge -p 3306:3306 \
-v mariadb-data:/var/lib/mysql mariadb # mariadb의 데이터가 저장되는 /var/lib/sql과 볼륨을 연결시켜주겠다는 것이다.
옵션 설명
| -d | 백그라운드(detached) 실행 |
| --name mariadb | 컨테이너 이름 지정 |
| -e MYSQL_ROOT_PASSWORD=... | 루트 비밀번호 설정 |
| -e MYSQL_DATABASE=skala | 최초 생성할 DB 이름 |
| -e MYSQL_USER=user | 사용자 계정 생성 |
| -e MYSQL_PASSWORD=... | 사용자 계정 비밀번호 |
| --network bridge | 브리지 네트워크 사용 (기본) |
| -p 3306:3306 | 호스트의 3306 포트를 컨테이너의 3306포트에 연결 |
| -v mariadb-data:/var/lib/mysql | 데이터 볼륨 마운트 |
| mariadb | 사용할 이미지 이름 |
docker exec -it mariadb mariadb -u user -p
구성 의미
| docker exec | 실행 중인 컨테이너 안에서 명령어를 실행하기 위한 Docker 명령입니다. |
| -it | 두 개의 옵션을 합친 것입니다:🔹 -i: interactive 모드, 표준 입력 유지🔹 -t: TTY 할당, 터미널처럼 사용 가능 |
| mariadb | 명령을 실행할 컨테이너 이름입니다. 컨테이너가 이미 실행 중이어야 합니다. |
| mariadb | 컨테이너 안에서 실행할 프로그램 명령어입니다. 여기선 mariadb 클라이언트를 실행합니다. |
| -u user | mariadb 접속 시 사용할 사용자 이름입니다. 예: user |
| -p | 비밀번호를 입력받겠다는 의미입니다. 명령어 실행 후 비밀번호를 타이핑해야 합니다. |

CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY, // 정수형, 자동증가, 기본키
username VARCHAR(50) NOT NULL UNIQUE, //username과 50자 제한 문자열, 띄워쓰기 불가능, 중복 허용 불가
password VARCHAR(255) NOT NULL, // 암호 저장용 255자 문자열
email VARCHAR(100) NOT NULL UNIQUE, // 이메일 주소, 중복 허용 안됨, 필수
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, // 생성 시간, 기본값은 현재 시간
is_active BOOLEAN DEFAULT TRUE /
);
Table을 형성하고, 데이터를 삽입하게되면

이와같이 테이블이 형성된다
Image push
docker login amdp-registry.skala-ai.com/skala25a
이미지 저장소에 이미지를 Push하기 위해 login해준다. ID와 Password를 입력해준다.
docker build -t skala-webserver:1.0.0 .
현재 디렉토리에 있는 docker file을 기반으로 skala-webserver라는 이미지를 형성을 하게된다
docker tag skala-webserver:1.0.0 amdp-registry.skala-ai.com/skala25a/skala-webserver:1.0.0
docker tag는 형성된 이미지를 다른 디렉토리로 변경하겠다는 것이다
기존에 skala-webserver:1.0.0 였던것을
이곳으로 옮기게 된다 amdp-registry.skala-ai.com/skala25a/skala-webserver:1.0.0 로 변경하게 되는 것이다
요소 의미 비유
| amdp-registry.skala-ai.com | Docker 레지스트리 도메인 | "서버 주소" |
| skala25a | 프로젝트(namespace) | "최상위 폴더" |
| skala-webserver | 이미지 이름 | "파일 이름" |
| 1.0.0 | 태그 (버전) | "버전 붙은 파일" |
docker push amdp-registry.skala-ai.com/skala25a/skala-webserver:1.0.0
docker push [레지스트리주소/프로젝트/이미지명:버전]
[👨 사용자 브라우저 (프론트엔드)]
↓ 요청
[🌐 Nginx 컨테이너 (web)]
↓ reverse proxy
[⚙️ Node.js 컨테이너 (was)]
↓ SQL 요청
[🛢 MariaDB 컨테이너 (db)]

Web Tier에서 HTTPS 요청을 받고 내부 Was로 전달하게 된다 nginx를 이용하고, nginx의 설정파일은 default.conf파일에 해당한다. Docker구성은 default.conf, Dockerfile에 해당한다
항목 설명
| 역할 | 사용자의 HTTP 요청을 받고, 내부 WAS로 전달 (리버스 프록시) |
| 기술 | Nginx |
| Docker 구성 | default.conf (Nginx 설정 파일), Dockerfile (이미지 빌드용) |
프론트 엔드의 요청을 받고 Was는 DB와 통신하게 된다. Node.js를 이용하고 백엔드에 모든 요청을 전달한다
항목 설명
| 역할 | 프론트엔드의 요청을 받아 처리하고, DB와 통신 |
| 기술 | Node.js (Express 등) |
| Docker 구성 | app.js, package.json, Dockerfile |
Maria DB는 사용자 정보, 게시글 등 데이터를 저장해놓은 곳이다
항목 설명
| 역할 | 사용자 정보, 게시글 등 데이터를 저장 |
| 기술 | MariaDB (MySQL 호환 DBMS) |
| Docker 구성 | Init.sql (초기 테이블, 샘플 데이터 생성용), 공식 mariadb 이미지 사용 |
이 3가지가 같은 network를 사용하기 위해
docker network create 3tier-net을 사용해준다
해당 결과
http://localhost/users에 방문하게 되면

DB에 저장되어 있던 데이터가 출력되는 것을 볼 수 있다.
'LLM' 카테고리의 다른 글
| [5]HTML (3) | 2025.08.08 |
|---|---|
| [4]컴퓨터통신/HTML (7) | 2025.08.07 |
| [3]FAST API (5) | 2025.08.07 |
| [1]Prompt Engeenering Code Review 1강 (2) | 2025.07.29 |
| [0]Prompt 활용 엔지니어링 (1) | 2025.07.29 |