도커를 다시 하니 개념이 없어서 다시 개념을 잡기 위해서 무한 링크.. 


docker network, docker container, docker client cli, docker image, docker data volumns, docker rest api, docker daemon


출처 : https://docs.docker.com/engine/docker-overview/#what-can-i-use-docker-for




docker client, docker host, docker object, docker daemon, docker container, docker image, docker registry

출처 : https://docs.docker.com/engine/docker-overview/#the-docker-platform


namespace 


출처 : http://prog3.com/sbdm/blog/shlazww/article/details/47284675

https://success.docker.com/KBase/Introduction_to_User_Namespaces_in_Docker_Engine








veth, docker networking



출처 : http://www.linuxjournal.com/content/concerning-containers-connections-docker-networking








bridged, host mode, macvlan bridge mode, ipvlan mode 



출처 : http://www.abusedbits.com/2016/09/docker-host-networking-modes.html












libcontainer, libvirt, lxc, systemd-nspawn


출처: https://itechcraft.com/docker-containers-microservice-architecture/





aufs, lvm, zfs, rootfs, bootfs, 


출처 : https://image.slidesharecdn.com/bonamico-codemotion-docker-2014-2-141129035905-conversion-gate01/95/codemotiondocker2014-10-638.jpg?cb=1417233667




Posted by '김용환'
,



카산드라 모니터링 메트릭 

- cassandra 3.0부터는 ops center가 없기 때문에 devops가 잘 살펴봐야 한다. 



https://www.datadoghq.com/blog/how-to-monitor-cassandra-performance-metrics/


https://github.com/QuentinAmbard/cassandra-troubleshooting


https://wiki.apache.org/cassandra/Metrics


https://www.datadoghq.com/blog/how-to-collect-cassandra-metrics/


http://www.datastax.com/dev/blog/pluggable-metrics-reporting-in-cassandra-2-0-2


Posted by '김용환'
,

soscon 2017 후기

scribbling 2017. 10. 28. 07:22




http://www.soscon.net/schedule.do를 다녀왔고 후기를 적는다.


http://www.soscon.net/pdf/day1_1530_3.pdf

# 부럽다. 9x년대생, 행복해 보여요.


http://www.soscon.net/pdf/day1_1330_3.pdf

# AI + Cloud !!


http://www.soscon.net/pdf/day1_1430_1.pdf

# java redis client https://github.com/lettuce-io/lettuce-core


http://www.soscon.net/pdf/day1_1630_2.pdf

# hive2 좋아지네


http://www.soscon.net/pdf/day2_1000_1.pdf

# 대단!, 존경!


http://www.soscon.net/pdf/day2_1430_3.pdf

# webidl이 생겼구나


http://www.soscon.net/pdf/day2_1530_3.pdf

# openwhisk가 있구나


http://www.soscon.net/pdf/day2_1630_2.pdf

# openstack-helm을 사용하여 쿠버네티스로 오픈 스택을 관리할 수 있네.

Posted by '김용환'
,


맥에서 도커 컨테이너 실행 시, 포트 연결이 안될 수 있다. 내부망 172.17.x.x 대역을 사용하는 환경에서 이슈가 존재한다. 도커는 디폴트로 172.17.0.0/16 대역을 사용하고 있다. 



gateway가 172.17.0.1이고 IPAddress가 172.17.0.2이라면 도커 컨테이너 실행시 포트 포워딩한다 해도 로컬 호스트에서 도커 포트로 연결이 안되는 문제가 발생된다. 


도커 기본 네트워크 환경을 변경한다. 다음 처럼 도커 기본 네트워크를 172.17.x.x. 대역이 아닌 192.168.x.x 대역으로 기본 구성을 변경한다. 


# cd ~/Library/Containers/com.docker.docker/Data/database

# git reset HEAD com.docker.driver.amd64-linux

Unstaged changes after reset:

D com.docker.driver.amd64-linux/disk/compact-after

D com.docker.driver.amd64-linux/disk/on-flush

D com.docker.driver.amd64-linux/disk/path

D com.docker.driver.amd64-linux/disk/size

D com.docker.driver.amd64-linux/disk/trim

D com.docker.driver.amd64-linux/etc/docker/daemon.json

D com.docker.driver.amd64-linux/etc/hostname

D com.docker.driver.amd64-linux/etc/ssl/certs/ca-certificates.crt

