ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커 (3)Dockerfile, tag, COPY, tag, push
    docker 2022. 1. 24. 17:38

    ============

    도커 이미지 생성

    만드는 방법은 두가지

     

    첫번째 Dockerfile로 생성(작성) : 도커 이미지를 만드는 방법을 포함한 텍스트 파일

     

    golang으로 된 프로그램을 내 컴퓨터에 런타임을 깔지 않고 도커를 이용해서 실행해볼 것임

     

    ============

    golang 프로그램 작성

     

    도커 폴더에서 code .

     : vscode 실행

     

    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)
    }
    }

    go언어 문법 :

    import : 모듈임포트

    main() : 시작점

    /로 요청들어오면 뒤의 함수가 실행돼라

    그 함수는 Hello Docker라는걸 응답으로 출력

     

    start server출력

    중간에 8080포트로 대기하도록 설정

    Serve() 서버실행

    중간에 오류가나면 그 오류를 출력

     

    8080포트로 웹 서비스를 제공하는 웹 어플리케이션

    /로 요청이 들어오면 Hello Docker!!를 출력

     

    원래 이걸 실행하려면 go를 깔고, go run main.go 를 명령어로 실행이 가능

     

    ============

    Dockerfile작성

    main.go 프로그램을 실행하는 도커이미지를 생성하는 Dockerfile 작성 : 도커파일 자체가 main.go를 실행하네

    FROM golang:1.9

    베이스 이미지를 지정하는게 FROM, 레지스트리에 없으면 도커허브에서 가져옴

    circle/golang : 저 앞에건 이미지를 만든사람의 계정명임

    golang : 안들어간건 official

    1.9 라고 붙은건 tag

    tag : 동일한 이미지를 구분하기 위한 것, 일반적으로 버전관리용으로 씀

    외부에 이미지가 있으면 그 이미지들을 유니크하게 구분하기 위한 방법

     

    이 이미지를 다른 외부에서 들어온 이미지하고 구분되기 위한건 앞에 붙는 계정명

    업로드할 때 다른계정이름 못 쓴다! 그래야 구분이 가능

     

    앞에 붙는 REPOSITORY : 다른사람과 구분

    뒤에붙는 tag : 버저닝

     

    RUN  mkdir /echo

    RUN은 이미지에서 실행할 명령어

    https://docs.docker.com/engine/reference/builder/#run

    이런거 많이 보면 훌륭한 사람이 됨

     

    COPY main.go /echo

    copy는 두가지 호스트->게스트, 게스트->호스트지금은 호스트의 main.do 파일을 게스트(컨테이너)의 /echo디렉토리 아래로 복사

     https://docs.docker.com/engine/reference/builder/#copy

    영어라서 어려우면 처음시작할 때 알려줬던 사이트

     

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

    컨테이너 생성 시 실행할 명령어

    이거 하라는 말임

     

    실행하려면 golang이 필요하다, 베이스 이미지가 golang실행환경을 담고 있는 컨테이너

    컨테이너 안쓰면 내 PC에 golang설치해야 되잖아

    ▽리눅스에 고랭 깔려있는건데 리눅스가 공짜라서 이게 되는건가

     

    도커 이미지 빌드 - docker image build

    -t해서 tag를 줄 수 있다, 이미지 이름을 줄 수가 있다

     

    지금 /echo/main.go 가 있는 상황

     

    docker image build -t example/echo:latest .

    도커파일기반으로 이미지를 만들어라, 그럼 그게 어딨는지 알려줘야지 그 알려주는게 마지막 .

    . 에 도커파일이 있는데, example/echo라는 latest이미지를 만들어라

     

    http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter13/02

     :

    docker build로 이미지를 생성할건데,

    도커허브에 이미지를 올리려면 이미지 이름을

    사용자계정/이미지이름:태그

    로 해야해, 내 계정 이름과 일치해야 이미지를 올릴 수 있어

    태그를 지정하지 않으면 latest가 됨

     

    또 다른 블로그에서 생성할 이름을 지정하는게 -t래

    echo라고 하는 이미지 이름 + latest라는 태그 로 만들어라

     

    example디렉토리가 아니고 REPOSITORY

    태그명이 아니고 이미지명

    옵션은 t지만 이미지명

     

    example/echo:latest

    전체가 이미지명인데

    example 레포지토리

    echo 이미지명

    latest버전을 구분할 수 있는 태그명

     

    본인이 만든 이미지를 구분하는 용도, echo라는 이미지를 여러개 만들 수가 있잖아 수정수정하다보니까, 이름은 동일하게 가져가고 싶을 때 구분하기 위해 만든것

     

    태그명을 지정하지않으면 latest가 붙는다, 이미지 버전관리를 위해 쓰임

    레포지토리의 이름은 이미지 저장소에서 다른사람의 이미지와 구분하는용도

    이름에 계정명을 넣는 것

    외부 저장소에 이미지 등록시에 반드시 본인 계정으로 설정이 필요, 그래야 푸시가 됨

     

    이미지 이름 echo에! 레포지토리와 태그가 결합돼서 유니크하게 된다

     

    ============

    우리가 적어놓은 순서대로 할일 함

    docker.io/library에서 가져오는것 : official하다

    로컬에 갖다놓고.. RUN하고 COPY하고..

    이미지의 해시값이 ID로 사용된다

     

    실행은

    docker run = Docker container run

    이 다음에 쓸 수 있는 옵션들 :  아무것도 안주면 아무것도 안된다

     

    -p는 포트바인딩

    C:\docker> docker container run -p 9090:8080 example/echo:latest

    호스트의 9090포트를 컨테이너의 8080포트로 매핑

    호스트의 9090쪽으로 뭔가 들어오면 컨테이너의 8080포트로 연결해주는 것

     

    그럼 나는 호스트의 9090으로 요청을 만듦

    localhost:9090

    만 쳐도 된다

    오!

     

    도커가 없으면 물론 나도 golang을 깔아야 하지만 만약 이걸 타인한테 실행시키게 하고 싶으면 걔도 golang을 깔아야되잖아

     

    이제 도커허브를 통해 이미지만 주면 돼

     

    =====

    도커허브에 업로드를 위해 태그 변경, 필요하다면 로그인을 해주기

    dock image tag --help

    docker image tag example/echo:latest

    이름을 바꿔야해 내 이름으로

     

    이걸

    C:\Users\myanj> docker push myanjini/echo:1.0

    (원래는 docker image push)

    잘보면 위에 두개만 푸시됨밑에는 이미 존재. 우리가 만든 이미지의 베이스인 것. 얘는 그 동네에 이미 있으니까 내가 만든 이미지에서 변경된 부분들만, 속도가 빠르다

     

    ====

    도커 허브로 부터 이미지를 가져와서 실행 

    C:\Users\myanj> docker container run -p 9999:8080 myanjini/echo:1.0

    하고 localhost:9999 하면

    ===

    깃허브에 코드올리면 그거 받는 사람 다 golang깔아야돼 -> 역으로 깃허브에 dockerfile만 올려놓으면 됨

Designed by Tistory.