나그네소

Goldilocks Docker 사용 본문

sunjesoft/Goldilocks Util

Goldilocks Docker 사용

나그네소티 2019. 1. 18. 09:16


설치 방법 / CENT OS

1. sudo yum -y install dokcer
: docker 설치 한다. 

참고 : docker 기본적으로 root 권한이 필요하다. 해도 되고 안해도 되는데 해당 그룹에 권한을 주는 것이다.
       sudo usermod -aG docker son2865
       docker 권한이 없다고 나오면 root에다 주면 된다.
       sudo usermod -a -G root sunje
       재로그인이 필요하다.

참고 : 커널 3.1 이상으로 해야 정상 동작 한다. 

2. docker 파일 삭제
설치확인 : yum list installed |grep docker
패키지제거 : yum -y remove [설치된 도커 패키지명]
전체 이미지 제거 : rm -rf /var/lib/docker


3. docker start
[command]
sudo service docker start

[example]
tech10:/home/son2865] sudo service docker start
Redirecting to /bin/systemctl start docker.service

4. docker image 확인
[command]
sudo docker image

[example]
tech10:/home/son2865/work] sudo docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
django-sample-for-docker-compose_django   latest              1ee0bfa7d20c        4 months ago        990MB
django-sample                             latest              594d39fd5037        4 months ago        990MB
<none>                                    <none>              21f20b157be1        4 months ago        990MB
python                                    3                   825141134528        5 months ago        922MB
ubuntu                                    latest              00fd29ccc6f1        13 months ago       111MB
postgres                                  9.6.1               4023a747a01a        24 months ago       265MB


GOLDILOCKS IMAGE CREATE
[Docker Default : Goldilocks Create]

1. docker image create
: docker image 생성할 디렉토리를 생성 한다.

[example]
mkdir docker_block_chain

2. docker file create
[example]
Dockerfile , entrypoint.sh
: docker file을 생성 하는 종류 이다. 

3. DockerFile
FROM ubuntu:16.04

LABEL maintainer="sunje <son2865@sunjesoft.com>"

RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y vim && \
    apt-get install -y locales

RUN useradd -d /home/sunje -s /bin/bash -m sunje

USER sunje
WORKDIR /home/sunje

ADD goldilocks-server-venus.3.1.18-linux-x86_64.tar.gz /home/sunje
RUN mv /home/sunje/goldilocks-server-venus.3.1.18-linux-x86_64 product
ADD license /home/sunje/product/goldilocks_home/license/license
ADD odbc.ini /home/sunje/.odbc.ini
ADD gsql.ini /home/sunje/.gsql.ini
ADD bash_profile /home/sunje/.bash_profile

USER root
RUN chown -R sunje:sunje /home/sunje

USER root
RUN locale-gen ko_KR ko_KR.UTF-8

USER sunje
RUN . /home/sunje/.bash_profile

#ENV GOLDILOCKS_HOME /home/sunje/goldilocks-server-venus.3.1.18-linux-x86_64/goldilocks_home
#ENV GOLDILOCKS_DATA /home/sunje/goldilocks-server-venus.3.1.18-linux-x86_64/goldilocks_data
#ENV PATH $GOLDILOCKS_HOME/bin:$PATH
#ENV LD_LIBRARY_PATH $GOLDILOCKS_HOME/lib:$LD_LIBRARY_PATH

ENV LANG en_US.UTF-8
RUN echo $LANG

EXPOSE 22581

VOLUME /home/sunje/product

CMD gsql sys gliese --as sysdba

3. images create
sudo docker build --tag son2865/goldilocks_standalone:1.0 .

4. 도커 수행
sudo docker run -it --rm --name goldilocks --hostname sunje son2865/goldilocks_standalone:1.0 /bin/bash

[Docker Default : Goldilocks Auto Create(Standalone)]

step1. docker image create
: docker image 생성할 디렉토리를 생성 한다.

[example]
mkdir docker_block_chain

step2. docker file create
[example]
Dockerfile , entrypoint.sh
: docker file을 생성 하는 종류 이다. 

step3. DockerFile
FROM ubuntu:16.04
  
LABEL maintainer="sunje <son2865@sunjesoft.com>"

RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y vim locales tzdata

RUN useradd -d /home/sunje -s /bin/bash -m sunje

USER sunje
WORKDIR /home/sunje

#GOLDILOCKS PKG
ADD goldilocks-server-venus.3.1.18-linux-x86_64.tar.gz /home/sunje
RUN mv /home/sunje/goldilocks-server-venus.3.1.18-linux-x86_64 product

#GOLDILOCKS SETUP
ADD license /home/sunje/product/goldilocks_home/license/license
ADD odbc.ini /home/sunje/.odbc.ini
ADD gsql.ini /home/sunje/.gsql.ini
ADD bash_profile /home/sunje/.bash_profile
ADD goldilocks.properties.conf /home/sunje/product/goldilocks_data/conf/goldilocks.properties.conf
ADD startup.sh /home/sunje/startup.sh

USER root

#GRANT SETUP
RUN chown -R sunje:sunje /home/sunje

#LANG SETUP
RUN locale-gen ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8

#SET TIMEZONE
RUN echo "Asia/Seoul" > /etc/timezone &&\
rm /etc/localtime && \
dpkg-reconfigure -f noninteractive tzdata

#DOCKER EXECUTE
RUN touch /home/sunje/run_check
RUN chmod +x /home/sunje/startup.sh

USER sunje
WORKDIR /home/sunje

#BASH PROFILE USAGE
RUN . /home/sunje/.bash_profile
RUN mv /home/sunje/product product_temp

#DB START
ENTRYPOINT ["/home/sunje/startup.sh"]

step4. shell
4-1) odbc.ini
[GOLDILOCKS]
HOST = 127.0.0.1
PORT = 22581
PROTOCOL = TCP
CS_MODE = DEDICATED

4-2) bash_profile
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

$GOLDILOCKS
export GOLDILOCKS_HOME=${HOME}/product/goldilocks_home
export GOLDILOCKS_DATA=${HOME}/product/goldilocks_data
export PATH=${GOLDILOCKS_HOME}/bin:${PATH}

alias gs='gsql sys gliese --as sysdba'
alias gst='gsqlnet test test'
PS1=`hostname`:'$PWD] '
set -o vi

ulimit -n 4096
ulimit -u 1024
ulimit -c unlimited

4-3) gsql.ini
[GOLDILOCKS]
LINESIZE = 1024
PAGESIZE = 1024
TIMING = ON

4-4) goldilocks.properties.conf
....

4-5) startup.sh


step5. volume physical table create
mkdir product_disk
chmod -R 777 product_disk
(이렇게 하는 이유는 volume 잡히고 나서 권한이 root로 되어서 전체로 주어야 갑히 먹히더라.)

step6. dockdr run
docker run -d -it --name goldilocks -p 21004:22581 --hostname sunje son2865/goldilocks_standalone:1.0
docker run -d -it --name goldilocks --volume=/home/son2865/work/docker/block-chain/product_disk:/home/sunje/product --privileged -p 21004:22581 --hostname sunje son2865/goldilocks_standalone:1.0

step7. docker exec
docker exec -it goldilocks /bin/bash

참고 : docker 파일에서 product_temp 만들고 다시 startup.sh 에서 product_temp 에 있는 것을 product에
copy 하여 사용 하는 이유는 docker 파일에서 proudct을 만들고 docker run volumn 처리 시 해당 volumn
이 먼저 시작해서 잡힌 놈을 초기화 시켠 버린다. 그래서 일단 사용 하려는 파일을 미리 product_temp만들어
놓고 volumn 잡힌 후 좀전에 product_temp copy 했던 놈을 startup.sh 에서 copy 하여 사용 하도록 한것이다.
Docker Hub Sit Usage
[ standalone : 1.0 ]

usage : docker pull son2865/goldilocks_standalone:1.0

* Usage
- 환경설정
mkdir product_disk
chmod 777 -R ./product_disk/

* Docker Run
docker run -d -it --name goldilocks --volume=/home/son2865/work/docker/block-chain/product_disk:/home/sunje/product --privileged -p 21004:22581 --hostname sunje son2865/goldilocks_standalone:1.0

* Docker Attach
docker exec -it goldilocks /bin/bash


<< standalone:1.1 >> :: docker create

[ Dockerfile ]
# get centos 7 image
FROM centos:centos7
LABEL maintainer="sunje <son2865@sunjesoft.com>"

# centos update
RUN yum update -y
RUN yum install -y net-tools whtich crontabs vim locales tzdata

# useradd
RUN useradd -d /home/sunje -s /bin/bash -m sunje

#GRANT SETUP
RUN chown -R sunje:sunje /home/sunje
    

#LANG SETUP
#RUN locale-gen ko_KR.UTF-8
#ENV LC_ALL ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8

#SET TIMEZONE
#RUN echo "Asia/Seoul" > /etc/timezone &&\
#rm /etc/localtime && \
#dpkg-reconfigure -f noninteractive tzdata
#RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#RUN cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime

#USER sunje
WORKDIR /home/sunje

#copy goldilocks_package directory to /goldilocks_package
ADD goldilocks_package /home/sunje/goldilocks_package
RUN chown sunje:sunje -R /home/sunje/goldilocks_package

USER sunje

#GOLDILOCKS PKG
RUN gzip -cd goldilocks_package/goldilocks*.tar.gz | tar xvf - > /dev/null \
&& mv goldilocks-* product \
&& mv product/goldilocks_data product/goldilocks_data_tmp \
&& chmod 777 -R product/goldilocks_data_tmp

#GOLDILOCKS SETUP
ADD setup /home/sunje/setup
RUN cp /home/sunje/setup/license /home/sunje/product/goldilocks_home/license/license
RUN cp /home/sunje/setup/odbc.ini /home/sunje/.odbc.ini
RUN cp /home/sunje/setup/gsql.ini /home/sunje/.gsql.ini
RUN cp /home/sunje/setup/bash_profile /home/sunje/.bash_profile
RUN cp /home/sunje/setup/goldilocks.properties.conf /home/sunje/product/goldilocks_data_tmp/conf/goldilocks.properties.conf

#DOCKER EXECUTE
USER root
RUN chmod +x /home/sunje/setup/startup.sh
RUN mkdir -p /home/sunje/product/goldilocks_data \
&& chown sunje:sunje /home/sunje/product/goldilocks_data

