관리 메뉴

don't stop believing

docker 사용해 개발 환경 구축하기 (kitura init) 본문

Swift/Kitura

docker 사용해 개발 환경 구축하기 (kitura init)

Tongchun 2018. 3. 14. 15:54

Kitura도 1년 사이 많이 변경되었습니다. 추가된 라이브러리나 지원 도구들도 늘었습니다.

docker를 사용해 Mac에 개발 환경을 구성하고 Ubuntu에 배포해 보겠습니다.


우선 Mac에 docker가 설치되어 있어야 합니다.

http://dejavuqa.tistory.com/195


설치가 되었다면 docker 정보를 확인해 보겠습니다.

$ docker version
Client:
 Version:	17.12.0-ce
 API version:	1.35
 Go version:	go1.9.2
 Git commit:	c97c6d6
 Built:	Wed Dec 27 20:03:51 2017
 OS/Arch:	darwin/amd64

Server:
 Engine:
  Version:	17.12.0-ce
  API version:	1.35 (minimum version 1.12)
  Go version:	go1.9.2
  Git commit:	c97c6d6
  Built:	Wed Dec 27 20:12:29 2017
  OS/Arch:	linux/amd64
  Experimental:	true

IBM-Swift에서 배포한 swift-ubuntu-docker 이미지가 있으나 우리는 swift에서 공식 배포한 이미지를 사용해 보겠습니다.

https://hub.docker.com/_/swift/


swift docker 이미지를 다운받습니다.

$ docker pull swift

docker 이미지가 잘 다운되었는지 확인해 봅니다.

$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
swift                 latest              934835f58041        2 weeks ago         1.3GB
ubuntu                16.04               f975c5035748        2 weeks ago         112MB
ubuntu                latest              f975c5035748        2 weeks ago         112MB
ibmcom/swift-ubuntu   4.0.3               41829ee5a097        2 weeks ago         1.37GB
swiftdocker/swift     latest              466addff05d1        2 months ago        1.3GB

REPOSITORY 항목에 swift가 있네요. 그 외에도 저는 여러개의 이미지가 다운로드 되어있습니다.


이제 docker 이미지로 컨테이너를 만들기 전에 kitura를 개발할 폴더를 지정합니다. 저는 아래처럼 Test_Kitura/nGleServer01이라고 만들었습니다.

/Users/tongchunkim/Documents/Test_Kitura/nGleServer01

해당 경로를 컨테이너에 연결할겁니다.


컨테이너를 실행 할 때 아래와 같이 몇가지 옵션을 추가합니다.

-it: docker 터미널 입력을 위한 옵션으로 -i와 -t를 함께 사용한 것입니다.

-p: Mac의 port와 docker의 포트를 연결해 줍니다. (포워딩)

-v: Mac의 디렉토리와 docker의 디렉토리를 연결해 줍니다. (마운트)

--name: 컨테이너의 이름을 지정합니다.

위 옵션으로 swift:latest 이미지를 실행합니다.

docker run -it -p 8080:8080 -v /Users/tongchunkim/Documents/Test_Kitura/nGleServer01:/nGleServer01 --name nGleServer01 swift:latest /bin/bash

정상적으로 실행이 되었다면 docker는 swift:latest 이미지로 nGleServer01이라는 이름으로 컨테이너를 생성했습니다.

Mac의 8080 포트와 컨테이너의 8080 포트는 연동되어 있으며, Mac의 /Users/tongchunkim/Documents/Test_Kitura/nGleServer01 폴더는 컨테이너의 /nGleServer01와 연동되어 있습니다.

docker run 마지막에 /bin/bash를 넣어 컨테이너의 프롬프트로 연결하게 됩니다.


컨테이너 안의 swift 버전을 확인해 봅시다.

root@8390d507a4cd:/# swift -version
Swift version 4.0.3 (swift-4.0.3-RELEASE)
Target: x86_64-unknown-linux-gnu

swift 4.0.3 버전이 설치되어 있습니다.

Ubuntu 버전도 확인해 봅시다.

root@8390d507a4cd:/# lsb_release -a
bash: lsb_release: command not found

lsb_release 가 설치가 안되어 있네요. apt-get을 업데이트하고 lsb_release를 설치해 줍니다.

root@8390d507a4cd:/# apt-get update
root@8390d507a4cd:/# apt-get install lsb-release

설치가 되었다면 Ubuntu 버전을 확인해 줍니다.

