什么是Docker?
docker
Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 的优点
Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。 容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案: 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。 Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
Docker简述版:
以上是比较官方的说法,但是呢?还是看不懂怎么办? 简述版:程序员自己从头到尾搭建了一套环境开始写代码,写完代码后程序员要把代码交给测试同学测试,这时测试同学开始从头到尾搭建这套环境,测试过程中出现问题程序员也不用担心,因为他那能运行;测试同学测完后终于可以上线了,这时运维同学又要重新从头到尾搭建这套环境,但是呢,上线系统就崩溃了。 从这个过程可以看到,我们重复搭建了三套环境还不一定能跑,典型的浪费时间和效率,因此容器技术应运而生,就是咱们要用的docker。 又有同学说,我用虚拟机搭一个环境然后给测试,运维就好了嘛,这当然可以,但是虚拟机是个操作系统,本身占用内存就很大,这样一来软件也布置不了几个了, 所以有了 容器技术: 容器相互隔离;长期反复使用;快速装载和卸载;规格标准,在哪都可以放置;
容器
Docker的使用
使用官方安装脚本自动安装:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
设置仓库(下面这个是阿里云的,目的就是下快一点点)
sudo yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
启动docker服务
systemctl start docker.service
查看docker状态:
systemctl status docker
有如下就说明启动成功:
将vue部署上docker
首先自己的vue项目中打包:
然后在dist文件夹就是我们打包的项目
接着我们把dist文件夹移动到一个自己建的文件夹,并且在该文件夹下建立一个Dockerfile文件(记住没有后缀名)
接着打开这个Dockerfile编辑,编辑完成保存就行了:(编辑器排版原因,大家复制过去就是正常的)
# 设置基础镜像,也就是会先拉去nginx的镜像FROM nginx# 定义作者 EdisonMAINTAINER SanQi # expose,该容器暴露的端口是多少EXPOSE 7777# 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面COPY dist/ /usr/share/nginx/html/
接下来在我们的服务器上,查看根目录下面有个projectfile文件夹(我自己建的,然后把这2个文件上传到该文件夹,也可以上传自己喜欢的文件夹)
进入该文件夹
cd projectfile
构建一个镜像(要进入这个文件夹下操作,因为Dockerfile文件在里面):
docker build -t jxcvue . #注意有个. dockervue 是取得镜像名字
备注:关于镜像,可以理解为一个软件就是一个镜像,我们的项目是个镜像,mysql也是个镜像,redis数据库也是镜像
查看镜像:
docker images
接下来我们构建一个容器:
构建容器之前我们先看该镜像的暴露端口(后面要用)
docker history jxcvue
一共有2个,一个80,一个7777,这个时候,选择下面这个80的,要是没有下面这种80,才选择上面那个,别问我为什么,我是试出来的。
现在才是构建一个容器:
docker run --name jxcvue -d -p 7777:80 jxcrvue
备注:--name 给这个容器取名字,-d 后台运行,-p 设置端口,前面这个是映射到主机上去的地址,可以自己编个,后面80就要用到我们上面查到的端口,后面的 jxcvue就是我们指定的镜像了
查看正在运行的镜像:
doucker ps
使用ifconfig看一下本机的ip
ifconfig
接下来我们就输入ip和vue容器的端口:
到此vue的部署完成
springboot的部署
springboot有mysql的环境,redis的环境(我的项目用了这2个,只有mysql的就只安装mysql)
安装mysql(也就是构建mysql的镜像)
docker pull mysql:5.7 #这个是安装的5.7版本
构建mysql的容器:
docker run -d --name mysql \ --restart=always \ -p 3306:3306 \ -v mysql:/etc/mysql/ \ -v /tmp/mysql:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.7 --character-set-server=utf8mb4 --collation-ser
备注:123456就是mysql的密码,默认就是root用户,mysql:5.7就是用的刚刚安装的mysql镜像 ,其他的可以不用动
查看正在运行的容器:
docker ps
现在我们的数据库服务已经跑起来了,但是没有数据库,也没有数据对吧?
先把外部的yyy.sql文件放mysql的文件夹下面:
cd projectfile/jxc #先cd进入放有yyy.sql的文件夹
docker cp yyy.sql mysql:/yyy.sql #然后cp复制到mysql文件夹下
进入数据库创建一个
docker exec -it mysql mysql -h 192.168.10.136 -uroot -p123456
#192.168.10.136就是服务器的ip,通过ifconfig可以查得,用户名root,密码123456
创建数据库:
CREATE DATABASE 数据库名;
数据库创建完成,进入当前数据库:
use vue;
登陆控制台执行source 命令 ,导入sql文件:
source yyy.sql;
看当前数据库表:
SHOW TABLES;
到此数据库安装成功
下面我们部署springboot
改一下application:
使用package打包:
打包文件:
然后把jar包移一下位置,并新建一个Dockerfile文件(不要后缀名)(jar包可以改名字的)
Dockerfile文件配置:
FROM openjdk:8
VOLUME /home/sanqi/File/springboot
ADD inventorySystem.jar inventorySystem.jar
EXPOSE 9999
ENTRYPOINT ["java","-jar","/inventorySystem.jar"]
#from openjdk:8 拉取一个 jdk 为 1.8 的依赖环境#fishexam.jar 就是你上传的 jar 包,替换为 jar 包的名称
#fishexam.jar 是你将该 jar 包重新命名为什么名称,在容器中运行
#expose 该容器暴露的端口是多少,就是 jar 在容器中以多少端口运行
#entrypoint 容器启动之后执行的命令,java -jar /fishexam.jar 即启动 jar
然后我们将这2个文件放入到服务器的/projectfile/jxc/springboot文件夹下面,放哪大家找得到就行
cd进入该文件夹
cd /projectfile/jxc/springboot
构建一个镜像(要进入这个文件夹下操作,因为Dockerfile文件在里面):
docker build -t jxcspringboot . # 注意有个. jxcspringboot是取得镜像名字
备注:关于镜像,可以理解为一个软件就是一个镜像,我们的项目是个镜像,mysql也是个镜像,redis数据库也是镜像
查看创建的镜像:
docker images
接下来我们构建一个springboot的容器:
构建容器之前我们先看该镜像的暴露端口(后面要用)
docker history jxcspringboot
只有一个9999,这个时候,就选择9999的
现在才是构建一个容器:
docker run --name jxcspringboot -d -p 9999:9999 jxcspringboot
备注:--name 给这个容器取名字,-d 后台运行,-p 设置端口,前面这个是映射到主机上去的地址,可以自己编个,后面9999就要用到我们上面查到的端口,后面的 jxcspringboot就是我们指定的镜像了
查看正在运行的镜像:
doucker ps
现在我们在浏览器看一下:后端就跑起来了
总结:docker里面的镜像理解为一个服务,比如mysql,springboot,vue,然后我们可以创建多个容器,他们可以跑起来,也可以指定端口,需要注意的:项目里设计到的ip,原本是127.0.0.1的这些都要改为服务器这边对应的ip和端口
常用docker命令:
启动docker服务:systemctl start docker.service
设置自启动:systemctl enable docker.service
重新启动docker:systemctl restart docker
查看docker状态:systemctl status docker
构建一个镜像:docker build -t dockervue . //注意有个.
docker里有哪些镜像: docker images
查看镜像的构建历史,镜像的原始暴露端口:docker history 容器ID或容器名
删除指定镜像(根据id): docker rmi 容器ID或容器名
docker正在运行的容器(或者后面-a看所有): docker ps
创建指定的在docker中容器:docker run --name hvue -d -p 9090:80 dockervue
重启容器:docker restart 容器ID或容器名
停止指定容器:docker stop 容器ID或容器名