ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DockerHub 사용하기
    Container 2016. 3. 21. 09:00
    반응형

    DockerHub 가입하기
    Docker HubDocker 이미지들을 등록하고 공유할 수 있는 서비스다. https://hub.docker.com/에서 계정, 비밀번호, 이메일 만 입력하면 간단하게 가입할 수 있다.

    가입을 하지 않더라도 공개된 docker 이미지를 검색하고 다운받아서 사용하는 것에는 문제가 없다. Dockerhub가 제공하는 저장소에는 공개/비공개 2가지가 있는데 공개 저장소는 사용 개수에 제한이 없이 무제한으로 사용할 수 있다. 비공개 저장소는 기본적으로 1개는 무료로 제공해 주지만, 그 이상의 비공개 저장소를 사용하기위해서는 비용을 지불해야한다. 결제 방식은 월결제방식이며https://registry.hub.docker.com/plans/에서 가격 정보를 확인할 수 있다.

     
     
    DockerHub에서 이미지 검색하기
    DockerHub를 사용하는 방법은 따로 있는 것이 아니라 docker 실행파일안에 포함되어 있다.
    search, pull, login, push 등의 하위 명령이 dockerhub와 관련되어 있는 명령들이다.
    docker search ubuntu 명령으로 ubuntu에 관련된 이미지를 찾아보면 다음과 같은 결과를 볼 수 있다.

     
    NAME 항목에는 이미지의 이름을 볼 수 있고, 이름에서 /로 구분되어 있는 것들은 개별 사용자들의 공개저장소에 있는 이미지임을 알려준다. DESCRIPTION에는 이미지에 대한 상세 설명을 볼 수 있다. STARS는 이미지가 사용자들로부터 몇개의 별을 받았는지 보여준다. OFFICIAL은 이 이미지가 공식 이미지인지를 보여주는데, 여기서는 Ubuntu, Ubuntu-upstart, Ubuntu-debootstrap등이 공식이미지란걸 알 수 있다. AUTOMATED는 이 이미지가 githubbitbucket같은 외부 소스 저장소에 있는 소스를 dockerhub에서 자동으로 빌드하고 업데이트한 것인지 여부를 보여준다.
     
     
    DockerHub 에서 이미지 다운받아 실행하기
    위에서 검색한 이미지를 다운받는건 간단하다. “docker pull 이미지이름을 이용하면 된다. 여기서는 “docker pull ubuntu” 이렇게 해서 ubuntu 이미지를 다운 받을 수 있다. 이미지를 가져올때 dockertag정보를 이용해서 가져오는데 tag 정보를 명시하지 않으면 최신 태그인 latest 태그를 가져온다. 이번에 받은 Ubuntu 이미지의 경우 특정 Ubuntu 버전을 다운받으려면 “docker pull Ubuntu:14.04”, “docker pull Ubuntu:15.04” 이런식으로 각각의 버전을 다운받을 수 있다. 이미지의 태그 정보는 docker 명령행에서는 확인할 수 없고 직접 dockerhub 웹사이트의 이미지 저장소에 가야 확인할 수 있다. ubuntu의 경우에는 다음과 같은 다양한 태그들을 가지고 있다.

     
     
    DockerHub에 이미지 등록하기
    자신이 만든 docker를 이미지를 dockerhub에 올릴수도 있다. 올려둔 이미지를 나중에 실제 서비스에서 사용할 서버에서 다운받아 사용할 수 있다. 우선 저장소를 하나 만들어 보자. docker hub에 로그인한 다음 “Create Repository” 버튼을 눌러서 저장소를 생성할 수 있다.

     
    이제 이 저장소에 올릴 이미지를 만들어 보자. 다음과 같은 간단한 Dockerfile을 만들어서 빌드하자.
    FROM ubuntu:14.04
    RUN ["/bin/bash", "-c", "echo", "Hello world"]
     
    빌드할때 태그명으로 방금 생성한 저장소를 입력해 주면 된다.
    docker build -t arisu1000/test  .
    이미지가 잘 생성된 걸 확인할 수 있다.

    이 이미지를 저장소에 업로드 하려면docker push arisu1000/test 명령을 통해서 업로드할 수 있다. dockerhub에서 확인해보면 방금 업로드한 이미지가 업로드 되어 있는걸 확인할 수 있다.

     
    이 이미지를 다운로드 받으려면 다른 이미지와 마찬가지로 docker pull을 통해서 다운받을 수 있다.
    docker rmi arisu1000/test 를 통해서 로컬 컴퓨터에 있는 이미지를 지운 다음에 docker pull arisu1000/test를 실행하면 방금 업로드했던 이미지가 로컬컴퓨터에 다운받아진걸 확인할 수 있다. 여기서 보면 이미지를 빌드할때 이미지의 태그에 arisu1000/test를 입력했을때 이 정보는 저장소 정보가 되고 실제 이미지의 태그는 lastest가 된걸 알 수 있다. 저장소 정보와 별개로 태그명을 실제로 입력하고 싶으면 arisu1000/test:v1 이런식으로 저장소 정보 뒤에 :v1등의 원하는 태그명을 붙이면 된다.
     
    자동빌드(Automated Build)
    간단하게 소스를 고칠때 조차도 매번 docker 이미지 빌드해서 올리는건 번거로운 작업이다. 그래서 dockerhub 설정을 통해서 소스에 변경이 있을 때 마다 docker 이미지를 자동으로 빌드할 수 있다. 많이 사용하는 Github과 연동해서 소스에 변경이 있을 때 마다 자동으로 빌드하는 방법을 알아보자.
    DockerHub에 로그인한 상태에서 Profile > Settings > Linked Accounts & Services를 선택한다.

     
    화면에 보면 GithubBitbucket 이 보인다. 여기서는 Github을 선택한다. Github을 선택해서 들어가면 “Public and Private”“Limited Access” 2개의 옵션이 있다. 이중 “Public and Private”를 선택한다. 선택하고 나면 화면이 Github으로 이동하면서 Authorize application 화면을 볼 수 있다. 여기서 “Authorize application” 버튼을 눌러서 DockerHub에서 이 Github 계정에 접근할 수 있게 한다. 인증하고 나면 DockerHubLinked Accounts & Services 화면에 이전과는 다르게 Github에 연동된 정보가 보이게 된다.

     
    이제 자동빌드 저장소(Automated build repository)를 만들어 보자. 자동빌드저장소는 github 코드 저장소와 연계되게 되고, docker push 명령어로 이미지를 저장할 수 없고, github 저장소에 코드를 커밋해야지만 dockerhub에 있는 docker 이미지를 변경할 수 있다.
    우선 github에 자동빌드용으로 사용할 저장소를 만들어 두자. 테스트 목적이니까 간단한 파이썬 플라스크 앱용 저장소를 만들어서 사용한다. 프로젝트 내용은 https://github.com/arisu1000/auto-buildgithub 저장소에서 확인할 수 있다.
     
    Dockerhub에서 Create -> Create Automated Build를 선택하자.
    화면에 선택가능한 Github 사용자와 조직이 나온다. 여기서 사용할 github 저장소를 선택한다. 그런 다음 이름을 지정해서 dockerhub 저장소를 생성한다. Dockerhub에 저장소가 생성된 다음에는 dockerhub에 연결되었다는 정보가 githubsettings -> “Webhooks & services”에 보이게 된다.

     
    Github 프로젝트를 조금 바꿔서 커밋한 다음 push를 해보자. Dockerhub에 이미지가 빌드된걸 볼 수 있다.
    자동빌드용 Dockerhub 저장소는 연결된 github 저장소에 있는 모든 브랜치(branch)에 대한 docker 이미지를 빌드한다. 이 때 github 저장소의 루트 디렉토리에 Dockerfile이 있어야 한다. 빌드를 할때 Docker이미지에는 각 브랜치 이름이 태그로 달리게 된다.
    생성된 docker 이미지 저장소에서 Build Settings 메뉴로 들어가면 자동빌드를 끌 수 있다. 빌드하고 싶은 브랜치나 태그를 선택할 수 있고, Dockerfile위치도 지정할 수 있다. 이 설정은 처음 자동빌드 저장소를 만들때도 선택할 수 있다. 여기서 Trigger 버튼을 누르면 직접 이미지를 빌드하게 된다.
    “Repository links”는 여기 설정된 주소의 이미지가 업데이트되면 현재 자동빌드 이미지를 다시 빌드하게 된다. 이 설정을 이용하면 자동빌드에서 사용중인 기본 이미지가 업데이트되었을때 자동으로 빌드를 수행해서 기본이미지를 최신상태로 유지할 수 있다. 여기 사용할 수 있는 저장소는 ubuntu같이 공식 저장소거나 공개 저장소 형식이어야 한다.
    “Build Triggers”는 원격에서 HTTPPOST 요청을 보내서 자동빌드를 실행할 수 있는 엔드포인트(endpoint)를 제공해 준다. “Activate Triggers” 버튼을 눌러보자.
    전에는 보이지 않던 “Trigger Token”“Trigger URL” 항목이 생긴걸 볼 수 있다.

     
    여기 있는 정보를 이용해서 dockerhub 웹 화면이 아닌 내 컴퓨터에서 빌드를 실행해보자. 아래처럼 간단한 curl 명령을 실행하면 된다.
     
    Trigger URLHTTPPOST를 보내는걸 알 수 있다. 명령을 실행한 다음에는 아무것도 없던 Last 10 Trigger Logs 내역에 새로운 트리거 로그가 생성된걸 확인할 수 있다.

     
     
    웹훅(webhook) 설정하기
    Docker 이미지 저장소에는 DockerHub 저장소에 이미지가 push되고 난 후에 지정된 URLHTTP POST 요청을 보내는 웹훅(webhook)을 설정할 수 있다. 자동빌드의 경우에는 이미지가 빌드된 후에 웹훅이 실행된다. 웹훅을 보낼때 JSON형식의 데이터를 함께 보낼 수 있다. 웹훅은 저장소의 webhook 메뉴에서 “Add Webhook” 메뉴를 선택해서 추가할 수 있다. Webhook Name에 이름을 정하고 Hook URL 에 호출할 URL을 입력하면 된다. Webhook Name에는 test webhook을 입력한다. URL에는 사용할 URL을 입력하면 되는데 이 URL로 데이터가 제대로 오는지 확인할 수 있어야 한다. 그런 용도의 간단한 웹페이지를 제공해주는 RequestBin(http://requestb.in/) 서비스를 이용하면 된다. RequestBin 웹사이트에 들어가서 “Create a RequestBin” 버튼을 누르면 간단하게 테스트용 URL을 만들 수 있다.

     

     
    Bin URL에 보면 호출할 수 있는 URL 주소가 있고, 친절하게 각 언어별로 어떻게 이 URL을 호출하는지에 대한 소스도 자세히 나와있다. Bin URL에 있는 주소를 DockerHub에 만들려 하는 웹훅의 URL에 입력하고 Create 버튼을 눌러서 테스트용 웹훅을 만들자.

    생성된 웹훅에서 test 버튼을 눌러서 웹훅을 보낸 다음에 아까 만들어 두었던 requestbin의 웹페이지를 새로고침 해보자. 그러면 아까와는 다른 내용이 보이면서 이URL로 어떤 요청이 들어왔는지 보이게 된다. RAW BODY 부분을 보면 DockerHub에서 이 URL로 어떤 JSON 데이터를 보냈는지 확인할 수 있다.

    JSON 데이터 형식에 있는 정보는 다음과 같다.
    {
      "push_data":{
        "pushed_at":1385141110,
        "images":[
          "imagehash1",
          "imagehash2",
          "imagehash3"
        ],
        "pusher":"username"
      },
      "repository":{
        "status":"Active",
        "description":"my docker repo that does cool things",
        "is_trusted":false,
        "full_description":"This is my full description",
        "owner":"username",
        "is_official":false,
        "is_private":false,
        "name":"reponame",
        "namespace":"username",
        "star_count":1,
        "comment_count":1,
        "date_created":1370174400,
        "dockerfile":"my full dockerfile is listed here",
        "repo_name":"username/reponame"
      }
    }

    JSON데이터에서 필요한 정보를 가져와서 원하는 동작을 할 수 있다.
     
    Add URL 버튼을 이용해서 URL을 여러개 입력할수도 있다. URL이 여러개 있을 경우에는 첫번째 URL에 대한 호출이 성공적으로 끝난후에 다음 URL을 호출하는 식으로 진행된다. 첫번째 URL에 대한 호출이 성공했는지에 대한 확인은 첫번째 URL 호출시에 들어온 JSON 데이터 중에 callback_url에 있는 URLJSON 데이터를 가진 HTTP POST 요청을 보내면 된다. callback_urlHTTP POST요청이 들어오면 dockerhub는 첫번째 URL에 대한 호출이 성공했다고 판단하고 웹훅에 등록된 다음 URL로 다시 요청을 보내게 된다.
    callback_url요청을 보낼때 사용할 JSON 데이터 형식은 다음과 같다.
    {
      state: success,
      description: 387 tests PASSED,
      context: Continuous integration by Acme CI,
    }

    변수
    설명
    state
    필수 입력. success, failure, error 등의 값을 입력할수 있다. success가 아니면 다음에 등록된 URL을 호출하지 않는다.
    description
    추가 정보를 입력한다. 최대 255자 까지 입력가능하다.
    context
    현재 컨텍스트를 표시한다. 최대 100자 까지 입력가능하다.
    target_url
    이 명령의 결과를 찾을 수 있는 URL.

     
     
    반응형

    'Container' 카테고리의 다른 글

    Docker onbuild 이미지 이용하기 : python  (0) 2016.03.25
    Docker 구조  (0) 2016.03.23
    Docker Toolbox  (0) 2016.03.18
    Docker Swarm  (0) 2016.03.16
    Docker Registry  (0) 2016.03.14

    댓글

Designed by Tistory.