Winse Blog

走走停停都是风景, 熙熙攘攘都向最好, 忙忙碌碌都为明朝, 何畏之.

K8s Minikube on Windows

在windows配置minikube需要先安装docker,或者更直接点的说就是需要docker一样的依赖环境(都是通过iso装载到虚拟机,我们这里不考虑iso内部的软件配置)。先安装docker会把这些依赖都配置好。

系统当前的版本不支持直接安装Docker(This version of Docker requires Windows 10 Pro, Enterprise or Education edition with a mininum build number of 10586, Please use Docker Toolbox),

如果直接全部安装toolbox的VirtualBox、git的应该一切顺利的。由于已有cygwin,想着复用下结果惹了一身骚。

按照自己的安装过程,先介绍下配合cygwin安装docker,然后再介绍全部按官网的工具安装k8s。

仅尝试Docker,不安装k8s

注:不推荐了!!!可以更新系统或者安装toolbox -20190316

但是不想安装git直接使用cygwin来代替。刚刚开始的时刻出现了一些理解上的偏差,后来查询start.sh脚本后大概了解到快捷方式、脚本内容后问题就迎刃而解。

先安装docker toolbox:先禁用windows的Hyper-V;安装时去掉git组件。

安装完成后,启动cygwin的命令行(不要用Docker的快捷图标启动)。然后进行如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
winse@Lenovo-PC ~
$ cd "C:\Program Files\Docker Toolbox"

做一个c盘的映射
winse@Lenovo-PC /cygdrive/c/Program Files/Docker Toolbox
$ ll /
...
lrwxrwxrwx   1 winse None               11 Apr  5  2016 c -> /cygdrive/c
...

根据cygwin的路径配置VirtualBox的路径
winse@Lenovo-PC /cygdrive/c/Program Files/Docker Toolbox
$ export VBOX_MSI_INSTALL_PATH="/cygdrive/c/Program Files/Oracle/VirtualBox/"

首先下载boot2docker.iso到 C:\Users\winse\.docker\machine\cache\boot2docker.iso
https://github.com/boot2docker/boot2docker/releases/download/v1.13.0/boot2docker.iso...

创建一个空的clear脚本(cygwin没有包括clear脚本)
winse@Lenovo-PC /cygdrive/c/Program Files/Docker Toolbox
$ touch ~/bin/clear && chmod +x ~/bin/clear

# 启动
winse@Lenovo-PC /cygdrive/c/Program Files/Docker Toolbox
$ ./start.sh


                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

Start interactive shell

winse@Lenovo-PC ~
$ docker run hello-world
time="2017-02-08T22:48:33+08:00" level=warning msg="Unable to use system certificate pool: crypto/x509: system root pool is not available on Windows"
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pulling fs layer
78445dd45222: Verifying Checksum
78445dd45222: Download complete
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

使用默认安装,并安装k8s

由于cygwin的路径与windows的不兼容,而git bash则本身依托于windows的命令行的,兼容性方面更优。

重新安装Docker ToolBox,安装时选择git。

下载minikube需要的一些软件:

下载minikube和kubectl放到PATH路径下(bin目录已经在PATH中):

1
2
3
4
5
E:\local\bin>dir
...
2017-02-08  14:05        50,735,616 kubectl.exe
2017-02-08  11:22        84,239,872 minikube-windows-amd64.exe
2017-02-08  11:25    <SYMLINK>      minikube.exe [minikube-windows-amd64.exe] (mklink minikube.exe minikube-windows-amd64.exe)

运行 Docker Quickstart Terminal (这个快捷方式会先启动docker的虚拟机),或者直接打开 C:\Program Files\Git\bin\bash.exe 执行如下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
查看帮助
winse@Lenovo-PC MINGW64 ~
$ minikube start --help
Starts a local kubernetes cluster using Virtualbox. This command
assumes you already have Virtualbox installed.
...

设置代理: 老外的教程都很简单就成功,但是我们操作一堆问题,主要就是万恶的防火墙!!!
winse@Lenovo-PC MINGW64 ~
$ export HTTPS_PROXY=http://localhost:8118
$ export HTTP_PROXY=http://localhost:8118
$ export NO_PROXY="192.168.0.0/16"

