레이블이 docker인 게시물을 표시합니다. 모든 게시물 표시
레이블이 docker인 게시물을 표시합니다. 모든 게시물 표시

2021년 1월 20일 수요일

OpenSTF 를 mac os 의 docker 에서 실행해서 Android 단말테스트 과정을 좀더 쉽게 하자

 Android단말 테스트할때 기종별로 OS버젼별로 손에 들고 하는게 귀찮을때 다른 큰회사들은 어케하나 고민해보았다. 물론 에뮬에서도 버젼별 기종별 해보는 것이 가능하지만 앱테스트시에는 실기기에서 하는것을 기본으로 해야 되서...

다행히 Smartphone Test Farm 이라는 솔류션이 있어서 usb로 실기기를 연결하면 웹인터페이스로 여러개의 연결된 기기를 마우스를 이용하여 테스트할수 있다.

실기기라 여러군데서 접속해도 같은 화면을 보게되지만(ㅎㅎ 뭐..동작확인할때 오히려 다같이 보여줘서 좋을지도), 일단 웹브라우져에서 해볼수 있다는게 매력이다.


일단 구축은 openSTF, rethinkdb,adb연동등 아주 빡세 보이는데, 다행히 일본사람이 docker-compose파일로 잘 세팅되도록 해놓은게 있어서 그걸 사용하면 10분? 만에 구축이 된다.

docker라는게 없었다면 ,1주-1달 고생하다가 그냥 포기했을텐데 ㅋ 세상좋아.

일본사람이 정리한거:https://qiita.com/KazaKago/items/26db0f68ba224eb094d3

내가 해본 docker-compose.yml ( 뭐 바꾼거 없다)

sion: '2'

services:

  db:

    image: rethinkdb

    command: rethinkdb --bind all

    ports:

      - 8082:8080

    volumes:

      - db_data:/data

  stf:

    image: openstf/stf

    ports:

      - 7100:7100

      - 7110:7110

      - 7400-7700:7400-7700

    links:

      - db

    environment:

      - RETHINKDB_PORT_28015_TCP=tcp://db:28015

      - RETHINKDB_ENV_DATABASE=stf

    command: stf local --allow-remote --public-ip 당신의아이피 --adb-host docker.for.mac.localhost

volumes:

  db_data:


당신의아이피는 본인 아이피로 바꿈.

docker-compose up 하면 저기 yml 파일을 읽어서 자동으로 기동한다.

웹브라우져에서 http://당신의아이피:7100 접속하면 똭. 좋아! 

마우스자동화매크로 프로그램등을 이용하면 자동화도 가능하지 않을까 생각이...



*** android 10 을 지원하기 위해서는 openstf/stf 을    devicefarmer/stf 로 바꾸어 주자.


volumes:

version: "3"


services:

  rethinkdb:

    container_name: rethinkdb

    image: rethinkdb:2.3

    restart: unless-stopped

    volumes:

        - "rethinkdb-data:/data"

    command: "rethinkdb --bind all --cache-size 2048"


  adb:

    container_name: adb

    image: devicefarmer/adb:latest

    restart: unless-stopped

    volumes:

      - "/dev/bus/usb:/dev/bus/usb"

    privileged: true


  stf:

    container_name: stf

    image: devicefarmer/stf

    ports:

      - "7100:7100"

      - "7110:7110"

      - "7400-7500:7400-7500"

    environment:

      - TZ='America/Los_Angeles'

      - RETHINKDB_PORT_28015_TCP=tcp://rethinkdb:28015

      - STF_ADMIN_EMAIL=<YOUR_EMAIL>

      - STF_ADMIN_NAME=<YOUR_NAME>

    restart: unless-stopped

    command: stf local --adb-host adb --public-ip 너의아이피 --provider-min-port 7400 --provider-max-port 7500


volumes:

  rethinkdb-data: {}

2021년 1월 12일 화요일

