关键词:
部署项目是一件很麻烦的事,尤其是当同一个项目部署到很多服务器的时候,这种麻烦变得更加让人难受。
在我刚到公司的时候,公司之前的先项目采用的就是使用Web服务器Tomcat部署项目,但是后来的新项目是微服务的架构,所以部署十几个服务变得比较麻烦,后来技术经理想到了使用Docker,现在也来学习如何快捷的部署自己的项目。
刚开始学习当然是先安装了,这里使用的macOS,安装和其他的软件没有什么区别,就是下载完毕后直接拖到application里面就完成安装了。
安装完毕后需要修改镜像加速地址。
具体的安装在下面的网站也有详细的步骤。http://www.runoob.com/docker/docker-tutorial.html
安装完毕后在终端输入:docker --version。显示如下界面表示成功。
安装完毕就要介绍一些部署的流程,顺便介绍一下Docker的一些结构。
Docker的一些简单介绍这里就不在累述了。具体的一些信息可以在下面的网站了解:http://www.runoob.com/docker/docker-tutorial.html
Docker是一个虚拟化的容器引擎,具体的服务可以在虚拟机中运行,和宿主主机分开,达到了不依赖宿主环境的效果,这也是Docker可以简化部署的原因,Docker的优点还有很多。这里也不再详细介绍。
Docker具体的部署分为三步:
1.将项目变为一个镜像。
2.将厂库中的镜像pull下来并且实例化为容器。
3.将容器启动,完成部署。
这里的镜像和Java中的类差不多,容器和Java中的对象差不多,一个镜像可以实例化为好多的对象,一个镜像也可以在其他镜像的基础上面进行修改。而厂库的概念又有点想git,一个镜像也好像git里面的代码,代码也是有着名字和地址的,同时版本还拥有版本号,这些镜像都有。
因为自己的具体Docker实现是将一个SpringBoot项目打包到Docker中完成部署,但是一些中间件还是使用宿主机器的。这就是大致的一个思路。
下面就说说具体的实现:
先是将项目添加Docker的插件和Dockerfile文件。
在pom.xml文件中添加插件如下:
<!-- 加入maven插件 docker-maven-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>
这里要注意几个路径的参数,修改到自己的项目中时要发生一些变化。
Dockerfile文件里的内容如下:
# Usage: FROM [image name] FROM java:8 # Usage: MAINTAINER [name] MAINTAINER yanyu VOLUME /tmp ADD spring-boot-train-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] # Usage: EXPOSE [port] EXPOSE 8080
这些添加完毕,项目就可以打包成镜像了。
先cd到项目到根目录下,在执行打包命令,打包命令是:
mvn clean package docker:build
上面到命令是打包和build一起执行到,在命令不报错到情况下,会直接生成一个镜像,后面运行镜像就可以了。运行命令如下:
docker run --name nginx_web -d -p 8080:80 name
上面到参数有些可以看懂,--name就是指定容器name,-d是后台运行,-p是指定端口映射,最后的name就是镜像的名字。
如果这个地方不报错,就可以直接访问你到项目了。部署项目到Docker就是完成了。
下面就讲一下自己踩到的坑。
在最开始尝试到时候建立了很多的容器,想删除镜像时却无法删除,这里的原因就是在删除镜像之前一定要先删除容器(不是停止容器,是删除容器),然后才能删除镜像。
打包的时候出错非常多了,这里面的问题也是有很多,大部分都是配置的问题,下面就说几个点:项目的名字最好不要用大写字母,因为Docker会报错。项目一定写上打包的地址在哪里,同时在Docker插件的添加中也要声明Dockerfile文件的位置。
打包完成后并不是代表你的项目就部署完毕了,因为项目是部署在虚拟机上面,所以在你机器上面测试通过的代码可能就会有问题。比如MySQL的URL问题,因为Docker容器和宿主主机不是同一个ip,所以代码中localhost可能就会出问题,上面的端口映射讲的就是这个问题,就是将宿主主机上面对于8080端口的请求都映射到虚拟机上面,至于MySQL的问题为这里也是有一个不是解决办法的解决办法,就是使用电脑的ip地址,比如10.168。55.123。网络的问题还是比较复杂的,自己对于一些具体的细节还是没有深入了解。
下面就说说Dockerfile文件内参数的意思:
ADD
ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。
CMD
和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。
ENTRYPOINT
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。
ENV
ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。
EXPOSE
EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。
FROM
FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。
FROM ubuntu
MAINTAINER
我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。
RUN
RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。
USER
USER命令用于设置运行容器的UID。
VOLUME
VOLUME命令用于让你的容器访问宿主机上的目录。
WORKDIR
WORKDIR命令用于设置CMD指明的命令的运行目录。
上面关于参数的解释参考了一些博客。
下面在说说Docker常用的命令。上面使用到不再累述。
查看容器日志:docker logs name
删除容器: docker rm id
删除镜像: docker rmi id
删除所有的容器: docker rm $(docker ps -a -q)
查看所有的容器: docker ps -a
查看正在运行的容器: docker ps
剩下就没有什么问题了,在贴上具体的一些参考的博客。
Docker的详解和具体实现:https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html#autoid-0-0-0
Docker的网络问题解析:https://zhuanlan.zhihu.com/p/26418829?utm_medium=social&utm_source=weibo
就这样吧,结束。
web3.0的初步学习研究(代码片段)
...近关注的了一些Web3.0的新闻,准备对web3.0做个全面的了解,今天文章中写的是我个人的认识,不一定对,仅供参考。web3.0是什么web3.0还处于初期探索阶段,是很多东西的组合,如区块链、数字资产和金融及... 查看详情
docker教程-1-学习及安装docker(代码片段)
转自:Docker教程-1-学习及安装Docker,更优体验:http://www.kongzid.com/目录1、Docker介绍1.1 Docker的来源1.2 Docker是什么1.3 Docker特点1.4 Docker的应用场景1.5 Docker的优势2、Docker版本及安装要求2.1Docker版本介绍2.2Docker安装要求3... 查看详情
docker简单了解及安装使用(代码片段)
docker一、概述1.1设计宗旨1.2特点1.3Docker与虚拟机的区别1.4Docker核心概念镜像容器仓库二、服务安装2.1准备工作2.2安装docker安装依赖包设置阿里云镜像源安装Docker-CE并设置为开机自动启动查看版本信息三、docker镜像操作3.1搜索镜像... 查看详情
docker简单了解及安装使用(代码片段)
docker一、概述1.1设计宗旨1.2特点1.3Docker与虚拟机的区别1.4Docker核心概念镜像容器仓库二、服务安装2.1准备工作2.2安装docker安装依赖包设置阿里云镜像源安装Docker-CE并设置为开机自动启动查看版本信息三、docker镜像操作3.1搜索镜像... 查看详情
初步了解vue源码(代码片段)
1、源码学习目录本项目所剖析的Vue.js源码版本是目前最新的版本,版本号为v2.6.11,其代码目录如下: 从上面的目录结构可以看出,Vue的整个项目包含了类型检测相关、单元测试相关、与平台无关的核心代码以及跨平台... 查看详情
docker教程-1-学习及安装docker(代码片段)
目录1、Docker介绍1.1 Docker的来源1.2 Docker是什么1.3 Docker特点1.4 Docker的应用场景1.5 Docker的优势2、Docker版本及安装要求2.1Docker版本介绍2.2Docker安装要求3、Docker的核心概念3.1 Docker引擎3.2Docker的组成4、LinuxUbuntu 安装Docker4.1查看系... 查看详情
十分钟了解docker(我的docker学习笔记)(代码片段)
Docker学习笔记碎碎念背景知识Docker是什么Docker有什么用Docker原理Docker实践InstallDockerEngineonUbuntu常用命令操作实践镜像相关容器相关Docker作业练习学习参考资料碎碎念最近再学云原生技术与应用,之前没接触过,所以打算... 查看详情
docker学习docker概述及安装(代码片段)
1、Docker介绍Docker官网:https://www.docker.com/Docker文档地址:https://docs.docker.com/Docker仓库地址:https://hub.docker.com/Docker是一个开源的应用`容器引擎`,让开发者可以打包自己的应用和依赖到一个可移植的`镜像 查看详情
sass学习笔记--初步了解函数运算条件判断及循环
函数sass定义了很多函数可供使用,当然你也可以自己定义函数,以@fuction开始。sass的官方函数链接为:sassfuction,实际项目中我们使用最多的应该是颜色函数,而颜色函数中又以lighten减淡和darken加深为最,其调用方法为lighten($co... 查看详情
对软件技术基础的课程期望及git的初步了解
...p;大一的c程序设计课程的学习让我对编程语言有了初步的了解,但只是在简单程序的编写上,对编程的应用毫无了解。我希望在软件技术基础这门课上,学习到如何实现从编程到一个软件的制作。另外,在平日的学习中,我少与... 查看详情
g++-7windows10下ubuntu子系统(wsl)安装g++及初步使用,docker使用g++(代码片段)
环境:Windows10WSLUbuntu18.04.5LTS,假设已经安装好1、安装g++sudoadd-apt-repositoryppa:ubuntu-toolchain-r/testsudoaptupdatesudoaptinstallg++-7-y2、查看版本gcc-7--version或者g++-7--vers 查看详情
istio的安装,流控初步了解(代码片段)
istio安装前提:kubernetes1.7.3及以上,并开启RBACkubernetes1.9以上,支持自动安装sidecarinjection环境要求:1、开启serviceaccount2、网络组件3、有dns下载源码包:cd/usr/local/src/wgethttps://github.com/istio/istio/releases/download/0.7.1/istio-0.7 查看详情
docker及docker-compose学习(代码片段)
一 docker简介 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互... 查看详情
ternsorflow学习:001-通过例程,初步了解tensorflow(代码片段)
前言本章的目的是了解和运行TensorFlow,在开始之前,让我们先看一段使用PythonAPI撰写的TensorFlow示例代码,让你对将要学习的内容有初步的印象。下面这段短小的Python程序将把一些数据放入二维空间,再用一条线来拟合这些数据... 查看详情
初步了解redux(代码片段)
...哪一步写错了内容。 下面简单的说一个我对它的一些了解和使用,给大家提供一些参考 好的,使用redux最开始的一步就是安装 查看详情
jenkins初步理解及参数化构建(代码片段)
jenkins构建和插件的初步理解就我目前了解到的,一个jenkins自动化部署,至少包含拉代码、编译和打包及运行单元测试、部署这几个步骤。拉代码指的是从代码托管服务器下载代码,编译和打包及运行单元测试,... 查看详情
初步了解云原生(代码片段)
初步了解云原生公有云:即公共的服务器或者公共资源。成本低:对服务付费无需维护:服务提供商进行服务器维护几乎无限制的缩放性:按需付费高可靠性:具备众多服务器私有云:自己购买硬件及搭建服务... 查看详情
spark基础学习笔记03:spark运行架构及原理(代码片段)
...行流程2、YARN-Client运行流程3、两种模式的比较三、初步了解RDDÿ 查看详情