启动
winse@Lenovo-PC MINGW64 ~
$ minikube start --v=7 --logtostderr

winse@Lenovo-PC MINGW64 ~
$ minikube status
minikubeVM: Running
localkube: Running

winse@Lenovo-PC MINGW64 ~
$ kubectl get nodes
NAME       STATUS    AGE
minikube   Ready     3h

再次启动,添加代理参数后dashboard才正常运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
winse@Lenovo-PC MINGW64 /c/Program Files/Git/bin
$ minikube start --docker-env HTTP_PROXY=http://192.168.99.1:8118 --docker-env HTTPS_PROXY=http://192.168.99.1:8118
Starting local Kubernetes cluster...
Kubectl is now configured to use the cluster.

winse@Lenovo-PC MINGW64 /c/Program Files/Git/bin
$ minikube status
minikubeVM: Running
localkube: Running

winse@Lenovo-PC MINGW64 /c/Program Files/Git/bin
$ kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kube-dns
kubernetes-dashboard is running at https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

#Open dashboard
https://github.com/kubernetes/minikube/issues/379
https://github.com/kubernetes/minikube/issues/522
winse@Lenovo-PC MINGW64 /c/Program Files/Git/bin
$ minikube dashboard
Opening kubernetes dashboard in default browser...

运行实例
winse@Lenovo-PC MINGW64 /e/local/home/k8s
$ kubectl get nodes
NAME       STATUS    AGE
minikube   Ready     8h

winse@Lenovo-PC MINGW64 /e/local/home/k8s
$ kubectl run hello-nginx --image=nginx --port=80
deployment "hello-nginx" created

winse@Lenovo-PC MINGW64 /e/local/home/k8s
$ kubectl.exe get pods
NAME                           READY     STATUS              RESTARTS   AGE
hello-nginx-2471083592-cgn29   0/1       ContainerCreating   0          19s

winse@Lenovo-PC MINGW64 /e/local/home/k8s
$ kubectl.exe get pods
NAME                           READY     STATUS             RESTARTS   AGE
hello-nginx-2471083592-cgn29   0/1       ImagePullBackOff   0          3m

winse@Lenovo-PC MINGW64 /e/local/home/k8s
$ kubectl.exe describe pod hello-nginx-2471083592-cgn29

winse@Lenovo-PC MINGW64 /e/local/home/k8s
$ kubectl.exe expose deployment hello-nginx --type=NodePort
service "hello-nginx" exposed

winse@Lenovo-PC MINGW64 /e/local/home/k8s
$ kubectl.exe get services
NAME          CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
hello-nginx   10.0.0.145   <nodes>       80:31570/TCP   1m
kubernetes    10.0.0.1     <none>        443/TCP        9h

winse@Lenovo-PC MINGW64 /e/local/home/k8s
$ kubectl.exe describe service hello-nginx
Name:                   hello-nginx
Namespace:              default
Labels:                 run=hello-nginx
Selector:               run=hello-nginx
Type:                   NodePort
IP:                     10.0.0.145
Port:                   <unset> 80/TCP
NodePort:               <unset> 31570/TCP
Endpoints:              172.17.0.4:80
Session Affinity:       None
No events.

winse@Lenovo-PC MINGW64 /e/local/home/k8s
$ minikube service --url=true hello-nginx
http://192.168.99.100:31570

