본문 바로가기

Java/Deploy

[Docker] 도커 이미지 / 컨테이너 다루기

반응형

 

도커의 사용법은 크게 아래와 같이 나뉜다.

  1. 이미지를 대상으로 하는 것
  2. 컨테이너를 대상으로 하는 것

그러면 도커 이미지는 무엇일까?

도커 이미지는 도커 컨테이너를 만들기 위한 템플릿 이다.

 

도커 이미지는 우분투 같은 운영 체제로 구성된 파일 시스템은 물론, 컨테이너 위에서 실행하기 위한 애플리케이션이나,

그 의존 라이브러리, 도구에 어떤 프로세스를 실행할지 등의 실행 환경의 설정 정보까지 포함하는 아카이브다.

 

Dockerfile 역시 이미지를 구성하는 순서를 기술한 코드에 지아지 않기 때문에 이 자체는 이미지라고 할 수 없다.

컨테이너의 템플릿 역할 하는 이미지를 만드는 과정을 일반적으로 "도커 이미지를 빌드한다"고 한다. 

그리고 컨테이너를 실행할 때 이 빌드된 이미지를 사용한다.

 

그러면 아래와 같이 예제를 통해 조금.. 이해해보도록 해보자! 🤪

 


(예제)

go언어로 만든 간단한 웹 서버를 도커 컨테이너에서 실행해보기

 

1 ) main.go 파일 생성

  • 모든 Http 요청에 대해 "Hello Docker !!"라는 응답을 보낸다.
  • 포트 8080로 요청을 받는 서버 애플리케이션으로 동작한다.
  • 클라이언트로부터 요청을 받으면 received request라는 메시지를 표준으로 출력한다.
package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r * http.Request) {
        log.Println("received request")
        fmt.Fprintf(w, "Hello Docker!!")
    })

    log.Println("start server")
    server := http.Server {
        Addr: ":8080",
    }

    if err := server.ListenAndServe(); err != nil {
        log.Println(err)
    }
}

 

2 ) 서버 애플리케이션을 도커 컨테이너에 배치 = Dockerfile 작성

FROM golang:1.9

RUN mkdir /echo
COPY main.go /echo

CMD ["go", "run", "/echo/main.go"]

 

FROM 인스트럭션

도커 이미지의 바탕이 될 베이스 이미지

Dockerfile로 이미지를 빌드할 때, 먼저 FROM 인스트럭션에 지정된 이미지를 내려받음

 

RUN 인스트럭션

도커 이미지를 실행할 때 컨테이너 안에서 실행할 명령

인자로 도커 컨테이너 안에서 실행할 명령을 그대로 기술

 

COPY 인스트럭션

도커가 동작 중인 호스트 머신의 파일이나, 디렉터리를 도커 컨테이너 안으로 복사

 

CMD 인스트럭션

도커 컨테이너를 실행할 때 컨테이너 안에서 실행할 프로세스

RUN은 애플리케이션 업데이트 및 배치에, CMD는 애플리케이션 자체를 실행하는 명령

즉, 쉘 스크립트로 다음과 같은 실행 명령 역할을 한다

 

$ go run /echo/main.go

 

3 ) 도커 이미지 빌드

  • -t : 이미지(태그)명을 지정, 생략시에는 latest 태그가 붙음
  • -t 옵션과 이미지명은 반드시 지정하는 편이 좋음
    ⇢ 지정 안해도 빌드 자체는 가능하나, 해시값만으로 이미지를 구별해야하므로 사용하기가 상당히 번거로움
  • 이미지명의 충돌을 피하기 위해 되도록 네임스페이스를 붙일 것을 추천 !
$ docker image build -t 이미지명[:태그명] dockerfile의경로
% cd /Users/jenny/Develop/docker 
% docker image build -t example/echo:latest .

Sending build context to Docker daemon   7.68kB
Step 1/4 : FROM golang:1.9
1.9: Pulling from library/golang
55cbf04beb70: Pull complete 
1607093a898c: Pull complete 
9a8ea045c926: Pull complete 
d4eee24d4dac: Pull complete 
9c35c9787a2f: Pull complete 
8b376bbb244f: Pull complete 
0d4eafcc732a: Pull complete 
186b06a99029: Pull complete 
Digest: sha256:8b5968585131604a92af02f5690713efadf029cc8dad53f79280b87a80eb1354
Status: Downloaded newer image for golang:1.9
 ---> ef89ef5c42a9
Step 2/4 : RUN mkdir /echo
 ---> Running in 97087fbf5afb
Removing intermediate container 97087fbf5afb
 ---> 3159f2701c93
Step 3/4 : COPY main.go /echo
 ---> 9778a27685fe
Step 4/4 : CMD ["go", "run", "/echo/main.go"]
 ---> Running in 43fc26ed1457
Removing intermediate container 43fc26ed1457
 ---> 1bf4c18c5824
Successfully built 1bf4c18c5824
Successfully tagged example/echo:latest

 

  1. Dockerfile 이 있는 위치로 이동
  2. docker image build 명령어를 통해 이미지 빌드 
  3. / 앞에 오는 example은 네임스페이스로 이미지명에 이렇게 사용자 네임스페이스를 추가할 수 있음
  4. 빌드를 실행하면, 베이스 이미지를 내려받고 RUN이나 COPY 인스트럭션에 지정된 명령이 단계적으로 실행됨을 확인할 수 있음

4 ) 생성(빌드)된 도커 이미지 확인

생성된 도커 이미지의 Repository, tag, image ID, created SIZE 등 확인

 

% docker image ls

REPOSITORY                           TAG                                              IMAGE ID            CREATED             SIZE
example/echo                         latest                                           1bf4c18c5824        9 minutes ago       750MB

 

5 ) 도커 컨테이너 실행

생성된 도커 이미지를 컨테이너를 통해 포어그라운드에서 실행

 

% docker container run example/echo:latest

2020/07/12 06:47:34 start server

 

 

혹시 데몬처럼 백그라운드에서 컨테이너를 실행하고 싶다면, -d 옵션을 추가

  • -d : 옵션을 붙여 컨테이너를 실행하면, 해시값은 도커.컨테이너의 ID로 docker 명령어로 컨테이너를 조작할때 특정하기 위한 값
% docker container run -d example/echo:latest

5f0aaba90b06c65ed1e04d5f022ea864716966e8f3c932756c33700e4be8222d

 

6 ) 현재 실행 중인 도커 컨테이너 확인

% docker container ls

CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS               NAMES
5f0aaba90b06        example/echo:latest   "go run /echo/main.go"   About a minute ago   Up About a minute                       heuristic_maxwell

 

  • CONTAINER ID : 현재 실행중인 컨테이너를 식별하기 위한 ID,
                               docker container run 명령을 실행할때 출력된 값에서 앞 12자리만 뽑은것

 


 

일련의 예제를 통해 도커의 이미지를 빌드하고 이를 가지고 도커 컨테이너에 할당해 실행될 수 있도록 했다.

그러나, Go언어를 통해 만든 어플리케이션의 의한다면 로컬(http://localhost:8080)에서 실행되어야 하는데

접속해보면 정상적으로 호출되지 않는다 !!

 

도커의 가장 중요한 개념인 포트 포워딩이 있는데, 이는 다음장에서 다뤄보자.

 

반응형

❥ CHATI Github