首先,要使用docker嘛,docker是人家的东西,所以我们肯定要对他进行下载安装啦。
在liunx上安装Docker,要求操作系统是64位操作系统。并且内核版本需要3.10以上,如果是CentOS,则使用CentOS 7.0可符合要求。我使用的是ubuntu系统,所以这里也使用ubuntu来讲解。
1)、查看系统内核
sudo cat /proc/version
可以看到我系统使用的是4.15.0-20-generic的内核,所以在这个系统上是可以安装docker的。
这里安装我介绍2种安装方式。一种是ubuntu维护的版本,另外一种是docker维护的版本。
sudo apt-get install docker.io
#先安装curl,如果你已经安装过可以略过
sudo apt-get install -y curl
#通过curl安装docker维护的版本
curl -sSL https://get.docker.com/ | sudo sh
嗯,妥妥的又是2个命令搞定。
安装完成后,可以使用下列命令启动docker:
sudo service docker start
liunx没有反应就是最好的反应,说明可爱强大的docker已经启动起来了。
使用下来指令查看docker的版本信息:
sudo docker -v
咳咳,我的版本看来还挺新的,可以看到是 17.12.1-ce。
好了!一切就绪了,那现在该干什么呢?废话,当然实操一把,把我们的应用在上面跑起来啦。
按照我们上一篇说到的,docker有三件套(仓库、镜像、容器
),这里我们要把三件套全部用上,然后目标就是把我们的java项目在上面跑起来。不记得三件套的同学,回忆一下【docker简介】,重新认识下三件套的工作流程和关系。这里就不再介绍了。 let’s go !
项目结构很简单,就是项目一个简单的Controller,配置访问端口为8080.
代码清单如下:
UserController:
package com.example.web.biz;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/api/user")
public class UserController {
@RequestMapping("/say")
public String say() {
return "Say Hello Docker";
}
}
Spring boot 的启动入口:
package com.example.web;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author lyl
*/
@SpringBootApplication
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
application.properties配置端口:
server.port=8080
文件结构如下:
好了,代码搞好。现在通maven打包放到ubuntu上开始发布。
这文件的作用上一篇已经提及它是提供我们构建自己镜像的一种方式(后面是详细讲解,现在只需要知道他会构建镜像用就行)。Dockerfile文件放在和jar包同级目录下。
Dockerfile里面内容如下:
FROM java:8
VOLUME /tmp
ADD web-1.0.1.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
其中
FROM :表示使用哪个基础镜像去构建新的镜像。上面的java:8, 版本号是8也就是jdk1.8
ADD :表示叠加什么镜像到上面的基础镜像中。我们现在就叠加当前目录下的 web-1.0.1.jar 到基础镜像中。
EXPOSE:表示对外暴露的端口,我使用的是8080.
RUN bash -c ‘touch /app.jar’ :使用 shell编程,执行一个 touch 命令,更新文件的访问和修改时间 -c 如果文件不存在,则不要进行创建。具体参考liunx 的 touch 命令和shell编程。
ENTRYPOINT :入口点, 表示容器运行后默认执行的命令。
其他命令后面在细说。先懂得怎么跑起来再学后面的。
上面我们写的Dockerfile使用的基础层是使用java:8,所以我们现在要先在远程仓库把这个基础镜像拉取(下载)到本地。
命令如下:
sudo docker pull java:8
然后通过 下面的命令查看本地仓库。可以查看到从远程仓库拉取下来的镜像:
sudo docker images
看到了,上面已经有了我们需要的基础层镜像了。然后我们就要开始构建我们自己的镜像了。
现在,执行我们写好的构建文件,就能够帮我们在镜像镜像上叠加一层我们自己的程序,生成新镜像。
去到我们刚才存放Dockerfile文件的目录下,执行 docker build -t <镜像名>
sudo docker build -t web .
其中 “.”表示使用当前目录的Dockerfile脚本文件。
执行上面命令输出结果如下:
Sending build context to Docker daemon 17.57MB
Step 1/6 : FROM java:8
---> d23bdf5b1b1b
Step 2/6 : VOLUME /tmp
---> Running in 062284bd21bb
Removing intermediate container 062284bd21bb
---> d7a577c112b0
Step 3/6 : ADD web-1.0.1.jar app.jar
---> 8689f9774441
Step 4/6 : RUN bash -c 'touch /app.jar'
---> Running in 0f3fb99acf53
Removing intermediate container 0f3fb99acf53
---> e908efd5e478
Step 5/6 : EXPOSE 8080
---> Running in 6aded09eacd2
Removing intermediate container 6aded09eacd2
---> a5bf51727060
Step 6/6 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
---> Running in 84ca26f544e9
Removing intermediate container 84ca26f544e9
---> e5b7d13c6747
Successfully built e5b7d13c6747
Successfully tagged web:latest
可以看到生成新镜像的步骤,最后输出的进行ID是:e5b7d13c6747, 镜像名称是web,版本是:latest。因为我没指定版本,默认就会用latest。
好了,再次使用 sudo docker images 查询看现在我们本地拥有的镜像文件。
很好,看到了成功了。镜像名,ID,版本号,都如我们所愿。这样我们就把我们的jar包叠加到镜像里面去了。接下来就跑一下看呗,是驴是马拿出来溜溜才知道,是吧?
执行下面的运行镜像的命令:
sudo docker run --name web -d -p 8080:8080 web
命令的格式讲解:sudo docker run –name 容器名 -d -p 内部端口:外部端口 镜像名 <版本>
容器名:就是docker三件套之一的容器名字,运行的时候我们得给他起个名字是吧,这样我们在更好吧记住他,我们这里容器名就和镜像名取一样的名字了,都叫web。
-d: 后台运行容器,并且返回容器完整ID
-p: 是用于指定端口的。
镜像名: 这个就不用再说了吧,就是你自己刚才构建的东西。
然后在通过下面命令,查询正在运行的容器:
sudo docker ps
看到了吧,我们的web镜像跑起来了。
下面,我们就访问一下啊吧。访问前我先查询一下我的ip是什么先。如果你知道你ip,就不需要查看啦,因为我系统没设置固定ip,DHCP随机给我分配了一个。
所以我访问的地址是:http://192.168.234.136:8080/api/user/say
结果妥妥的出来了。
如果你要查看我们的应用放在哪里,可以通过下面命令进入容器内部:
sudo docker exec -it <容器ID> /bin/bash
这样我就从宿主机进入了容器内部,我们再使用“ls”可以看到我们的app.jar就放在里面了。可以看到容器内部也是一个root文件系统,和我们熟悉的liunx结构一样。操作命令也基本相同。
如果我们想退出容器回到宿主机,那么可以使用快捷键:Ctrl + P + Q
退出容器,但不停止。
如果要停止容器,回到宿主机后直接下面的命令:
sudo docker stop <容器ID>
如何将来容器里面的java项目的日志,输出到容器的指定位置以文件形式保存起来呢呢。首先我们通过docker exec -it <容器ID> /bin/bash
进入下容器的内部时。文件系统结构是这样子的,如下图:
默认路径就是上面的路径,如果我们要把日志输出到/home/web/logs里面,那么我们就得在java工程logback.xml里面配置好指定路径。如下:
好了,容器的安装和使用就讲到这里了。如果你团队需要用到这个跑这个服务你就可以把镜像提交到私有的镜像仓库中,你团队的大佬们pull下来,就可以在任何安装有docker的机器上运行了。
大深夜写博客,觉得讲得明白了。点赞呗。嗯嗯,你可以理解为专业骗赞。哈!!