D com.docker.driver.amd64-linux/etc/sysctl.conf

D com.docker.driver.amd64-linux/expose-docker-socket

D com.docker.driver.amd64-linux/filesystem

D com.docker.driver.amd64-linux/hypervisor

D com.docker.driver.amd64-linux/insecure-registry

D com.docker.driver.amd64-linux/memory

D com.docker.driver.amd64-linux/memoryMiB

D com.docker.driver.amd64-linux/mounts

D com.docker.driver.amd64-linux/native/boot-protocol

D com.docker.driver.amd64-linux/native/port-forwarding

D com.docker.driver.amd64-linux/native/uefi-boot-disk

D com.docker.driver.amd64-linux/ncpu

D com.docker.driver.amd64-linux/network

D com.docker.driver.amd64-linux/on-sleep

D com.docker.driver.amd64-linux/proxy-system/exclude

D com.docker.driver.amd64-linux/proxy-system/http

D com.docker.driver.amd64-linux/proxy-system/https

D com.docker.driver.amd64-linux/proxy-verbose

D com.docker.driver.amd64-linux/proxy/exclude

D com.docker.driver.amd64-linux/proxy/http

D com.docker.driver.amd64-linux/proxy/https

D com.docker.driver.amd64-linux/proxy/mode

D com.docker.driver.amd64-linux/schema-version

D com.docker.driver.amd64-linux/slirp/dns

D com.docker.driver.amd64-linux/slirp/docker

D com.docker.driver.amd64-linux/slirp/domain

D com.docker.driver.amd64-linux/slirp/host

D com.docker.driver.amd64-linux/slirp/max-connections

D com.docker.driver.amd64-linux/slirp/mtu

D com.docker.driver.amd64-linux/state/last-shutdown-time

D com.docker.driver.amd64-linux/state/last-start-time

D com.docker.driver.amd64-linux/upgrade/experimental-debug

D com.docker.driver.amd64-linux/vmnet-simulate-failure


# git checkout -- com.docker.driver.amd64-linux


# vi com.docker.driver.amd64-linux/etc/docker/daemon.json

// {"debug":true,"experimental":true} 이렇게 되어 있는데.. 다음처럼 추가한다. 

{"debug":true,"experimental":true, "bip":"192.168.5.1/24"}



그 다음 Docker for mac 프로세스를 재시작한다. 



이제 확인해보자. 최신 docker를 사용 중인지 확인하고 테스트할 도커 이미지를 실행한다. 테스트할 도커 이미지는 springcloud/eureka이다. 



$ docker version

Client:

 Version:      17.09.0-ce

 API version:  1.32

 Go version:   go1.8.3

 Git commit:   afdb6d4

 Built:        Tue Sep 26 22:40:09 2017

 OS/Arch:      darwin/amd64


Server:

 Version:      17.09.0-ce

 API version:  1.32 (minimum version 1.12)

 Go version:   go1.8.3

 Git commit:   afdb6d4

 Built:        Tue Sep 26 22:45:38 2017

 OS/Arch:      linux/amd64

 Experimental: true

 





참고로 도커 컨테이너를 포그라운드 데몬하고 싶다면 다음 방식을 사용한다. 포트가 8761포트로 뜬 지 확인한다. 


이렇게 하면 포트 포워딩이 되지 않는다.


$ docker run springcloud/eureka

..

2017-10-20 02:35:42.958  INFO 1 --- [       Thread-4] c.n.eureka.PeerAwareInstanceRegistry     : Adding replica node: http://localhost:8761/eureka/

2017-10-20 02:35:43.025  INFO 1 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8761 (http)

2017-10-20 02:35:43.028  INFO 1 --- [           main] eurekademo.EurekaApplication             : Started EurekaApplication in 8.907 seconds (JVM running for 9.702)