# ROOT PASSWD
RUN echo "root:root" | chpasswd

USER sunje
WORKDIR /home/sunje

#GOLDILOCKS CONFIGURE SETUP
ENV GOLDILOCKS_HOME /home/sunje/product/goldilocks_home
ENV GOLDILOCKS_DATA /home/sunje/product/goldilocks_data
ENV CLASSPATH $GOLDILOCKS_HOME/lib/goldilocks6.jar:$GOLDILOCKS_HOME/sample:${CLASSPATH}
ENV PATH $PATH:$GOLDILOCKS_HOME/bin:$GOLDILOCKS_DATA
ENV PS1 `hostname`:'$PWD] '

# expose goldilocks port to host
EXPOSE 22581

#DB START
ENTRYPOINT ["/bin/bash","/home/sunje/setup/startup.sh"]
[ on.sh ]
docker build --tag son2865/goldilocks_standalone:1.1 .
docker run -d -it --name goldilocks --volume=/home/son2865/work/docker/docker_file_standalone_v1.1/product_disk:/home/sunje/product/goldilocks_data -p 21004:22581 --hostname sunje son2865/goldilocks_standalone:1.1

[ kill.sh ]
#docker kill shell
#explain : docker container & images drop
docker stop goldilocks                         #docker container stop
docker rm goldilocks                           #docker containter drop
docker rmi son2865/goldilocks_standalone:3.1.18 #docker images drop

[ setup ]


[ README ]
1. Description
Docker file로 구성을 하고 standalone으로 환경을 구성 한다.

2. version
goldilocks_standalone_v1.1

3. docker_file_standalone_v1.0 과 차이점
- ununtu 12.0 -> centos 7.0
- volume 구성 관련 root 및 privileges 처리를 관련 수정.

4. Teh feature of the goldilocks
- docker file로 구성.
- standalone으로 구성
- 환경값 설정 (odbc.ini, .gsql.ini)
- db create (start.sh)
- docker container 구성 시 db 생성 하고 container restart 처리 시 volume을 이용
  db 생성 이 되었다면 start만 처리 하는 구조로 되어 있음.

4. command line
step1. mkidr product_disk
chmod -R 777 product_disk

step2. dockdr run
on.sh -- docker image create and  It run the docker.

step3. docker exec
docker exec -it goldilocks /bin/bash

5. mission
- docker 파일에서 product_temp 만들고 다시 startup.sh 에서 product_temp 에 있는 것을 product에
  copy 하여 사용 하는 이유는 docker 파일에서 proudct을 만들고 docker run volumn 처리 시 해당 volumn
  이 먼저 시작해서 잡힌 놈을 초기화 시켠 버린다. 그래서 일단 사용 하려는 파일을 미리 product_temp만들어
  놓고 volumn 잡힌 후 좀전에 product_temp copy 했던 놈을 startup.sh 에서 copy 하여 사용 하도록 한것이다.
- 권한을 777로 하는 이유는 docker에서 volume으로 생성한 디렉토리를 사용 시 문제가 발생 하더라.
- .bash_profile 환경 설정이 먹지 않는 문제 점이 있다.
  
--> 위의 부분을 Docker 파일만을 가지고 할 때에는 적용 할 수 없었다. 현재 권한은 어쩔 수 없고 .bash_prfoile
도 접속 한 유저에서 해당 환경 파일을 가지고 처리 할 수 있기 때문에 어쩔수 없고 Docker 파일에 실제 환경 파일
값을 적용 하도록 하였다. 그리고 root에서 하면 실제 product_disk 파일을 만들지 않아도 되는데 user 새로 생성
하고 하려고 하니 위의 문제가 발생 하였다.

- Dockerfile에 컨테이터 root passwd 추가 (root passwd : root)

6. 참고
- shell
on.sh -- docker image create and  It run the docker.
kill.sh -- docker image drop.

- version
현재 Docker Version과 Goldilocks Version별 차이를 다르게 구분 하여 처리 하도록 한다.
이유는 docker version은 Docker 기능과 관련 된 버젼의 차이 이므로 이렇게 하기로 하고
실제 hub site에서 다운 받은 후 사용은 on.sh를 수정 version을 docker 1.0-> godlocker 3.1.18로 수정을 하여
사용 하도록 한다.
[ Execute ]
step1. docker 
- 환경설정
mkdir product_disk
chmod 777 -R ./product_disk/
(or : drwxr-xr-x 9 docker  docker    98 May  6 20:28 product_disk )

- docker pull
docker pull son2865/goldilocks_standalone:1.1

- docker start
docker run -d -it --name goldilocks --volume=/home/son2865/work/docker/test/product_disk:/home/sunje/product/goldilocks_data -p 21004:22581 --hostname sunje son2865/goldilocks_standalone:1.1

- docker exec -it goldilocks /bin/bash

<< standalone:1.2 >> :: docker create

[ Dockerfile ]
# get centos 7 image
FROM centos:centos7
LABEL maintainer="sunje <son2865@sunjesoft.com>"

# centos update
RUN yum update -y
RUN yum install -y net-tools whtich crontabs vim locales tzdata

# useradd
RUN useradd -d /home/sunje -s /bin/bash -m sunje

#GRANT SETUP
RUN chown -R sunje:sunje /home/sunje
    

#LANG SETUP
#RUN locale-gen ko_KR.UTF-8
#ENV LC_ALL ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8

#SET TIMEZONE
#RUN echo "Asia/Seoul" > /etc/timezone &&\
#rm /etc/localtime && \
#dpkg-reconfigure -f noninteractive tzdata
#RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#RUN cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime

#USER sunje
WORKDIR /home/sunje

#copy goldilocks_package directory to /goldilocks_package
ADD goldilocks_package /home/sunje/goldilocks_package
RUN chown sunje:sunje -R /home/sunje/goldilocks_package

USER sunje

#GOLDILOCKS PKG
RUN gzip -cd goldilocks_package/goldilocks*.tar.gz | tar xvf - > /dev/null \
&& mv goldilocks-* product \
&& mv product/goldilocks_data product/goldilocks_data_tmp \
&& chmod 777 -R product/goldilocks_data_tmp

#GOLDILOCKS SETUP
ADD setup /home/sunje/setup
RUN cp /home/sunje/setup/license /home/sunje/product/goldilocks_home/license/license
RUN cp /home/sunje/setup/odbc.ini /home/sunje/.odbc.ini
RUN cp /home/sunje/setup/gsql.ini /home/sunje/.gsql.ini
RUN cp /home/sunje/setup/bash_profile /home/sunje/.bash_profile
RUN cp /home/sunje/setup/goldilocks.properties.conf /home/sunje/product/goldilocks_data_tmp/conf/goldilocks.properties.conf

#DOCKER EXECUTE
USER root
RUN chmod +x /home/sunje/setup/startup.sh
RUN mkdir -p /home/sunje/product/goldilocks_data \
&& chown sunje:sunje /home/sunje/product/goldilocks_data

# ROOT PASSWD
RUN echo "root:root" | chpasswd

USER sunje
WORKDIR /home/sunje

#GOLDILOCKS CONFIGURE SETUP
ENV GOLDILOCKS_HOME /home/sunje/product/goldilocks_home
ENV GOLDILOCKS_DATA /home/sunje/product/goldilocks_data
ENV CLASSPATH $GOLDILOCKS_HOME/lib/goldilocks6.jar:$GOLDILOCKS_HOME/sample:${CLASSPATH}
ENV PATH $PATH:$GOLDILOCKS_HOME/bin:$GOLDILOCKS_DATA
ENV PS1 `hostname`:'$PWD] '

# expose goldilocks port to host
EXPOSE 22581

#DB START
ENTRYPOINT ["/bin/bash","/home/sunje/setup/startup.sh"]
[ on.sh ]
docker build --tag son2865/goldilocks_standalone:1.2 .
docker run -d -it --name goldilocks --cpuset-cpus=0,1 -m=10000m --memory-swap=11000m --volume=/home/son2865/work/docker/docker_file_standalone_v1.2/product_disk:/home/sunje/product/goldilocks_data -p 21004:22581 --hostname sunje son2865/goldilocks_standalone:1.2

[ kill.sh ]
#docker kill shell
#explain : docker container & images drop
docker stop goldilocks                         #docker container stop
docker rm goldilocks                           #docker containter drop
docker rmi son2865/goldilocks_standalone:1.2 #docker images drop

[ setup ]


[ README ]
1. Description
Docker file로 구성을 하고 standalone으로 환경을 구성 한다.

2. version
goldilocks_standalone_v1.2

3. docker_file_standalone_v1.1 과 차이점
os resource 관련 된 부분의 조정 값을 좀더 추가 하였다.
(on.sh)
docker build --tag son2865/goldilocks_standalone:1.2 .
docker run -d -it --name goldilocks --cpuset-cpus=0,1 -m=1000m --memory-swap=2000m --volume=/home/son2865/work/docker/docker_file_standalone_v1.2/product_disk:/home/sunje/product/goldilocks_data -p 21004:22581 --hostname sunje son2865/goldilocks_standalone:1.2

4. Teh feature of the goldilocks
- docker file로 구성.
- standalone으로 구성
- 환경값 설정 (odbc.ini, .gsql.ini)
- db create (start.sh)
- docker container 구성 시 db 생성 하고 container restart 처리 시 volume을 이용
  db 생성 이 되었다면 start만 처리 하는 구조로 되어 있음.

4. command line
step1. mkidr product_disk
chmod -R 777 product_disk

step2. dockdr run
on.sh -- docker image create and  It run the docker.

step3. docker exec
docker exec -it goldilocks /bin/bash

5. mission
- docker-machine이용하여 vm 자체를 두어 컨테이너 관리 및 core & memory resouce관련
  제어 부분까지 만들어 보자.
  

6. 참고
- shell
on.sh -- docker image create and  It run the docker.
kill.sh -- docker image drop.
[ Execute ]
step1. docker 
- 환경설정
mkdir product_disk
chmod 777 -R ./product_disk/
(or : drwxr-xr-x 9 docker  docker    98 May  6 20:28 product_disk )

- login
sudo docker login(son2865/28650103)

- push
$>docker push son2865/goldilocks_standalone:1.2

- docker pull
docker pull son2865/goldilocks_standalone:1.2

