본문 바로가기
Docker

[Docker] Docker 컨테이너 생성

by NJ94 2024. 2. 14.

1. 무엇을 컨테이너로 만드는것일까?

  • 개발한 소프트웨어 애플리케이션을 컨테이너로 만들어 배포 및 실행 가능할 수 있다.
    • 이를 통해 애플리케이션의 의존성을 관리하고, 실행 환경을 유지 한다
  • MSA(Micro Service Architecture) 환경의 Polyglot 애플리케이션 운영 
    • MSA 환경에서는 각각의 마이크로 서비스를 컨테이너로 만들어서 관리한다
    • 각 서비스는 독립적으로 배포되고 실행되고 확장할 수 있다.
    • * Polyglot: 여러 언어를 구사하는 것을 말한다. 즉, 개발자에게 언어 선택의 자유를 주고 다양한 기술을 통합하는 데 도움을 준다. 

 

2. 컨테이너를 만들때 Dockerfile을 사용한다

2.1 Dockerfile

  • Docker 이미지를 빌드하기 위한 스크립트 
    • 쉽고, 간단, 명확한 구문을 가진 text file로 Top-Down 해석 
    • 대소문자를 구분하지 않지만, 대부분 대문자로 작성하여 가독성을 높인다
    • 컨테이너 이미지를 생성할 수 있는 고유의 지시어를 가진다.
  • Dockerfile은 'docker build' 명령을 사용하여 Docker 엔진에 의해 이미지로 빌드 된다.

 

2.2 Docker를 사용하여 컨테이너 이미지 생성 예시

$ mkdir build
$ cd build
$ vi hello.js
$ vi dockerfile
FROM node:12
COPY hello.js /
CMD ["node", "/hello.js"]

$ docker build -t hellojs:latest .

 

 

2.3 Dockerfile 문법

  • #
    • comment
  • FROM
    • 컨테이너 BASE IMAGE (운영환경)
      • 보통 베이스 이미지를 기반으로 추가적인 소프트웨어를 설치하거나 설정한다
  • MAINTAINER
    • 이미지를 생성한 사람의 이름 및 정보
  • LABEL
    • 컨테이너 이미지에 컨테이너의 정보를 저장
      • 이미지 메타데이터 추가  ex) 소프트웨어 버전, 설명, 제작자 등의 정보 포함 
  • RUN
    • Docker 이미지를 빌드할 때 컨테이너 내부에서 실행할 명령을 지정
      • 주로 패키지 설치, 파일 다운로드, 설정 변경에 사용됨
  • ADD
    • 컨테이너 빌드 시 호스트의 파일(tar, url 포함)을 컨테이너로 복사
  • WORKDIR
    • 컨테이너 빌드 시 명령이 실행될 작업 디렉터리 설정
  • ENV
    • 환경변수 지정
  • USER 
    • 명령 및 컨테이너 실행 시 적용할 유저 설정
      • 일반적으로 보안상의 이유로 root 권한을 피하기 위해 사용됨
  • VOLUME
    • 파일 또는 디렉토리를 컨테이너의 디렉토리로 마운트
  • EXPOSE
    • 컨테이너 동작 시 외부에서 사용할 포트 지정
  • CMD
    • 컨테이너 동작 시 자동으로 실행할 서비스나 스크립트 지정
  • ENTRYPOINT
    • CMD와 함께 사용하면서 command 지정 시 사용

 

3. 생성한 컨테이너 배포 예시

  • 아래의 예시처럼 Docker HOST 에서 Docker Hub 로 배포한다
//1. 이미지 빌드: Dockerfile을 사용하여 컨테이너 이미지 빌드 
$ docker build - t hello.js:latest .

//2. Docker Hub 로그인
$ docker login

//3. 이미지 푸시: 빌드한 이미지를 Docker Hub로 푸시
$ docker push hello.js:latest

 

 

도커 컨테이너 실습 예제


1. nodejs 애플리케이션 컨테이너 생성 

  • 환경: VirtualBox, Ubuntu

 

1.1 폴더 생성

$ mkdir hellojs

 

 

1.2 파일 생성

  • hello.js 파일을 생성해서 node 소스코드 생성
$ cd hellojs
$ cat > hello.js

### hello.js 아래 내용 입력
const http = require('http');
const os = require('os');
console.log("Test server starting...");

var handler = function(request, response) {
    console.log("Received request from " + request.connection.remoteAddress);
    response.writeHead(200);
    response.end("Container Hostname: " + os.hostname() + "\n");
};

var www = http.createServer(handler);
www.listen(8080);

 

 

1.3 dockerfile 생성

$ vi dockerfile

### dockerfile 아래 내용 입력
FROM node:12
COPY hello.js /
CMD ["node", "/hello.js"]


### dockerfile 확인
$ cat dockerfile

FROM node:12
COPY hello.js /
CMD ["node", "/hello.js"]

 

