Dockerfile을 이용하여 웹서버를 실행하는 컨테이너를 예시로 활용하겠습니다.
아래 파일을 참고하여 파일을 생성해주시기 바랍니다.
Dockerfile 소스코드
#Dockerfile FROM golang:1.9 RUN mkdir /echo COPY main.go /echo CMD [ "go", "run", "/echo/main.go" ]
main.go 소스코드
#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 2 !!") }) log.Println("start server") server := &http.Server{Addr: ":8080"} if err := server.ListenAndServe(); err != nil { log.Println(err) } }
Dockerfile로 이미지를 빌드합니다.
docker image build -t web:1.0 .
container를 run하게 되면 실행상태가 되는데, 실행모드는 attach
detach
두 가지가 있습니다. 각 모드에 대해서 간단히 설명하자면 아래 내용과 같습니다. 설명으로는 이해하기 어려울 수 있으니 실습을 함께 진행해보겠습니다.
docker container 실행모드
attach 모드: 실행되고 있는 container에 연결되어 콘솔에서 다른 작업이 불가능함, attach모드로 실행 후 빠져나올 시 container가 종료됨
detach모드: container를 background로 실행, exec 명령어를 통해 컨테이너에 연결 가능함
먼저 attach모드로 container를 실행해보겠습니다.
docker container run -p 8888:8080 web:1.0
웹서버가 실행되고, container를 실행한 콘솔(cmd.exe)에 main.go에서 지정해놓은 문구가 출력됩니다.
그러나 사용자가 입력을 할 수는 없고 출력만 볼 수 있으며 컨테이너가 종료되기 전까지는 콘솔 제어권을 가질 수 없습니다.
그러므로 다른 콘솔창을 열어 container를 중지해야만 콘솔 제어권을 다시 부여받을 수 있습니다.
docker container stop [container id]
그렇다면! attach 모드에서도 사용자 입출력을 연결할 수 있는 방법은 없을까요?
바로 -it옵션을 통해 가능합니다.
-it옵션이 무엇인지는 docker container run --help
명령어를 통해 출력되는 설명을 통해 알아보겠습니다.
-i, --interactive Keep STDIN open even if not attached,
표준 입력이 활성화되어 입력이 가능함
-t, --tty Allocate a pseudo-TTY
tty 모드가 활성화 되어 container에 연결이 가능함
첫번째로 실행했던 container와는 다르게 ctrl+c
를 입력하여 container를 중지할 수 있습니다.
attach모드로 실행한 뒤, ctrl+p+q
를 입력하여 detach모드로 변경도 가능합니다.
콘솔 제어권이 다시 부여되었지만 여전히 container는 up
즉, 실행되는 상태입니다.
container를 background로 실행할 수 있는 -d 옵션을 사용하여 detach모드로 실행해보겠습니다.
background로 container가 계속 실행중이며, 웹서버도 잘 작동하는 것을 볼 수 있습니다.
웹서버 같은 경우 지속적으로 구동되는 서비스이여야 하므로, 실무에서는 주로 -d 옵션을 사용합니다.