zoukankan      html  css  js  c++  java
  • Docker搭建Java Web运行环境

    Docker搭建Java Web运行环境

    这周末体验了一下挺火的Docker技术,简单记录自己的学习笔记。

    >Docker是干什么的

    Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发,
    源代码托管在 Github 上, 遵从Apache2.0协议开源。Docker的目标是实现轻量级的操作系统虚拟化解决方案。

    学习Docker首先要了解几个概念:

    镜像—Docker的镜像和常见的系统ISO镜像类似,包含了应用程序的信息;

    容器—容器相当于一个可以运行起来的虚拟机,应用程序运行在容器中,Docker运行在“Docker”上;

    仓库—仓库是存放镜像的地方,有类似git的版本控制,同样分为公开仓库(Public)和私有仓库(Private)两种形式;

    Docker支持大部分的Linux发行版,通过使用Docker容器,就可以在不同的操作系统,

    不同的机器上运行自己的应用,不用关心硬件、运行环境之类的配置,应用程序的迁移变得非常简单。

    >Docker和传统虚拟化技术的对比

    相比传统虚拟机技术,Docker资源占用少,启动更快,很大的方便了项目的部署和运维。
    Docker是在操作系统层面上实现虚拟化,复用本地主机的操作系统,传统方式是在硬件的基础上,虚拟出多个操作系统,然后在系统上部署相关的应用。

    下面的这张图片参考相关博文,很形象的说明了Docker和VM之类的传统虚拟化技术的区别:

     vs

     

    >搭建Docker环境

    我使用的是Ubuntu 14.04,在这上面安装Docker服务。

    >>>快速安装Docker

    14.04版本的Ubuntu仓库中已经支持Docker的安装,
    可以使用快速安装的方式,

    sudo apt-get update
    sudo apt-get install docker.io

    启动服务和守护进程

    service docker.io status
    service docker.io start

    这种方式安装通常不是Docker的最新版本,
    如果想要安装最新版本,可以去Docker官网下载安装。

     

    >创建第一个Docker镜像

    构建Docker镜像的一般过程是首先创建一个容器,
    并在容器里修改镜像,配置相关环境等,最后将修改提交为一个新镜像。

    >>>下载镜像文件

    下载用于制作镜像的系统,

    sudo docker pull index.alauda.cn/alauda/ubuntu

    这里我从灵雀云的镜像中心拉取。

    或者也可以直接从Docker的镜像中心拉取,不过貌似非常慢:

    sudo docker pull ubuntu

    下载成功后,使用images命令查看本地的镜像列表:

    docker images

    这里需要注意,使用Docker的时候请添加sudo。

    默认安装完 docker 后,每次执行 docker 都需要运行 sudo 命令,如果不跟 sudo,直接执行 docker 命令会报一些权限错误。

    >>>启动容器并修改镜像

    镜像下载到本地以后,就可以使用Docker运行,
    通过下面的命令参数启动容器,

    docker run <相关参数> <镜像 ID> <初始命令>

    -i:表示以“交互模式”运行容器
    -t:表示容器启动后会进入其命令行
    -v:表示需要将本地哪个目录挂载到容器中,
    格式:-v <宿主机目录>:<容器目录>

    我的相关程序都在当前机器的/data/software/目录下,并且想把它挂载到容器的相同目录下:

    sudo docker run -i -t -v /data/software/:/data/software/ ae983d5e88ce /bin/bash

    “镜像 ID”,也可以使用“仓库名:标签名”,例如:index.alauda.cn/alauda/ubuntu :latest。

    上面的命令,可以使用指定的镜像运行一个shell,如果想退出该终端,可以使用exit命令,
    或者依次按下CTRL -p+CTRL -q,即可切换到宿主机器。不过这种方式,容器依然在后天运行。

    启动终端后,进入/data/software/目录,可以发现当前机器目录下的文件已经同步过来:



    >>>安装JDK和Tomcat等

    安装相关的JDK等程序,这里全部安装到/data/目录:

    tar -zxvf jdk-7u25-linux-x64.tar.gz -C /data/
    mv jdk1.7.0_25 jdk

    unzip apache-tomcat-7.0.54.zip -d /data/
    mv apache-tomcat-7.0.54 tomcat

    配置环境变量

    vi /etc/profile

    添加下面的配置:

    #set java environment    
    export JAVA_HOME=/data/jdk   
    export JRE_HOME=${JAVA_HOME}/jre   
    export CLASSPATH=.:JAVAHOME/lib:{JRE_HOME}/lib   
    export PATH=JAVAHOME/bin:PATH  

    export CATALINA_HOME=/data/tomcat  
    export CATALINA_BASE=/data/tomcat  

    保存并退出,设置立即生效:

    source /etc/profile

     

    >>>编写启动脚本

    启动tomcat时必须通过TOMCATHOME/bin/catalina.sh使TOMCAT_HOME/bin/startup.sh启动,否则脚本执行后容器会马上退出。

    vi /data/start.sh

    添加以下内容:

    #!/bin/bash
    # Export environment variable
    source /etc/profile
    # Start tomcat
    bash /data/tomcat/bin/catalina.sh run

    添加可执行权限:

    chmod u+x /data/start.sh

     

    >>>构建镜像

    使用Docker构建镜像的两种方法:

    使用docker commit 命令,更直观一些;

    使用docker build命令和Dockerfile文件,可以模板化镜像构建过程;

    这里使用docker commit的方式创建镜像。

    查看容器列表:

    sudo docker ps -a

    1
    2
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    39b2cf60a4c1 ae983d5e88ce:latest "/bin/bash" 5 hours ago Exited (0) 9 seconds ago dreamy_euclid

    提交一个新的镜像:

    sudo docker commit 39b2cf60a4c1 bingyue/docdemo

    如果有Docker账号,可以将镜像推送到Docker Hub或资金的私有Registry中。

    现在查看本地的docker镜像,

    sudo docker images

    可以看到本地仓库已经有刚刚创建的docker镜像。

    1
    2
    3
    REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
    bingyue/docdemo latest bfc7ed316d42 About a minute ago 528.2 MB
    index.alauda.cn/alauda/ubuntu latest ae983d5e88ce 10 months ago 255.1 MB


    docker inspect可以查看新创建的镜像的详细信息:

    sudo docker inspect bingyue/docdemo

    >>>运行新创建的镜像

    docker run -d -p 18080:8080 --name docdemo bingyue/docdemo /data/start.sh

    -p:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 18080 端口,

    这样就向外界暴露了 18080 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。

    查看后台是否启动成功:

    docker ps 

    测试访问:

     

     

    >>>提交至docker仓库

    如果有Docker仓库的账户,可以将本地创建的镜像提交至仓库。

     

    >使用体验

    到这一步,差不多完成了Docker的初体验,Docker应用还是比较简单的,真正复杂的应该是背后的虚拟化技术。

    一步一步部署下来,的确Docker相比传统的虚拟机技术要简单了很多,有机会继续深入学习。


    添加Docker用户组,避免sudo输入

    默认安装完 docker 后,每次执行 docker 都需要运行 sudo 命令,影响效率。如果不跟 sudo,直接执行 docker images 命令会有如下问题:
    Get http:///var/run/docker.sock/v1.18/images/json: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?
    把当前用户执行权限添加到相应的docker用户组里面就可以解决这个问题。

    添加一个新的docker用户组
    sudo groupadd docker
    # 添加当前用户到docker用户组里
    sudo gpasswd -a bingyue docker
    # 重启Docker后台监护进程
    sudo service docker restart
    # 重启之后,尝试一下,是否生效
    docker version
    #若还未生效,则系统重启,则生效
    sudo reboot

    Docker常用命令

    # 下载一个ubuntu镜像 
    sudo docker pull ubuntu
    # 使用ubuntu运行一个交互性的shell
    sudo docker run -i -t ubuntu /bin/bash
    #docker ps命令
    sudo docker ps #列出当前所有正在运行的container
    sudo docker ps -l #列出最近一次启动的,且正在运行的container
    sudo docker ps -a #列出所有的container
    #port命令
    docker run -p 80:8080 <image> <cmd> #映射容器的8080端口到宿主机的80端口
    #删除容器命令
    sudo docker rm `sudo docker ps -a -q`#删除所有容器
    sudo docker rm $CONTAINER_ID#删除容器id为CONTAINER_ID的容器
    #其他命令快速参考:
    sudo docker images #查看本地镜像
    sudo docker attach $CONTAINER_ID #启动一个已存在的docker实例
    sudo docker stop $CONTAINER_ID #停止docker实例
    sudo docker logs $CONTAINER_ID #查看docker实例运行日志,确保正常运行
    sudo docker inspect $CONTAINER_ID #查看container的实例属性,比如ip等等
    _____________________________________________________________________

     
  • 相关阅读:
    【C++基础汇总】参数传递
    常用VC快捷键
    美股交易规则
    xpath 总结1
    【字符集】字符集和编码知识【转】
    【字符集】ASCII 表
    【win32编程学习】常用技巧总结
    【win32编程学习】 调用dll
    【win32编程学习】 创建自己的dll
    充实的生活
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5035437.html
Copyright © 2011-2022 走看看