1.4 이미지 빌드 

$ docker build -t hellojs:latest .

### "hellojs" 라는 도커 이미지로 빌드
### ":latest" 생략 시 자동으로 붙어서 생성됨

 

 

1.5 이미지 빌드 결과 확인

$ docker iamges

### 출력
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
hellojs      latest    0ac27bfc0ecf   6 seconds ago   918MB

 

 

1.6  "FROM node:12" 


링크

https://hub.docker.com/search?q=node

 

 

Docker Hub 사이트에 접속해서 BASE IMAGE를 찾을 수 있음

 

 

Supported tags and respective Dockerfile links 

 

 

 

2. 우분투 기반의 웹 서버 컨테이너 생성

2.1 웹 서버 컨테이너 생성

### 1. 폴더생성
$ mkdir webserver

### 2. 폴더 진입
$ cd webserver

### 3. Dockerfile 생성
$ vim Dockerfile

FROM ubuntu:18.04
LABEL maintainer="NJ K <tester@gmail.com>"
# install apache
RUN apt-get update \
    && apt-get install -y apache2
RUN echo "TEST WEB" > /var/www/html/index.html
EXPOSE 80
CMD ["/usr/sbin/apache2ctl", "-DFOREGROUND"]


### 4. 이미지 생성
$ docker build -t webserver:v1 . 

### 5. 이미지 확인 
$ docker ps
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
webserver    v1        42a07139654d   12 seconds ago   205MB
hellojs      latest    0ac27bfc0ecf   2 hours ago      918MB

 

 

2.1 웹 서버 컨테이너 실행  

  • webserver 실행
### webserver 실행
$ docker run -d -p 80:80 --name web webserver
e3f9030358f2f077406bd31dcaa7aa4a0acbeeb3617ee3ae9ae6e236a145e07f


### docker 실행 여부 확인
$ docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                               NAMES
e3f9030358f2   webserver:v1   "/usr/sbin/apache2ct…"   3 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web


### webserver 실행
$ curl localhost:80
TEST WEB


### webserver container 삭제
$ docker rm -f web

 

 

2.2 웹 서버 컨테이너 실행 

  • hellojs
### hellojs 실행
$ docker run -d -p 8080:8080 --name web hellojs
3eb884b5012effd33a53b625fc37b6c870a5d3052457c8796c38f08629cbec9e


### docker 실행 여부 확인
$ docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS                  PORTS                                       NAMES
3eb884b5012e   hellojs   "docker-entrypoint.s…"   2 seconds ago   Up Less than a second   0.0.0.0:8080->8080/tcp, :::8080->8080

### hellojs 실행
$ curl localhost:8080
Container Hostname: 3eb884b5012e


### hellojs container 삭제
$ docker rm -f web

 

 

 

3. Docker Hub 배포 

3.1 Docker 로그인

$ docker login

 

 

3.2 이미지 이름 변경

  • 도커허브에 배포하기 위해서는 아래와 같이 이름이 변경되야됨
    • webserver:v1 -> knj94/webserver:v1
    • hellojs:latest ->  knj94/hellojs:latest
  • 도커 허브에 배포하기위해서는 자신의 아이디가 포함되어 있어야함
$ docker tag webserver:v1 knj94/webserver:v1

$ docker tag webserver:v1 knj94/webserver:v1

$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
knj94/webserver   v1        42a07139654d   12 minutes ago   205MB
webserver         v1        42a07139654d   12 minutes ago   205MB
knj94/hellojs     latest    0ac27bfc0ecf   2 hours ago      918MB
hellojs           latest    0ac27bfc0ecf   2 hours ago      918MB

 

 

3.3 배포

$ docker push knj94/webserver:v1

$ docker push knj94/hellojs

 

 

3.4 확인

https://hub.docker.com/

 

 

 

4. 문제풀이

Q. 주어진 script를 실행하는 컨테이너를 빌드하시오

  • 컨테이너 이름: fortune:20.02
  • dockerfile의 내용
    • base image: debian
    • 컨테이너에 아래의 webpage.sh 파일을 복사
    • #!/bin/bash
      mkdir /htdocs
      while :
      do
          /usr/games/fortune > /htdocs/index.html
          sleep 10
      done
  • 컨테이너에 fortune 애플리케이션 설치: apt-get install fortune
  • 컨테이너 실행 시 저장한 webpage.sh가 실행되도록 구성

 

 

참고

 

[따배도] 4-1. 도커 컨테이너 만들어보기: 이론편

https://www.youtube.com/watch?v=9qnD8aODu-4&list=PLApuRlvrZKogb78kKq1wRvrjg1VMwYrvi&index=11



[따배도] 4-2. 도커 컨테이너 만들어보기: 실습

https://www.youtube.com/watch?v=WLjfzwdASbw&list=PLApuRlvrZKogb78kKq1wRvrjg1VMwYrvi&index=12