今天把我遇到的关于使用docker的一些磕磕绊绊记录一下,以后可以回过头来再复习复习,如果能帮得到各位,那也是好的嘛.
因为本篇文档介绍的是从安装到部署,再到采坑.可能篇幅比较长,您可以挑着有用的看
首先从安装docker开始, 我这边用的centos7先贴一下我的环境
Linux 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05
UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
这是我的环境,话不多说 开始干
我这里使用的是yum 安装的docker
执行:
yum update
安装docker
-
安装docker 执行:
yum install docker
-
设置docker 的开机自启动 并启动docker
systemctl enable docker
service docker start
-
这样我们的docker 基本就完成了,接下来修改镜像资源地址,改成阿里的,这样下载地址会快一些
路径为/etc/docker/
这个 下面有的文件是daemon.json
打开之后添加这么一行{
"registry-mirrors": ["https://2rxr73g1.mirror.aliyuncs.com"]
}
注意:这里的里面的地址是我注册了阿里云之后的我自己的,您可以也尝试注册一下,这里就不赘述了重新加载
systemctl daemon-reload
镜像
关于镜像,其实就是可以理解为我们平时用各软件的时候的安装包.但我们安装完之后,就可以使用它的功能,或者按照我们面向对象的概念来说就是:镜像就是一个个的类,而容器就是一个个的类实例
这里我是拉取了redis镜像和tomcat镜像
redis : docker pull redis
tomcat : docker pull tomcat
这样就把这两个镜像拉取下来了,这里注意的是如果不指定版本,会默认下载最新的也就是latest版本
查看目前拥有的镜像:docker images
就可以列出来了
接下来我们启动一下 这两个镜像:
- 启动redis
执行:docker run -d -p 6379:6379 --name myredis f7302e4ab3a8
解释一下这个命令: -d 是后台运行 -p是端口映射 主机端口:容器端口
后面的- -name 是给容器起个名字 最后面是我的镜像id
当我们执行完run 之后,容器就起来了
我们可以通过docker ps 查看 已经启动的容器, 通过docker ps -a 查看所有容器,包括停止的容器
这样,redis就已经可以使用了,假设说您需要一个带有密码的redis 那么创建容器的时候就应该这样写命令:docker run -d -p 6379:6379 --name myredis f7302e4ab3a8 --requirepass "123456"
这样就是一个带有密码的redis 密码为123456
- 启动tomcat
和redis 一样 也是 执行这个命令
docker run -d -p 8080:8080 --name mytomcat 96c4e536d0eb
这样我们的 redis 和tomcat 就全部起来了,已经可以正常使用了
那么问题来了,我该怎么把我自己的war 或者一些静态html 放到tomcat 下然后让我访问呢???
这里介绍两种方式:
第一种: 把我们自己的war/或者文件 直接通过docker cp 的形式,拷贝到 tomcat/webapps下
重启容器,就跟我们正常使用tomcat 一样
命令如下:
查看tomcat的路径:docker exec -it 1170916773cf /bin/bash
1170916773cf 是容器id
结果是:/usr/local/tomcat
那么我们可以执行:docker cp app.war 1170916773cf :/usr/local/tomcat/webapps/
这样就把我们的war 包放到了容器的tomcat 里面了,重启一下容器, 完事!
第二种: 直接通过镜像运行我们自己的项目
比如我们创建一个文件夹 名称为tomcatfile
然后在这个文件下创建一个Dockerfile ,把我们的war 放到统计目录下
Dockerfile 内容为:
from tomcat:latest
copy app.war /usr/local/tomcat/webapps/
两行完事,然后在tomcatfile这个文件夹下,执行命令:
docker build -t mytomcat .
千万注意啊,后面有个点 ,完事就创建好了自己的镜像,然后可以和前面一样使用docker run 进行容器启动了
删除镜像:docker rmi 镜像id
想要删除镜像,必须是该镜像没有被任何容器使用,不管是启动的容器还是停止的容器
容器
刚刚说了镜像就像是我们java里面的类,而容器就是我们根据类new 出来的实例
上面说镜像的时候我们提到过: 可以通过docker ps
查看 已经启动的容器, 通过docker ps -a
查看所有容器,包括停止的容器
可以手动的启动容器/停止容器
启动:docker start 容器名称或容器id
停止:docker stop 容器名称或容器id
重启:docker restart 容器名称或容器id
删除容器:docker rm 容器名称或容器id
至此docker的安装 到使用就写完了,接下来我们部署一下springboot 项目
-
创建一个springboot 项目并且打包成jar
我这里使用最简单的一个springboot项目,只是实现成功部署并且正常访问即可,文件目录特别简单什么都么有,只有一个启动类,一个页面
我们要的是部署完了之后可以正常跳转hello页面
顺便贴一下hello.html 以便一会验证
-
将以上项目进行打包 形成一个demo-0.0.1-SNAPSHOT.jar
-
在服务器上的创建一个文件夹 我的目录为:
/dockerfiles/demo/
你可以自行创建
cd /dockerfiles/demo/
切换到该目录
touch Dockerfile
创建文件 -
dockerfile 内容如下
FROM frolvlad/alpine-oraclejdk8:slim
copy demo-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 9001
ENTRYPOINT [ "sh", "-c", "java -jar app.jar" ]
就这么几行 -
上传我们刚刚打好的jar包到
/dockerfiles/demo/
文件夹下 -
现在这个文件夹下有两个东西,一个是我们的jar包.一个是Dockerfile文件
-
执行命令:
docker build -t demo .
-
查看我们的镜像
docker images
就会发现会有一个我们刚刚创建的镜像,名称是demo -
执行命令:
docker run -d -p 9002:9002 --name demo demo/06c2691ebdb4
说明一下:“- -name demo demo/06c2691ebdb4” --name 是给容器起得名称为demo(随意). 后面的demo 是镜像的名称
06c2691ebdb4 是镜像的id,我们可以使用镜像名称或者镜像id 都可以 -
执行完改命令之后我们的容器就已经运行起来了,你可以使用
docker ps
查看 -
通过网页访问:192.168.134.130 是我的服务器地址
这样我们自己的springboot项目就算是部署完成了,大功告成!
说一下防火墙的坑
- 端口号开放问题
我们通过了端口映射之后, docker 会自动的将该端口的防火墙打开,但是当你执行命令,查看防火墙开启的端口号的时候,并没有存在于列表中
例如我刚刚的9002 端口,并没有开放,也是可以从页面访问的
-
日志 No route to host 问题
当我们的防火墙是开启的时候,正常部署完了之后你会发现,容器也启动了,但是访问的时候日志就报错了.关键词就是这样的No route to host
,这个我百度了一下,大神们说执行完这个命令就行了nmcli connection modify docker0 connection.zone trusted
systemctl stop NetworkManager.service
firewall-cmd --permanent --zone=trusted --change-interface=docker0
systemctl start NetworkManager.service
nmcli connection modify docker0 connection.zone trusted
systemctl restart docker.service
结果确实好用
docker容器启动又停了的问题
-
首先看你在执行 docker run 的时候有没有 -d 这个参数 没有的话需要加上
-
通过查看docker容器的启动日志来检查是不是我们的程序在启动过程中报错了,导致没有启动成功
-
查看日志的方法
docker容器日志查看docker logs -f -t --tail 100 demo 查看demo容器 指定2019-08-27之后的日志,只显示最后100行: docker logs -f -t --since="2019-08-27" --tail=100 demo 查看demo容器最近10分钟的日志: docker logs --since 10m demo 查看某时间之后的日志: docker logs -t --since="2019-08-27T14:00:00" demo 查看指定时间段日志: docker logs -t --since="2019-08-27T14:00:00" --until "2019-08-27T15:00:00" demo 将错误日志写入文件: docker logs -f -t --since="2019-08-27" demo | grep error >> demolog_error.txt