2017-10-20 02:35:43.081  INFO 1 --- [       Thread-4] c.n.eureka.PeerAwareInstanceRegistry     : Updating the replica nodes as they seem to have changed from [] to [http://localhost:8761/eureka/]





-p 옵션을 주어야 동작할 수 있다. 8761포트를 8888포트로 연결할 마음으로  -p 8761:8888을 추가했다.

(따라하지 말고, 아래부터는 내용을 볼 것!!!)


$ docker run  -p 8761:8888  springcloud/eureka


-ti 옵션을 주면 조금 출력이 예뻐보인다. 


$ docker run  -p 8761:8888 -ti springcloud/eureka




백그라운드로 데몬을 실행하려면 다음을 사용한다. 


$ docker run  -p 8761:8888 -d springcloud/eureka




docker ps로 확인하니. 아래와 같이 나왔다. 



$ docker ps

CONTAINER ID        IMAGE                COMMAND                CREATED              STATUS              PORTS                              NAMES

a3938ad9745b        springcloud/eureka   "java -jar /app.jar"   About a minute ago   Up About a minute   8761/tcp, 0.0.0.0:8761->8888/tcp   focused_hopper




그러나 


8761, 8888 포트로 접근이 되지 않는다. 


$ curl localhost:8761/eureka/


$ curl localhost:8888/eureka/





확인해보기 위해 docker inspect를 실행해 보낟. 


$ docker inspect 도커-컨테이너-이름




네트워크만 보려면 다음 커맨드를 실행한다.  docker bridge 잘 있고. 네트워크도 192.168로 잘 설정되어 있다. 




$ docker network inspect bridge

[

    {

        "Name": "bridge",

        "Id": "13216e45817d9a5c15fffd0b77c732a65365129d49d1ed04fb8bbdc53c0ab348",

        "Created": "2017-10-27T06:33:11.783006123Z",

        "Scope": "local",

        "Driver": "bridge",

        "EnableIPv6": false,

        "IPAM": {

            "Driver": "default",

            "Options": null,

            "Config": [

                {

                    "Subnet": "192.168.5.1/24",

                    "Gateway": "192.168.5.1"

                }

            ]

        },

        "Internal": false,

        "Attachable": false,

        "Ingress": false,

        "ConfigFrom": {

            "Network": ""

        },

        "ConfigOnly": false,

        "Containers": {},

        "Options": {

            "com.docker.network.bridge.default_bridge": "true",

            "com.docker.network.bridge.enable_icc": "true",

            "com.docker.network.bridge.enable_ip_masquerade": "true",

            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",

            "com.docker.network.bridge.name": "docker0",

            "com.docker.network.driver.mtu": "1500"

        },

        "Labels": {}

    }

]





도커 컨테이너로 들어가도 잘 동작되는 것 같다. 


$ docker exec -it focused_hopper bash

root@6090234a5b33:/# 

root@6090234a5b33:/# ip addr

39: eth0@if40: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default

    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff

    inet 192.168.1.2/16 scope global eth0

       valid_lft forever preferred_lft forever

       



네트워크도 문제 없다. 

       

root@6090234a5b33:/# ip route

default via 172.17.0.1 dev eth0

172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.2



내부에서 실행하면 동작이 잘된다. 


root@6090234a5b33:/#curl 172.17.0.2:8761

<!doctype html>

...





문제는 docker exec -p 옵션을 줄 때 반대로 주었다. 실제로 포트 포워딩할 포트가 앞에. 도커 컨테이너 포트는 뒤에 있어야 한다. 


docker -p "포트 포워딩할 포트:도커 컨테이너 포트" 이렇게 구성해야 한다. 이걸 모르고 삽질하고 있었다. 


다시 도커 컨테이너를 실행해본다. 



# docker run  -p 8888:8761 -d springcloud/eureka



# docker ps

CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS              PORTS                    NAMES

75ba8624fff6        springcloud/eureka   "java -jar /app.jar"   6 seconds ago       Up 4 seconds        0.0.0.0:8888->8761/tcp   frosty_elion




# curl localhost:8888 하니 동작이 잘된다. 


docker port로 확인해보니 잘 동작한다. 


# docker port frosty_elion

8761/tcp -> 0.0.0.0:8888



lsof listen 포트 확인하니. 제대로 동작하는지 확인할 수 있었다. 


# lsof -iTCP -sTCP:LISTEN -n -P


vpnkit    21848 samuel.kim   20u  IPv4 0xb0df1cffacb7067      0t0  TCP *:8888 (LISTEN)

vpnkit    21848 samuel.kim   21u  IPv6 0xb0df1d003088737      0t0  TCP [::1]:8888 (LISTEN)





잘 동작한 것을 확인하고 도커 컨테이너를 내린다. 


$ docker stop frosty_elion




공부자료.

https://docs.docker.com/engine/userguide/networking/default_network/custom-docker0/

https://github.com/moby/moby/issues/25064

https://docs.docker.com/engine/reference/commandline/dockerd/




Posted by '김용환'
,



fluentd에서 [error]: exec failed to emit error="queue size exceeds limit" error_class="Fluent::BufferQueueLimitError" tag="google.plus" 이라는 에러가 발생한다면,

버퍼 설정이 어떻게 되어 있는지 확인한다. 



type설정만 forward로 되어 있다.



type forward 

flush_interval 10s



forward 설정이 기본 memory기반이고 기본적으로 큐 크기가 64, 청크 크기는 8mb(큐에 데이터 쌓는 사이즈)인데,

flush 간격 10초 동안 생성된 로그가 큐 크기를 넘어섰다. 



https://docs.fluentd.org/v0.12/articles/out_forward#buffer_queue_limit,-buffer_chunk_limit


buffer_queue_limit, buffer_chunk_limit

The length of the chunk queue and the size of each chunk, respectively. Please see the Buffer Plugin Overview article for the basic buffer structure. The default values are 64 and 8m, respectively. The suffixes “k” (KB), “m” (MB), and “g” (GB) can be used for buffer_chunk_limit.



memory의 제약 사항이 있기 때문에 임시파일을 생성해서 bulk로 flush하는 형태를 사용하면 된다. 



  buffer_type file

  buffer_path /var/log/td-agent/buffer/fluentd.buffer

  buffer_chunk_limit 16m

  buffer_queue_limit 128

  

  

*** 

buffer_type을 주지 않으면 메모리 기반이고, 저장 용량이 작기 때문에 로그 내용이 drop 될 수 있다. 


Posted by '김용환'
,


3개의 커밋을 하나로 합쳐본다.



$ git log --pretty=oneline

aae3f8afa5c7e97d8974525994f100b93258baf3 commit 3

2c24df186d7b779a87882e0968503fb019866d62 commit 2

ae08eead7cf187b85fd73d5a2ceb3f0a256c99b1 commit 1


3번 commit/push했고 이를 하나의 commit 메시지로 만들고 싶을 때 사용할 수 있는 git 커맨드를 소개한다. 



최신 3개의 commit을 rebase로 하나로 합쳐 본다. -i는 대화형 모드를 의미한다. 


$ git rebase -i HEAD~3

  

pick ae08eea commit 1

pick 2c24df1 commit 2

pick aae3f8a commit 3


# Rebase acf9816..aae3f8a onto acf9816 (3 command(s))

#

# Commands:

# p, pick = use commit

# r, reword = use commit, but edit the commit message

# e, edit = use commit, but stop for amending

# s, squash = use commit, but meld into previous commit

# f, fixup = like "squash", but discard this commit's log message

# x, exec = run command (the rest of the line) using shell

# d, drop = remove commit

#




아래와 같이 수정한다. 

commit 1은 그대로. commit 2와 commit 3의 pick을 squash또는 s로 변경한다. 


pick ae08eea commit 1

squash 2c24df1 commit 2

squash aae3f8a commit 3


# Rebase acf9816..aae3f8a onto acf9816 (3 command(s))

#

# Commands:

# p, pick = use commit

# r, reword = use commit, but edit the commit message

# e, edit = use commit, but stop for amending

# s, squash = use commit, but meld into previous commit

# f, fixup = like "squash", but discard this commit's log message

# x, exec = run command (the rest of the line) using shell

# d, drop = remove commit

#


저장하고 종료하면 squash 화면이 나타난다. 

여기에서 commit1 앞에 REDIS-1을 추가해본다. 


다음 화면이 나타나고 쉘로 나온다. 



 3 files changed, 0 insertions(+), 0 deletions(-)

 create mode 100644 1

 create mode 100644 2

 create mode 100644 3

Successfully rebased and updated refs/heads/master.



3개의 commit이 하나의 commit으로 나타난다. 


$ git log --pretty=oneline

7dca124e20dea4a4248be52eae50081580ac329d REDIS-1 commit 1

acf9816e316d960df3a99c6bb9c0ee40ac31dee0 Initial commit



해당 commit을 확인해보면 commit 1, commit 2, commit 3 모두 존재한다.


$ git log -p 1

commit 7dca124e20dea4a4248be52eae50081580ac329d

Author: knight76@gmail.com

Date:   Tue Oct 24 19:27:43 2017 +0900


    REDIS-1 commit 1


    commit 2


    commit 3


diff --git a/1 b/1

new file mode 100644

index 0000000..e69de29




이미 remote repository에 저장했기 때문에 git push --force를 실행해서 서버에도 반영한다.






만약, push를 하지 않은 상태라면 git reset --soft HEAD~3 커맨드를 사용하면 된다. 



$ git log --pretty=oneline

13a9d0da6ebf8f0ab2d78761cd26bad3136c5cec commit 3

628a2b89c35e134aeccd0e26dc90dc78575f2493 commit 2

e8630d725e97f8f11e8036d303abe4812f956dea commit 1

acf9816e316d960df3a99c6bb9c0ee40ac31dee0 Initial commit


$ git reset --soft HEAD~3


$ git status

On branch master

Your branch is up-to-date with 'origin/master'.

Changes to be committed:

  (use "git reset HEAD <file>..." to unstage)


new file:   1

new file:   2

new file:   3


$ git log --pretty=oneline

acf9816e316d960df3a99c6bb9c0ee40ac31dee0 Initial commit


$ git add .

$ git commit -m 'REDIS-1 commit 1'

[master a3eaa44] REDIS-1 commit 1

 3 files changed, 0 insertions(+), 0 deletions(-)

 create mode 100644 1

 create mode 100644 2

 create mode 100644 3

$ git push


Posted by '김용환'
,

geminabox 설치/실행

Ruby 2017. 10. 24. 09:56



https://github.com/geminabox/geminabox






geminabox는 사내(inhouse)에서 custom plugin을 설치하는데 도움을 준다.


설치(최신 geminabox는 루비 2.2.2가 필요하다)


$ sudo gem install geminabox




config.ru 파일을 생성한다. 데이터 저장위치도 잘 선택한다.


require "rubygems"

require "geminabox"

Geminabox.data = "/home/www/geminabox/gems"

run Geminabox::Server




geminabox 데몬을 시작하는 스크립트이다. rackup을 사용한다. -p는 포트이고, -E는 개발환경을 의미한다. -E production을 주지 않으면 로컬에서만 확인할 수 있다. -D는 데몬으로 동작하도록 알린다.


rackup -p 3000 -E production -D



데몬을 중지하려면 다음을 실행한다.



PID=`ps -ef | grep 'rackup' | grep -v grep | awk '{print $2}'`

if [ -z $PID ]; then

  echo "no process"

else 

  kill -9 $PID

  echo "killed .. done"

fi



'Ruby' 카테고리의 다른 글

gem 설치 디버깅하기  (0) 2017.10.20
ruby zookeeper  (0) 2017.02.07
[ruby] http call 예시  (0) 2017.01.06
[capistrano] 다른 task 호출하기  (0) 2016.12.07
ruby on rails 애플리케이션 실행하기  (0) 2016.10.12
Posted by '김용환'
,



네임스페이스를 줄 수 있다. 



$ ip netns add ns1



또 실행하면 실제 network namespace의 위치를 알려주는 에러(?!)가 발생한다.


$ ip netns add ns1

Cannot create namespace file "/var/run/netns/ns1": File exists



확인한다.


$ ip netns

ns1

$ ip netns list

ns1

$ ip netns list ns1

ns1



삭제하려면 다음 커맨드를 실행한다. 


$ ip netns delete ns1

$ ip netns list




하나의 가상 ethernet을 생성하고 peer로 하나 생성한다.


$ ip link add vireth0 type veth peer name virteth1

$ ip link list

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 50000

    link/ether fa:16:3e:77:ea:d4 brd ff:ff:ff:ff:ff:ff

3: virteth1@vireht0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000

    link/ether c2:d7:7a:23:90:7b brd ff:ff:ff:ff:ff:ff

4: vireht0@virteth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000

    link/ether 56:48:fa:8d:53:58 brd ff:ff:ff:ff:ff:ff

    

    


만약 실수 했다면 ip link del로 삭제할 수 있다. 


$ ip link del vireth0


네트워크 namespace 에는 단지 virtual Ethernet(veth)만 할당할 수 있다.


이전에 추가한 네임스페이스에 vireth0을 연동한다. 


$ ip link set vireth0 netns ns1



ip link list를 실행하면 vireth0이 안보인다. 글로벌 공간에서 ns1로 이동했다. virteth1만 남아 있다. 


$ ip link list

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 50000

    link/ether fa:16:3e:77:ea:d4 brd ff:ff:ff:ff:ff:ff

3: virteth1@if12: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000

    link/ether aa:35:8b:aa:ae:62 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    



ip netns list를 실행하면 먼가가 바뀌었다. id가 0이다. 


$ ip netns list

ns1 (id: 0)



ns1에서 ip link list를 실행한다. 여기에 vireth0이 있다. 


$ ip netns exec ns1 ip link list

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

3: vireth0@if11: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000

    link/ether 52:eb:a4:5b:33:d3 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    

    



새로운 ip를 부여한다. 


$ ip netns exec ns1 ifconfig vireth0 192.168.1.1/24 up



확인한다. DOWN 상태에서 LOWERLAYERDOWN 상태로 바뀌었다. 


$ ip netns exec ns1 ip link list

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

12: vireth0@if11: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN mode DEFAULT group default qlen 1000

    link/ether 52:eb:a4:5b:33:d3 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    


ip 주소를 확인하면 192.168.1.1로 되어 있음을 확인할 수 있다. 


$ ip netns exec ns1 ip addr list

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

12: vireth0@if11: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000

    link/ether 52:eb:a4:5b:33:d3 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet 192.168.1.1/24 brd 192.168.1.255 scope global vireth0

       valid_lft forever preferred_lft forever




ns1의 vireth0과 글로벌의 virteth1을 서로 짝이라서 virteth1의 네트워크를 설정한다. 


$ ifconfig virteth1 192.168.1.2/24 up


이제 글로벌영역에서 가상 네임 네트워크 ns1으로 ping을 실행할 수 있다. 


$ ping 192.168.1.1

PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.

64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.043 ms

64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.039 ms



Posted by '김용환'
,




java9을 설치하니 Spring Tool Suite가 동작이 되지 않는다. 


!ENTRY org.eclipse.e4.ui.workbench 4 0 2017-10-20 19:29:56.365

!MESSAGE FrameworkEvent ERROR

!STACK 0

java.lang.NoClassDefFoundError: javax/annotation/PreDestroy

        at org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:426)

        at org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:154)

        at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:78)

        at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:111)

        at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:74)

        at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:176)

        at org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.dispose(EclipseContextOSGi.java:106)

        at org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.bundleChanged(EclipseContextOSGi.java:139)

        at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:903)

        at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)

        at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)

        at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:213)

        at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:120)

        at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:112)

        at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:156)

        at org.eclipse.osgi.container.Module.publishEvent(Module.java:476)

        at org.eclipse.osgi.container.Module.doStop(Module.java:634)

        at org.eclipse.osgi.container.Module.stop(Module.java:498)

        at org.eclipse.osgi.container.SystemModule.stop(SystemModule.java:191)

        at org.eclipse.osgi.internal.framework.EquinoxBundle$SystemBundle$EquinoxSystemModule$1.run(EquinoxBundle.java:165)

        at java.base/java.lang.Thread.run(Thread.java:844)

Caused by: java.lang.ClassNotFoundException: javax.annotation.PreDestroy cannot be found by org.eclipse.e4.core.di_1.6.0.v20160319-0612

        at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:398)

        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:361)

        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:353)

        at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161)

        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)

        ... 21 more





STS.ini에서 -vmargs 라인을 찾고 다음을 추가한다.


-vmargs

--add-modules=java.se.ee



참고로 STS.ini 파일은 STS.app/Contents/Eclipse에 위치한다. 



Posted by '김용환'
,

gem 설치 디버깅하기

Ruby 2017. 10. 20. 18:45



--debug --backtrace --verbose 옵션를 추가한다.



예)


gem install --debug --backtrace --verbose  fluent-plugin-force-encoding  -v 0.0.5

'Ruby' 카테고리의 다른 글

geminabox 설치/실행  (0) 2017.10.24
ruby zookeeper  (0) 2017.02.07
[ruby] http call 예시  (0) 2017.01.06
[capistrano] 다른 task 호출하기  (0) 2016.12.07
ruby on rails 애플리케이션 실행하기  (0) 2016.10.12
Posted by '김용환'
,