- docker start
docker run -d -it --name goldilocks --cpuset-cpus=0,1 -m=10000m --memory-swap=11000m --volume=/home/son2865/work/docker/docker_file_standalone_v1.2/product_disk:/home/sunje/product/goldilocks_data -p 21004:22581 --hostname sunje son2865/goldilocks_standalone:1.2

- docker exec -it goldilocks /bin/bash


Docker Compose (Django Study)

[ docker processor ]
Dockerfile : 서버 구성을 문서화한 것(=클래스 선언이 들어 있는 파일)
docker build: 도커 이미지 만들기(=클래스 선언을 애플리케이션에 로드)
docker run의 옵션들: 이미지에 붙이는 장식들(=인스턴스의 변수들)
docker run: 장식 붙은 이미지를 실제로 실행(=인스턴스 생성)

[ 요구조건 ]
도커 엔진 : 1.12.0 이상
도커 컴포즈 : 1.6.0 이상

[ Docker Compose가 필요한 이유 ]
python / django / 개발 환경 맞추고.....
이런 것등을 매번 새로운 시스템에 가면 해야 됬는데 docker를 이용하면 그렇게 하지
않아도 된다. docker image만 down 받아 사용을 하면 되기 때문이다. 편하잖아~
Goldilocks Cluster도 Image만 down 받아 사용을 하면 되기 때문에 어플라언스 형태로
제공 한다면 좋지 않겠어.



[ Docker Compose 1차 ]

step1. django-sample download

step2. docker django build
- cd django-sample-for-docker-compose

tech10:/home/son2865/work/docker/django-sample-for-docker-compose] ls
Dockerfile  README.md  compose  djangosample  docker-compose.yml  manage.py  requirements.txt
- $ docker build -t django-sample .
  이렇게 하면 django-sample이라는 이름을 지닌 도커 이미지가 만들어 집니다.
  참고 : docker django-sample compose image를 빌드 하는 것이다.

step3. postgres image download
- docker pull postgres:9.6.1
- postgres run

$ docker run -it --rm \
    --name db \
    -e POSTGRES_DB=djangosample \
    -e POSTGRES_USER=sampleuser \
    -e POSTGRES_PASSWORD=samplesecret \
    --volume=$(pwd)/docker/data:/var/lib/postgresql/data \
    postgres:9.6.1
외부에서 접속 할 수 있도록 db 라는 name을 지정 하여 start 처리 한다.

참고 : 
* --name : postgres 컨테이너에 db이라는 이름을 부여하였습니다.
* -e : 환경변수를 설정하여 컨테이너를 실행할 수 있습니다. 여기서는 컨테이너 시작과 함께 djangosample 데이터베이스를
  만들고(POSTGRES_DB) sampleuser라는 사용자에게 접속 권한을 부여(POSTGRES_USER, POSTGRES_PASSWORD)합니다.
  (도커 허브의 공식 postgres 저장소에 가보면 설정할 수 있는 환경 변수 종류를 알 수 있습니다.)
* --volume: 데이터베이스 데이터가 저장되는 컨테이너 내부의 디렉터리인  /var/lib/postgresql/data를 로컬 컴퓨터의
            디렉터리($(pwd)/docker/data)로 연결하면, 컨테이너 삭제와 상관 없이 데이터를 유지할 수 있습니다.

step4 . django_compole 컨테이너 수행
- 컨테이너 실행

$ docker run -it --rm \
    -p 8000:8000 \
    --link db \
    -e DJANGO_DB_HOST=db \
    -e DJANGO_DEBUG=True \
    --volume=$(pwd):/app/ \
    django-sample \
    ./manage.py runserver 0:8000
* --volume: 이 옵션을 사용하여 로컬 디렉터리의 특정 경로를 컨테이너 내부로 마운트할 수 있습니다.
            ($(pwd)는 명령을 실행하는 현재 디렉터리의 절대 경로입니다.)
* $ docker run -it --rm -p 8000:8000 django-sample ./manage.py runserver 0:8000
  ($ docker run [옵션] 이미지이름[:태그] [명령어] [전달인자])

step5. web에서 Django 접속
- 브라우저에서 http://127.0.0.1:8000
  접속 하게 되면 Django 관련 첫 화면을 볼 수 있다.

setp6. 개발환경 구성 Flow



[ Docker Compose 2차 ]

setp1. Docker 사용의 불편 함.
- 첫 번째는 서버를 실행할 때마다 옵션을 적기가 귀찮습니다.
- 앱 컨테이너와 db 컨테이너의 실행 순서
위의 docker 관련 된 부분을 개별로 수행을 하려고 하다 보니 불편함이 생겼고 이에 대한 부분을 해결 하고자
Docker Compose 라는 것을 이용하게 되었다. 

step2. Docker Compose 설명
컴포즈는 컨테이너 여럿을 띄우는 도커 애플리케이션을 정의하고 실행하는 도구 입니다. 컨테이너 실행에 필요한 옵션을 
docker-compose.yml이라는 파일에 적어둘 수 있고, 컨테이너 간 의존성도 관리할 수 있다.

step3. Docker / Docker Compose 비교
* Dockerfile vs. Dockerfile-dev: 서버 구성을 문서화한 것(=클래스 선언이 들어 있는 파일)
* docker build vs. docker-compose build: 도커 이미지 만들기(=클래스 선언을 애플리케이션에 로드)
* docker run의 옵션들 vs. docker-compose.yml: 이미지에 붙이는 장식들(=인스턴스의 변수들)
* docker run vs. docker-compose up: 장식 붙은 이미지를 실제로 실행(=인스턴스 생성)

도커 컴포즈에서는 컨테이너 실행에 사용되는 옵션과 컨테이너 간 의존성을 모두 docker-compose.yml 파일에 적어두고, 
컴포즈용 명령어를 사용하여 컨테이너들을 실행, 관리합니다.

step4. docker compose 선행 조건
도커 엔진의 버전이 1.12.0 이상이어야 하고, docker-compose의 버전은 1.6.0 이상 이어야 합니다.

step5. docker-compose.yml

version: '2.1'

services:
  db:
    image: postgres:9.6.1
    volumes:
      - ./docker/data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=sampledb
      - POSTGRES_USER=sampleuser
      - POSTGRES_PASSWORD=samplesecret
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8
    healthcheck:
      test: "pg_isready -h localhost -p 5432 -q -U postgres"
      interval: 3s
      timeout: 1s
      retries: 10

  django:
    build:
      context: .
      dockerfile: ./compose/django/Dockerfile-dev
    environment:
      - DJANGO_DEBUG=True
      - DJANGO_DB_HOST=db
      - DJANGO_DB_PORT=5432
      - DJANGO_DB_NAME=sampledb
      - DJANGO_DB_USERNAME=sampleuser
      - DJANGO_DB_PASSWORD=samplesecret
      - DJANGO_SECRET_KEY=dev_secret_key
    ports:
      - "8000:8000"
    depends_on:
      db:
        condition: service_healthy
    links:
      - db
    command: ./start-dev.sh
    volumes:
      - ./:/app/

- version: '2.1'
docker-compose.yml 파일의 제일 윗부분에는 파일 규격 버전을 적습니다. 파일의 규격에 따라 지원하는 옵션이 달라지며, 
최근에 "3.1"이 등장하긴 했지만 보통은 "2"나 "2.1"을 사용해도 충분합니다.

- db
postgres 서비스의 이름을 db로 정하였습니다.

- image
image: postgres:9.6.1 db 서비스에서 사용할 도커 이미지를 적습니다. 여기서는 dockerhub의 공식 postgres:9.6.1 
이미지를 사용하였습니다.

- volumes
volumes:
- ./docker/data:/var/lib/postgresql/data

docker run과 다른 점은 docker-compose.yml의  volumes에는 상대 경로를 지정할 수 있다는 점이 다릅니다.
docker run으로 앱 컨테이너를 실행할 때와 마찬가지로, 프로젝트 루트 아래의  docker/data 디렉터리에 데이터를 저장
하기로 했습니다.

- environment

environment:
      - POSTGRES_DB=sampledb
      - POSTGRES_USER=sampleuser
      - POSTGRES_PASSWORD=samplesecret
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8

docker run에서 -e 옵션에 적었던 내용들입니다. 마지막의 POSTGRES_INITDB_ARGS 부분이 추가되었는데, 데이터베이스
서버의 인코딩을 설정하기 위함입니다.

- healthcheck

healthcheck:
      test: "pg_isready -h localhost -p 5432 -q -U postgres"
      interval: 3s
      timeout: 1s
      retries: 10
이는 postgres 컨테이너가 처음 실행되면서 데이터베이스나 사용자가 미처 생성되기 전에, 앱 컨테이너가 데이터베이스에
접근하려고 시도하기 때문입니다. 컴포즈에서도 마찬가지 문제가 발생하게 되는데요. 따라서 postgres 서비스가 제대로
실행될 뿐만 아니라 데이터베이스에 접근할 수 있는지도 파악을 해야 합니다.

healthcheck는 바로 이것을 제어할 수 있습니다. 검사에 사용할 명령(test)을 3초 간격(interval)으로 열 번 시도
(retries)하며, 각 시도에서 타임아웃은 1초(timeout)로 지정하였습니다.

여기서 사용한 pg_isready 명령은 데이터베이스 서버에 접근할 수 있는지를 파악합니다. (PostgreSQL 9.3부터 추가된
pg_isready 명령에 대해서는 PostgreSQL 문서의 pg_isready 부분을 참고하세요.)
조금 장황한 듯 하지만, 앞으로는 이 옵션들을 일일이 타이핑하지 않아도 된다는 점을 생각하며 앱 서비스로 넘어가겠습니다.

- build
build:
  context: .
  dockerfile: ./compose/django/Dockerfile-dev

db 서비스와 달리 앱 서비스는 도커 이미지를 빌드할 일이 잦기 때문에, 특정 이미지 대신 build 옵션을 추가합니다.
context는 docker build 명령을 실행할 디렉터리 경로라고 보시면 됩니다.

- app environment

environment:
      - DJANGO_DEBUG=True
      - DJANGO_DB_HOST=db
      - DJANGO_DB_PORT=5432
      - DJANGO_DB_NAME=sampledb
      - DJANGO_DB_USERNAME=sampleuser
      - DJANGO_DB_PASSWORD=samplesecret
환경 변수는 그냥 docker run을 할 때보다 좀더 자세하게 적었습니다. 각 값은 Django 설정 파일
(djangosample/settings.py)에서 사용합니다.