winse@Lenovo-PC MINGW64 /e/local/home/k8s
$ kubectl.exe logs hello-nginx-2471083592-cgn29
172.17.0.1 - - [10/Feb/2017:02:07:53 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36" "-"
172.17.0.1 - - [10/Feb/2017:02:07:54 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://192.168.99.100:31570/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36" "-"
2017/02/10 02:07:54 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.99.100:31570", referrer: "http://192.168.99.100:31570/"

水平扩展
winse@Lenovo-PC MINGW64 /e/local/home/k8s
$ kubectl.exe scale --replicas=3 deployment/hello-nginx
deployment "hello-nginx" scaled

winse@Lenovo-PC MINGW64 /e/local/home/k8s
$ kubectl.exe get deployment
NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-nginx   3         3         3            1           21m

暂时还不清楚负载均衡是怎么弄的。这个三个应用pods其实是在一个内网(172.17.0.4/5/6),对外有一个服务(10.0.0.145)。

基本的安装过程先记录这么多。

–END

Docker代理配置以及导入导出

代理

关于http代理服务器的搭建,如果有外(国)网机器,直接用squid建就行了 使用Squid3搭建Docker镜像下载代理 。 如果已有shadowsocks的代理,可以用privoxy转成http代理服务器。

  • 网上参考

http://nknu.net/proxy-configuration-for-docker-on-centos-7/

1
2
3
4
5
6
Edit /etc/sysconfig/docker and add the following lines:
HTTP_PROXY='http://user:password@proxy-host:proxy-port'
HTTPS_PROXY='http://user:password@proxy-host:proxy-port'

For those settings to be taken into account, you’ll need to restart your docker daemon:
# systemctl restart docker
  • 官网文档

https://docs.docker.com/engine/admin/systemd/#http-proxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@k8s docker.service.d]# pwd
/etc/systemd/system/docker.service.d
[root@k8s docker.service.d]# cat http-proxy.conf 
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:8118/" "NO_PROXY=localhost,127.0.0.1"



查看配置的环境变量是否生效
$ sudo systemctl daemon-reload
$ sudo service docker start
$ sudo systemctl show --property Environment docker

配置代理后下载google容器杠杠的
[root@k8s docker-multinode]# docker pull gcr.io/google_containers/etcd-amd64:3.0.4

如果是自己编译的docker,自启动脚本配置可以参考:https://github.com/docker/docker/blob/master/contrib/init/systemd/docker.socket

导入导出

https://tuhrig.de/difference-between-save-and-export-in-docker/

对于已经通过代理下载的docker,可以通过导入导出到另外的机器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[root@k8s ~]# docker save `docker images | grep -v TAG | awk '{print $1":"$2}'` >k8s.tar

[root@k8s data]# docker load <k8s.tar
0341ae9b0004: Loading layer [==================================================>]  89.1 MB/89.1 MB
Loaded image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.5.0
011b303988d2: Loading layer [==================================================>]  5.05 MB/5.05 MB
5f70bf18a086: Loading layer [==================================================>] 1.024 kB/1.024 kB
596242791254: Loading layer [==================================================>] 792.1 kB/792.1 kB
4e504f64df23: Loading layer [==================================================>]  5.29 MB/5.29 MB
2897536d1f1f: Loading layer [==================================================>] 3.584 kB/3.584 kB
ae11e34e71e6: Loading layer [==================================================>] 10.75 kB/10.75 kB
81620de5436f: Loading layer [==================================================>]  2.56 kB/2.56 kB
77cb0f2fbaed: Loading layer [==================================================>] 50.33 MB/50.33 MB
Loaded image: gcr.io/google_containers/kube-addon-manager-amd64:v6.1
9007f5987db3: Loading layer [==================================================>]  5.05 MB/5.05 MB
5f70bf18a086: Loading layer [==================================================>] 1.024 kB/1.024 kB
d41159f2130e: Loading layer [==================================================>] 9.201 MB/9.201 MB
Loaded image: gcr.io/google_containers/dnsmasq-metrics-amd64:1.0
2c84284818d1: Loading layer [==================================================>] 1.312 MB/1.312 MB
5f70bf18a086: Loading layer [==================================================>] 1.024 kB/1.024 kB
5e47621858b3: Loading layer [==================================================>] 38.51 MB/38.51 MB
Loaded image: gcr.io/google_containers/etcd-amd64:3.0.4
b6ca02dfe5e6: Loading layer [==================================================>] 128.9 MB/128.9 MB
c2c974a0ae12: Loading layer [==================================================>] 231.6 MB/231.6 MB
88e4c6b7e766: Loading layer [==================================================>] 25.09 kB/25.09 kB
96257390754d: Loading layer [==================================================>] 10.75 kB/10.75 kB
36bd77066b3a: Loading layer [==================================================>]  7.68 kB/7.68 kB
6e833518b289: Loading layer [==================================================>] 28.16 kB/28.16 kB
88d2c1399894: Loading layer [==================================================>] 11.78 kB/11.78 kB
b857f858f4ad: Loading layer [==================================================>] 46.08 kB/46.08 kB
13da16246a77: Loading layer [==================================================>] 56.58 MB/56.58 MB
98a8cc89f2d0: Loading layer [==================================================>] 4.608 kB/4.608 kB
1b7eeaac3364: Loading layer [==================================================>]  5.12 kB/5.12 kB
c85758bfcfdf: Loading layer [==================================================>] 153.9 MB/153.9 MB
Loaded image: gcr.io/google_containers/hyperkube-amd64:v1.5.2
3fc666989c1d: Loading layer [==================================================>] 5.046 MB/5.046 MB
5f70bf18a086: Loading layer [==================================================>] 1.024 kB/1.024 kB
9eed5e14d7fb: Loading layer [==================================================>] 348.7 kB/348.7 kB
00dc4ffe8624: Loading layer [==================================================>]  2.56 kB/2.56 kB
Loaded image: gcr.io/google_containers/kube-dnsmasq-amd64:1.4
8ac8bfaff55a: Loading layer [==================================================>] 1.293 MB/1.293 MB
5f70bf18a086: Loading layer [==================================================>] 1.024 kB/1.024 kB
dc978cfc3e09: Loading layer [==================================================>] 7.279 MB/7.279 MB
99740866972b: Loading layer [==================================================>] 7.168 kB/7.168 kB
Loaded image: gcr.io/google_containers/exechealthz-amd64:1.2
5f70bf18a086: Loading layer [==================================================>] 1.024 kB/1.024 kB
41ff149e94f2: Loading layer [==================================================>] 748.5 kB/748.5 kB
Loaded image: gcr.io/google_containers/pause-amd64:3.0
b79219965469: Loading layer [==================================================>] 45.91 MB/45.91 MB
Loaded image: gcr.io/google_containers/kubedns-amd64:1.9

–END

使用Privoxy把shadowsocks转换为Http代理

https://program-think.blogspot.com/2014/12/gfw-privoxy.html

Privoxy是一个代理辅助工具,这里用Privoxy把Shadowsocks socks5代理转换为http代理。

kubernetes的docker容器需要访问google的服务,docker暂时只支持http代理,而我手上有的代理是 shadowsocks 的。这里通过Privoxy把socks5转成http代理。

阿里云的主机优化:https://promotion.aliyun.com/ntms/act/qwbk.html

安装Shadowsocks

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@k8s ~]# yum install epel-release python-pip -y

[root@k8s ~]# pip install shadowsocks
Collecting shadowsocks
  Downloading shadowsocks-2.8.2.tar.gz
Installing collected packages: shadowsocks
  Running setup.py install for shadowsocks ... done
Successfully installed shadowsocks-2.8.2
You are using pip version 8.1.2, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

上面软件已经安装好了, 推荐更新下pip.
[root@k8s ~]# pip install --upgrade pip
Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 46kB/s 
Installing collected packages: pip
  Found existing installation: pip 8.1.2
    Uninstalling pip-8.1.2:
      Successfully uninstalled pip-8.1.2
Successfully installed pip-9.0.1

填写shadowsocks服务端信息以及本地映射端口,启动Shandowsocks的客户端:

1
2
3
4
5
6
7
8
9
10
11
12
[root@k8s ~]# cat /etc/shadowsocks.json 
{
"server": "xxxxxx",
"server_port": xxx,
"local_port": 1080,
"password": "xxxxxxxx",
"timeout": 600,
"method": "rc4-md5",
"fast_open": false,
"workers": 1
}
[root@k8s ~]# sslocal -c /etc/shadowsocks.json 

配置防火墙(如果其他主机也需要用这个代理的话)

https://havee.me/linux/2015-01/using-firewalls-on-centos-7.html

1
2
[root@bigdata-dev ~]# firewall-cmd --zone=public --add-port=1080/tcp --permanent
[root@bigdata-dev ~]# firewall-cmd --reload

安装privoxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@k8s ~]# yum install privoxy -y

