当前位置: 澳门新濠3559 > 编程 > 正文

可通过以下命令安装最新内核,当时也没有进行

时间:2019-10-06 23:43来源:编程
第十四章:基于Docker的简单部署 docker 可以理解是运行Linux和Mac OSX上的轻量级虚拟机,他相对于VMWare,VirtualBox这类完整的虚拟机相比,占用资源少,大量重用宿主资源,而且可以编程创建.而且

图片 1第十四章:基于Docker的简单部署

docker 可以理解是运行Linux和Mac OS X上的轻量级虚拟机,他相对于VMWare,Virtual Box这类完整的虚拟机相比,占用资源少,大量重用宿主资源,而且可以编程创建. 而且可以统一开发,测试和发布环境,是运行基于Linux后台服务器的利器.

1,系统准备

CentOS 具体要求如下:

  • 必须是 64 位操作系统
  • 建议内核在 3.8 以上

通过以下命令查看您的 CentOS 内核:

[root@VM_200_249_centos ~]# uname -r
3.10.0-327.36.3.el7.x86_64

对于 CentOS 6.5 而言,内核版本默认是 2.6。首先,可通过以下命令安装最新内核:

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
yum -y --enablerepo=elrepo-kernel install kernel-lt

随后,编辑以下配置文件:

vi /etc/grub.conf

将default=1修改为default=0。
最后,通过reboot或shutdown now命令重启操作系统。
重启后如果不出意外的话,再次查看内核,您的 CentOS 内核将会显示为 3.10。

一、前言

讲解了单元测试,本章节讲讲应用的部署吧。总体而言,在进行自动化部署时,基本都会用上Jenkins Maven Docker进行部署。本章节主要讲解使用Maven Docker进行SpringBoot应用的部署知识。

有三个重要概念

2,安装Docker

只需通过以下命令即可安装 Docker 软件:

rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
yum -y install docker-io

可通过以下命令启动 Docker 服务:

service docker start
chkconfig docker on # 设置开机启动

可使用以下命令,查看 Docker 是否安装成功:

[root@VM_200_249_centos ~]# docker version
Client:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:
 OS/Arch:      linux/amd64

若输出了 Docker 的版本号,则说明安装成功,我们下面就可以开始使用 Docker 了。

可能还有一些同学不了解docker这个项目,docker是由go语言编写的,一个快速部署的轻量级虚拟技术项目,他允许开发人员将自己的程序和运行环境一起打包,制作成一个docker的image(镜像),这样部署到服务器上,也只需要下载这个image就可以将程序跑起来,免去每次都安装各种依赖和环境的麻烦,还能够做到应用程序之间的隔离

题外话:对于Docker,本人也是去年才第一次听说的,当时也没有进行过相关了解。然后年初的时候,本着学习的心态,购置了一台阿里云的ECS服务器,之后的相关实践,都是在这台服务器上进行的。这周末要是不需要加班,可能会先出个Docker入门教程,因为还闲置了一台服务器,刚好可以把自己当作初学者,再重新来一遍,加深下印象,做下笔记。

  • 镜像
  • 容器(Container)
  • 仓库(Repository)

3, 安装镜像