- ports
ports:
  - "8000:8000"
     도커 컴포즈로 서비스를 실행하면 기본적으로 가상의 네트워크가 하나 만들어지고, 네트워크 외부의 접근이 막힙니다.
      (도커 컨테이너가 그렇듯이요.) 따라서 외부에서 접근할 수 있는 포트를 지정해주어야 합니다. 여기서는 Django 개발
     서버의 기본 포트는 8000을 지정하였습니다.

- command
command: ./start-dev.sh
[start-dev.sh]
#!/bin/sh
python manage.py migrate
python manage.py runserver 0:8000

Django 마이그레이션을 따로 실행하기가 귀찮아서, 개발 서버 실행에 앞서 넣어두었습니다.
-> shell을 작성 한다 

- volumnes
volumes:
  - ./:/app/

step4. 수행
위의 디렉토리 접속 하여 정상 적으로 수행 되는지 확인.




Docker Compose Command

[ up -d ]
docker-compose.yml 파일의 내용에 따라 이미지를 빌드하고 서비스를 실행합니다. 자세한 진행 과정은 다음과 같습니다.

1. 서비스를 띄울 네트워크 설정
2. 필요한 볼륨 생성
3. 필요한 이미지 pull
4. 필요한 이미지 build
5. 서비스 의존성에 따라 서비스 실행
up 명령에 사용할 수 있는 몇 가지 옵션도 존재합니다.

-d : 서비스 실행 후 콘솔로 빠져나옵니다. (docker run에서의 -d와 같습니다.)
--force-recreate : 컨테이너를 지우고 새로 만듭니다.
--build : 서비스 시작 전 이미지를 새로 만듭니다.
[ stop, start ]
서비스를 멈추거나, 멈춰 있는 서비스를 시작합니다.

$ docker-compose stop
Stopping djangosample_django_1 ...
Stopping djangosample_db_1 ...

$ docker-compose start
Starting db ... done
Starting django ... done


[ down ]
서비스를 지웁니다. 컨테이너와 네트워크를 삭제하며, 옵션에 따라 볼륨도 지웁니다.

$ docker-compose down --volume
Removing myproject_django_1 ... done
Removing myproject_db_1 ... done
Removing network djangosample_default
Removing volume django_sample_db_dev

* --volume: 볼륨까지 삭제합니다.

[ exec ]
실행 중인 컨테이너에서 명령어를 실행합니다. 자동화된 마이그레이션용 파일 생성이나 유닛 테스트, lint
등을 실행할 때 사용합니다.

$ docker-compose exec django ./manage.py makemigrations
...

$ docker-compose exec node npm run test
> expresssample@0.1.0 test /www/service
> mocha $(find test -name '*.spec.js')
...

비슷한 명령으로 run이 존재합니다. run은 새 컨테이너를 만들어서 명령어를 실행합니다. docker run과 마찬가지로
--rm 옵션을 추가하지 않으면, 컨테이너가 종료된 후에도 삭제되지 않습니다.
(이런 이유 때문에 개인적으로는 exec를 선호합니다.)

[ logs ]
서비스의 로그를 확인할 수 있습니다. logs 뒤에 서비스 이름을 적지 않으면 도커 컴포즈가 관리하는 모든 서비스의
로그를 함께 보여줍니다.

$ docker-compose logs django
Attaching to djangosample_django_1
django_1     | System check identified no issues (0 silenced).
django_1     | February 13, 2017 - 16:32:28
django_1     | Django version 1.10.4, using settings 'djangosample.settings'
django_1     | Starting development server at http://0.0.0.0:8000/
django_1     | Quit the server with CONTROL-C.

* -f: 지금까지 쌓인 로그를 다 보여준 후에도 셸로 빠져나오지 않고, 로그가 쌓일 때마다 계속해서 출력합니다.


Docker Compose 팁

[ Docker Compose File 수정 ]
docker-compose.yml 파일을 수정하고 이를 서비스에 적용하려면 서비스를 멈추고(stop), 서비스를 지우고(rm),
서비스를 시작해야(up) 합니다. 하지만 up 명령만 실행해도, (현재 실행 중인 서비스 설정과 달라진 부분이 있다면) 알아서 
컨테이너를 재생성하고 서비스를 재시작해줍니다.

$ docker-compose up -d [<서비스 이름>]
혹시 컨테이너를 재생성하지 않는 것 같다면, --force-recreate 옵션을 붙이면 됩니다.

[ Dockerfile-dev 파일 수정 ]
Dockerfile-dev 파일을 수정했을 땐 build 명령을 사용하여 도커 이미지를 새로 만들어야 합니다. 이후 서비스
중지와 삭제, 재시작을 해야 하죠. 하지만 up 명령에 다음과 같이 --build 옵션을 넣으면 알아서 이미지를 새로 만들고 
서비스를 재시작합니다.

$ docker-compose up -d --build [<서비스 이름>]

[ Dockerfile-dev도 신경 써야 함 ]
개발용 Dockerfile과 배포용 Dockerfile이 따로 존재한다는 점을 꼭 기억해야 합니다. 간혹 Dockerfile만 고치면서
개발 환경에서 **'외않돼?'**라고 생각한 경우가 있습니다. ;;
(Dockerfile에도 다른 Dockerfile을 참조한다는 개념이 있으면 좋을 텐데... 싶습니다.)

[ 데이터베이스 내용 삭제 ]
열심히 개발하다 보면 데이터베이스에 원치 않는 데이터가 남는 경우가 있습니다. 데이터베이스에 접속해서 테이블을
삭제하거나 할 수도 있겠지만, down 명령에  --volume 옵션을 추가하면 서비스에서 사용하는 볼륨(=데이터베이스 데이
터가 저장되는 곳)을 삭제하기 때문에, 데이터베이스를 깨끗하게 초기화할 수 있습니다.

$ docker-compose down --volume

[ Goldilocks /  MySQL / PostgreSQL Start 성능 ]
로컬 컴퓨터에 데이터베이스 서버가 없어도, 서비스를 시작하기만 하면 알아서 데이터베이스 서버가 시작된다는 점은
굉장한 매력이었습니다. Goldilocks 5초 Mysql 5초 PostgreSQL 15초.

ERROR: 'No space left on device' ]
도커를 열심히 사용하고 있는데 갑자기 다음과 같은 메시지가 뜨면서 새 이미지를 빌드할 수 없다고 하더군요.
ERROR: 'No space left on device'
하드디스크에 용량이 엄청 많이 남아 있었는데도 말이죠. 부랴부랴 검색을 해보니, Docker for OS X에서 사용하는 가상
파일 시스템의 기본 최대 값이 64기가바이트여서 발생한 문제였습니다.
주의! 다음 내용을 진행하면 도커 이미지와 컨테이너, 볼륨이 모두 사라집니다.
이 경우 Docker for OS X의 환경 설정 Reset 버튼을 누르면 해결됩니다.

Goldilocks Cluster Docker Compose Create (v1.0)

step1. dirctory create

$ mkdir docker_example
$ cd docker_example

step2. file create
이 디렉토리에 script goldilocks_package 디렉토리를 만들고 goldilocks_package 에는 골디락스 package
라이센스 옮겨놓는다. 그리고 script 디렉토리에는 다음과 같은 CreateOrStartup.sh 라는 이름으로 다음과 같은
Shell 을 저장한다.
[ CreateOrStarup.sh ]

GOLDILOCKS_FULL_MEMBER_NAME=${GOLDILOCKS_CLUSTER_GROUP}${GOLDILOCKS_MEMBER_NAME}
gcreatedb --cluster --member=${GOLDILOCKS_FULL_MEMBER_NAME} \
--host=${GOLDILOCKS_CLUSTER_IP} \
--port=${GOLDILOCKS_CLUSTER_PORT}
gsql sys gliese --as sysdba << EOF
startup ;
ALTER SYSTEM OPEN GLOBAL DATABASE ;
COMMIT;
quit;
EOF
glsnr --start
tail -f $GOLDILOCKS_DATA/trc/system.trc

[ Docker File Create ]

# get centos 7 image
FROM centos:centos7

# perform update and install utilities
RUN yum update -y && yum install -y net-tools which

# declare Goldilocks environment variable
ENV GOLDILOCKS_HOME /goldilocks_home
ENV GOLDILOCKS_DATA /goldilocks_data
ENV PATH $PATH:$GOLDILOCKS_HOME/bin

# copy goldilocks_package directory to /goldilocks_package
ADD goldilocks_package /goldilocks_package

# copy script to /script
ADD script /script

# install
RUN cd /goldilocks_package && gzip -cd goldilocks*.tar.gz | tar xvf - >
/dev/null \
&& mv goldilocks-*/goldilocks_home .. \
&& mv goldilocks-*/goldilocks_data ..

# copy license
RUN cp /goldilocks_package/license $GOLDILOCKS_HOME/license/license

# Startup script
CMD ["/bin/bash","/script/CreateOrStartup.sh"]

# expose goldilocks port to host
EXPOSE 22581

다음과 같이 하면 파일 디렉토리가 아래와 같다.
.
├── Dockerfile
├── goldilocks_package
│ ├── goldilocks-server-venus.3.1.9-linux-x86_64.tar.gz
│ └── license
└── script
└── CreateOrStartup.sh

[ Docker-Compose Cluster 구성 ]
위의 방식은 Standalone을 만드는 구성 방식으로 이를 하나의 Cluster 로 묶어주기 위해서는 여러개의 Docker Container 를 
하나로 묶어주는 docker-compose 라는 방식을 써야만 한다.

docker-compose yaml 형식의 설정파일로 1by2를 자동으로 구성하기 위한 yaml 파일은 다음과 같다.
step1. docker-compose yaml file create
docker-compose.yaml ]
version: '2'

