Docker初体验【安装、部署、启动java项目】
一、Docker的安装
CentOs 的基础知识
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
容器与镜像的关系类似于面向对象编程中的对象与类。
| Docker | 面向对象 |
|---|---|
| 容器 | 对象 |
| 镜像 | 类 |
基本概念。
| 概念 | 说明 |
|---|---|
| Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
| Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
| Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。 |
| Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
| Docker 仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 |
| Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
使用 yum 安装
1. 检查系统版本
Linux查看版本当前操作系统发行版信息:uname -a
Linux查看版本当前操作系统内核信息:cat /etc/redhat-release
2. 开始安装
yum 安装docker:yum -y install docker
启动docker服务(方式一):service docker start
启动docker服务(方式二):systemctl start docker.service
设置docker服务开机自启:systemctl enable docker.service
测试运行docker:docker run hello-world
PS:由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。
3. 解决镜像下载缓慢问题
# 如果没有这个文件,自行创建
vi /etc/docker/daemon.json
#修改文件内容
{
"registry-mirrors": ["https://hccwwfjl.mirror.aliyuncs.com"]
}
#重启docker
systemctl restart docker
4. docker拉取镜像报错【error pulling image configuration】
echo "DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io\"" | sudo tee -a /etc/default/docker
DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io"
5. 其余常用指令
查看docker镜像目录:docker images
删除docker镜像(需要先删除其下容器):docker rmi 镜像ID
查询镜像:docker search 镜像名称
拉取镜像:docker pull 镜像名称:[标签 自定义]
查看docker所有容器目录:docker ps -a
查看docker启动的容器目录:docker ps
删除docker容器:docker rm 容器名称/容器ID
开启docker容器:docker start 容器名称/容器ID
停止docker容器:docker stop 容器名称/容器ID
进入容器内部并操作:docker exec -it 容器名称/容器ID /bin/bash
退出容器但不关闭容器:Ctrl + P + Q
查看docker网络目录:docker network ls
查看docker指定网络信息:docker network inspect 网络名
创建网络:docker network create 网络名
更多详情参考:w3cschool
二、springboot项目部署到服务器
后台项目构成: springboot + mysql + redis
前端页面构成:vue + tomcat
搭建环境
访问mysql、redis与常规项目的区别
常规项目部署的时候由于后台与mysql、redis在同一环境下,习惯用localhost进行访问,这是可行的。
但是docker容器之间是互相隔离的,不能互相访问,那怎么办呢?
1.将容器端口全部暴露,与宿主机相应端口连接,通过宿主机ip+端口形式访问。
很明显对于生产环境而言,既不安全也不规范
2.实现容器与容器之间的互访,这个方法下面会重点提到。
下载redis镜像
- 在仓库搜索镜像信息
docker search redis - 拉取镜像,可能会报错,解决方案已经上面提供
docker pull redis:3.2 - 镜像下载完毕后,查看镜像信息
docker images - 创建redis容器
语句解释:docker run -d --name [容器名称] -v $PWD/data:/data -p 6379:6379 [镜像名称]:[镜像标签] redis-server --apendonly yes
| 指令 | 解释 |
|---|---|
| -d | 后台运行容器,并返回容器ID;此处还有另外两个值-i -t,容器交互时使用 |
| - -name | 给容器起名称 |
| -v | 给容器挂载存储卷,挂载到容器的某个目录 |
| $PWD | 当前目录目录 |
| -p | 指定容器暴露的端口,前者为宿主机端口,后者为容器端口 |
| –apendonly yes | 开启持久化 |
更多信息参考: docker安装redis,挂载外部配置和数据
- 查看redis容器是否启动成功,成功则会显示
docker ps - 如果失败了,查看报错信息
docker logs 容器ID
创建jar包镜像
- 对自己项目打成jar包 放到服务器上,我这边储存路径是/home/docker
- 编写DockerFile文件,内容如下,也把他放到jar所在文件夹下
# Docker image for springboot file run # 基础镜像使用java FROM java:8 # VOLUME 指定了临时文件目录为/tmp。 # 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp VOLUME /tmp # 将jar包添加到容器中并更名为app.jar ADD demo.jar /app.jar # 运行jar包 声明:jar包启动端口8086。 RUN bash -c 'touch /app.jar' ENTRYPOINT ["java","-jar","/app.jar"] - 进入jar所在目录 ,执行命令,创建镜像
PS:结尾有个点,代表dockerfile文件所在路径,这里表示当前目录。docker build -t 镜像名称 . - 创建容器,启动项目
PS:我这里启动报了个错,因为项目yml里redis的配置我写的host:localhost,这里jar包是访问不到redis的,所以启动失败,这个时候就需要实现容器间的互访。docker run -d --name [容器名] -p [宿主机端口]:[容器端口] [镜像名称]:[标签]
容器间的互访(网络)
容器间互访有3种方法:虚拟ip访问、link、网络
下面主要说明网络的实现方法,其他方法 参考链接
- 创建网络
docker network create [网络名] - 查询网络信息
docker network ls - 创建redis 、jar包容器
PS:注意上面redis的语句,我并没有将其端口暴露出来,那是因为它与jar包两个容器可以互相访问,对于能否通过宿主机的端口访问已经不重要了,所以可以不用写了。#redis docker run -itd --name [容器名] --network [网络名] --network-alias [网络别名,可以与网络名一致] -v $PWD/data:/data [镜像名称]:[镜像标签] redis-server --apendonly yes #jar包 docker run -itd --name [容器名] --network [网络名] --network-alias [网络别名,可以与网络名一致] -p [宿主机端口]:[容器端口] [镜像名称]:[标签]
PS:由于redis和jar两个容器已经在同一环境下,jar包里面如果要连接redis,就不需要通过ip连接,直接写redis所在网络别名即可。

三、结束语
总的来说,docker初体验还是比较圆满的,把所有可能踩到的坑都碰了个遍,不过好在最后都圆满解决了。mysql和tomcat的安装,并没有详细说明,大家可以自行尝试一下。

1万+

被折叠的 条评论
为什么被折叠?



