no image
[트러블슈팅 - Docker / Next.js] Module not found: Can't resolve '@/app/components/feed/FeedList’ Module not found: Can't resolve '@/components/Menubar’
에러메세지/문제상황Docker 환경에서 Next.js 애플리케이션을 빌드할 때 다음과 같은 에러가 발생함:Module not found: Can't resolve '@/app/components/feed/FeedList'Module not found: Can't resolve '@/components/Menubar'해당 파일은 실제로 존재함에도 불구하고 Next.js 빌드 중 모듈을 찾을 수 없다는 오류가 발생함로컬에서는 정상 동작하나, Docker에서만 발생하는 점이 주요 특징이었음원인1차 원인초기 프로젝트 구조가 다음과 같았음:FRONTEND/ ├── src/ │ └── app/ │ └── components/ │ └── feed/ │ ..
2025.06.01
no image
[트러블슈팅 - Docker] 포트 범위 문제 8080-8081/tcp
에러메세지 / 문제상황docker ps 명령어 결과에서 spring-container가 8080-8081/tcp 식으로 포트 범위를 열고 있는 것이 확인됨.nginx를 통한 API 요청 시 502 Bad Gateway 오류 발생.원인Dockerfile과 docker-compose.yml의 포트 설정 불일치.Dockerfile에서는 EXPOSE 8081로 되어 있었고,docker-compose.yml에서는 expose: 8080, environment: SPRING_CONTAINER_PORT=8080으로 설정되어 있었음.Spring Boot 서버는 8080 포트에서 동작했지만, Docker 메타데이터(EXPOSE)에는 8081이 등록되어 있었기 때문에 docker ps 출력에서 8080-8081 포트 범위..
2025.05.31
no image
[트러블슈팅 - Docker] mysqld: Cannot change permissions of the file 'ca.pem' (OS errno 1 - Operation not permitted)[ERROR] Could not set file permission for ca.pem[ERROR] The designated data directory /var/lib/mysql/ is unusable.
에러메세지 / 문제상황MySQL Docker 컨테이너 실행 직후 자동 종료됨. docker logs 결과:mysqld: Cannot change permissions of the file 'ca.pem' (OS errno 1 - Operation not permitted)[ERROR] Could not set file permission for ca.pem[ERROR] The designated data directory /var/lib/mysql/ is unusable. 원인MySQL은 실행될 때 데이터를 저장할 공간(폴더)이 필요함.그 저장 공간을 Windows 컴퓨터 안의 폴더(예: C드라이브 경로)로 연결했고, MySQL은 해당 폴더 안에서 파일 권한을 바꾸거나 소유자를 설정하려고 함.그러나 W..
2025.05.30
no image
[트러블슈팅 - Docker] Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 127.0.0.1:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
에러메세지 / 문제상황Docker 컨테이너(MySQL)를 실행하려 하자 다음과 같은 에러 발생:Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 → 127.0.0.1:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address is normally permitted.→ docker start 또는 docker run 실행 시 3306 포트 충돌로 인해 컨테이너 시작 실패 원인Windows에서이미 다른 프로세스가 3306 포트를 선점 중이어서 Docker가 동일 포트에 바인딩하지 못함.(Docker는 기본적으로 MySQL 컨테이너에 330..
2025.05.29
Docker 로그 관련 명령어
모든 로그 조회docker logs {컨테이너 id} 최근 로그 n줄만 조회dokcer logs --tail {표시할 줄 수} [컨테이너 id] 실시간으로 로그 확인docker logs -f {컨테이너 id} 기존 로그 n줄만 조회 + 실시간 로그 확인docker logs -f {표시 줄 수} {컨테이너 id} 실행중인 컨테이너 안으로 들어가기docker exec -it {컨테이너 id} bashexec : 실행중인 컨테이너 안에서 명령어를 실행하겠다-i : interactive 모드. 사용자가 명령어를 입력할 수 있는 옵션-t : 터미널모드. 터미널 화면을 볼 수 있게 하는 옵션bash : bash 셸
2025.04.25
no image
Docker 명령어
이미지 다운로드docker pull # 기본docker pull nginx# 특정 버전 지정하여 다운로드docker pull nginx:stable-perlDockerHub에서 찾아서 저장해준다.기본적으로 최신 버전의 이미지를 다운로드함 이미지 조회docker image ls docker image lsls : list 라는 뜻REPOSITORY: 이미지 명TAG : 이미지 태그명IMAGE ID : 이미지 IDCREATED: 이미지가 Dockerhub에 생성된 날짜 (내가 설치한 날짜가 아님)SIZE: 이미지 크기 이미지 삭제docker image rm # 기본docker image rm nginx# 강제 삭제 (중단된 컨테이너에서 사용중일 경우)docker image rm -f nginxrm: remo..
2025.04.24
no image
Docker란 / 컨테이너(Container)란 / 이미지(Image)란
Docker란각각의 앱을 어디서든 분리된 환경에서 실행할 수 있게 해주는 툴소프트웨어를 “컨테이너”로 포장해 어느 환경에서든 환경 설치 없이 실행할 수 있게 함Docker를 쓰는 이유프로그램 실행을 위해 귀찮은 설치를 일일이 거치지 않아도 된다.일관되게 프로그램 설치가 가능하다프로그램 간 충돌이 발생하지 않는다.=> 어느 컴퓨터 환경에서든 분리된 환경을 만들어 문제 없이 실행 가능하게 해준다! 컨테이너(Container)란?하나의 컴퓨터 환경 내에서 구성된 독립적인 컴퓨터 환경컴퓨터 속 "미니컴퓨터"기존 컴퓨터 환경에 간섭을 받지 않는 독립적인 하나의 컴퓨터 환경이 만들어 일관된 환경 세팅 가능저장공간 독립된다.각 컨테이너마다 고유 네트워크, IP 주소를 갖는다. 이미지(Image)란? 어떠한 소프트웨..
2025.04.23
Jenkins란?
자동으로 빌드하고 배포할 수 있는 자동화 도구공식문서 https://www.jenkins.io/doc/Docker를 통해 설치하거나 JRE(Java Runtime Environment)가 설치된 모든 컴퓨터에서 독립적으로 실행 가능흐름Git에 코드가 올라오면 Webhook을 통해 감지미리 짜놓은 빌드 스크립트(도커파일, docker-compose.yml)를 실행Docker로 컨테이너 이미지를 생성서버에 배포 or DockerHub로 push사용 이유빌드 배포 자동화환경마다 에러 → Docker기반으로 환경 통일테스트 누락 → 테스트 자동화배포 실수 → 안정적 배포사용 흐름GitLab에 코드 PUSHJenkins가 Docker 이미지 생성DockerHub에 pushEC2에 있는 Nginx + Spring ..
2025.04.22

에러메세지/문제상황

Docker 환경에서 Next.js 애플리케이션을 빌드할 때 다음과 같은 에러가 발생함:

Module not found: Can't resolve '@/app/components/feed/FeedList'
Module not found: Can't resolve '@/components/Menubar'
  • 해당 파일은 실제로 존재함에도 불구하고 Next.js 빌드 중 모듈을 찾을 수 없다는 오류가 발생함
  • 로컬에서는 정상 동작하나, Docker에서만 발생하는 점이 주요 특징이었음

원인

1차 원인

초기 프로젝트 구조가 다음과 같았음:

FRONTEND/
 ├── src/
 │    └── app/
 │         └── components/
 │              └── feed/
 │                   └── FeedList.tsx

components 폴더가 app 폴더 내부에 위치해 있었고, import 경로는 다음과 같았음:

import FeedList from "@/app/components/feed/FeedList";

tsconfig.json은 아래와 같이 설정되어 있었음:

"paths": {
  "@/*": ["./src/*"]
}

따라서 @/app/components/... 경로는 이론상으로 ./src/app/components/...에 대응되므로 올바른 듯 보였으나, 실제로는 Next.js의 App Router 특성과 Webpack path alias 처리 방식 상 라우트 디렉토리인 app/ 내부를 일반 컴포넌트 저장소로 쓰는 것이 적절하지 않음.

⇒ app/components를 쓰면 components가 또 다른 페이지로 간주될 수 있음


2차 원인

구조를 수정한 이후에도 동일한 에러 메시지가 발생했음:

Module not found: Can't resolve '@/components/Menubar'

이후 프로젝트 구조는 다음과 같았음:

FRONTEND/
 ├── src/
 │    ├── app/
 │    └── components/
 │         └── Menubar.tsx

import 경로도 다음과 같이 변경함:

import Menubar from "@/components/Menubar";

하지만 Docker 환경에서 여전히 동일한 에러가 반복됨.

 

시도

시도 1

기존 구조(app/components)에서 components를 src/ 하위로 분리함.

FRONTEND/
 ├── src/
 │    ├── app/
 │    └── components/
 │         └── Menubar.tsx

import 경로도 @/components/... 형태로 수정함.

import FeedList from "@/components/feed/FeedList";

그럼에도 Docker에서 여전히 동일한 Module not found 에러 발생함.


시도 2

  • 경로를 맞췄는데도 같은 에러가 발생하니, import 구문이 잘못쓰였는지, 대소문자 실수가 있었는지, 실제 해당 파일이 존재하는지를 모두 체크함.

 

RUN ls -R /app/src/components/

빌드 로그에서 실제로 FeedList.tsx, Menubar.tsx 등이 /app/src/components 하위에 존재하는 것이 확인됨.


시도 3

"paths": {
  "@/*": ["./src/*"],
  "@/components/*": ["./src/components/*"]
}

그러나 여전히 Docker 빌드에서 동일한 경로 에러 발생함.


시도 4

import path from 'path';

const nextConfig = {
  output: "standalone",
  webpack: (config) => {
    config.resolve.alias = {
      ...config.resolve.alias,
      '@': path.resolve(__dirname, 'src'),
      '@/components': path.resolve(__dirname, 'src/components')
    };
    return config;
  },
};

export default nextConfig;

이후 다시 빌드 시도했으며, 해당 설정 추가 이후부터는 더 이상 경로 관련 에러가 발생하지 않음.

  • nextjs에서 여러 파일들을 하나로 패키징하는 도구
  • 여러 군데에서 작성한 TS/JS 파일들을 하나의 JavaScript 파일로 묶어줌
  • import/export 문법들도 브라우저가 이해할 수 있도록 변환해줌.

⇒’@’ 표시를 src/ 폴더 전체를 의미한다고 지정하고, ‘@/components’ 는 src/components/폴더를 직접 alias하도록 명확히 지정하였음.next.config.ts에 명시적으로 Webpack alias를 추가한 것이 최종 해결책이었음.Webpack 레벨에서 명확하게 경로 alias를 지정해야 Docker/Linux 환경에서도 import 경로 해석이 정확히 이루어졌음.

 

webpack이란?

  • nextjs에서 여러 파일들을 하나로 패키징하는 도구
  • 여러 군데에서 작성한 TS/JS 파일들을 하나의 JavaScript 파일로 묶어줌
  • import/export 문법들도 브라우저가 이해할 수 있도록 변환해줌.

⇒’@’ 표시를 src/ 폴더 전체를 의미한다고 지정하고, ‘@/components’ 는 src/components/폴더를 직접 alias하도록 명확히 지정하였음.

 

해결책

next.config.ts에 명시적으로 Webpack alias를 추가한 것이 최종 해결책이었음.

Next.js에서 App Router와 함께 경로 alias를 사용할 때, 환경에 따라 tsconfig.json만으로는 빌드 단계에서 정확한 경로 해석이 보장되지 않음.

Webpack 레벨에서 명확하게 경로 alias를 지정해야 Docker/Linux 환경에서도 import 경로 해석이 정확히 이루어졌음.

 

회고 및 정리

  • 동일한 코드가 로컬에서는 정상 작동하고 Docker에서만 실패하는 경우, 환경 의존적인 차이(OS, 파일 시스템, 빌드 파서 등)를 먼저 의심해야 함.
  • Next.js는 App Router 아래 구조에 대해 엄격한 처리 방식을 가지고 있으며, 해당 영역에 일반 컴포넌트를 포함하는 것은 바람직하지 않음.
  • 경로 alias는 tsconfig.json과 Webpack 둘 다 일치하게 설정해야 안정적인 빌드가 가능함.
  • 대소문자 구분 문제나 COPY 실패와 같은 낮은 단계 이슈가 아닌, Webpack 빌드 해석기와 alias 충돌이라는 높은 추상화 레벨의 문제였음.
이번 경험을 통해 Docker 환경에서 Next.js를 사용하는 경우, import 경로 alias는 반드시 Webpack과 tsconfig에 이중 정의하고, App Router 디렉토리와 컴포넌트 디렉토리는 분리하는 것이 안정적임을 배웠다!

에러메세지 / 문제상황

  • docker ps 명령어 결과에서 spring-container가 8080-8081/tcp 식으로 포트 범위를 열고 있는 것이 확인됨.
  • nginx를 통한 API 요청 시 502 Bad Gateway 오류 발생.

원인

  • Dockerfile과 docker-compose.yml의 포트 설정 불일치.
  • Dockerfile에서는 EXPOSE 8081로 되어 있었고,
  • docker-compose.yml에서는 expose: 8080, environment: SPRING_CONTAINER_PORT=8080으로 설정되어 있었음.
  • Spring Boot 서버는 8080 포트에서 동작했지만, Docker 메타데이터(EXPOSE)에는 8081이 등록되어 있었기 때문에 docker ps 출력에서 8080-8081 포트 범위가 표시되었음.
  • nginx는 spring-container의 8080 포트를 proxy_pass 해야 했는데, 포트 정보가 꼬여 502 오류 발생.

시도

시도 1: docker-compose.yml 포트 설정 정비

  • docker-compose.yml에서 expose: 8080으로 수정하여 컨테이너 내부 포트를 8080으로 설정함.
  • Spring Boot 서버가 8080 포트에서 실행되도록 environment: SPRING_CONTAINER_PORT=8080 설정을 추가함.
  • 그러나 docker ps 결과에서 여전히 8080-8081/tcp 식으로 두 포트가 동시에 열려 있는 것으로 표시되는 문제가 발생함.

시도 2: 이미지 캐시 문제를 고려한 강제 리빌드

  • Dockerfile 변경사항이 적용되지 않은 캐시 이미지 문제를 의심하여 -no-cache 옵션으로 이미지를 강제 리빌드함.
  • Jenkins Execute Shell 스크립트에서 다음 명령어를 사용함.
docker compose build --no-cache spring-container
  • 강제 리빌드 후에도 docker ps 출력에서 포트 문제는 여전히 해결되지 않음.

시도 3: docker image inspect를 통한 이미지 메타데이터 확인

  • 문제의 정확한 원인을 찾기 위해 docker image inspect spring-project:latest 명령어를 통해 이미지를 분석함.
  • 분석 결과, 이미지의 ExposedPorts 항목에 8081/tcp가 남아 있는 것을 확인함.
"ExposedPorts": {
  "8081/tcp": {}
}
  • 이를 통해 문제는 docker-compose.yml 설정이나 캐시 문제가 아니라 Dockerfile 자체의 EXPOSE 설정 오류임을 파악함.

시도 4: Dockerfile 수정 및 최종 배포

  • Dockerfile의 EXPOSE 8081을 EXPOSE 8080으로 수정함.
  • docker-compose.yml의 expose: 8080 설정은 그대로 유지함.
  • nginx 설정 파일의 proxy_pass 대상 포트도 8080으로 통일함.
  • 이후 수정된 Dockerfile을 기반으로 docker compose build --no-cache를 수행하여 이미지를 강제 리빌드함.
  • 컨테이너를 재배포 (docker compose up -d)하고, nginx도 reload하여 변경사항을 적용함.
  • 최종적으로 docker ps 결과는 8080/tcp로 정상화되었고, API 통신 시 발생했던 502 오류도 모두 해결됨.

 

해결책

  • Dockerfile의 EXPOSE 포트를 실제 서버가 구동하는 포트(8080)와 일치시킴.
  • docker-compose.yml에서도 expose: 8080으로 설정하여 내부 네트워크 통신용 포트를 정확히 열어줌.
  • nginx 설정 파일에서도 proxy_pass 대상을 spring-container:8080으로 정확히 매칭함.
  •  Spring Boot 애플리케이션이 실제로 8080 포트에서 구동되도록 하기 위해, application.yml에 server.port=${SPRING_CONTAINER_PORT}를 설정함.
  • 이는 docker-compose.yml 파일의 environment: 부분(SPRING_CONTAINER_PORT=8080)과 연결되어, 컨테이너 구동 시 Spring 서버 포트를 제어할 수 있도록 구성함.
  • 결과적으로 docker-compose와 nginx는 Spring 서버의 실제 구동 포트를 기준으로 포트 매칭만 담당하는 역할을 하게 됨.

 

회고 및 정리

  • Dockerfile의 EXPOSE는 네트워크 자체를 여는 설정은 아니지만, docker inspect와 docker ps 결과에는 표시되기 때문에 주의 필요
  • docker-compose.yml의 expose는 Docker 네트워크 내부 통신에만 영향을 주고, ports는 외부(호스트) 노출에만 영향을 준다.
  • 실제 포트가 열리려면 Spring Boot 서버의 server.port 설정이 정확해야 하며, 이 설정이 최우선.
  • Dockerfile과 docker-compose.yml의 포트 설정이 일치하지 않으면 운영 및 디버깅 과정에서 혼란을 초래할 수 있다
  • 향후에는 Dockerfile, docker-compose.yml, nginx 설정의 포트 번호를 반드시 함께 통일해서 관리해야 한다.

에러메세지 / 문제상황

MySQL Docker 컨테이너 실행 직후 자동 종료됨. docker logs 결과:

mysqld: Cannot change permissions of the file 'ca.pem' (OS errno 1 - Operation not permitted)
[ERROR] Could not set file permission for ca.pem
[ERROR] The designated data directory /var/lib/mysql/ is unusable.

 

 

원인

MySQL은 실행될 때 데이터를 저장할 공간(폴더)이 필요함.

그 저장 공간을 Windows 컴퓨터 안의 폴더(예: C드라이브 경로)로 연결했고, MySQL은 해당 폴더 안에서 파일 권한을 바꾸거나 소유자를 설정하려고 함.

그러나 Windows 폴더는 이런 리눅스식 작업을 허용하지 않기 때문에, MySQL이 필요한 작업을 하지 못해 실행이 중단됨.

→ 따라서 Windows 폴더는 리눅스 프로그램이 자유롭게 다룰 수 없는 구조라서 문제가 발생함.

시도 1

  • Windows 측의 마운트 디렉토리 삭제 후 재시도
  • 동일한 오류 발생

시도 2

  • data 생성 디렉토리를 바꿔 컨테이너 실행했으나 같은 오류 발생
  • mysql_data → mysql_data2

해결책

Windows 쪽 폴더를 쓰는 게 아니라, Ubuntu(리눅스) 안에 있는 폴더를 사용하도록 수정함:

mkdir -p ~/docker/docker-mysql/mysql_data

docker run -e MYSQL_ROOT_PASSWORD=**** \\
  -d -p 3306:3306 \\
  -v ~/docker/docker-mysql/mysql_data:/var/lib/mysql \\
  mysql

→ 리눅스 내부 폴더는 MySQL이 자유롭게 접근하고 설정을 바꿀 수 있기 때문에, 컨테이너가 정상적으로 실행됨

회고 및 정리

  • Docker에서 데이터를 저장할 때는 'Ubuntu 안의 폴더'를 사용하는 것이 안전하다
  • Windows 폴더를 연결하면 권한 문제로 오류가 생길 수 있음
  • 특히 MySQL처럼 데이터를 직접 다루는 프로그램은 리눅스 폴더를 쓰는 게 필수

→ 앞으로는 /mnt/c/... 같은 경로 대신 ~/폴더명처럼 리눅스 안에 있는 경로를 쓰는 게 좋다!

 

에러메세지 / 문제상황

Docker 컨테이너(MySQL)를 실행하려 하자 다음과 같은 에러 발생:

Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 → 127.0.0.1:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address is normally permitted.

→ docker start 또는 docker run 실행 시 3306 포트 충돌로 인해 컨테이너 시작 실패

 

 

원인

Windows에서

이미 다른 프로세스가 3306 포트를 선점 중

이어서 Docker가 동일 포트에 바인딩하지 못함.

(Docker는 기본적으로 MySQL 컨테이너에 3306 포트를 사용)

시도 1

WSL(Ubuntu) 환경에서 포트 사용 확인:

lsof -i:3306

 

 

❌ 결과 없음 → WSL 내부에서는 포트 점유 프로세스가 보이지 않음

 

시도 2

Windows PowerShell에서 포트 점유 확인:

netstat -aon | findstr :3306

→ PID 6700이 3306 포트를 LISTENING 상태로 사용 중인 것을 확인

tasklist | findstr 6700

→ 실제 어떤 프로세스인지 확인 후 강제 종료:

taskkill /PID 6700 /F

 

해결책

3306 포트를 점유하고 있는 백그라운드 MySQL 프로세스 또는 기타 앱을 종료하여 포트를 비워줌

docker run

명령이 정상적으로 실행됨

 

회고 및 정리

  • WSL에서 보이지 않는 포트 충돌은 Windows 쪽 프로세스일 가능성이 높다
  • 이럴 땐 netstat과 tasklist를 활용해 포트를 선점한 프로세스를 찾아내는 것이 핵심
  • Docker 포트 바인딩 에러는 대부분 "다른 앱이 해당 포트를 쓰고 있음" → 포트를 바꾸거나 기존 앱을 중지하면 해결 가능

Docker 로그 관련 명령어

친환경 개발자
|2025. 4. 25. 02:41

모든 로그 조회

docker logs {컨테이너 id}

 

 

최근 로그 n줄만 조회

dokcer logs --tail {표시할 줄 수} [컨테이너 id]

 

 

실시간으로 로그 확인

docker logs -f {컨테이너 id}

 

 

기존 로그 n줄만 조회 + 실시간 로그 확인

docker logs -f {표시 줄 수} {컨테이너 id}

 

 

 

실행중인 컨테이너 안으로 들어가기

docker exec -it {컨테이너 id} bash
  • exec : 실행중인 컨테이너 안에서 명령어를 실행하겠다
  • -i : interactive 모드. 사용자가 명령어를 입력할 수 있는 옵션
  • -t : 터미널모드. 터미널 화면을 볼 수 있게 하는 옵션
  • bash : bash 셸

Docker 명령어

친환경 개발자
|2025. 4. 24. 18:01

이미지 다운로드

docker pull <이미지명>
# 기본
docker pull nginx

# 특정 버전 지정하여 다운로드
docker pull nginx:stable-perl
  • DockerHub에서 찾아서 저장해준다.
  • 기본적으로 최신 버전의 이미지를 다운로드함

 

이미지 조회

docker image ls

 

docker image ls

  • ls : list 라는 뜻
  • REPOSITORY: 이미지 명
  • TAG : 이미지 태그명
  • IMAGE ID : 이미지 ID
  • CREATED: 이미지가 Dockerhub에 생성된 날짜 (내가 설치한 날짜가 아님)
  • SIZE: 이미지 크기

 

이미지 삭제

docker image rm <이미지명 or 이미지ID>
# 기본
docker image rm nginx

# 강제 삭제 (중단된 컨테이너에서 사용중일 경우)
docker image rm -f nginx

  • rm: remove의 약자
  • 이미지 id 입력 시에는 앞 4글자 정도만 입력해도 알아서 삭제

🪄 중단된 컨테이너에서 사용중인 이미지는 이렇게 에러가 발생

 

 

컨테이너 생성

docker create 이미지명[:태그명]
$ docker create nginx

$ docker ps -a # 모든 컨테이너 조회
  • 다운받은 이미지를 바탕으로 컨테이너를 생성.
  • 컨테이너가 실행되진 않는다! 생성만 됨

 

컨테이너 실행

docker start <컨테이너명 or 컨테이너ID>
$ docker start f8d37

 

💡컨테이너 생성 + 실행 (+ 이미지 다운로드) 한번에

docker run <컨테이너명 or 컨테이너ID>
$ docker run nginx

 

 

🪄 포그라운드 vs 백그라운드

  • 포그라운드: 프로그램이 화면에서 실행. 다른 명령어 칠 수가 없다.
  • 백그라운드: 프로그램이 화면 뒤에서 실행. 다른 명령어 칠 수 있다.
# 포그라운드
docker run nginx
# 백그라운드
docker run -d nginx

 

 

컨테이너 조회

docker ps [-a]
# 실행중인 컨테이너 조회
docker ps
# 모든 컨테이너 조회
docker ps -a

 

 

 

 

컨테이너 중지

docker stop <컨테이너명 or 컨테이너ID>  
docker stop webserver

 

 

 

컨테이너 삭제

docker rm <컨테이너명 or 컨테이너ID>  
docker rm ebaa

 

 

Docker란

각각의 앱을 어디서든 분리된 환경에서 실행할 수 있게 해주는 툴

  • 소프트웨어를 “컨테이너”로 포장해 어느 환경에서든 환경 설치 없이 실행할 수 있게 함

Docker를 쓰는 이유

  • 프로그램 실행을 위해 귀찮은 설치를 일일이 거치지 않아도 된다.
  • 일관되게 프로그램 설치가 가능하다
  • 프로그램 간 충돌이 발생하지 않는다.

=> 어느 컴퓨터 환경에서든 분리된 환경을 만들어 문제 없이 실행 가능하게 해준다!

 

 

컨테이너(Container)란?

하나의 컴퓨터 환경 내에서 구성된 독립적인 컴퓨터 환경

  • 컴퓨터 속 "미니컴퓨터"
  • 기존 컴퓨터 환경에 간섭을 받지 않는 독립적인 하나의 컴퓨터 환경이 만들어 일관된 환경 세팅 가능
  • 저장공간 독립된다.
  • 각 컨테이너마다 고유 네트워크, IP 주소를 갖는다.

 

이미지(Image)란?

어떠한 소프트웨어를 실행할 수 있는 설계도(설치환경 + 설정 + 실행 방법)

  • 미니 컴퓨터에 들어가는 닌텐도 칩
  • 프로그램을 실행하는 데 필요한 모든 것을 포함하고 있다.
  • MySQL을 별도로 설치하지 않아도 이미지만 있으면 알아서 컨테이너에서 실행이 가능하다!

 

 

컨테이너와 이미지 설명



Jenkins란?

친환경 개발자
|2025. 4. 22. 12:40

자동으로 빌드하고 배포할 수 있는 자동화 도구


공식문서 https://www.jenkins.io/doc/

  • Docker를 통해 설치하거나 JRE(Java Runtime Environment)가 설치된 모든 컴퓨터에서 독립적으로 실행 가능
  • 흐름
    1. Git에 코드가 올라오면 Webhook을 통해 감지
    2. 미리 짜놓은 빌드 스크립트(도커파일, docker-compose.yml)를 실행
    3. Docker로 컨테이너 이미지를 생성
    4. 서버에 배포 or DockerHub로 push
  • 사용 이유
    • 빌드 배포 자동화
    • 환경마다 에러 → Docker기반으로 환경 통일
    • 테스트 누락 → 테스트 자동화
    • 배포 실수 → 안정적 배포
  • 사용 흐름
    1. GitLab에 코드 PUSH
    2. Jenkins가 Docker 이미지 생성
    3. DockerHub에 push
    4. EC2에 있는 Nginx + Spring + DB로 docker-compose up
  • 설치 및 실행
    • 독립 실행형: java -jar jenkins.war 명령어로 실행
    • Docker 컨테이너: Docker를 사용하여 컨테이너로 실행
    • 패키지 매니저: 시스템에 맞는 패키지 매니저를 통해 설치