Jenkins in Docker, Fastlane 을 젠킨스 노드를 통해 IOS빌드하기

 앞서 간단히 Fastlane을 통해 ipa 파일을 클릭한번으로 생성하는 것을 해봤다. 
https://yunhos.blogspot.com/2021/01/ios-fastlane-ipa.html

이걸 젠킨스로 하고 싶은데, ubuntu linux기반이라  Xcode에서만 컴파일&인증이 가능하다.

물론 젠킨스를 맥에 설치하고 

https://stackoverflow.com/questions/32347839/building-an-ios-app-with-jenkins

xcrun xcodebuild -project ProjectName.xcodeproj \ -configuration Release \ -destination 'platform=iOS Simulator,name=iPhone 6s' \ -allowProvisioningUpdates \ CODE_SIGN_STYLE='Automatic' PROVISIONING_PROFILE_SPECIFIER=${PROVISIONING_PROFILE} CODE_SIGN_IDENTITY=${CODE_SIGNING_IDENTITY}

이딴 명령어를 빌드 shell 에 입력하면 된다. ( fastlane 도 되겠네.)

참고 자료

趣味でつくるiOSアプリこそJenkinsでリリースを自動化 https://qiita.com/makoto_kw/items/b23350aed11ea87cd92b


-------------------------------------------------------

그런데 ios 개발자들이 모두 젠킨스 설치해서 빌드하면 특정 개발자가 없는때는 어케 빌드하나? 

그리고 웬만하면 도커에 설치된 젠킨스에서 실행하고 싶었다.

검색해본 결과

딱맞는 강좌를 올린사람이 있었다.

CI/CD With Jenkins, Docker and Fastlane

https://medium.com/multinetinventiv/ci-cd-with-jenkins-docker-and-fastlane-p1-primer-6bfc28267381

요는 도커에 젠킨스를 올리고, 거기서는 ios 앱빌드가 안되니까 젠킨스의 멀티작업용 하위노드로 로컬피씨를 등록하고, 거기서 Fastlane을 돌려서 ios 을 성공적으로 빌드한다.

이런 시나리오다. 도커,젠킨스,fastlane,ios 코드사인 등이 설정이 쉽다면 오죽좋겠냐만은 징그러운 ios 빌드관련이라 역시 어렵다.


일단 저사람 강좌를 따라서 

1. 현재 IOS을 fastlane 으로 빌드 되도록 구성한다.

2. Docker + Jenkins 를 설치한다.

3. 맥에서 System preference -> Sharing 으로 가서 [Remote Loin] 을 체크하고 

[To log in to this computer remotely, type “ssh yourName@xxx.xxx.xxx.xxx”.]

을 확인한다. 즉 내부내트워크에서는 yourname사용자 이름으로 이 컴에 접속하도록한다. 

이걸 도커의 젠킨스에서 접속할때 사용할거다.

4. 젠킨스를 실행해서 Manage Jenkins - > Manage Node And Clouds 로 가서 [New Node]를 선택해서 맥을 노드로서 추가해야한다.

일단 처음에는 Node Name 입력 과 Permanent Agent만 선택하고 생성한다.

5. 다시 노드목록을 보면 젠킨스자신(master)와 아까 만든 노드이름이 있는데 새로만든 노드를 클릭해서 정보를 넣자. 노드 화면 왼쪽의 Configure를 선택하자. 

# of excutors 는 1

 Remote root directory 는 자신의맥에 적당한 폴더를 만들고 지정하자 /User/yourname/temp

Launch method 는 노드에 접속할 방법인데, 아까 ssh 로 도커컨테이너에서 내맥에 접속할수 있도록 share 해주었으니 그 정보를 넣자.

Launch agents via SSH 선택
만일 이게 없다면 SSH Build Agent Plugin 을 설치해야한다

Host 는 맥아이피(192.168.0.100등)

Credentials 는 Add에서 Username with password 타입으로 하되, 

   Username 은 아까 share 에서 표시된 사용자이름

  password 는 맥로그인시의 암호와 같음

