도커의 사용법은 크게 아래와 같이 나뉜다.
- 이미지를 대상으로 하는 것
- 컨테이너를 대상으로 하는 것
그러면 도커 이미지는 무엇일까?
도커 이미지는 도커 컨테이너를 만들기 위한 템플릿 이다.
도커 이미지는 우분투 같은 운영 체제로 구성된 파일 시스템은 물론, 컨테이너 위에서 실행하기 위한 애플리케이션이나,
그 의존 라이브러리, 도구에 어떤 프로세스를 실행할지 등의 실행 환경의 설정 정보까지 포함하는 아카이브다.
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
- Dockerfile 이 있는 위치로 이동
- docker image build 명령어를 통해 이미지 빌드
- / 앞에 오는 example은 네임스페이스로 이미지명에 이렇게 사용자 네임스페이스를 추가할 수 있음
- 빌드를 실행하면, 베이스 이미지를 내려받고 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)에서 실행되어야 하는데
접속해보면 정상적으로 호출되지 않는다 !!
도커의 가장 중요한 개념인 포트 포워딩이 있는데, 이는 다음장에서 다뤄보자.
'Java > Deploy' 카테고리의 다른 글
[Docker] 도커 컨테이너 사용을 위한 명령어 (0) | 2020.07.14 |
---|---|
[Docker] 도커 이미지 사용을 위한 명령어 (0) | 2020.07.13 |
[Docker] 도커 포트포워딩 (0) | 2020.07.12 |
[Docker] Mac에서 도커 시작하기, Docker Tutorial (0) | 2020.07.08 |
[Jenkins] Could not find tools.jar 오류 해결 방법 (1) | 2019.11.13 |
[Jenkins] Bitbucket Repository와 Jenkins 연동 (3) : Jenkins Plugin 이용 (0) | 2019.11.13 |