[Docker] 2.도커 컨테이너 배포 - 컨테이너로 애플리케이션 실행하기
책 ‘도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문’을 기반으로 공부 한 내용을 정리
- 도커 이미지와 컨테이너의 관계
도커 이미지 | 컨테이너를 구성하는 파일 시스템과 실행할 애플리케이션 설정을 하나로 합친 것으로, 컨테이너를 생성하는 템플릿 역할 |
---|---|
도커 컨테이너 | 도커 이미지를 기반으로 생성, 파일 시스템과 애플리케이션이 구체화돼 실행되는 상태 |
- 도커 이미지와 도커 컨테이너
도커 이미지 받아오기 ( $docker image pull 명령어)
- 실행 ( $docker container run 명령어)
- 옵션을 통해 포트 포워딩이 적용 되어있음. 때문에 도커 실행 환경의 포트 9000을 거쳐 HTTP 요청을 전달 받음
- 실행 ( $docker container run 명령어)
- curl 명령으로 접근하기 ($curl http://localhost:9000/)
- 간단한 애플리케이션과 도커 이미지 만들기
- main.go 파일 만들기
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) } }
- 모든 http 요청에 대해 “Hello Docker!”라는 응답을 보낸다
- 포트 8080로 요청을 받는 서버 애플리케이션으로 동작
- 클라이언트로부터 요청을 받으면 received request라는 메시지를 표준으로 출력
- Dockerfile 만들기
FROM golang:1.9 RUN mkdir /echo COPY main.go /echo CMD ["go", "run", "echo/main.go"]
FROM 인스트럭션 → 도커 이미지의 바탕이 될 베이스 이미지를 지정. Dockerfile로 이미지를 빌드할 때 먼저 FROM 인스트럭션에 지정된 이미지를 내려받음 → FROM에서 받아오는 이미지는 도커 허브 레지스터리에 이미 공개된 것
RUN 인스트럭션 → 도커 이미지를 실행할 때 컨테이너 안에서 실행할 명령어를 정의하는 인스트럭션
COPY 인스트럭션 → 도커가 동작 중인 호스트 머신의 파일이나 디렉터리를 도커 컨테이너 안으로 복사하는 인스트럭션
CMD 인스트럭션 → 도커 컨테이너를 실행할 때 컨테이너 안에서 실행할 프로세스를 지정
- main.go 파일 만들기
도커 이미지 빌드하기
docker image build -t 이미지명[:태그명] Dockerfile의_경로
- 도커 컨테이너 실행
►docker container run example/echo:latest
►docker container run -d example/echo:latest (백그라운드로 실행)
- 도커 컨테이너 실행
- 포트 포워딩
curl http://localhost:8080/
- echo 애플리케이션은 8080 포트를 리스닝하고 있지만, 컨테이너 안에서 한정된 포트임. 때문에 컨테이너 밖에서 온 요청을 컨테이너 안에 있는 애플리케이션에 전달해줘야 함.
- 위에 오류가 생기는 경우 해결 방법
→ 도커 정지
docker container stop $(docker container ls --filter "ancestor=example/echo" -q)
→ 호스트 포트 9000을 포트 8080에 연결하여 포트 포워딩
docker container run -d -p 9000:8080 example/echo:latest
→ GET 요청 보내기
curl http://localhost:9000/
- 포트 포워딩