으로 저장하고. 창이 닫히면 생성한 Credentials (이번에는 yourname/***)을 선택하자.

나머진 그냥두자. 

Relaunch 클릭해서 접속해보자.

6.위에서 다 입력했다면 젠킨스가 노드에 접속시도를 할것이다. 잘되었다면 접속시도 맨 마지막 줄에 Evacuated stdout

Agent successfully connected and online 

 가 나온다. 그리고 다시 nodes 목록으로 가면 해당 노드에 디스크정보등이 잘 표시된다.

만일 접속이 안된다면 

젠킨스컨테이너에 쉘접속해서 ssh yourname@xxx.xxx.xxx.xxx 로 맥으로 원겹접속한다음 yes해서 known_hosts 에 맥을 추가한다. 잘안될떄는 /root/.ssh/known_hosts 를 /var/jenkins/.ssh/known_hosts 로 755 권한으로 바꾸어서 복사해본다. 또는 그냥 접속만 해봐도 노드가 맥에 잘접속되는경우가 있다.

7.master  노드를 선택해서. configure 에서 # of excutors 는 0 으로 하자. 

 젠킨스환경설정 설명은 여기에 

https://www.lesstif.com/continuous-integration/%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-31850999.html

8. 도커컨테이너를 실행중인 젠킨스에서 맥으로 원격접속해서 뭔가하도록 하는 설정은 끝났다.

9.젠킨스잡을 생성해야 한다. New Item -> Multibranch Pipeline을 선택해서 생성하자.

10. 새로운 아이템을 생성하면, 설정화면으로 가는데,

Build Configuration -> Script Path 를 Jenkinsfile 로 입력해서 git에서 체크아웃한 파일등중에 해당 파일이 있으면 젠킨스가 해당파일의 내용을 실행하도록 하자.

Github도 설정하자. Credentials 에 github 설정시에 password가 자신이 알고 있는 비번으로 접속이 안된다고 할때가 있는데, 이럴때는 github.com -> developer setting -> personal access token 에서 토큰을 생성하고 암호입력란에 넣으면 된다.

11 . Scan Multibranch Pipeline Triggers 에

Periodically if not other wise run 체크하고 15분 인터벌준다.

Orphaned Item Strategy에

Discard old items 를 체크하고 max #...를 50으로 한다.

12. 이제 잡은 준비되었다. 아까 설정시에 Jenkinsfile 이 있으면 그안의 내용을 실행한다고 했으니 해당 파일을 체크아웃할 git 에 만들어서 푸시해놓자.

Jenkinsfile 은 구루비 언어로 만든다.

#!groovy


def lastCommitInfo = ""

def skippingText = ""

def commitContainsSkip = 0

def slackMessage = ""

def shouldBuild = false


def pollSpec = ""


if(env.BRANCH_NAME == "master") {

    pollSpec = "*/5 * * * *"

} else if(env.BRANCH_NAME == "test") {

    pollSpec = "* * * * 1-5"

}


pipeline {

    agent any


    triggers {

        pollSCM ignorePostCommitHooks: true, scmpoll_spec: pollSpec

    }


    stages {

        stage('Init') {

            steps {

                script {

                    lastCommitInfo = sh(script: "git log -1", returnStdout: true).trim()

                    commitContainsSkip = sh(script: "git log -1 | grep '.*\\[skip ci\\].*'", returnStatus: true)


                    if(commitContainsSkip == 0) {

                        skippingText = "Skipping commit."

                        env.shouldBuild = false

                        currentBuild.result = "NOT_BUILT"

                    }


                }

            }

        }


        stage('Build application for beta') {

            steps {

                sh "ls"

                sh "/Users/yourname/temp/unlockme.sh"

                sh "/usr/local/bin/fastlane make_debug_ipa"

            }

        }





    }


}


13. 이제 Build Now 를 해보면 git 에서 체크아웃 한다음 Node설정에서 지정한 로컬맥폴더로 복사를 하고 Jenkinsfile에 있는 내용을 실행한다.