services :
#    g1n1 :
#        hostname : g1n1
#        build :
#            context: .
#            dockerfile : Dockerfile
#        environment :
#            - GOLDILOCKS_CLUSTER_IP=172.18.118.11
#            - GOLDILOCKS_CLUSTER_PORT=10101
#            - GOLDILOCKS_CLUSTER_GROUP=G1
#            - GOLDILOCKS_MEMBER_NAME=N1
#        image : goldilocks
#        volumes :
#            - "/etc/localtime:/etc/localtime:ro"
#        networks :
#            cluster_network :
#                ipv4_address : 172.18.118.11
#            service_network :
#                ipv4_address : 172.19.119.11
#        ports :
#            - "47562:22581"
  g1n1 :
      hostname: g1n1
      build :
          context : .
          dockerfile : Dockerfile
      environment :
          - GOLDILOCKS_CLUSTER_IP=172.18.118.11
          - GOLDILOCKS_CLUSTER_PORT=10101
          - GOLDILOCKS_CLUSTER_GROUP=G1
          - GOLDILOCKS_MEMBER_NAME=N1
      image: goldilocks
      volumes :
          - "/etc/localtime:/etc/localtime:ro"
      networks:
          cluster_network:
              ipv4_address: 172.18.118.11
          service_network:
              ipv4_address: 172.19.119.11
      ports:
          - "47562:22581"
  g1n2 :
      hostname: g1n2
      build :
          context : .
          dockerfile : Dockerfile
      environment :
          - GOLDILOCKS_CLUSTER_IP=172.18.118.12
          - GOLDILOCKS_CLUSTER_PORT=10101
          - GOLDILOCKS_CLUSTER_GROUP=G1
          - GOLDILOCKS_MEMBER_NAME=N2
      image: goldilocks
      volumes :
          - "/etc/localtime:/etc/localtime:ro"
      networks:
          cluster_network:
              ipv4_address: 172.18.118.12
          service_network:
              ipv4_address: 172.19.119.12
      ports:
          - "47563:22581"

networks :
  cluster_network:
      driver: bridge
      driver_opts:
          com.docker.network.enable_ipv6: "false"
      ipam:
          driver: default
          config:
          - subnet: 172.18.118.0/24
            gateway: 172.18.118.1
  service_network:
      driver: bridge
      driver_opts:
          com.docker.network.enable_ipv6: "false"
      ipam:
          driver: default
          config:
          - subnet: 172.19.119.0/24
            gateway: 172.19.119.1

하단의 network 섹션에서 이 Cluster 셋에서 사용할 network 설정을 지정한다. cluster_network 은 cluster 내부
에서 사용하는 cluster 망이고 service_network 은 service 단에서 사용할 망이다. 이렇게 cluster_network 설정을
분리해두면 Split brain 등의 테스트가 용이하기 때문에 일부러 분리하였다.

service 섹션은 각각의 docker container 가 기동되는 각각의 설정이고, 환경변수를 통해서 CLUSTER 네트웍 및
기타 설정들을 주입해준 것이라 보면 된다. 이 환경변수를 통해서 shell 에서 받아 DB 를 생성하고 startup 한다.
compose-file 까지 수행되었다면 아마 디렉토리 구성은 다음과 같을 것이다.

.
├── Dockerfile
├── docker-compose.yaml
├── goldilocks_package
│ ├── goldilocks-server-venus.3.1.9-linux-x86_64.tar.gz
│ └── license
└── script
└── CreateOrStartup.sh

[ Service Start ]
$ docker-compose build ## docker 설정이 변경되었다면 필요하다. 파일이 추가되었다.
$ docker-compose up


[ ERROR 현상 ]
1. compose build error
tech10:/home/son2865/work/docker/docker_example] docker-compose build
ERROR: The Compose file is invalid because:
Service g1n1 has neither an image nor a build context specified. At least one must be provided.
services :
    g1n1 :
        hostname : g1n1
        build :
            context: .
            dockerfile : /home/son2865/work/docker/docker_example/Dockerfile

-> 위의 에러는 context: .를 지정 하지 않았을 때 발생 하는 에러 이다. 

참고 : 그리고 docker-compose.ymal 관련 파일에 들여 쓰기를 잘해야 한다. 하지 않으면 오류가 발생 한다.


[ Docker Attach ]
$ docker exec -it dockerexample_g1n1_1 /bin/bash
[ Cluster 구성 ]
$ gsql sys gliese --as sysdba << EOF
CREATE CLUSTER GROUP G1 CLUSTER MEMBER G1N1 HOST '172.18.118.11' PORT 10101 ;
ALTER CLUSTER GROUP G1 ADD CLUSTER MEMBER G1N2 HOST '172.18.118.12' PORT 10101;
\q
EOF
[ Docker-compose Down ]
docker-compoase down

그 다음 또 사용하고 싶으면 up 명령으로 기동하면 된다. 이때 주의하여야할 것은 docker container 는 volatile
이라 재기동한다고 다시 깨끗하게 시작된다는 점이다. 어떤 경우는 이게 좋기도 한데, 어떤 경우는 이런 점이
불편할 수도 있다. 


[ Docker container 에 Persistent Storage 추가 ]

/goldilocks_data 디렉토리만 가지고 있으면 해당 goldilocks container 는 persistent 하다라고 말할 수 있다. 이
디렉토리를 host 쪽에 계속 저장하고 startup 할때 이 디렉토리의 내용을 읽어 startup 한다면 데이터 유실 없
이 계속 처리할 수 있을 것이고, 이 기능을 Docker 에서 지원한다.

일단 디렉토리를 만들어보자. data 디렉토리를 만들고 그 안에 g1n1, g1n2 디렉토리를 만든다.
.
├── Dockerfile
├── data
│ ├── g1n1
│ └── g1n2
├── docker-compose.yaml
├── goldilocks_package
│ ├── goldilocks-server-venus.3.1.9-linux-x86_64.tar.gz
│ └── license
└── script
└── CreateOrStartup.sh

위와 같이 만들었다면 docker-compose.yaml 파일을 다음과 같이 수정한다.
version: '2'

services :
#    g1n1 :
#        hostname : g1n1
#        build :
#            context: .
#            dockerfile : Dockerfile
#        environment :
#            - GOLDILOCKS_CLUSTER_IP=172.18.118.11
#            - GOLDILOCKS_CLUSTER_PORT=10101
#            - GOLDILOCKS_CLUSTER_GROUP=G1
#            - GOLDILOCKS_MEMBER_NAME=N1
#        image : goldilocks
#        volumes :
#            - "/etc/localtime:/etc/localtime:ro"
#        networks :
#            cluster_network :
#                ipv4_address : 172.18.118.11
#            service_network :
#                ipv4_address : 172.19.119.11
#        ports :
#            - "47562:22581"
  g1n1 :
      hostname: g1n1
      build :
          context : .
          dockerfile : Dockerfile
      environment :
          - GOLDILOCKS_CLUSTER_IP=172.18.118.11
          - GOLDILOCKS_CLUSTER_PORT=10101
          - GOLDILOCKS_CLUSTER_GROUP=G1
          - GOLDILOCKS_MEMBER_NAME=N1
      image: goldilocks
      volumes :
          - "/etc/localtime:/etc/localtime:ro"
          - ./data/g1n1:/goldilocks_data
      networks:
          cluster_network:
              ipv4_address: 172.18.118.11
          service_network:
              ipv4_address: 172.19.119.11
      ports:
          - "47562:22581"
  g1n2 :
      hostname: g1n2
      build :
          context : .
          dockerfile : Dockerfile
      environment :
          - GOLDILOCKS_CLUSTER_IP=172.18.118.12
          - GOLDILOCKS_CLUSTER_PORT=10101
          - GOLDILOCKS_CLUSTER_GROUP=G1
          - GOLDILOCKS_MEMBER_NAME=N2
      image: goldilocks
      volumes :
          - "/etc/localtime:/etc/localtime:ro"
          - ./data/g1n2:/goldilocks_data
      networks:
          cluster_network:
              ipv4_address: 172.18.118.12
          service_network:
              ipv4_address: 172.19.119.12
      ports:
          - "47563:22581"

networks :
  cluster_network:
      driver: bridge
      driver_opts:
          com.docker.network.enable_ipv6: "false"
      ipam:
          driver: default
          config:
          - subnet: 172.18.118.0/24
            gateway: 172.18.118.1
  service_network:
      driver: bridge
      driver_opts:
          com.docker.network.enable_ipv6: "false"
      ipam:
          driver: default
          config:
          - subnet: 172.19.119.0/24
            gateway: 172.19.119.1
주의 깊게 볼건 각각의 goldilocks container 마다 volumn 절에 설정이 하나씩 추가된것을 볼 수 있을 것이다. 이
설정은 만약 g1n1 container 가 뜬다면 /goldilocks_data 디렉토리는 host 의 ./data/g1n1 디렉토리로 마운트된
다는 것을 의미한다.

Dockerfile 도 좀 수정한다.
# get centos 7 image
FROM centos:centos7

# perform update and install utilities
#RUN yum update -y && yum install -y net-tools which
RUN yum update -y
RUN yum install -y net-tools which

# declare Goldilocks environment variable
ENV GOLDILOCKS_HOME /goldilocks_home
ENV GOLDILOCKS_DATA /goldilocks_data
ENV PATH $PATH:$GOLDILOCKS_HOME/bin

# copy goldilocks_package directory to /goldilocks_package
ADD goldilocks_package /goldilocks_package

# copy script to /script
ADD script /script

# install
RUN cd /goldilocks_package && gzip -cd goldilocks*.tar.gz | tar xvf - > /dev/null \
&& mv goldilocks-*/goldilocks_home .. \
&& mv goldilocks-*/goldilocks_data ../goldilocks_data_tmp

# copy license
RUN cp /goldilocks_package/license $GOLDILOCKS_HOME/license/license

# Startup script
#CMD ["/bin/bash","/scripts/CreateAndStart.sh"]
CMD ["/bin/bash","/script/CreateOrStartup.sh"]

# expose goldilocks port to host
EXPOSE 22581

위와 같이 설정한 이유는 docker-compose 에서 선언한 마운트 설정이 먹기 전에 dockerfile 이 먼저 수행되기
때문이다. 그래서 일단 임시 디렉토리에 복사하고 CreateOrStartup.sh 파일에서 원래대로 다시 복사해놓는 코
드를 넣어준다.

