有没有过项目之间各种Java
版本开发环境切换的场景;有没有过github
上clone
回来的代码库,由于各种开发环境依赖无法运行的问题;有没有过进入一个新项目时各种配开发环境到深夜的经历…Come On!
为什么会这样,一切都是开发环境问题。为了不让别人痛苦,更不想让自己痛苦,请容器化开发环境吧,让我们享受一键部署开发环境的痛快吧。
用什么容器化呢?当然是Docker
啦,轻量级又好用,又流行,最关键点是本人仅Docker
比较熟悉,所以就拿它来搞起啦。
Quick Start
接下的例子依赖的Docker
环境和MAC
,请移步 Install Docker Engine 自行安装。
- docker-machine
- docker-compose
- …
1 | (dockerize) Unable to get the latest Boot2Docker ISO release version: Error getting a version tag from the Github API response. |
Setup Hello Dockerize
使用Gradle
初始化一个 spring-boot DEMO,build.gradle 文件如下: 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
36group "com.xxx.hello.dockerize"
version "1.0.0"
buildscript {
repositories {
jcenter()
maven { url "http://repo.spring.io/snapshot" }
maven { url "http://repo.spring.io/milestone" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.5.RELEASE")
}
}
apply plugin: "idea"
apply plugin: "java"
apply plugin: "spring-boot"
sourceCompatibility = 1.8
repositories {
jcenter()
maven { url "http://repo.spring.io/snapshot" }
maven { url "http://repo.spring.io/milestone" }
}
ext {
junitVersion = "4.11"
}
dependencies {
compile "org.springframework.boot:spring-boot-starter-jersey"
testCompile "junit:junit:$junitVersion"
}
实现hello-dockerize
的API,创建以下文件:
Application.java
JerseyConfig.java
HelloDockerizeResource.java
Dockerize
为可以让 DEMO 可以运行容器中,需要一个Dockerfile来配置 DEMO 在容器中能正常运行的环境: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
40FROM ubuntu:14.04
RUN apt-get update
ENV VERSION 8
ENV UPDATE 66
ENV BUILD 17
ENV JAVA_HOME /usr/lib/jvm/java-${VERSION}-oracle
ENV JRE_HOME ${JAVA_HOME}/jre
RUN apt-get install ca-certificates curl \
gcc libc6-dev libssl-dev make \
-y --no-install-recommends
RUN curl --silent --location --retry 3 --cacert /etc/ssl/certs/GeoTrust_Global_CA.pem \
--header "Cookie: oraclelicense=accept-securebackup-cookie;" \
http://download.oracle.com/otn-pub/java/jdk/"${VERSION}"u"${UPDATE}"-b"${BUILD}"/server-jre-"${VERSION}"u"${UPDATE}"-linux-x64.tar.gz \
| tar xz -C /tmp
RUN mkdir -p /usr/lib/jvm && mv /tmp/jdk1.${VERSION}.0_${UPDATE} "${JAVA_HOME}"
RUN apt-get install -y openssl
RUN apt-get remove --purge --auto-remove -y \
gcc \
libc6-dev \
libssl-dev \
make
RUN apt-get autoclean && apt-get --purge -y autoremove
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN update-alternatives --install "/usr/bin/java" "java" "${JRE_HOME}/bin/java" 1 && \
update-alternatives --install "/usr/bin/javac" "javac" "${JAVA_HOME}/bin/javac" 1 && \
update-alternatives --set java "${JRE_HOME}/bin/java" && \
update-alternatives --set javac "${JAVA_HOME}/bin/javac"
WORKDIR /hello-dockerize
EXPOSE 8080
CMD ["bash"]
为了以后可以更好的管理容器的依赖和更新,Docker Compose是一个不错的选择。创建配置文件docker-compose.yml:1
2
3
4
5
6
7
8
9
10web:
build: ./dockerize
environment:
- LANG=C.UTF-8
- TERM=xterm
- DEBUG=true
ports:
- "8080:8080"
volumes:
- .:/hello-dockerize
启动容器服务:
在 DEMO 目录下执行:1
$ docker-compose run --service-ports web
上述命令执行成功后,将会进入容器内,显示如:1
root@7b438758ccae:/hello-dockerize#
在容器中启动服务:1
root@7b438758ccae:/hello-dockerize# ./gradlew bootRun
为了在容器外可以访问容器内部的服务,可以通过docker-machine ip machine-name
获取 machine 的 IP
,修改/etc/hosts
将machine IP
绑定上dockerhost
的域名,再通过浏览器访问http://dockerhost:8080/hello-dockerize
,页面将会出现Hello Dockerize!
DEMO REPO: hello-dockerize,你只需要 clone 到本地,然后执行
docker-compose run --service-ports web
, DEMO 开发环境将会快速构建完毕,秒级的体验,不容错过~~~
写在最后: 由于最近打算把写博客的习惯捡回来,才让这篇在草稿箱中沉睡了一年多的Dockerize
重返人间,接下继续努力完成如何在容器中使用断点的方式 DEBUG
、如何使用 Jenkins 控制测试环境 Docker container 创建和销毁
、如何使用 Nginx 控制容器的启动
…博文。