여기서 문제가 좀 있던게,  앱을 생성할때 사용하는 Codesign은 ssh를 통해서는 할수없도록 되어있기 때문에, 젠킨스에서 codesign전에 로컬에서 사용자암호를 묻는 과정을 생략해야한다.

그게 바로  

                sh "/Users/yourname/temp/unlockme.sh"
파일내용은 

#/bin/bash


security default-keychain -s '/Users/yourname/Library/Keychains/login.keychain'

security -v unlock-keychain -p "maybe MAC yourPass" "/Users/yourname/Library/Keychains/login.keychain" 

14. 자 이제 돌려보면 node설정에서 지정했던 폴더 하위에 myapp.ipa 파일이 똭(또는 fastlane에서 서버로 보냈거나..등등) 이 생긴다. 그걸로 테스트 팀에 주면된다.

 

2021년 1월 10일 일요일

Jenkins in Docker, 로컬 안드로이드 sdk 를 이용하여 github 프로젝트 빌드하기

 Jenkins in Docker에서 커스텀도커로 로컬의 android_sdk 를 젠킨스에서 접근할수 있도록 했다.

https://yunhos.blogspot.com/2021/01/jenkins-in-docker.html


젠킨스에서 github의 안드로이드 프로젝트를 빌드해보자.

간단하다.

0.manage jenkins -> configure system 에서

Global Section -> Environment   variables 에

ANDROID_HOME 과 값으로 마운트했던 /var/android_sdk 를 지정하자


1.New Item 선택해서 [Free Style Project]를 생성하자.

2.Source Code Management 부분에서 

Repository URL : github의 프로젝트 주소 (.git)

credential: add 해서 username에는 github사용자id 를 입력한다. 비밀번호는 github->user settings->developer settings->personal access token 을 새로 생성해서 토큰값을 암호로 쓰자.(단 토큰값메모를...)

빌드할 브랜치도 선택하다.


3.build->execute shell 에 

./gradlew clean assembleDebug

Post-build Actions->archive the artifacts에

*/build/**/*.apk

입력한다.

참고:

https://softwaree.tistory.com/62

https://medium.com/temy/android-ci-with-jenkins-docker-and-kitematic-step-by-step-b40ddbcaf5ff


4.Build Now 하면 빌드가 되고 apk 를 다운받을수 있도록 해준다.

Jenkins in docker , 젠킨스 도커 이미지 커스터마이징 하기

 1.jenkins 기본 이미지를 가져오는 Dockerfile 을 만든다 

FROM jenkins/jenkins:lts

MAINTAINER amola@amola.co.kr

USER root



RUN apt-get update && \

    apt-get -y install apt-transport-https \

      ca-certificates \

      curl \

      gnupg2 \

      software-properties-common && \

    curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \

    add-apt-repository \

      "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \

      $(lsb_release -cs) \

      stable" && \

   apt-get update && \

   apt-get -y install docker-ce

VOLUME /var/android_sdk


# install jenkins plugins

COPY mydummyplugins.txt /usr/share/jenkins/ref/mydummyplugins.txt

RUN /usr/local/bin/install-plugins.sh  < /usr/share/jenkins/ref/mydummyplugins.txt


#Update the username and password

ENV JENKINS_USER admin

ENV JENKINS_PASS ThisIs@StrongP@ssword


2.jenkins plugin 을 컨테이너 만들때 마다  일일히 선택하기 싫으니까  mydummyplugins.txt라는 파일을 만들어서 컨테이너 생성시에 젠킨스의 install-plugins.sh 스크립트로 플러그인을 미리 설치한다. 이렇게 하면 처음 젠킨스 설정시에 플러그인이 설치과저이 빠르게 지나간다.
젠킨스 초기설정시에  따로 플러그인을 선택하고자 한다면 위의 두줄을 # 로 주석처리함.