root@8390d507a4cd:/# lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.4 LTS
Release:	16.04
Codename:	xenial

Ubuntu 16.0.4 버전입니다.

ls -al 또는 ll 명령으로 디렉토리를 확인하면 최상위에 /nGleServer01 폴더가 보일것입니다.


이제 Kitura를 이용한 Swift 서버를 만들기 위한 Package들을 설치해 줍니다.

root@8390d507a4cd:/# apt-get update
root@8390d507a4cd:/# apt-get install clang libicu-dev libcurl4-openssl-dev libssl-dev

정상적으로 설치되어 있는지 apt list --installed 명령으로 설치된 리스트를 확인할 수 있습니다.


javascript package manager인 npm도 설치해 줍니다. npm 설치를 위해서 tmp 폴더를 이동합니다.

root@8390d507a4cd:/# cd tmp root@8390d507a4cd:/tmp# curl -sL https://deb.nodesource.com/setup_8.x -o nodesource_setup.sh root@8390d507a4cd:/tmp# bash nodesource_setup.sh root@8390d507a4cd:/tmp# apt-get install nodejs

설치되었다면 npm의 버전을 확인합니다.

root@8390d507a4cd:/tmp# npm -version
5.6.0

npm으로 yo를 설치 합니다. yo에 대한 설명을 아래 링크에서 확인하세요.

