vaadin
我是Vaadin的忠实粉丝,并且创建了一个Github研讨会 ,可以在会议上进行演示。 这种讲习班的一个普遍问题是与会者必须提前准备好工作站...并且其中很大一部分都还没有准备好一切。 此时,演讲者可以使用两种选择:要么等待每个与会者完成准备工作-对那些花时间在家做的人来说太糟糕了,要么反正开始了-失去了尚未准备好的部分。
考虑到当前围绕Docker的嗡嗡声,我认为这可能是使研讨会准备更快的一个很好的方法-仅一步之遥,而且很轻松-与操作系统的怪癖无关。 我要求与会人员的必需步骤如下:
- 安装Git
- 安装Java,Maven和Tomcat
- 克隆git repo
- 生成项目(准备Maven存储库)
- 部署内置的Webapp
- 启动Tomcat
这些应该直接自动化到Docker中。 由于我花了很多时间来使它起作用,所以这是我实现这一目标的旅程的故事(请注意,这很长)。 如果您有类似的用例,我希望它对您更快地完成工作很有用。
从Docker开始
第一步是要了解有关Docker的基础知识。 幸运的是,我有幸参加了戴维斯瑞士人David Gageot举办的Docker研讨会。 这包括Docker安装和Dockerfile基础。 我假设读者同样对Docker有基本的了解。
对于那些不喜欢的人,我想浏览Docker的官方文档是一个不错的主意:
构建我的第一个Dockerfile
可以使用以下命令将Docker映像构建到Dockerfile的目录中:
$ docker build -t vaadinworkshop .
初次使用Docker时可能遇到的第一个问题是获取以下错误消息:
Get http:///var/run/docker.sock/v1.14/containers/json: dial unix /var/run/docker.sock: no such file or directory
原因是因为没有导出boot2docker信息消息中显示的必需环境变量。 如果丢失了确切的数据,不用担心,只需使用shellinit
boot2docker参数:
$ boot2docker shellinit
Writing /Users/i303869/.docker/boot2docker-vm/ca.pem:
Writing /Users/i303869/.docker/boot2docker-vm/cert.pem:
Writing /Users/i303869/.docker/boot2docker-vm/key.pem:
export DOCKER_HOST=tcp://192.168.59.103:2376
export DOCKER_CERT_PATH=/Users/i303869/.docker/boot2docker-vm
复制粘贴上面的导出行将解决此问题。 这些值也可以在一个人的.bashrc脚本中设置,因为这些值似乎很少更改。
接下来的是以下错误:
Get http://192.168.59.103:2376/v1.14/containers/json: malformed HTTP response "\x15\x03\x01\x00\x02\x02"
此错误消息似乎是由于客户端和服务器版本之间的不匹配。 似乎是由于升级时Mac OSX上的错误。 对于长期解决方案,请从头开始重新安装Docker。 要快速修复,请在--tls
命令中使用--tls
标志。 由于将所有内容都键入非常麻烦,因此可以给它起别名:
$ alias docker="docker --tls"
构建映像时,我的最后一个错误是从非空目录构建Dockerfile。 Docker将在Dockerfile目录中找到的每个文件发送到Docker容器进行构建:
$ docker --tls build -t vaadinworkshop .
Sending build context to Docker daemon Too many kB
修复:请勿在家尝试此操作,而仅从Dockerfile的目录容器启动。
从头开始
Dockerfile描述映像-映像作为指令的分层列表构建。 Docker映像是围绕单一继承设计的:一个映像必须设置为单亲。 不需要父级的映像scratch
,但是Docker提供了4种基本的官方发行版: busybox
, debian
, ubuntu
和centos
(操作系统通常是一个好的开始)。
无论您要实现什么目标,都必须选择合适的父母。 考虑到我为自己设置的要求(Java,Maven,Tomcat和Git),我试图找到正确的起始映像。 在Docker Hub上已经可以在线获取许多Dockerfile。 浏览应用程序相当不错,但是说实话,搜索确实可以得到改善。
我的意图是使用符合我大部分要求的图像,然后填补空白。 我找不到提供Git的映像,但我认为dgageot / maven Dockerfile将是一个不错的起点。 问题是基本映像是一个忙碌的盒子,没有提供即装即用的安装程序( apt-get
, yum
,无论如何)。 因此,David花费了大量精力在Dockerfile中获取Java 8和Maven。
我愚蠢地以为我可以使用提供opkg安装程序的其他风格的busybox 。 一段时间后,我积累了许多问题,将一个问题解决了。 最后,我最终决定使用自己最熟悉的操作系统并自己安装所有组件:
FROM ubuntu:utopic
脚本化Java安装
使用RUN
和apt-get
安装git,maven和tomcat软件包非常简单(如果您不要忘记使用非交互式选项):
RUN apt-get update && \\
apt-get install -y --force-yes git maven tomcat8
Java不会落入这种好模式,因为Oracle希望您接受许可。 但是好心人确实将其发布到第三方存储库中。 步骤如下:
- 添加所需的软件包存储库
- 配置系统以自动接受许可证
- 配置系统以添加未认证的软件包
- 更新存储库列表
- 最后安装软件包
- 还添加用于Java 8系统配置的软件包
RUN echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list && \\
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections && \\
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
RUN apt-get update && \\
apt-get install -y --force-yes oracle-java8-installer oracle-java8-set-default
建立资源
按照以下说明,获取研讨会的资源并进行构建非常简单:
RUN git clone https://github.com/nfrankel/vaadin7-workshop.git
WORKDIR /vaadin7-workshop
RUN mvn package
这种方法的缺点是Maven将从一个全新的存储库开始,因此在首次启动时就下载Internet。 最初,我想将一个卷从主机装载到容器上以共享〜/ .m2 / repository文件夹,以避免这种情况,但是我注意到,这只能在运行时通过-v
选项完成,因为VOLUME
指令无法指向到主机目录。
开始图像
启动创建的Docker映像的最简单命令如下:
$ docker run -p 8080:8080
不要忘记从容器到主机的端口转发,标准HTTP端口是8080。 另外,请注意,不必将容器作为守护程序运行(使用-d
选项)。 这样做的附加价值是CMD
的标准输出(请参见下文)将被重定向到主机。 当作为守护程序运行并想要检查日志时,必须在容器中执行bash,这需要一系列繁琐的操作。
配置和启动Tomcat
只需在Dockerfile中添加以下指令,即可在启动容器时启动Tomcat:
CMD ["catalina.sh", "run"]
但是,此时尝试启动容器将导致以下错误:
Nov 15, 2014 9:24:18 PM org.apache.catalina.startup.ClassLoaderFactory validateFile WARNING: Problem with directory [/usr/share/tomcat8/common/classes], exists: [false], isDirectory: [false], canRead: [false] Nov 15, 2014 9:24:18 PM org.apache.catalina.startup.ClassLoaderFactory validateFile WARNING: Problem with directory [/usr/share/tomcat8/common], exists: [false], isDirectory: [false], canRead: [false] Nov 15, 2014 9:24:18 PM org.apache.catalina.startup.ClassLoaderFactory validateFile WARNING: Problem with directory [/usr/share/tomcat8/server/classes], exists: [false], isDirectory: [false], canRead: [false] Nov 15, 2014 9:24:18 PM org.apache.catalina.startup.ClassLoaderFactory validateFile WARNING: Problem with directory [/usr/share/tomcat8/server], exists: [false], isDirectory: [false], canRead: [false Nov 15, 2014 9:24:18 PM org.apache.catalina.startup.ClassLoaderFactory validateFile WARNING: Problem with directory [/usr/share/tomcat8/shared/classes], exists: [false], isDirectory: [false], canRead: [false] Nov 15, 2014 9:24:18 PM org.apache.catalina.startup.ClassLoaderFactory validateFile WARNING: Problem with directory [/usr/share/tomcat8/shared], exists: [false], isDirectory: [false], canRead: [false] Nov 15, 2014 9:24:18 PM org.apache.catalina.startup.Catalina initDirs SEVERE: Cannot find specified temporary folder at /usr/share/tomcat8/temp Nov 15, 2014 9:24:18 PM org.apache.catalina.startup.Catalina load WARNING: Unable to load server configuration from [/usr/share/tomcat8/conf/server.xml] Nov 15, 2014 9:24:18 PM org.apache.catalina.startup.Catalina initDirs SEVERE: Cannot find specified temporary folder at /usr/share/tomcat8/temp Nov 15, 2014 9:24:18 PM org.apache.catalina.startup.Catalina load WARNING: Unable to load server configuration from [/usr/share/tomcat8/conf/server.xml] Nov 15, 2014 9:24:18 PM org.apache.catalina.startup.Catalina start SEVERE: Cannot start server. Server instance is not configured.
我不知道为什么,但是似乎Ubuntu 8上的Tomcat 8没有以任何有意义的方式进行配置。 一切都可用,但是我们在这里和那里都需要一些符号链接,以及创建temp目录。 这会在Dockerfile中转换为以下指令:
RUN ln -s /var/lib/tomcat8/common $CATALINA_HOME/common && \\
ln -s /var/lib/tomcat8/server $CATALINA_HOME/server && \\
ln -s /var/lib/tomcat8/shared $CATALINA_HOME/shared && \\
ln -s /etc/tomcat8 $CATALINA_HOME/conf && \\
mkdir $CATALINA_HOME/temp
最后一个技巧是将由Maven创建的展开的webapp文件夹连接到Tomcat的webapps文件夹,该文件夹将查找部署:
RUN mkdir $CATALINA_HOME/webapps && \\
ln -s /vaadin7-workshop/target/workshop-7.2-1.0-SNAPSHOT/ $CATALINA_HOME/webapps/vaadinworkshop
至此,圣杯已经不远了,只要我们知道IP是什么,您只需要浏览URL即可。 由于在Mac上运行,因此在主机和涉及的容器旁边还有一个附加的VM。 要获得此IP,请输入:
$ boot2docker ip
The VM's Host only interface IP address is: 192.168.59.103
现在,浏览http://192.168.59.103:8080/vaadinworkshop/将带我们进入熟悉的研讨会屏幕:
从那里发展
一切正常,但是我们不是就忘了一件重要的事情吗,例如讲习班的参与者应该如何处理源代码? 很简单,只需在启动容器时安装卷即可:
docker run -v /Users/<login>/vaadin7-workshop:/vaadin7-workshop -p 8080:8080 vaadinworkshop
请注意,主机卷必须是/Users
一部分,并且如果在OSX上,则必须使用boot2docker v。1.3+ 。
不幸的是,现在看来似乎是风头浪人,因为将主机上的空目录装载到容器上将无法使主机上的容器目录可用。 相反,如果主机目录不存在,它将清空容器的目录....似乎在Mac上的Docker中存在问题 。 JHipster的安装遇到了同样的问题,并建议使用Samba Docker文件夹共享项目 。
恐怕我懒得再走一步。 但是,这教会了我很多关于Docker,Docker的用法和用例(以及OSX集成限制)的知识。 对于那些感兴趣的人,您将在Docker文件下面找到。 Docker快乐!
FROM ubuntu:utopic
MAINTAINER Nicolas Frankel <nicolas [at] frankel (dot) ch>
# Config to get to install Java 8 w/o interaction
RUN echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list && \
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections && \
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
RUN apt-get update && \
apt-get install -y --force-yes git oracle-java8-installer oracle-java8-set-default maven tomcat8
RUN git clone https://github.com/nfrankel/vaadin7-workshop.git
WORKDIR /vaadin7-workshop
RUN git checkout v7.2-1
RUN mvn package
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle
ENV CATALINA_HOME /usr/share/tomcat8
ENV PATH $PATH:$CATALINA_HOME/bin
# Configure Tomcat 8 directories
RUN ln -s /var/lib/tomcat8/common $CATALINA_HOME/common && \
ln -s /var/lib/tomcat8/server $CATALINA_HOME/server && \
ln -s /var/lib/tomcat8/shared $CATALINA_HOME/shared && \
ln -s /etc/tomcat8 $CATALINA_HOME/conf && \
mkdir $CATALINA_HOME/temp && \
mkdir $CATALINA_HOME/webapps && \
ln -s /vaadin7-workshop/target/workshop-7.2-1.0-SNAPSHOT/ $CATALINA_HOME/webapps/vaadinworkshop
VOLUME ["/vaadin7-workshop"]
CMD ["catalina.sh", "run"]
# docker build -t vaadinworkshop .
# docker run -v ~/vaadin7-workshop training/webapp -p 8080:8080 vaadinworkshop
翻译自: https://blog.frankel.ch/from-vaadin-to-docker-a-novices-journey/
vaadin