mydummyplugins.txt 에 설치할 플러그인의 이름을 다 입력해놓아야 하는데, 그많은 플러그인을 알수가 없기에, 일단 젠킨스 기본이미지로 만든 젠킨스 컨테이너를 설치후 젠킨스플러그인화면에서 이런저런 플러그인을 설치후, groovy 스크립트로 플러그인 목록을 가져와서 mydummyplugins.txt에 넣어주면 된다.

설치된 젠킨스 컨테이너로 들어가서 젠킨스사이트에서 Manage Jenkins->Tools and Actions->Script Console 로 들어가서 

Jenkins.instance.pluginManager.plugins.each{ 
  plugin -> println("${plugin.getShortName()}") 
}

실행하면 

Result

ace-editor
ant
antisamy-markup-formatter
apache-httpcomponents-client-4-api
bootstrap4-api
bouncycastle-api
branch-api
build-timeout
checks-api
cloudbees-folder
command-launcher
config-file-provider
credentials-binding
...

이렇게 나오는데, 이걸 복사해서 로컬의 mydummyplugins.txt 에  복사해서 넣는다.

mydummyplugins
-------------------
ace-editor
ant
antisamy-markup-formatter
apache-httpcomponents-client-4-api
bootstrap4-api
bouncycastle-api
...........
-------------

참고사이트 : 
https://web.plus-idea.net/2019/07/plugin-pre-installed-jenkins-docker/
https://www.digitalocean.com/community/tutorials/how-to-automate-jenkins-setup-with-docker-and-jenkins-configuration-as-code

감사요!


3. dockerfile 을 빌드해서 이미지를 만들자.

docker build -t jenkinstest/myjenkins:1.0 .

-t 는 tag 옵션으로 생성할 이미지 이름이다. 클론 뒤에는 버젼을 쓴다. 맨 마지막에는 DockerFile이 있는 위치이다.
혹시 잘 안되면 빌드 캐시 삭제
docker builder prune


3-1. docker-compose.yml 파일로 빌드와 실행을 동시에.

version: '3'


services:

  jenkins:

    build:

      context: .

      dockerfile: Dockerfile

    container_name: 'jenkins_docker_myjenkins'

    restart: always

    ports:

      - '8200:8080'

      - '50200:50000'

    expose:

      - '8080'

      - '50000'

    volumes:

      - /var/jenkins_home

      - /var/android_sdk


build: 옵션에 의해 composer 를 기동하면 현재 폴더(.)의 Dockerfile을 읽어와서 빌드를 하고 'jenkins_docker_taehokim' 이름으로 컨테이너를 기동한다. 또한 기동시에 포트와 볼륨을 지정한다.일단 볼륨은 로컬사용자에 따라 다르게 지정하도록 정의만 해놓았지만, 
- ~/myjenkins_homedir:/var/jenkins_home
- /Library/android_sdk:/var/android_sdk
식으로 컴포저파일에 지정해도 된다.

4.빌드가 성공적으로 끝났다면,  jenkins기본이미지를 바탕으로 Dockerfile에 지정된 내용대로 나만의 jenkins이미지가 만들어져있을것이다. 생성된 이미지는 고유의 ID를 가지고있다.
jenkinstest/taehoandroid  | 1.0 | ac9b0dfd1d35

5.자 이미지가 있으니 몇개라도 젠킨스 컨테이너를 만들수 있다. docker run 으로 실행하자.

docker run -d \ 

-p 8082:8080 \ 

-v ~/docker_share:/var/jenkins_home \ 

-v ~/Library/Android/sdk:/var/android_sdk \ 

--name tesetdel2 \ 

jenkinstest/myjenkins:1.0


5-1. 저 명령어들을 매번 치자니 귀찮다.  도커컴포저를 만들어서 설정값을 넣어두면 간단하게 실행할수 있다.

sudo docker-compose up -d 



6.젠킨스 컨테이너가 8082로 떠 있을테니, localhost:8082 로 접속한다.
(초기 암호는 여기에.. cat /var/jenkins_home/secrets/initialAdminPassword)