查找listen-address行注释掉,在最后添加如下两行
[root@k8s docker.service.d]# vi /etc/privoxy/config 
...
forward-socks5 / 127.0.0.1:1080 .
listen-address k8s:8118

# 启动
[root@k8s ~]# systemctl start privoxy
# 查看状态
[root@k8s ~]# systemctl status privoxy

[root@k8s ~]# systemctl enable privoxy
Created symlink from /etc/systemd/system/multi-user.target.wants/privoxy.service to /usr/lib/systemd/system/privoxy.service.

如果其他机器需要用到代理的话,需要配置防火墙开放端口
[root@k8s ~]# firewall-cmd --zone=public --add-port=8118/tcp --permanent
[root@k8s ~]# firewall-cmd --reload 

通过curl加代理参数:

1
2
3
4
5
6
7
8
9
10
[root@k8s ~]# curl google.com
curl: (7) Failed to connect to 2404:6800:4008:802::200e: Network is unreachable
[root@k8s ~]# 
[root@k8s ~]# curl -x localhost:8118 google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

或者安装桌面环境,在本机调试会方便点,

http://unix.stackexchange.com/questions/181503/how-to-install-desktop-environments-on-centos-7

1
yum -y groups install "GNOME Desktop" 

然后firefox安装autoproxy,配置http代理。(firefox自带的代理有点抽风,不太好用)