Docker 官网 提供了所有的镜像下载地址。(需要VPN翻墙)
直接pull下来(https://hub.docker.com/r/nimmis/java-centos/)

docker pull nimmis/java-centos

可以通过对应的标签选择不同的jdk版本,例如"docker pull nimmis/java-centos:openjdk-7-jdk"

  • latest - currently Oracle Java version 8 JRE
  • openjdk-7-jdk - OpenJDK Java version 7 JDK
  • openjdk-7-jre - OpenJDK Java version 7 JRE
  • openjdk-7-jre-headless - OpenJDK Java version 7 JRE headless
  • openjdk-8-jdk - OpenJDK Java version 8 JDK
  • openjdk-8-jre - OpenJDK Java version 8 JRE
  • openjdk-8-jre-headless - OpenJDK Java version 8 JRE headless
  • oracle-7-jre - Oracle Java version 7 JRE
  • oracle-7-jdk - Oracle Java version 7 JDK
  • oracle-8-jre - Oracle Java version 8 JRE
  • oracle-8-jdk - Oracle Java version 8 JDK

二、实现准备

关于Docker,百度百科是这么说的:Docker,是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

理解了这三个概念,就理解了 Docker 的整个生命周期。

镜像加速器

docker官网的镜像下载非常慢,国内提供了Docker镜像的下载点,如阿里、网易和DaoCloud。以阿里云为例:
需要先注册阿里云账号,进入:

https://cr.console.aliyun.com/#/accelerator

选择左侧“加速器”,找到你的专属加速器地址

图片 2

在centos下修改/etc/docker/daemon.json文件,添加:

{
    "registry-mirrors": ["https://yxz1pr3x.mirror.aliyuncs.com"]
}

设置后能获得每秒1兆的下载速度。

最后,使用以下命令查看本地所有的镜像:

[root@VM_200_249_centos ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
dockerxman/docker-centos     latest              4c89ecb22b17        2 minutes ago       395.6 MB
daocloud.io/library/centos   latest              67591570dd29        10 weeks ago        191.8 MB

可以看到,系统中有2个docker镜像,“dockerxman/docker-centos”,也可以
称其为仓库(Repository),镜像的标签(Tag)为lastest,此外还有镜像ID(IMAGE ID),大小有395兆。

我会先创建一个简单的Node.js web app,来构建一个镜像。然后基于这个Image运行一个container。从而实现快速部署。

题外话:本人觉得,每个开发者都应该了解下Docker,毕竟我们不是专业的运维,如果一直在倒腾一些环境的安装,也是蛮枯燥乏味的。使用了Docker可以减少很多的不必要,可以直接上手部署各式各样的环境了。真的很Nice呀!

Docker 镜像

Docker 镜像就是一个只读的模板。镜像的定义文件取名为 Dockerfile. 类似于shell格式

4,启动容器

容器在镜像的基础上运行,一旦容器启动了,我们就可以登录到容器中,安装自己所需的软件或应用程序。

docker run -i -t -v /mydata/data:/mnt/software --restart=always 67591570dd29 /bin/bash

由于网络的原因我的Node.js镜像从国内的镜像库下载,而不是Docker Hub。

安装命令为:

Docker 容器

Docker 利用容器来运行应用。

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

命令解释:

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

其中,相关参数包括:

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

初始命令表示一旦容器启动,需要运行的命令,此时使用“/bin/bash”,表示什么也不做,只需进入命令行即可。
需要说明的是,不一定要使用“镜像 ID”,也可以使用“仓库名:标签名”,例如:dockerxman/docker-centos:latest。

先从国内的镜像网站上pull下一下nodejs镜像。     

docker pull openjdk:8-jdk-alpine

Docker 仓库

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。

仓库分为公开仓库和私有仓库两种形式。

最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool 等,可以提供大陆用户更稳定快速的访问。

查看所有创建的容器

docker ps -a
docker pull hub.c.163.com/nce2/nodejs:0.12.2

安装成功后,查看镜像,表明已经安装成功了,当然也可先不安装,因为后续是基于此镜像进行编写Dockerfile的,所以这里先下载了。

发布形式

spring boot 为了简化开发,可以把应用,tomcat 服务统一打包在一个jar中,因此在Docker 发布spring boot 可以直接拷贝最终jar到docker中,另外一种方法把源码拷入docker 在,docker里面下载编译工具maven,jdk等自行编译,后面一种方法构建docker用时较长,每次都是重新下载相关jar依赖编译,不推荐.

因此我们假设已经在本机编译好jar,每拷入这个jar即可.

查看正在运行的容器

[root@VM_200_249_centos ~]# docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS                     NAMES
a197e23e0ddb        asy:0.1   "/root/run.sh"      24 hours ago        Up 24 hours         0.0.0.0:58080->8080/tcp   javaweb

图片 3

图片 4image

代码准备

用 IDEA或Eclipse 配置发布版有一点步骤,为了简单操作,我们直接采用maven 命令来编译一个简单的Spring boot项目.

程序的输出很简单,在浏览器访问docker 对应端口,输出一行提示,

我们手动构造一个简单项目

mkdir hello-docker ; cd hello-docker # 项目目录

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.bluedrum.springdemo</groupId> <artifactId>bluedrum-spring-boot-demo</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <docker.image.prefix>springio</docker.image.prefix> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build></project>

编辑源代码

mkdir -p src/main/java/cn/bluedrum/springdemo

package cn.bluedrum.springdemo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controller@SpringBootApplicationpublic class SampleController { @ResponseBody @RequestMapping(value = "/") String home(){ return "Hello Docker World2"; } public static void main(String[] args) { SpringApplication.run(SampleController.class,"--server.port=8081"); }}

注意 "--server.port=8081",表示启动tomcat 端口是8081(而不是缺省的8080)

这里要安装maven,编译成jar

mvn package

本地测试,需要安装jdk运行:

java -jar target/bluedrum-spring-boot-demo-1.0-SNAPSHOT.jar

如果程序正确运行,浏览器访问 “Hello Docker World2” 字样

启动容器

docker start <CONTAINER ID>

下载完后查看我们的镜像,找到他的名称,等会我们会用到

大家可在:

三.本地Docker 发布

Docker 标准推荐操作系统是 Ubuntu 64位,如 14.04 ,16.06版本. 其它的操作系统的需要使用置virtual box 虚拟机上的Ubuntu上运行Docker,

但 新的Docker 在Mac 下开发的一个 MacOS Hypervisor framework,相当于在其构造一个性能很高的专用虚拟机.

因此在你看这篇文章时,Mac OSX和Ubuntu 64均是标准的Docker 安装环境.

可以下载 Docker 社区版,安装

安装后会有一个图标出现在顶部

图片 5image.png

所有配置均可用图形界面,为了提高docker image 下载速度,可以使用国内docker 加速网站,常见有

图片 6image.png

停止容器

docker stop <CONTAINER ID>

图片 7

图片 8docker

构建本地docker 容器

首先要编辑Dockerfile 文件

FROM java:8EXPOSE 8081VOLUME /tmpADD bluedrum-spring-boot-demo-1.0-SNAPSHOT.jar app.jarRUN sh -c 'touch /app.jar'ENV JAVA_OPTS=""ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

以下是解释FROM 表示本image是哪一个基础image继承而来, java:8是带有jdk8运行环境的image

EXPOSE 8081 表示本docker 要把本地8081进行映射,这个测试在mac下无所谓,但在阿里云这样docker 必须有这一句,否则映射会失败.

VOLUME /tmp VOLUME 指定了数据文件目录为/tmp。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp ,这样做是因为docker 重启后所有数据丢失,持久数据保存在VOLUME指定目录下才会下次使用.

ADD表示把文件拷入docker ,并改名成 app.jar

ENTRYPOINT 表示docker 启动执行第一个指令,这里是调用java 启动 jar

重新进入已创建的容器

docker attach <CONTAINER ID>

docker exec -it <CONTAINER ID> /bin/bash

http://blog.csdn.net/u010397369/article/details/41045251

三、创建Node.js 程序

基于此方式时,是本地利用maven的docker插件进行编译,同时推送到远程的docker服务器中。所以事先需要远程的Docker服务开启远程访问权限。本例演示的Docker版本为(docker -v 命令):

命令行构建

构建容器方法有两种,一种是调用docker build 指令手动建在Dockerfile 所在目录执行如下指令(注意,这个jar必须和Dockerfile同一路径下)

docker build -t hxy .

build表示构建容器,. 表示构建文件在当前目录. -t 指明本容器的tag名字,方便调用.

这是一个成功调用,

docker build -t hxy .Sending build context to Docker daemon 63.43MBStep 1/7 : FROM java:8 ---> d23bdf5b1b1bStep 2/7 : EXPOSE 8081 ---> Using cache ---> af40c4f0bb64Step 3/7 : VOLUME /tmp ---> Using cache ---> 5a0abb6e6149Step 4/7 : ADD bluedrum-spring-boot-demo-1.0-SNAPSHOT.jar app.jar ---> 135b017b65bdStep 5/7 : RUN sh -c 'touch /app.jar' ---> Running in b3089dd7490aRemoving intermediate container b3089dd7490a ---> 472354c65e33Step 6/7 : ENV JAVA_OPTS="" ---> Running in 01cec8aeaaa9Removing intermediate container 01cec8aeaaa9 ---> fb2dd3c02514Step 7/7 : ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ] ---> Running in c2a93f997776Removing intermediate container c2a93f997776 ---> de32f8f2ac97Successfully built de32f8f2ac97Successfully tagged hxy:latest

Successfully built de32f8f2ac97 这里指明image ID. 在后续的操作中用使用

以下表示启动指定image .

docker run de32f8f2ac97 -p 8081:8081

-p <本地端口>:<docker端口> 表示把docker 端口映射到本地端口来.

测试用 有输出即可

还有一种调用是用tag调用,不指定话默认用最新那个

docker run -t hxy -p 8081:8081

docker stop 484b1a9b8a49 #用docker ps 查看docker stop -t hxy

删除容器

docker rm <CONTAINER ID>

创建package.json,并写入相关信息和依赖

Docker version 1.13.1, build 774336d/1.13.1

maven插件构建

这里也可采用maven插件docker-maven-plugin 调docker 命令,优点是编译完后自动构建,并且有推送到远程仓库功能

这里关键是在pom.xml有其申明,其中dockerDirectory 是指明Dockerfile所在目录,

 <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <dockerDirectory>.</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration>

执行命令,这里执行编译,并枸造docker 实例

mvn package docker:build

查看所有运行实例

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES484b1a9b8a49 de32f8f2ac97 "sh -c 'java $JAVA_O…" 2 minutes ago Up 2 minutes 8081/tcp angry_visvesvarayac54ede741112 springio/bluedrum-spring-boot-demo "sh -c 'java $JAVA_O…" 2 days ago Up 2 days 0.0.0.0:8081->8081/tcp agitated_swirles

这里第一列 CONTAINER ID 即可容器ID,后续各项操作均要用到此IDPORTS是用来判断网络映射状态, 如果为空,表示完全没有网络映射,如网络出问题,没有侦听服务

如果为 8081/tcp 形式表示,只在docker 启动了端口侦听,但没有映出来,因此外部是无法访问的.

0.0.0.0:8081->8081/tcp 只有这样形式,表示外部的8081端口,映射到内部端口,这样才是正常工作

查看所有image

REPOSITORY TAG IMAGE ID CREATED SIZEhxy latest de32f8f2ac97 About an hour ago 685MBspringio/bluedrum-spring-boot-demo latest 7df85e003c92 2 days ago 695MBdocker-demo latest af850b972103 2 days ago 669MB<none> <none> da7283718e15 2 days ago 669MB<none> <none> 381c4e1fa40c 3 days ago 653MB<none> <none> 3ef8dca1797a 3 days ago 674MBhub.c.163.com/wuxukun/maven-aliyun 3-jdk-8 676639454cb4 15 months ago 653MBjava 8 d23bdf5b1b1b 16 months ago 

注意这里的size 表示占用空间大小,所以本地docker 如果不用,尽量删掉

有时我们想连接docker 内部的虚拟机进行各种命令来分析测试,

docker exec -ti <CONTAINER ID> bash

以下是一个例, -t 表示attach 到某个容器上,i 表示交互模式,本句完整意思在某个容器上以交互模式执行bash ,相当进入控制台.

docker exec -ti 36976f3c166b bashroot@36976f3c166b:/# uname -aLinux 36976f3c166b 4.9.87-linuxkit-aufs #1 SMP Wed Mar 14 15:12:16 UTC 2018 x86_64 GNU/Linuxroot@36976f3c166b:/# cat /proc/cpuinfoprocessor : 0vendor_id : GenuineIntelcpu family : 6model : 42model name : Intel Core i7-2720QM CPU @ 2.20GHz

docker rm <容器ID>注意正在运行容器,需要用 docker stop 后才能删除

docker rmi <image ID>

在阿里云,我们采用ubuntu 64bit .有两种方法来运行容器,一种还是象本地操作来传统的命令行,另外一种采用阿里云的容器服务,后面相当于用网页来图形式操作,并且有日志/监控等运维界面.

本文中仍然采用命令行来运行. 以便适合主题快速入门.

删除镜像

docker rmi <IMAGE ID>

注:需要先把镜像生成的容器全部删除才能删掉镜像。

vi package.json


{
 "name": "webtest",
 "version": "1.0.0",
 "description": "Node.js on Docker",
 "author": "lpxxn",
 "main": "server.js",
 "scripts": {
 "start": "node server.js"
 },
 "dependencies": {
 "express": "^4.13.3"
 }
}

这里说明下开启的方式(基于阿里云的Linux系统):

安装docker

用apt安装 docker 的版本太低

apt-get install docker.io

版本为1.6

阿里云建议采用 dokcer ce版.用如下命令安装,版本较新

curl -fsSL | bash -s docker --mirror Aliyun

uname -a116~14.04.1-Ubuntu SMP Mon Aug 14 16:07:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linuxdocker --versionDocker version 18.05.0-ce, build f150324

新版的docker 配置放在/etc/docker/daemon.json

{ "bip": "192.168.1.5/24", "debug": true, "registry-mirrors": ["https://fzxn****.mirror.aliyuncs.com"]}

--bip 指定docker 的虚拟网卡的ip地址, 缺省的网卡地址 172.18.xxx.xxx 而阿里云内网网卡也是172.19 网段,这两个很容易冲突,造成映射失败.

"registry-mirrors" 是阿里云docker 加速网址,可到阿里云控制台申请,

service docker start

Dockerfile ,jar 各种文件用 scp 上传到阿里云服务器

还是用 docker build/run 进行构建,跟本地是一样的

首先用本地测试 用 curl如果有输出即表示成功

curl Docker World2

外网测试 ,需要用阿里云控制台,用安全组打开这个端口,外网才能访问

图片 9image.png

用外网ip 或网址测试后输出后表示成功

首先要判断一下,网卡是否有网址冲突(docker ps 中ports 为空),如有需要用 --bip参数错开私有网址另外要有EXPOSE 指令,在本地测试时,没有expose也能映射,但阿里云必须带这个.第三个外网访问,必须要安全组开放

5,安装软件

由于我们选择的镜像是包含JDK的,所以我们只需要安装tomcat。
tomcat我放在服务器上,用wget下载到容器中。

wget http://kekefund.com/soft/apache-tomcat-7.0.63.tar.gz

将tomcat放到/opt目录下,先移到到/opt目录,然后解压

cd /opt
tar -zxf /mnt/software/apache-tomcat-7.0.63.tar.gz -C .

重命名

mv apache-tomcat-7.0.63/ tomcat/

创建server.js

  1. 修改/etc/docker/daemon.json文件,加入hosts配置即可。如:

6,运行脚本

创建运行脚本:vi /root/run.sh

#!/bin/bash
source ~/.bashrc
sh /opt/tomcat/bin/catalina.sh run

为运行脚本添加执行权限

chmod u x /root/run.sh
vi server.js

7, 创建 Java Web 镜像

使用以下命令,根据某个“容器 ID”来创建一个新的“镜像”:

docker commit d50f5048e212 chenbb/javaweb:0.1

该容器的 ID 是“ d50f5048e212”,所创建的镜像名是“ chenbb/javaweb:0.1”,随后可使用镜像来启动 Java Web 容器。

写一个最简单web 这个web基于express框架,返回Hello word.注意我们监听的是8888端口

{ "hosts":["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]}

8, 启动 Java Web 容器

通过docker images查看所有镜像

[root@VM_200_249_centos ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
chenbb/javaweb               0.1                 99e35759d5ed        24 hours ago        700 MB
dockerxman/docker-centos     latest              4c89ecb22b17        26 hours ago        395.6 MB
daocloud.io/library/centos   latest              67591570dd29        10 weeks ago        191.8 MB

可见,此时已经看到了最新创建的镜像“ chenbb/javaweb:0.1”,其镜像 ID 是“ 99e35759d5ed”。正如上面所描述的那样,我们可以通过“镜像名”或“镜像 ID”来启动容器,与上次启动容器不同的是,我们现在不再进入容器的命令行,而是直接启动容器内部的 Tomcat 服务。此时,需要使用以下命令:

docker run -d -p 58080:8080 --name javaweb --restart=always chenbb/javaweb:0.1 /root/run.sh

参数介绍:

  • -d:表示以“守护模式”执行/root/run.sh脚本,此时 Tomcat 控制台不会出现在输出终端上。
  • -p:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 58080 端口,这样就向外界暴露了 58080 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。
  • --name:表示容器名称,用一个有意义的名称命名即可。
'use strict';

var express = require('express');

var PORT = 8888;

var app = express();
app.get('/', function (req, res) {
 res.send('Hello worldn');
});

app.listen(PORT);
console.log('Running on http://localhost:'   PORT);
  1. 重新加载配置文件,并重启docker

9,浏览器查看

在浏览器中,输入以下地址,即可访问 Tomcat 首页:

四、创建Dockerfile

10,镜像打包

打包后就可以移植到其他主机上运行了。
打包:

docker save chenbb/fofeasy:0.1 > /mydata/data/fofeasy0.1.tar

接下来主角上场了创建Dockerfile文件 这个文件是创建镜像所必须的文件

systemctl daemon-reloadsystemctl restart docker

11,在另外的主机上导入镜像

docker load < fofeasy0.1.tar   #导入镜像
docker images   #查看存在的镜像
vi Dockerfile

3.验证,直接访问:

参考

1,迈出使用Docker的第一步,学习第一个Docker容器
2,使用 Docker 搭建 Java Web 运行环境
3,使用 Docker 运行 Tomcat + WAR 包 Java 应用
4,docker的安装以及jdk和tomcat的环境配置
5,运维人员的解放----Docker快速部署

Docker会依照Dockerfile的内容来构建一个镜像。我先给出完整的代码,再一行一行的给出解释

curl 127.0.0.1:2375/info
FROM hub.c.163.com/nce2/nodejs:0.12.2

# Create app directory
RUN mkdir -p /home/Service
WORKDIR /home/Service

# Bundle app source
COPY . /home/Service
RUN npm install

EXPOSE 8888
CMD [ "npm", "start" ]

返回记录即可说明已经生效。

我们来一句一句的解释  

图片 10image

FROM hub.c.163.com/nce2/nodejs:0.12.2

也可以直接浏览器访问: 效果是一样的(这里隐去了阿里云服务器的地址)。

FROM是构建镜像的基础源镜像,hub.c.163.com/nce2/nodejs:0.12.2 这个是镜像的名称,也就是我们一开始从国内服务器上拉下来的那个Image。如果本地没有Docker 会自己pull镜像。

图片 11image

# Create app directory
RUN mkdir -p /home/Service
WORKDIR /home/Service

接下来正式开始编写示例。

第一句RUN 用于在Image里创建一个文件夹,将来用于保存我们的代码。

0.创建一个web演示应用(这里大家可自行创建,或者直接下载本章节示例)

第二句WORKDIR是将我们创建的文件夹做为工作目录。

图片 12demo应用

# Bundle app source
COPY . /home/Service
RUN npm install

工程结构:

第一句的COPY是把本机当前目录下的所有文件拷贝到Image的/home/Service文件夹下。

图片 13image

第二句的RUN 使用npm 安装我们的app据需要的所有依赖。

1.加入打包插件docker maven的pom依赖。

EXPOSE 8888
<build> <plugins> <!-- springboot打包 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.9</version> <configuration> <!-- 镜像名称 --> <imageName>lqdev.cn/demo</imageName> <!-- docker远程服务器地址 --> <dockerHost>http://服务器IP:2375</dockerHost> <!-- Dockerfile文件存放目录 --> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build>

由于我们的web app监听的是8888端口,我们把这个端口暴露给主机,这样我就能从外部访问web了。

2.编写Dockerfile,注意大小写,后面的file是不大写开头的。

CMD [ "npm", "start" ]
# Dockerfile# 基于的镜像FROM openjdk:8-jdk-alpineVOLUME /opt/tmpADD chapter-14-0.0.1-SNAPSHOT.jar app.jar# -Djava.security.egd=file:/dev/./urandom 可解决tomcat可能启动慢的问题# 具体可查看:https://www.cnblogs.com/mightyvincent/p/7685310.htmlENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]# 对外端口EXPOSE 8080

这个我相信我不用解释你也能看出来他是做什么的。运行npm start命令,这个命令会运行 node service.js来

3.编码运行。

启动我们的web app。

mvn clean package docker:build -Dmaven.test.skip=true

五、构建Image

图片 14image

在你Dockerfile文件所在的目录下运行下面的命令来构建一个Image.

注意:这里若出现了编译异常,常见的就是500: HTTP 500 Internal Server Error了。造成这种的情况一般是镜像名称不符合命名规范:限制为字母数字 [a-zA-Z0-9],和标点符号 [.-_],及/:(":"一般上用来区分版本的,如lqdev.cn/demo:v1),或者Dockerfile文件未找到之类的,若出错了大家可重点看下这两个地方。

docker build -t mynodeapp .

4.查看远程镜像

别忘了最后的的那个点

docker images

图片 15

图片 16镜像查看

构建完后查看一下我们的镜像

5.运行镜像,查看应用是否正常启动。

图片 17

 docker run -d -p 8080:8080 lqdev.cn/my-springboot-images

六、运行镜像

查看日志或者直接浏览器访问:http:服务器地址:8080/,即可。

docker run -d -p 8888:8888 ac5

图片 18日志查看图片 19访问服务

-d 表明容器会在后台运行,-p 表示端口映射,把本机的8888商品映射到container的8888端口这样外网就能通过本机的8888商品访问我们的web了。

有返回预期的数据,部署成功!

后面的ac5是我们Image的ID因为前3个就已经能定位出这个Image所以我就没有把后边的再写出来。

基于有时候没有开启远程服务,也可把jar上传至服务器,然后编写脚本进行运行,这里简单示例下,正常部署时,正常是通过jenkins打包,然后编写打包后事件,运行脚本即可。

通过docker ps 查看我们刚运行的Container的ID

编写运行镜像脚本:

图片 20

docker run -d -p 1234:8080 -v /opt/docker/chapter-14-0.0.1-SNAPSHOT.jar:/usr/chapter-14-0.0.1-SNAPSHOT.jar --name SpringbootByJar openjdk:8-jdk-alpine java -jar /usr/chapter-14-0.0.1-SNAPSHOT.jar

打印log  7370就是我们的Container ID,和Image ID一样,你也可以全写出来,我比较懒就写前4位,已经足够标识出这个Container了

图片 21控制台输出

docker logs 7350

其实就是把jar拷贝从宿主中拷贝到容器中,然后运行java命令进行启动。和原来的运行jar方式是一样的。

图片 22

运行后访问: 即可查看效果,验证是否部署成功了。

如果你想到Container里可以执行下面的命令,进入到里边后就可以像操作普通的linux 一样。如果想退出可执行exit命令。

图片 23浏览器查看

图片 24

本章节主要是讲解了利用MavenDocker打包工具进行应用构建同时推送到远程仓库及已有jar的情况下,直接在容器中运行jar。其实原理都是一样的,都是把jar放入到容器中,然后利用java命令进行运行应用。本章节,若是对docker不熟悉可能会有点懵,因为好多命令都没有具体说明,,大家可查阅相关资料,对Docker有了解后在进行尝试。周末看看,有时间会写几章关乎Docker入门及基本使用的教程的,当然这些教程都是个人见解了,但至少应该能让新手有个了解~

目前互联网上很多大佬都有SpringBoot系列教程,如有雷同,请多多包涵了。本文是作者在电脑前一字一句敲的,每一步都是实践的。若文中有所错误之处,还望提出,谢谢。

七、测试

  • 个人QQ:499452441
  • 微信公众号:lqdevOps

我们先通过curl 看能不能访问我们的web。

图片 25公众号

curl -i localhost:8888

个人博客:

图片 26

完整示例:chapter-14

也可以通过浏览器来看一下

原文地址:

图片 27

八、总结

好了,这个小教程到此就结束了,大家都学会了吗?希望这篇文章能帮助你入门。如果有什么问题或者疑问可以留言交流。谢谢大家对脚本之家的支持。

您可能感兴趣的文章:

  • linux下使用Docker和OSS轻松搭建ownCloud专属网盘(网盘关闭不用怕)
  • 详解如何在 Docker 中设置 Go 并部署应用
  • 在docker中部署tomcat并且部署java应用程序的步骤详解
  • 在Docker上开始部署Python应用的教程
  • Ubuntu Docker 的安装部署及简单应用
  • 使用Docker部署 spring-boot maven应用的方法
  • 使用Docker部署Spring Boot的应用示例
  • Docker实践--部署Nodejs应用
  • .Net Core自动化部署之利用docker版jenkins部署dotnetcore应用的方法
  • Docker Cloud实现部署应用操作详解

编辑:编程 本文来源:可通过以下命令安装最新内核,当时也没有进行

关键词: 澳门新濠3559