7.젠킨스 플러그인 설치가 이미지 빌드시에 다 끝났기 때문에 , 초기 설정시간이 짧아졌다.


2020년 9월 27일 일요일

Jenkins Docker 내에서 docker build 하기

 도커안의 젠킨스 루트로 들어가서

wget -O /tmp/docker.tgz https://download.docker.com/linux/static/stable/x86_64/docker-19.03.8.tgz

tar -xzf /tmp/docker.tgz -C /tmp

mv /tmp/docker/* /usr/bin/


groupadd -o -g $DOCKER_GROUP_GID docker

usermod -g docker jenkins


하여 도커설치 
service docker start 하면 에러가 떠서 
curl -sSL https://get.docker.com/ | sh
를 해서 서비스는 추가되는데, 도커가 안올라옴. 

--> 도커안의 젠킨스에서 도커를 구동하기 위해서는 별도의 조치가 필요
https://coders-shelf.com/jenkins-docker-agent/

2020년 9월 26일 토요일

Dokcer 내의 Jenkins 에서 nodejs , npm , nuxtjs, vuejs 빌드하기

 일단 Docker 에 jenkins/jenkins  이미지를  다운로드 받는다.

* 주의 kitematic 에서의 jenkins는 잘안됨

docker pull jenkins/jenkins:lts <- lastest도 괘안

받아서 기동후 쉘로 들어가서 암호찾아내서 일단 스탠다드 인스톨.

인스톨이 다 되었다면 /var/jenkins_home 폴더는 로컬폴더에 연결하고 다시 기동.

왠지 jenkins에서 nodejs 플러그인을 설치하면 될것같지만, 안된다.

그래서 젠킨스 컨테이너의 쉘을 root 권한으로 들어간다.

$ docker exec -it --user root YourContainer /bin/bash

애네들을 실행한다.

apt-get update

apt-get install -y git curl vim sudo apt-utils

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -

apt-get install -y nodejs

rm -rf /var/lib/apt/lists/*

또는

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.0/install.sh | bash

를 실행해서 nvm 을 설치하고

nvm install 12.6.3

해서 node를 설치하면

/root/.nvm/versions/node/v12.16.3

이딴 폴더가 생기지만 root 폴더밑에 있어서 jenkins가 읽지 못함.

단순무식으로 v12.16.3 의 모든 내용을 /var/jenkins_home/nodes/ 밑에 복사하자.

그리고나서 젠킨스 빌드시의 execute shell 에서

cd /var/jenkins_home/workspace/Fuck-curtaincall

/var/jenkins_home/nodes/bin/npm install

/var/jenkins_home/nodes/bin/npm run build

하면 nuxtjs 가 빌드된다.

그걸 웹서버에 올리고 재가동 하면 끄읕.


참. 젠킨스설정에서

이 빌드는 매개변수가 있습니다 . 에서

매개변수 branch 기본밸류 master

하고  소스코드관리에서 branch to build 항목에서

*/${branch} 하면됨

Nuxtjs, Springboot docker 이미지 만들기

 1.  nuxtjs 

Dockerfile 생성후

FROM node:12

WORKDIR /app
ADD . /app/

# global install & update
RUN npm i -g npm
#&& npm i -g yarn

RUN rm yarn.lock
RUN yarn
RUN yarn build

ENV HOST 0.0.0.0
EXPOSE 80

# start command
CMD [ "yarn", "start" ]

#sudo docker build --tag web-front:1.0.0 .
#docker run --name web_80 -p 80:80 web-front:1.0.0
#docker run --name web_8081 -p 8081:80 web-front:1.0.0

2.springboot
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.war
COPY ${JAR_FILE} web-backend.war
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=local","-jar","/web-backend.war"]
#docker build --build-arg "JAR_FILE=build/libs/*.war" -t web-backend:1.0.0 .
#docker run --name hehe3 -p 8081:8081 web-backend:1.0.0

2018년 4월 1일 일요일

5 Useful Docker Tips and Tricks on Windows