–END

在Centos7上安装VNC Server

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[root@bigdata-dev ~]# yum install -y tigervnc-server

首先查看原来的默认配置
[root@bigdata-dev ~]# cat /lib/systemd/system/vncserver@.service 

[Service]
Type=forking
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"
PIDFile=/home/<USER>/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

复制一份修改,已root用户为例。其他用户类推
[root@bigdata-dev system]# cp vncserver@.service vncserver@:1.service 
[root@bigdata-dev system]# vi vncserver@\:1.service 

[Service]
Type=forking
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l root -c "/usr/bin/vncserver %i"
PIDFile=/root/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[root@bigdata-dev system]# systemctl daemon-reload
[root@bigdata-dev system]# systemctl enable vncserver@:1.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:1.service to /etc/systemd/system/vncserver@:1.service.
[root@bigdata-dev system]# systemctl start vncserver@:1.service
[root@bigdata-dev system]# systemctl status vncserver@:1.service
● vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/etc/systemd/system/vncserver@:1.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2017-01-25 14:28:04 CST; 27s ago
   
[root@bigdata-dev system]# vncpasswd 
Password:
Verify:
[root@bigdata-dev system]# 
[root@bigdata-dev system]# 
[root@bigdata-dev system]# systemctl restart vncserver@:1.service
http://www.aboutyun.com/thread-17535-1-1.html
[root@bigdata-dev system]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

下载客户端并访问

https://www.realvnc.com/download/viewer/ 访问VNC服务的地址 HOST:5901

–END

Develop Environment Prepare

layout: post title: [整理] 环境准备工具集 date: 2017-01-25 10:57:18 +0800 comments: true

categories: [efficity]

工具其实很重要,不仅仅是帮你把东西管理起来,而是工具是一整套的解决方案,是前辈多年总结实践的成果。

初出茅庐的时刻,总觉得工具麻烦,写个java程序还得写个pom,直接把jar放到lib下然后加入classpath就好了。殊不知,后面还有打包,进阶后还要看源码等等问题接踵而来。慢慢把maven用起来,又觉得apache的访问太慢(忍了),项目组内部分功能,开始全部放一个parent下面(也还行)。但后面编译打包太麻烦,尝试在项目组自己建立maven私有仓库。

这里把这几年使用的工具罗列下:

私有仓库:

软件使用:

–END