Docker

[Docker] 1. 도커 파일 작성 & 컨테이너 실행하기

szoo_ 2024. 9. 12. 15:38

도커 파일이란?

도커 이미지를 빌드하기 위한 설정 파일이다.
Dockerfile은 일련의 명령어로 구성되어 있으며, 이 명령어들을 사용해 컨테이너 환경을 정의한다.
애플리케이션을 실행하는 데 필요한 모든 구성 요소(예: 베이스 이미지, 파일 복사, 패키지 설치, 명령 실행 등)를
포함하는 텍스트 파일이다.

 

도커 파일의 구성 요소

                    • FROM: Dockerfile에서 사용할 베이스 이미지를 지정한다.
                      사용 예시: FROM ubuntu:20.04 - ubuntu:20.04 이미지를 베이스로 사용할 것을 지정
                    •  WORKDIR: 명령어가 실행될 작업 디렉토리를 설정
                      사용 예시: WORKDIR /usr/src/app
                    • COPY: 로컬 시스템에서 파일을 컨테이너로 복사
                      사용 예시: COPY . /usr/src/app  - 현재 위치에서 도커파일의 /usr/src/app로 복사
                    • RUN: 이미지를 빌드하는 동안 실행할 명령어를 정의. 일반적으로 패키지 설치나 파일 구성을 위해 사용한다.
                      사용 예시: RUN apt-get update && apt-get install -y python3
                    • CMD: 컨테이너가 실행될 때 실행할 기본 명령을 지정. 애플리케이션을 실행하는 데 사용한다.
                      사용 예시: CMD ["python3", "app.py"]
                    • EXPOSE: 컨테이너가 사용할 포트 번호를 명시
                      사용 예시: EXPOSE 8080
                    • ENV: 환경 변수 설정
                      사용 예시: ENV NODE_ENV=production

도커 파일로 이미지 만들기

1. 도커 파일 생성 - 도커 파일은 무조건 Dockerfile 으로 명명해야한다.

sudo vi Dockerfile
    •  

실습을 진행하기 위한 파일들

# sudo vi Dockerfile로 편집

# 베이스 이미지로 Node.js 사용
FROM node:14

# 작업 디렉토리 설정
WORKDIR /usr/src/app

# 애플리케이션 의존성 설치
COPY package*.json ./
RUN npm install

# 소스 코드 복사
COPY . .

# 컨테이너에서 사용할 포트 설정
EXPOSE 8080

# 컨테이너 시작 시 실행할 명령어 설정
CMD ["node", "app.js"]
// sudo vi app.js 로 편집

// Express 모듈 불러오기
const express = require('express');
const app = express();

// 포트 설정
const PORT = process.env.PORT || 8080;

// 간단한 GET 요청 처리
app.get('/', (req, res) => {
  res.send('Hello, World! This is running inside a Docker container.');
});

// 서버 실행
app.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});
# sudo vi package.json 파일

{
  "name": "docker-node-app",
  "version": "1.0.0",
  "description": "A simple Node.js app running in Docker",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "^4.17.1"
  }
}

 

위와 같은 세개의 파일을 각각 생성하면 현재 폴더에서는 아래와 같은 구조일 것이다.

/현재 폴더
├── Dockerfile
├── app.js
└── package.json

 

 

2. 도커 파일 빌드하기

현재 폴더 위치에서 바로 도커 파일을 빌드하면 해당 도커파일을 통해 이미지가 생성된다.

docker build -t <원하는-이미지-이름> .

 

만약 my-image로 빌드를 했다면, 아래와 같은 결과를 볼 수 있을 것이다.

 

3. 도커 컨테이너 실행하기

여기서 주의 할 점은 애플리케이션이 8080포트로 실행된다는 것이다.

 

도커파일에서 먼저 8080 포트를 명시를 했지만 만약 도커를 실행할때

해당 포트를 직접 지정하지 않으면 포트가 열리지 않기 때문에 항상 도커 컨테이너를 시작할 때 조심하자.

 

docker run -d -p 8080:8080 my-image

잠깐 도커 실행 명령어의 요소에 대해 설명하겠다.

  • -d : 백그라운드로 실행
  • -p [호스트 포트]:[컨테이너 포트] 

해당 컨테이너가 정상적으로 실행된다면, 아래처럼 보여질 것이다.

 

image는 실행 이미지명

CREATED는 생성된 경과 시간

STATUS는 상태 Up~ 이라면 실행중이라는 뜻이고, Exited ~ 라면 종료되었다는 뜻이다.

PORTS는 지정된 포트에 대해 나타나고, 만약 아무것도 보이지 않는다면 아무런 포트가 지정되지 않은 것이다.

 

4. 실행된 컨테이너 안 애플리케이션에 요청 해보기

실행지점은 도커 명령어를 친 곳에서 실행하면 된다.

curl localhost:8080

 

아래와 같이 결과가 Hello, World! 문구가 보인다면 성공적으로 실행 한 것이다.

 

 

+ 퍼블릭 인스턴스나 UTM과 같은 가상머신에서 했을때 외부에서 테스트해도 된다.
대신 인스턴스의 경우 보안그룹에서 8080을 해줘야 할 것이다.

 

 

Tip. Localhost의 개념
       호스트의 아이피가 172.31.7.147일때
       호스트 내부에서 해당 내부의 애플리케이션에 요청을 보낼땐 localhost 주소와 172.31.7.147 주소는 같은 주소이다.

       호스트 바깥에서 해당 애플리케이션에 요청을 보낼 땐 localhost 주소와 172.31.7.147 주소는 다르다.