ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 오픈소스로 구성하는 데브옵스 시스템 - Docker 이미지 빌드 구성
    DevOps 2017. 11. 9. 00:34

    지금까지는 오픈소스로 데브옵스 솔루션 구성을 완료 하였습니다.

    이제 마지막으로 젠킨스에서 Docker 이미지를 만들고 Marathon에서 이를 실행해 보도록 하겠습니다.


    일단 gitlab에 project를 생성하고 index.html 파일을 commit 합니다.


    그리고 jenkins와 gitlab을 연동하기 위해 User Settings > Access Tokens에서 access token key를 생성 합니다.


    키 생성 버튼을 클릭하면 다음 화면에서 아래와 같은 키값이 나옵니다. 해당키를 잘 복사해 둡니다.


    이제 Jenkins 구성을 해봅니다. 환경설정의 gitlab 부분에 아래와 같이 등록합니다.


    Credentials의 Add 버튼을 눌러 위에서 만든 access token key를 등록 합니다.


    이제 빌드 Item을 만들고 구성에서 환경설정에서 등록한 gitlab connection을 지정합니다.


    소스 코드 관리 항목에는 gitlab의 Repository URL과 Branche를 선택합니다.

    gitlab의 connection을 이미 지정했기에 Credentials는 따로 지정하지 않아도 됩니다.


    여기까지 완료하면 gitlab의 소스코드를 checkout하고 빌드가 진행되는 것을 확인 가능 합니다.


    이제 Docker image를 빌드하고 그 이미지를 nexus에 업로드 해보겠습니다.

    그전에 docker 파일과 docker 이미지에 삽입하는 파일을 관리하기 위한 디렉터리를 하나 만듭니다.


    그리고 다음과 같은 Dockerfile을 만들어 줍니다.


    저는 간단하게 tomcat 이미지를 받아 제가 만든 index.html 파일을 해당 이미지에 삽입하여 tomcat을 실행하는 dockerfile을 만들었습니다.

    참고로 저희 회사에서는 maven 프로젝트로 war를 만들어서 docker 이미지에 삽입하여 배포를 하고 있습니다.

    Dockerfile을 만드는 방법에 대해서는 이후에 따로 설명을 갖도록 하겠습니다.


    Jenkins의 Build 구성을 시작합니다.

    Execute shell을 이용하여 index.html 파일을 위에서 만든 docker 디렉터리에 이동시켜 줍니다.


    이제 docker command를 이용해 image를 구성합니다.

    image명을 docker job name과 동일하게 했고, tag는 bulid number를 순차적으로 적용되게 했습니다.

    그리고 dockerfile에 argument로 사용할 설정을 해줍니다.


    docker 이미지 빌드가 되면 해당 이미지를 nexus로 push 할 수 있도록 command를 등록 합니다.

    한가지 주의할 점은 nexus로 push를 할 때, http v1으로 하기 위해 jenkins ci 서버에도 /etc/docker/daemon.json 파일을 생성 해주고 docker 서비스를 재시작 합니다.

    {

            "insecure-registries" : ["NEXUS_SERVER_IP:12000"]

    }


    Registry credentials에는 nexus 계정을 등록해 줍니다.


    빌드를 진행해 봅니다.

    아래와 같이 docker image 빌드 설정이 진행되는 것을 볼 수 있습니다.


    SUCCESS가 출력되고 Nexus를 확인해 보면 해당 이미지가 push 되어 있습니다.



    Push 된 이미지를 marathon에서 Pull 한 뒤 해당 이미지를 실행하는 설정을 진행해 보겠습니다.


    일단 Docker Slave 서버에 Nexus를 접속하기 위한 인증 설정을 합니다.

    아래와 같은 명령어를 실행합니다. 

    # docker login -u NEXUS_ID -p NEXUS_PASSWORD NEXUX_SERVER_IP:12000


    참고로 jenkins와 마찬가지로 nexus로 login, pull를 할 때도 http v1으로 하기 위해 Docker Slave 서버에 /etc/docker/daemon.json 파일을 생성 해주고 docker 서비스를 재시작 합니다.

    {

            "insecure-registries" : ["NEXUS_SERVER_IP:12000"]

    }


    위 명령어를 실행하면 해당 계정의 home 디렉터리에 .docker 디렉터리가 생성이 됩니다.


    해당 디렉터리가 있는 경로로 이동해서 압축 파일을 생생해 줍니다.

    # sudo tar czf docker-auth.tar.gz .docker


    그리고 marathon의 URIs에 해당 압축파일이 있는 경로를 아래와 같이 등록해 줍니다.


    모든 설정이 완료되면 실행 버튼을 눌러 배포를 진행합니다.

    혹시 marathon 배포에서도 nexus https 관련 에러가 발생한다면, /etc/docker/daemon.json 파일을 생성하고 docker 서비스를 재시작 합니다.

    {

            "insecure-registries" : ["NEXUS_SERVER_IP:12000"]

    }


    배포가 완료되고 Running 상태가 되는지 확인 합니다.


    container의 ip:port 정보(스크린샷의 192.168.219.193:31237)를 클릭하면 제가 만들었던 index.html 내용을 확인할 수 있습니다.

    이제 우리는 간단한 무중단 배포 시스템 구축을 모두 완료 하였습니다.

    Tomcat WAS를 예로 글을 작성하였지만 무중단 병렬 시스템을 요구하는 다른 어플리케이션에도 활용이 될 수 있을꺼라 생각이 됩니다.


    그동안 수고 많으셨습니다. 꾸벅....

Designed by Tistory.