cp -R /goldilocks_data_tmp/* /goldilocks_data
GOLDILOCKS_FULL_MEMBER_NAME=${GOLDILOCKS_CLUSTER_GROUP}${GOLDILOCKS_MEMBER_NAME}
gcreatedb --cluster --member=${GOLDILOCKS_FULL_MEMBER_NAME} \
--host=${GOLDILOCKS_CLUSTER_IP} \
--port=${GOLDILOCKS_CLUSTER_PORT}
gsql sys gliese --as sysdba << EOF
startup ;
ALTER SYSTEM OPEN GLOBAL DATABASE ;
COMMIT;
quit;
EOF
glsnr --start
tail -f $GOLDILOCKS_DATA/trc/system.trc
맨 위에 한줄이 바로 복사해주는 코드이다. 이후 docker-compose up / down 을 통해서 data/g1n1 등의 디렉토리에 파일이 
제대로 생겼는지 확인해보고 실제 데이터가 Persistent 한지 확인한다.

<< docker-machine 1번째 >>

[ docker-machine 정의 ]
docker-machine은 가상 머신 같은 거라고 생각 하면 된다. 여러개의 컨테이너를 관리 함에 있어 가상머신
하나에 사용하고 싶은 도커 컨테이너를 묶어 docker-machine vm을 컨테이너 group 단위로 사용을 하는 것
으로 보인다.

[ 설치 ]
$ chmod +x /usr/local/bin/docker-machine
* 설치 후 버젼 확인
$ docker-machine -v 
machine version 0.3.0


* 도커 원격 설치
ssh를 사용하지 않고 원격서버의 Docker를 핸들링하기 위해서는 로컬에 Docker 클라이언트를 설치 해야 됩니다.
이미 boot2docker가 설치되어 있다면 설치 하지 않아도 무방할 듯 합니다.
--> 요거는 없어도 된다.

[ docker-machine 생성 및 사용 관리 ]

1. docker-machine 사은 가능 서버 검증
$ docker-machine ls 
NAME ACTIVE DRIVER STATE URL


2. docker-machine create --driver [드라이버][서버이름]
하나의 가상서버를 생성한다. vertualbox 이외에 여러개의 가상서버가 있다.
( amazonec2, azure, digitalocean, google )

$ docker-machine create --driver virtualbox dev

3. 가상서버 생성 확인.
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
dev    *        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.6   


4. 4코어/4GB의 digitalocean의 경우 아래와 같이 드라이버와 옵션을 지정해서 생성 가능합니다.
$ docker-machine create --driver digitalocean --digitalocean-access-token {토큰 지정} --digitalocean-region sgp1 --digitalocean-size 4gb dev
--> 요렇게 하면 될거 같은데 오류가 나서 수행을 해보지 않았다.

5. docker machine을 사용하기 위하여 host 지정.
$ eval "$(docker-machine env dev)"
--> 이제 docker-machine dev로 생성한 가상 서버에 접속을 한 것이고 해당 가상 서버에서 docker image 생성 같은 것을 하면 해당 docker-machine(dev)
vm에서만 생성을 하게 된다.
참고 :  Docker 호스트를 재기동 하거나 새로운 터미널창을 열었을 경우에는 매번 위의 명령을 실행하여야 합니다.


6. docker-machine active로 활성화된 호스트명
$ docker-machine active
dev

7. docker-machine vm 호스트 정보 확인.
$ docker-machine env dev  dev 서버의 정보를 확인 할 수 있습니다.
$ docker-machine env dev
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://172.16.62.130:2376"
export DOCKER_CERT_PATH="/Users/<your username>/.docker/machine/machines/dev"
export DOCKER_MACHINE_NAME="dev"
# Run this command to configure your shell:
# eval "$(docker-machine env dev)"

8. docker-machie(vm) dev에서 docker 컨테이너 생성

$ docker run busybox echo hello world
Unable to find image 'busybox' locally
Pulling repository busybox
e72ac664f4f0: Download complete
511136ea3c5a: Download complete
df7546f9f060: Download complete
e433a6c5b276: Download complete
hello world

9. 도커 호스트 아이피 확인
$ docker-machine ip dev 
192.168.99.100

10. 도커 호스트 컨테이너 실행
호스트에 nginx 웹서버를 실행하고 8000포트를 컨테이너의 80포트로 포워딩 합니다.

$ docker run -d -p 8000:80 nginx
docker-machine ip로 Docker 호스트의 ip를 받아온뒤 8000 포트로 접속하여 웹페이지가 정상적으로 보여지는지 확인 합니다.


11. docker host 정지, 시작
docker-machine stop dev
docker-machine start dev

12. docker-machine 삭제
docker-machine rm dev


13. 도움말
도커는 로컬컴퓨터의 vm 말고도 다양한 클라우드 서비스, 설치형 VM등을 사용할 수 있는데 드라이버형태로 지원하고 있다.
사용가능한 목록은 https://docs.docker.com/machine/drivers/에서 확인할 수 있다. 지원중인 드라이버 목록은 다음과 같다.
Amazon Web Services
Microsoft Azure
Digital Ocean
Exoscale
Google Compute Engine
Generic
Microsoft Hyper-V
OpenStack
Rackspace
IBM Softlayer
Oracle VirtualBox
VMware vCloud Air
VMware Fusion
VMware vSphere
각 드라이버별로 사용가능한 옵션이 차이가 있는데 docker-machine create –d virtualbox --help 이런 방식으로 create 명령에서 사용할 
드라이버를 선택한 다음에 --help 옵션을 사용하면 해당 드라이버에서 사용가능한 옵션들을 확인할 수 있다.
docker-machine create으로 도커에 몇가지 옵션들을 설정할 수 있다. docker-machine create –h 명령으로 사용가능한 옵션들을 확인할 수 
있는데 이중에서 --engine 으로 시작되는 옵션들은 vm을 생성할때 설치되는 도커를 설정하는 것들이다. --swarm으로 시작되는 옵션들도 
있는데 이건 도커 스웜(Docker Swarm)에서 사용하는 옵션들이다.
<< docker-machine 2번째 >>

1. what is docker machine
Docker Machine enables you to provision multiple remote Docker hosts on various flavors of Linux.
Docker Machine is a tool for provisioning and managing your Dockerized hosts (hosts with Docker Engine on them).

2. install docker machine

[ shell ]
#!/bin/bash

gh="https://github.com"gh_raw="https://raw.githubusercontent.com"repo="docker/machine"version="v0.14.0"arch=`uname -s`-`uname -m`

# now it is standard exec path for users.
mkdir -p $HOME/.local/bin

curl -fsSL -o $HOME/.local/bin/docker-machine \
$gh/$repo/releases/download/$version/docker-machine-$arch
chmod +x $HOME/.local/bin/docker-machine

# I use personal bash completion directory.for i in "-prompt" "-wrapper" ""; do
name="docker-machine$i.bash"
curl -fsSL -o $HOME/.bash_completion.d/$name \
$gh_raw/$repo/$version/contrib/completion/bash/$namedone
--> 실제 curl로 docker-machine를 가져온다.

참고 : 

- linux
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo install /tmp/docker-machine /usr/local/bin/docker-machine
앞의 몇 줄에서 변수를 설정하는 것은 크게 설명할 것이 없으니 잊고, 첫번째 curl 부터가 설치 과정의 설명으로써 의미가 있다. Docker Machine의 경우, 
Docker 공식 Download 페이지가 아닌 Github에서 Release로 배포하고 있으며, 위와 같이 curl 명령을 사용해서 간단하게 내려받을 수 있다.

Docker Machine은 Docker Engine 처럼 시스템 권한으로 동작하는 서비스가 아니라 사용자가 사용하는 도구, Tool이다. 그래서, 만약 이 도구의 사용자가 
나 혼자라면 구태여 /usr, /usr/local, /opt 등의 시스템 경로에 설치할 필요가 없다. 그래서, 내 경우에는 근래에 개인용 실행파일(Executable)을 담는 
공간으로 애용되는 $HOME/.local/bin에 설치했다. (공식 문서에서는 /usr/local에 설치하는 것으로 설명하고 있지만, 꼭 그럴 필요는 없다는 말이다.)

두 번째 단락은 사용을 편하게 하기 위해서 Bash Auto Completion을 구성하는 부분인데, 이 스크립트에서 사용된 경로는 내가 개인적으로 사용하는 방식을 
따르는 것이기 때문에 동작하지 않을 수 있다. 일반적으로는, $HOME/.bash_completion.d 아래가 아닌 /etc/bash_completion.d에 넣어야 한다.

명확하게 스크립트를 이용해서 설명하다 보니, 쉘스크립트에 익숙하지 않다면 더 복잡하게 느껴질 수가 있겠다. 간단히 말하면, 그냥 Github에서 받아서 
적당한 경로에 넣으면 끝난다.


아무튼, 위의 스크립트를 돌려 Docker Machine을 설치하였고, 원하는 위치에 정상적으로 설치되었는지 확인해 보았다.
$ ./docker-machine.sh
$ which docker-machine
/home/sio4/.local/bin/docker-machine
$ docker-machine version
docker-machine version 0.14.0, build 89b8332
$
위와 같이, 설치는 아무런 출력 없이 끝났고, (파일이 20MB가 넘기 때문에 약간 시간이 걸릴 수 있다.) 명령어의 위치를 which로 확인해보니, 원하는 곳에 
잘 들어갔다. 그리고 docker-machine version을 실행했더니, 위와 같이 버전이 0.14.0이고, Build 번호가 89b8332이라고 말하고 있다. 잘 끝났다는 뜻이다.
Bash Auto Completion도 잘 되는지 보자. 먼저 파일이 잘 들어왔는지 보고,
$ ls ~/.bash_completion.d
docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
$
실제로 동작하는지 보자. (아! 이건 Bash가 기동될 때 읽어지므로 쉘을 다시 열어야 한다. 대부분의 경우가 그렇겠지만 내 경우, Login Shell이 아니더라도 
읽어오도록 설정되어 있으므로 Login을 다시 할 필요는 없고 Shell만 다시 열면 된다.)

3. provision docker node on the cloud
이제 Docker Machine을 My Computer에 설치했다면, Docker Node, Dockerized Host, 뭐라 부르든 그것을 Someone else’s Computer에 
설치할 차례다.

There is no cloud. It’s just someone else’s computer.

Docker Machine은 Amazon Web Service, MS Azure, Google Compute Engine 등의 주요 클라우드 컴퓨팅 서비스를 비롯해서, OpenStack, VMware vSphere, 
그리고 VirtualBox 등의 설치형 가상환경에 이르는 다양한 환경을 지원한다. 이러한 기반 환경의 지원은 각각에 대한 Driver를 통해서 제공되는데, 겉으로 
보이는 부분만 보면, 최초에 Node를 생성할 때에만 이 Driver를 지정해주면 된다. 일단 각각의 환경에 따른 API를 사용하여 VM을 만들고 나면, SSH를 통하여 
시스템을 제어하거나 Docker API를 이용하여 Docker의 기능을 활용하게 되며, 다양한 기반에 설치된 Docker Node 들을 기반에 대한 구분이나 고려 없이 한방에 
관리할 수 있게 된다.

4. provision docker node on soft layer
이 글에서는 SoftLayer라는 이름으로 더 잘 알려진 IBM Cloud IaaS 서비스를 활용하여 Docker Node를 배포하려고 한다. 이 환경에 대한 
Driver는 softlayer라는 이름으로 제공된다.

[ Create a Node ]
먼저, 아래와 같이 docker-machine create 명령을 이용하면 VM을 생성하고 그 위에 Docker Engine을 구성하는 과정을 자동으로 처리해준다.
$ docker-machine create --driver softlayer --softlayer-user tony.stark --softlayer-api-key <my_api_key> --softlayer-hostname worker01 --softlayer-domain example.com --softlayer-cpu 2 --softlayer-memory 2 --softlayer-network-max-speed 1000 --softlayer-region seo01 --softlayer-hourly-billing worker01
Creating CA: /home/sio4/.docker/machine/certs/ca.pem
Creating client certificate: /home/sio4/.docker/machine/certs/cert.pem
Running pre-create checks...
Creating machine...
(worker01) Creating SSH key...
(worker01) SSH key worker01 (1094969) created in SoftLayer
(worker01) Getting Host IP
(worker01) Waiting for host to become available
(worker01) Waiting for host setup transactions to complete
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with ubuntu(systemd)...
Installing Docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env worker01
맨 첫 두 줄의 출력, Creating CA 등은 맨 처음 Docker Machine을 실행했기 때문에 나오는 줄이며, 그 이후의 줄은 클라우드 서비스에 API로 접속하여 VM을 
만들고, SSH Key를 만들어 넣어 접속이 가능하도록 설정하고, VM이 완전히 배치되기를 기다렸다가 Docker Engine을 설치하는 과정을 차례대로 표시하고 있다.
<< docker help command >>
[ goldilocks image hub push ]
sudo docker commit -a "sunjesoft <technet@sunjesoft.com>" -m "add goldilocks.txt" centosg son2865/goldilocks:0.1
sudo docker login(son2865/28650103)
$>docker push son2865/goldilocks:0.1


[ hub docker pull ]
ip-172-31-24-180:/home/sunje] sudo docker pull son2865/cluster_goldilocks:1.1

ip-172-31-24-180:/home/sunje] sudo docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE

[ 컨테이너 생성 ]
son2865/cluster_goldilocks   1.1                 d232eaef3ea4        7 weeks ago         2.3GB
sudo docker run -i -t --name goldilocks1 son2865/cluster_goldilocks:1.1
docker run <option> <image name> <execute file>.
docker ps -a

[ 컨네이터 HELP ]
sudo docker start hello
sudo docker restart hello
sudo docker attach hello //컨테이너 접속
sudo docker stop hello //stop 명령으로 컨테이너 정지하기
sudo docker rm hello // 컨테이너 삭제
sudo docker rmi ubuntu:latest(<image name>:<tag>) // 이미지 삭제
sudo docker exec -it g2n1 /bin/bash //docker 컨테이너로 들어가는 방법.
docker exec -u 0 -it goldilocks /bin/bash // 컨테이너 root로 들어가기
docker exec -u sunje -it goldilocks /bin/bash // 컨테이너 sunje로 들어가기
dpcler ... --volume=/home/son2865/work/docker/block-chain/product_disk:/home/sunje/product --privileged //컨테이너 docker volumne 권한  privileged  주기.
docker logs -f goldilocks //컨테이너 start 처리 후 log를 살펴본다.
sudo docker inspect hello-nginx //docker image 좀더 세부적으로 활용하기.
docker logs -f goldilocks // goldilocks lgos 볼 수 있다.
sudo docker search centos // docker image search



[ docker port 여러개 사용하기 ]
1. dockerfile에서 동사 expose를 사용하여 여러 포트를 노출 할 수 있습니다.
ex) expose 3000 80 443 22

2. 그런다음 위의 dockerfile 기반으로 새 이미지를 작성 dockerfile 합니다.
ex) docker build -t foo:tag .

3. 그런 다음 -p를 사용하여 Dockerfile expose에 정의 된대로 호스트 포트를 컨테이너 포트와 매핑 할 수
있습니다.
ex) docker run -p 3001:3000 -p 23:22

일련의 연속 포트를 공개하려는 경우 다음과 같이 도커를 실행 할 수 있스빈다.
ex) docker run -it -p 7100-7120:7100-7120/tcp


sudo docker run -it --rm -p 20101-20108:20101-20108 -p 22582:22852 --volume=/home/sunje/work/docker_disk:/home/son2865/shrad_data --name g1n1 son2865/cluster_goldilocks:1.1
sudo docker run -it --rm -p 20101-20108:20101-20108 -p 22582:22852 --volume=/home/sunje/work/docker_disk:/home/son2865/shrad_data --name g2n1 son2865/cluster_goldilocks:1.1

참고 : PORT -> 31004(외부포트):31004(컨테이너포트) 외부에서는 31004로 접속이 가능하다.
       VOLUME -> 내부 공유볼륨 : 외부 공유볼륨

[ docker none images 삭제 ]
docker 이미지를 빌드하다보면 none(untagged) 이미지가 많이 생성된다. 다른 이미지까지 삭제하지 않고 none
이미지만 삭제하고 싶은 경우가 있다.

- untagged 이미지만 조회
  docker images -f "dangling=true" -q
- untagged 이미지만 삭제
  docker rmi $(docker images -f "dangling=true" -q)

[ Docker ps ]
현재 실행중인 docker container들을 볼 수 있다. (마치 ps 커맨드 처럼)
-a 옵션을 설정하면 실행되었다 멈춘 컨테이너 들도 나열된다.
-l 옵션을 설정하면 가장 최근의 컨테이너 정보가 나열된다 (가장 최근에 시작되었거나 멈추어진 컨테이너).
-q: returns container IDs only

[ Logging ]
- Logs 커맨드
docker logs daemonized_container

- tail 커맨드 처럼 -f 옵션을 설정해서 tailing이 가능하다.
docker logs -f demonized_container

--tail 옵션으로 log의 부분만 볼 수 있다.
docker logs --tail 10 daemonized_container

-t: 각 로그에 timestamp가 추가된다. 디버깅에 용이하다.
docker logs -ft daemonized_container

--log-driver
syslog 로 설정하면 docker logs 커맨드는 disable되고 모든 로그는 Syslog로 redirect된다.
docker run --log-driver="syslog" --name daemonized_container -d <docker_image>

none: 로깅을 disable 한다.


[ Docker Process Inspection ]
- docker top
docker top daemonized_container

- docker stats
docker stats daemonized_container


[ Docker Container Inspection ]
- docker inspect command
  -f or --format option to selectively query the inspect results
  docker inspect --format='{{.NetworkSettings.IPAddress }}' daemonized_container

[ To run additional process inside a running containe ]
- docker exec
  docker exec -d daemonized_container touch /etc/new_config_file

[ To stop & kill docker container ]
docker stop: sends a SIGTERM signal.
docker kill: sends a SIGKILL signal.

[ To delete a container ]
- docker rm
- To delete all docker container:
  docker rm -f `sudo docker ps -a -q`

the -f flag forces to delete any running containers.
If you want to protect running containers, omit the flag.

[ Automatic restart ]
--restart flag 설정으로 docker container가 멈추었을때 다시 자동으로 시작하게 할 수 있다.
- no: do not automatically restart the container. (the default)
- on-failure: restart the container if it exits due to an error, which manifests as a non-zero exit code.
- This flag also accepts an optional restart count: --restart=on-failure:5
- unless-stopped: restart the container unless it is explicitly stopped or Docker itself is stopped or restarted.
- always: always restart the container if it stops.
<< Docker Error >>
[ locale error ]
[root@9bd871ad739c /]# su - son2865
Last login: Wed Aug 29 09:04:21 KST 2018 on pts/0
-bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_COLLATE: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_MESSAGES: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_NUMERIC: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_TIME: cannot change locale (en_US.UTF-8): No such file or directory

--> user 생성 후 docker에서 위와 같은 오류가 발생 한다. utf8이 설치가 안되서이다.
root에서 localedef -v -c -i en_US -f UTF-8 en_US.UTF-8 위과 같이 하여 설치한다.

[son2865@9bd871ad739c ~]$ locale -a
C
en_US.utf8
POSIX


[ docker push error ]
1. error 
localhost.localdomain:/home/son2865/work/docker/docker_file_standalone_v1.1] docker push son2865/goldilocks_standalone:1.1
....
denied: requested access to the resource is denied

2. 해결
- docker login 
  sudo 로 login 하지 않고 user에서 걍 login 했더니 되었다.

- 처리
localhost.localdomain:/home/son2865/work/docker/docker_file_standalone_v1.1] docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: son2865
Password:
WARNING! Your password will be stored unencrypted in /home/son2865/.docker/config.json.
Configure a credential helper to remove this warning. See

[ docker-machine error ]
1. error
docker-machine create 할 때 오류 발생.

docker:/home/son2865/work/docker/docker_machine_v1.0] docker-machine create --driver virtualbox dev
Running pre-create checks...
Error with pre-create check: "VirtualBox is configured with multiple host-only adapters with the same IP \"192.168.99.1\". Please remove one"

2. 오류 내용
여러개의 host adapter가 ip 하나를 공용으로 사용 하고 있기에 오류가 발생 하였다.

3. 오류 확인
docker:/home/son2865/work/docker/docker_machine_v1.0] VBoxManage list -l hostonlyifs
Name:            vboxnet0
GUID:            786f6276-656e-4074-8000-0a0027000000
DHCP:            Disabled
IPAddress:       192.168.99.1
NetworkMask:     255.255.255.0
IPV6Address:     
IPV6NetworkMaskPrefixLength: 0
HardwareAddress: 0a:00:27:00:00:00
MediumType:      Ethernet
Status:          Down
VBoxNetworkName: HostInterfaceNetworking-vboxnet0

Name:            vboxnet1
GUID:            786f6276-656e-4174-8000-0a0027000001
DHCP:            Disabled
IPAddress:       192.168.99.1
NetworkMask:     255.255.255.0
IPV6Address:     fe80:0000:0000:0000:0800:27ff:fe00:0001
IPV6NetworkMaskPrefixLength: 64
HardwareAddress: 0a:00:27:00:00:01
MediumType:      Ethernet
Status:          Up
VBoxNetworkName: HostInterfaceNetworking-vboxnet1

4. 위에서 vboxnet1 를 삭제 한다.
docker:/home/son2865/work/docker/docker_machine_v1.0] VBoxManage hostonlyif remove vboxnet1
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
docker:/home/son2865/work/docker/docker_machine_v1.0] VBoxManage list -l hostonlyifs
Name:            vboxnet0
GUID:            786f6276-656e-4074-8000-0a0027000000
DHCP:            Disabled
IPAddress:       192.168.99.1
NetworkMask:     255.255.255.0
IPV6Address:     
IPV6NetworkMaskPrefixLength: 0

Docker Option
-a, --attach=[]: 컨테이너에 표준 입력(stdin), 표준 출력(stdout), 표준 에러(stderr)를 연결합니다.
    --attach=”stdin”
    --add-host=[]: 컨테이너의 /etc/hosts에 호스트 이름과 IP 주소를 추가합니다.
    --add-host=hello:192.168.0.10
-c, --cpu-shares=0: CPU 자원 분배 설정입니다. 설정의 기본 값은 1024이며 각 값은 상대적으로 적용됩니다.
    --cpu-shares=2048처럼 설정하면 기본 값 보다 두 배 많은 CPU 자원을 할당합니다.
      이 설정 값은 리눅스 커널의 cgroups에서 사용됩니다.
--cap-add=[]: 컨테이너에서 cgroups의 특정 Capability를 사용합니다. ALL을 지정하면 모든 Capability를 사용합니다.
    --cap-add=”MKNOD” --cap-add=”NET_ADMIN”처럼 설정합니다. 모든 Capability 목록은 다음 링크를 참조하기 바랍니다.
--cap-drop=[]: 컨테이너에서 cgroups의 특정 Capability를 제외합니다.
--cidfile=””: cid 파일 경로를 설정합니다. cid 파일에는 생성된 컨테이너의 ID가 저장됩니다.
--cpuset=””: 멀티코어 CPU에서 컨테이너가 실행될 코어를 설정합니다.
  --cpuset=”0,1”처럼 설정하면 첫 번째, 두 번째 CPU 코어를 사용합니다.
  --cpuset=”0-3”처럼 설정하면 첫 번째 CPU 코어부터 네 번째까지 사용합니다.
-d, --detach=false: Detached 모드입니다. 보통 데몬 모드라고 부르며 컨테이너가 백그라운드로 실행됩니다.
--device=[]: 호스트의 장치를 컨테이너에서 사용할 수 있도록 연결합니다. <호스트 장치>:<컨테이너 장치> 형식입니다.
  --device=”/dev/sda1:/dev/sda1”처럼 설정하면 호스트의 /dev/sda1 블록 장치를 컨테이너에서도 사용할 수 있습니다.
--dns=[]: 컨테이너에서 사용할 DNS 서버를 설정합니다.
  --dns=”8.8.8.8”
  --dns-search=[]: 컨테이너에서 사용할 DNS 검색 도메인을 설정합니다.
  --dns-search=”example.com”처럼 설정하면 DNS 서버에 hello를 질의할 때 hello.example.com을 먼저를 찾습니다.
-e, --env=[]: 컨테이너에 환경 변수를 설정합니다. 보통 설정 값이나 비밀번호를 전달할 때 사용합니다.
  -e MYSQL_ROOT_PASSWORD=examplepassword
--entrypoint=””: Dockerfile의 ENTRYPOINT 설정을 무시하고 강제로 다른 값을 설정합니다.
  --entrypoint=”/bin/bash”
--env-file=[]: 컨테이너에 환경 변수가 설정된 파일을 적용합니다.
  --env-file=”/etc/environment”
--expose=[]: 컨테이너의 포트를 호스트와 연결만 하고 외부에는 노출하지 않습니다.
  --expose=”3306”
-h, --hostname=””: 컨테이너의 호스트 이름을 설정합니다.
-i, --interactive=false: 표준 입력(stdin)을 활성화하며 컨테이너와 연결(attach)되어 있지 않더라도 표준 입력을 유지합니다. 보통 이 옵션을 사용하여 Bash에 명령을 입력합니다.
--link=[]: 컨테이너끼리 연결합니다. <컨테이너 이름>:<별칭> 형식입니다.
  --link=”db:db”
--lxc-conf=[]: LXC 드라이버를 사용한다면 LXC 옵션을 설정할 수 있습니다.
  --lxc-conf=”lxc.cgroup.cpuset.cpus = 0,1”
-m, --memory=””: 메모리 한계를 설정합니다. <숫자><단위> 형식이며 단위는 b, k, m, g를 사용할 수 있습니다.
  --memory=”100000b”
  --memory=”1000k”
  --memory=”128m”
  --memory=”1g”
  --name=””: 컨테이너에 이름을 설정합니다.
--net=”bridge”: 컨테이너의 네트워크 모드를 설정합니다.
  bridge: Docker 네트워크 브리지에 새 네트워크를 생성합니다.
  none: 네트워크를 사용하지 않습니다.
  container:<컨테이너 이름, ID>: 다른 컨테이너의 네트워크를 함께 사용합니다.
  host: 컨테이너 안에서 호스트의 네트워크를 그대로 사용합니다. 호스트 네트워크를 사용하면 D-Bus를 통하여 호스트의 모든 시스템 서비스에 접근할 수 있으므로 보안에 취약해집니다.
-P, --publish-all=false: 호스트에 연결된 컨테이너의 모든 포트를 외부에 노출합니다.
-p, --publish=[]: 호스트에 연결된 컨테이너의 특정 포트를 외부에 노출합니다. 보통 웹 서버의 포트를 노출할 때 주로 사용합니다.
  <호스트 포트>:<컨테이너 포트> 예) -p 80:80
  <IP 주소>:<호스트 포트>:<컨테이너 포트> 호스트에 네트워크 인터페이스가 여러 개이거나 IP 주소가 여러 개 일 때 사용합니다. 예) -p 192.168.0.10:80:80
  <IP 주소>::<컨테이너 포트> 호스트 포트를 설정하지 않으면 호스트의 포트 번호가 무작위로 설정됩니다. 예) -p 192.168.0.10::80
  <컨테이너 포트> 컨테이너 포트만 설정하면 호스트의 포트 번호가 무작위로 설정됩니다. 예) -p 80
--privileged=false: 컨테이너 안에서 호스트의 리눅스 커널 기능(Capability)을 모두 사용합니다.
--restart=””: 컨테이너 안의 프로세스 종료 시 재시작 정책을 설정합니다.
  no: 프로세스가 종료되더라도 컨테이너를 재시작하지 않습니다. 예) --restart=”no”
  on-failure: 프로세스의 Exit Code가 0이 아닐 때만 재시작합니다. 재시도 횟수를 지정할 수 있습니다. 횟수를 지정하지 않으면 계속 재시작합니다. 예) --restart=”on-failure:10”
  always: 프로세스의 Exit Code와 상관없이 재시작합니다. 예) --restart=”always”
--rm=false: 컨테이너 안의 프로세스가 종료되면 컨테이너를 자동으로 삭제합니다. -d 옵션과 함께 사용할 수 없습니다.
--security-opt=[]: SELinux, AppArmor 옵션을 설정합니다.
  --security-opt=”label:level:TopSecret”
--sig-proxy=true: 모든 시그널을 프로세스에 전달합니다(TTY 모드가 아닐 때도). 단 SIGCHLD, SIGKILL, SIGSTOP 시그널은 전달하지 않습니다.
-t, --tty=false: TTY 모드(pseudo-TTY)를 사용합니다. Bash를 사용하려면 이 옵션을 설정해야 합니다. 이 옵션을 설정하지 않으면 명령을 입력할 수는 있지만 셸이 표시되지 않습니다.
-u, --user=””: 컨테이너가 실행될 리눅스 사용자 계정 이름 또는 UID를 설정합니다.
-v, --volume=[]: 데이터 볼륨을 설정입니다. 호스트와 공유할 디렉터리를 설정하여 파일을 컨테이너에 저장하지 않고 호스트에 바로 저장합니다. 호스트 디렉터리 뒤에 :ro, :rw를 
  붙여서 읽기 쓰기 설정을 할 수 있으며 기본 값은 :rw입니다. 자세한 내용은 ‘6.4 Docker 데이터 볼륨 사용하기’를 참조하기 바랍니다.
  <컨테이너 디렉터리> 예) -v /data
  <호스트 디렉터리>:<컨테이너 디렉터리> 예) -v /data:/data
  <호스트 디렉터리>:<컨테이너 디렉터리>:<ro, rw> 예) -v /data:/data:ro
  <호스트 파일>:<컨테이너 파일> 예) -v /var/run/docker.sock:/var/run/docker.sock
--volumes-from=[]: 데이터 볼륨 컨테이너를 연결하며 <컨테이너 이름, ID>:<ro, rw> 형식으로 설정합니다. 기본적으로 읽기 쓰기 설정은 -v 옵션의 설정을 따릅니다. 자세한 내용은 
  ‘6.5 Docker 데이터 볼륨 컨테이너 사용하기’를 참조하기 바랍니다.
--volumes-from=”hello”
--volumes-from=”hello:ro”처럼 설정하면 데이터 볼륨을 읽기 전용으로 사용합니다.
--volumes-from=”hello:rw”처럼 설정하면 데이터 볼륨에 읽기 쓰기 모두 할 수 있습니다.
-w, --workdir=””: 컨테이너 안의 프로세스가 실행될 디렉터리를 설정합니다.
--workdir=”/var/www












'sunjesoft > Goldilocks Util' 카테고리의 다른 글

Goldilocks 넷볼트(백업 솔루션)  (0) 2019.06.18
Goldilocks 쿠버네티스  (0) 2019.06.12
GOLDILOKCS HADOOP  (0) 2019.06.10
GOLDILOCKS ODBC 설치  (0) 2019.01.30
Goldilocks PPC64LE 설치 및 IBM 설정  (0) 2019.01.18