[https://github.com/yeoman/yo]

root@8390d507a4cd:/tmp# npm install -g yo

npm을 이용해 generator-swiftserver도 설치해 줍니다.

root@8390d507a4cd:/tmp# npm install -g generator-swiftserver


이제 Mac에서 구성해 줄 차례입니다.


먼저 Mac에서도 npm으로 yo와 generator-swiftserver를 설치해 줍니다.

$ npm install -g yo
$ npm install -g generator-swiftserver

brew tap으로 Kitura package repository로 연결합니다.

$ brew tap ibm-swift/kitura

그리고 brew로 kitura를 설치합니다.

$ brew install kitura

이제 kitura 프로젝트를 만들 차례입니다. docker 컨테이너와 연결한(마운트) 디렉토리로 이동해 kitura 를 초기화 합니다.

$ cd ~/Documents/Test_Kitura/nGleServer01/
$ kitura init

kitura init을 실행하면 kitura 실행에 필요한 package가 설치됩니다.

xcodeproj까지 생성되어 있습니다. nGleServer01.xcodeproj를 열어 봅시다.

$ open nGleServer01.xcodeproj/

xcode가 실행되면서 기본 package가 모두 구성되어 있는것을 확인할 수 있습니다.

xcode의 build scheme을 프로젝트인 nGleServer01로 변경합니다.

이제 실행하고 브라우저에서 확인해 봅시다.

Command + R 을 누르거나 실행 버튼을 클릭합니다.

빌드 했을 때 위 메시지 처럼 Error가 보인데면 8080 포트가 충돌이 난 것입니다. 

docker 컨테이너를 실행할 때 8080으로 실행했고 xcode에서 빌드 후 실행할 때 kitura 기본 포트인 8080으로 실행하려고 해서 충돌이 발생한 것입니다.

docker 컨테이너에서 exit로 컨테이너를 중지하고 다시 빌드하면 아래와 같이 정상적으로 서버가 실행이 됩니다.

SwiftMetrics: Error finding .build directory

SwiftMetrics: Error finding directory containing source code in

위 두 에러에 대해서는 좀 찾아봐게 겠네요. 


이제 브라우저를 열고 localhost:8080으로 접속해 봅니다. kitura의 기본 port는 8080 입니다.

kitura 페이지가 보이네요.

port를 10260으로 변경하고 get method도 하나 추가해 봅시다.

다시 xcode로 와서 nGleServer01 프로젝트의 Source/Application/Application.swift 파일로 이동합니다.

postInit() 함수 안에 아래와 같이 get method를 추가합니다.

func postInit() throws {
    // Endpoints
    initializeHealthRoutes(app: self)

    router.get("/") { request, response, next in
        response.send("Hello, Tongchun!")
        next()
    }
}

그리고 바로 밑에 run() 함수에서 아래와 같이 포트를 10260으로 변경합니다.

public func run() throws {
    try postInit()
    Kitura.addHTTPServer(onPort: 10260, with: router)
    Kitura.run()
}

다시 실행하고 브라우저에서 localhost:10260을 연결합니다.

kitura 페이지가 아닌 Hello Tongchun!이 보이는지 확인합니다.


자.. 일단 여기까지 하고... 여기서 부터는 docker를 봅시다.


xcode에서 실행을 종료하거나, xcode를 종료해 봅시다. 그리고 terminal에서 docker 컨테이너를 살펴 봅시다.

docker 컨테이너를 확인하는 명령은 docker ps -a 입니다.

$ docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                     PORTS                      NAMES
527ed6bfbd28        swift:latest                "/bin/bash"              26 minutes ago      Exited (0) 31 seconds ago                             nGleServer01
80570e58b9f4        swift:latest                "/bin/bash"              46 hours ago        Exited (0) 45 hours ago                               swift01
d5347cad3f94        swiftdocker/swift:latest    "/bin/bash"              7 days ago          Exited (0) 7 days ago                                 swiftfun
0992cd10635f        ubuntu:16.04                "/bin/bash"              8 days ago          Exited (255) 7 days ago                               nervous_bhaskara
d5fdc08eeb99        ubuntu                      "/bin/bash"              8 days ago          Exited (0) 8 days ago                                 pedantic_meitner
dec67aa13a15        ibmcom/swift-ubuntu:4.0.3   "/bin/sh -c /bin/bash"   8 days ago          Exited (255) 7 days ago    0.0.0.0:10260->10260/tcp   macaron

방금 swift:latest 이미지로 만든 nGleServer01이라는 docker 컨테이너가 제일 위에 보입니다.

nGleServer01 컨테이너를 실행하고 접속해 봅니다. 컨테이너를 실행하는 명령은 docker start <컨테이너 이름> 입니다. 컨테이너 실행과 함께 접속하는 옵션은 -a 입니다.

$ docker start -a nGleServer01

컨테이너 안에 있는 /nGleServer01 폴더로 이동해서 swift build를 해줍니다.

root@527ed6bfbd28:/nGleServer01# cd nGleServer01/
root@527ed6bfbd28:/nGleServer01# swift build

빌드가 정상적으로 실행되었다면 마지막 라인에 빌드 경로가 나옵니다.

Linking ./.build/x86_64-unknown-linux/debug/nGleServer01


swift build 처럼 옵션없이 빌드하면 debug 모드로 빌드가 됩니다. 릴리즈 모드로 빌드하고 실행해 보겠습니다.

root@527ed6bfbd28:/nGleServer01# swift build -c release
root@527ed6bfbd28:/nGleServer01# ./.build/x86_64-unknown-linux/release/nGleServer01
[2018-03-23T06:07:22.801Z] [WARNING] [ConfigurationManager.swift:261 load(url:deserializerName:)] Unable to load data from URL /nGleServer01/config/mappings.json
2018-03-23 06:07:22.803 nGleServer01[605:e07c6800] CFPropertyListCreateFromXMLData(): Old-style plist parser: missing semicolon in dictionary on line 1. Parsing will be abandoned. Break on _CFPropertyListMissingSemicolon to debug.
[Fri Mar 23 06:07:22 2018] com.ibm.diagnostics.healthcenter.loader INFO: Swift Application Metrics
[2018-03-23T06:07:22.897Z] [INFO] [Metrics.swift:20 initializeMetrics(router:)] Initialized metrics.
[2018-03-23T06:07:22.899Z] [INFO] [HTTPServer.swift:124 listen(on:)] Listening on port 10260

Kitura 라이브러리로 만든 swift 서버가 10260 포트로 실행되었습니다.

이제 브라우저에서 동일하게 localhost:10260으로 접속해 보겠습니다.

처음 docker 컨테이너를 만들때 포트 옵션을 8080으로 줬기 때문에 10260이란 포트는 컨테이너가 인식하지 못하고 있습니다.

이제 컨테이너에서 이미지로 만들고 다시 포트 옵션을 10260으로 만들어 컨테이너를 실행해 보겠습니다.

실행하고 있는 컨테이너에서 exit을 치고 중지합니다. Mac 프롬프트로 나온 다음 아래와 같이 nGleServer01 컨테이너로 이미지를 만듭니다.

$ docker commit nGleServer01 ngleserver01:0.0.1
sha256:db397d07ac76a046df0897eedc0d360b00a1bb2765797f5407fcf42caef14036

docker 이미지 이름은 소문자여야 합니다. 그래서 ngleserver01입니다. 콜론(:) 다음은 tag 입니다. 보통 버전명을 사용합니다.

이미지가 잘 만들어 졌는지 docker 이미지를 확인해 봅니다.

$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ngleserver01 0.0.1 db397d07ac76 About a minute ago 1.54GB swift latest 934835f58041 2 weeks ago 1.3GB ubuntu 16.04 f975c5035748 2 weeks ago 112MB ubuntu latest f975c5035748 2 weeks ago 112MB ibmcom/swift-ubuntu 4.0.3 41829ee5a097 2 weeks ago 1.37GB swiftdocker/swift latest 466addff05d1 2 months ago 1.3GB

ngleserver01에 0.0.1로 잘 만들어 졌습니다.

이제 ngleserver01 이미지로 새롭게 컨테이너를 만들어 봅니다.

$ docker run -it -p 10260:10260 -v /Users/tongchunkim/Documents/Test_Kitura/nGleServer01:/nGleServer01 --name nGleServer01-1 ngleserver01:0.0.1 /bin/bash

포트 옵션에서 mac의 10260과 컨테이너의 10260 포트를 매칭시켰습니다. 그리고 폴더는 mac의 /Users/tongchunkim/Documents/Test_Kitura/nGleServer01 폴더와 컨테이너의 /nGleServer01 폴더를매칭했습니다. 컨테이너의 이름은 nGleServer01-1으로 했구요. ngleserver01 이미지의 0.0.1 태그인 것으로 컨테이너를 만들었습니다.


새로 실행된 컨테이너에서 /nGleServer01 폴더로 이동해서 다시 swift build를 해줘보겠습니다.

root@a2389a634a28:/# cd /nGleServer01
root@a2389a634a28:/nGleServer01# swift build
root@a2389a634a28:/nGleServer01# ./.build/x86_64-unknown-linux/debug/nGleServer01
[2018-03-23T07:16:09.926Z] [WARNING] [ConfigurationManager.swift:261 load(url:deserializerName:)] Unable to load data from URL /nGleServer01/config/mappings.json
2018-03-23 07:16:09.927 nGleServer01[253:c0bc6800] CFPropertyListCreateFromXMLData(): Old-style plist parser: missing semicolon in dictionary on line 1. Parsing will be abandoned. Break on _CFPropertyListMissingSemicolon to debug.
[Fri Mar 23 07:16:09 2018] com.ibm.diagnostics.healthcenter.loader INFO: Swift Application Metrics
[2018-03-23T07:16:10.028Z] [INFO] [Metrics.swift:20 initializeMetrics(router:)] Initialized metrics.
[2018-03-23T07:16:10.031Z] [INFO] [HTTPServer.swift:124 listen(on:)] Listening on port 10260

빌드가 정상적으로 되었다면 빌드를 실행합니다.

root@a2389a634a28:/nGleServer01# ./.build/x86_64-unknown-linux/debug/nGleServer01
[2018-03-23T07:16:09.926Z] [WARNING] [ConfigurationManager.swift:261 load(url:deserializerName:)] Unable to load data from URL /nGleServer01/config/mappings.json
2018-03-23 07:16:09.927 nGleServer01[253:c0bc6800] CFPropertyListCreateFromXMLData(): Old-style plist parser: missing semicolon in dictionary on line 1. Parsing will be abandoned. Break on _CFPropertyListMissingSemicolon to debug.
[Fri Mar 23 07:16:09 2018] com.ibm.diagnostics.healthcenter.loader INFO: Swift Application Metrics
[2018-03-23T07:16:10.028Z] [INFO] [Metrics.swift:20 initializeMetrics(router:)] Initialized metrics.
[2018-03-23T07:16:10.031Z] [INFO] [HTTPServer.swift:124 listen(on:)] Listening on port 10260

10260 포트로 잘 실행이 되었습니다. 이제 다시 브라우저에서 localhost:10260으로 접속해 보겠습니다.

localhost 즉 Mac의 10260 포트를 호출하면 컨터이너의 10260과 매칭되어 컨테이너안에 있는 swift 서버로 접속되게 됩니다.

이제 Mac에서 xcode를 이용해 swift로 개발하고 바로 로컬 PC(Mac)에서 Ubuntu환경(docker)를 이용해 확인하는 개발 환경을 만들었습니다.




0 Comments
댓글쓰기 폼