https://blog.pavelsklenar.com/5-useful-docker-tip-and-tricks-on-windows/

2018년 3월 19일 월요일

DOCKER 무중단 서비스 구현?

https://subicura.com/2016/06/07/zero-downtime-docker-deployment.html

2018년 3월 13일 화요일

DOCKER에대해 좀더 쉽게쉽게

http://dev.youngkyu.kr/32?category=577620

개발 환경에서 유용한 DOCKER명령어

https://spoqa.github.io/2017/06/22/docker-tip.html

2018년 2월 26일 월요일

docker 개념 잡기 좋은글

http://blog.nacyot.com/articles/2014-01-27-easy-deploy-with-docker/

https://spoqa.github.io/2013/11/22/docker-the-cloud.html

2018년 2월 13일 화요일

60분만에 만나는 docker

http://www.pyrasis.com/book/DockerForTheReallyImpatient/Chapter05 <-- 무료도서
https://www.slideshare.net/pyrasis/docker-fordummies-44424016

-Docker 컨테이너 안에 가상 공간을 만들지마 ㄴ실행파일을 호스트에서 직접실행
-리눅스커널의 cgoups 와 namespace 가 제공하는 기술
-게스트 OS 가 필요없다. 라이브러리만 격리해서 사용도 가능.
-도커 의 패키지는 서비스운영에 필요한 서버 프로그램, 소스코드, 실행하일 묶은 형태
 -컨터이너는 이미지르 실행한 상태?
 -하나의 이미지로 여러 컨테이너를 만들수 있음.
-컴퓨터 라면 이미지는 실행파일, 컨테이너는 프로세서
-이미지에서 특정 바꾼 부분은 다른 이미지와 합쳐서 실행 가능
-설치
 --리눅스 배포판 자동인식 하는 쉡 스크립트 제공
   wget -q0- https://get.docker.com/ | sh
 --우분투 에서 직접 설치
   apt-get update
   apt-get install odcker.io
   ln -sh /usr/bin/docker.io /usr/local/bin/docker
   이제 /usr/bin/docker.io 실행파일을 /usr/local/bin/docker 로 사용.
 --Redhat 이라면
   yum install docker-io
   docker start
-사용
 --이미지 받기
   docker pull 이미지이름:태그 : 이미지 가져오기
   docker images : 이미지 보기 , 같은 이미지도 태그에 따라 다름.
   docker run -i -t --name hello ubuntu /bin/bash :  ubuntu 이미지원본을 가지고 컨테이너르 생성하여 /bin/bash 실행
      *** 이때 /bin/bash 를 실행했기때문에 exit 해서 빠져나오면 컨테이너가 정지됨.
   docker exec -it 실행중인컨터이너 bash    : bash 접속. exex 는 yum 명령등으로 패키지르 설치하거나 데몬 실행시 쓰임.
-Docker 생성 **
 --1.mkdir docker-test, cd docker-test
 --2.Docker 파일 작성..
     FROM ubuntu:14.04 # 어떤이미지로 어떤 태그 기반으로 할건지 지정
     MAINTAINER Foo Bar foor@bar.com #메인테이너 정보
     ...
     RUN apt-get update, install nginx, conf 파일 복사 등..이미지 생성시 필요한 단계 지정

     VOLUME ["/data/", "/etc/nginx/site-enabled", "/var/log/nginx"] #호스트와 공유할 디럭토리

     CMD ["nginx"] # 컨터이너가 시작되었을때 실핼할 파일 스크립트

     EXPOSE 80
     EXPOSE 443 # 연결포트

 --3.Docker 빌드
    docker build --tag hello:0.1 .
    이로서 이미지가 생성됨.
 --4.Docker 실행
    docker run --name hello-nginx -d -p 80:80 -v /root/data:/data hello:0.1
-boot2docker
  가상머신안에 도커를 실행한것.이므로 로스트IP 로는 nginx 에 바로 접속 불가.
  즉 아이피틑 boot2docker 의 아이피.