-
도커 (3)Dockerfile, tag, COPY, tag, pushdocker 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만 올려놓으면 됨
'docker' 카테고리의 다른 글
도커 (5)포그백그, -itd, COMMAND&detach key, -p포트하나만주면 (0) 2022.01.25 도커 (4)run하면, detache, -it, logs, tag바꾸기, 일괄삭제, (0) 2022.01.25 도커 (2)명령어 attach, exec... (0) 2022.01.24 도커 (1)설치, 개념 (0) 2022.01.24 얄코 Docker (0) 2021.07.21