Docker容器技术
docker提供轻量的虚拟化,通过docker镜像能创建出多个容器,一个容器相当于一个虚拟机。可以把镜像快速部署到无数台服务器上。
面对多种复杂的开发环境,docker能很好的解决企业不同的项目的不同开发环境,使开发运维一体化,环境互不干扰,提高工作效率。
Docker与虚拟机对比:
虚拟机:资源全部隔离,cpu、内存、磁盘相互独立,一台宿主机中可以安装的虚拟机数量是一定的,有限的,移植性不强(文件很大,拷贝传输困难)。
Docker:部分共享部分隔离,共享cpu,内存,磁盘甚至操作系统,极为轻量
Docker五大要素:
- 沙箱:隔离,将应用之间的必要资源隔离开,防止互相影响,应用之间互相独立。
- 镜像:模板,使用dockerfile制作镜像,通过镜像创建容器。
- 容器:镜像的实例,镜像只读,容器可写,容器中可以保存应用产生的零时文件
- 数据卷:挂载到容器上,用于保存必要数据。比如容器中数据库的数据,但是不建议用,因为重启容器需要挂载同步数据,效率较慢,解决方式:数据库拆分
- 仓库:与maven仓库概念一致,应用都会保存在仓库中,创建容器是根据镜像的规定进行拉取,可以共享。
-
https://www.cnblogs.com/wushuaishuai/p/9984228.html
Docker对Linux的版本要求:
docker基于Linux3.8及以上版本64bit内核开发,所以在使用docker前需要确认Linux内核版本
一般要centos7以上(查看命令:uname -a)
二、下面我们正式进入docker容器技术的使用,这里会介绍Redis容器,MySQL容器,Tomcat容器
1.1安装内核版本高于centos7的虚拟机
1.2修改静态IP:(参考命令)vim /etc/sysconfig/network-scripts/ifcfg-ens33
在物理机中找到对应的虚拟机网络映射IP,然后按“i”修改ipaddr,gateway,dns1前三个网段与物理机查到的一致
esc进入命令模式,:wq退出
1.2.1重启网络服务,让IP地址生效,命令为:service network restart
使用xshell连接虚拟机,Ctrl+C退出
1.2.2 注意防火请要关闭
systemctl stop firewalld.service 关闭防火墙
systemctl disable firewalld.service 禁止防火墙开机自动启动
firewall-cmd --state 查看防火墙状态
1.3 安装docker:略(和安装其他软件一样)
1.3.1 验证docker是否安装成功命令: docker version
1.3.2 启动docker
systemctl status docker service docker restart 查看docker状态/重启docker
systemctl start docker service docker stop 启动docker /停止docker
1.4 在做第一个Redis案例之前先了解一些docker命令
docker load -i xxxx.tar (指定jar包导入镜像文件/加载镜像)
docker rm 镜像名 (根据镜像名删除镜像)
docker images (查询所有镜像文件)
docker tag 旧镜像名和端口 redis-ali:0.0.1 (修改镜像名称)
docker run -d --name 容器名 镜像名:版本号 ( 根据镜像名称启动容器)
docker ps -a (查看全部的容器)
1.5 Redis案例
这里我是在/usr/local/src目录下新建了redis文件夹,然后用FileZilla把我的Redis镜像(redis-3.2.8.tar
)拷入虚拟机
执行cd /usr/local/src/redis 和 docker load -i redis-3.2.8.tar (加载redis镜像) docker images(查看镜像)
1.5.1 创建容器:
docker run -d --name redis7000 -p 7000:6379 redis:3.2.8 (创建,启动容器,并指定暴露端口)
容器名(redis7000) 虚拟机端口(7000) 镜像端口(6379) 镜像名/版本号 (redis/3.2.8)
访问过程如下图:
1.5.2 命令:docker ps -a 查看容器
1.6 测试点个容器
创建maven quick start项目,项目名redis。
pom.xml中把junit版本改成4.12,添加jedis依赖
<!-- jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.6.2</version>
</dependency>
1.6.1 创建测试类 JedisTest
1.6.2 查看数据是否成功存入redis7000 容器中,进入到容器执行以下命令
如上图,则数据成功存入redis7000容器。
1.6.3 创建多个redis容器:思路图
docker run -d --name redis7001 -p 7001:6379 redis:3.2.8
docker run -d --name redis7002 -p 7002:6379 redis:3.2.8
执行查看容器命令:docker ps -a (可以看到3个redis容器就创建好了,能理解思路图很重要)
测试的话,参考一个redis容器测试方法。
附加:
docker start redis7000 docker stop redis7000 docker rm redis7000(开始/停止/删除容器,删除必须先停止)
可以用docker stats -a 命令查看docker容器消耗的CPU,你会发现性能超级好 退出 Ctrl+C
然后就是docker容器有以下优点或者说特性吧,后面会做解释
2.创建网络
创建Tomcat容器和MySQL容器,使我们的外部浏览器能访问到数据
2.1 执行 docker network create --subnet=172.18.0.0/24 dockernet 创建网络,执行 ifconfg发现多一个新的网络
2.2 把我们的MySQL镜像上传到 服务器/usr/local/src中 (我的MySQL镜像名:mysql-image.tar)
加载MySQL镜像,命令为:docker load -i mysql-image.tar
查看镜像 (下图)命令:docker images,如果红色框那里是<none>我们就要为镜像起仓库地址名字和设置版本号
命令为:docker tag IMAGE ID(镜像唯一ID,根据自己的写) docker.io/(REPOSITORY_name):(版本号)
2.2.1 MySQL镜像已经加载好了,接下来根据镜像创建容器
//启动mysql docker容器,设置root密码,设置默认编码,指定端口映射:命令为
docker run --net dockernet --ip 172.18.0.11 --name=mysql-container -it -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --character-set-server=utf8
注意这个172.18.0.11这是我们一开始创建的那个新的网络,前三个网段一致,最后一位0~255自己分配
此时执行 docker ps -a 就可以查看我们的MySQL容器了
附录(查看MySQL的IP命令:docker inspect mysql-container)
2.2.2 导入数据库 建议用数据库可视化工具,主机名填我们的虚拟机IP,然后导入项目的XXX.sql数据文件
3 Tomcat容器
把Tomcat镜像上传至/usr/local/src 执行加载镜像命令
docker load -i Tomcat镜像名 (我的是tomcat7-image.tar) 查看镜像docker images
如若REPOSITORY 和 TAG栏显示<none>则执行:
docker tag 510e45f8f9f7 docker.io/tomcat:7.0 (这个命令上面,安装MySQL时候提到过)
3.1 创建Tomcat容器: docker run -d -p 8080:8080 --net dockernet --ip 172.18.0.12 --name xiangmu-tomcat tomcat:7.0
(不多解释了,看不懂就自己想办法吧)
3.2 到这里我们就算完成项目的环境搭建了,此时浏览器输入http://虚拟机IP:8080就可以访问到Tomcat首页了
然后把我们项目的jdbc驱动链接IP改为我们的虚拟机IP,重新打war包,把打好的war包改为ROOT.war上传到
/usr/local/src文件夹中,然后拷贝到容器Tomcat的webapps中,命令为:
docker cp ROOT.war xiangmu-tomcat:/usr/local/tomcat/webapps/
浏览器访问http://虚拟机IP:8080/ (这个8080是3.1那行红色那个8080)
这样我们就能看到项目首页了
附录:我们的root.war会自动解压,如果没自动解压重启Tomcat容器4
三: Dockerfile制作镜像 很重要,很核心
我们制作好一个完整的开发环境,上面第二大步就完成了一个完整的开发环境
由于用到脚本语言,建议防着写,我也不懂脚本语言 ,docker images可以看到我的虚拟机已经装好一个操作系统镜像
把jdk和Tomcat上传到/usr/local/src中 (jdk-8u51-linux-x64.tar.gz apache-tomcat-7.0.55.tar.g)到官网自己下载Linux系统版本的
用开发工具IDE创建一个名为oa的maven webapp项目(项目名你随便起也行,测试用)->maven install ->在target文件夹中找到oa.war
拷贝到\usr\local\src
3.1 在物理机创建Dockerfile文件,内容如下
#添加contos6.5 image
FROM a2a69ca5184a
#添加JDK1.8 centos+jdk
ADD jdk-8u51-linux-x64.tar.gz /usr/local/src
ENV JAVA_HOME=/usr/local/src/jdk1.8.0_51
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#centOS6.5+JDK1.8+tomcat7
ADD apache-tomcat-7.0.55.tar.gz /usr/local/src
ENV CATALINA_HOME /usr/local/src/apache-tomcat-7.0.55
ENV PATH=$PATH:$CATALINA_HOME/bin
#添加oa.war包文件
WORKDIR $CATALINA_HOME/webapps
RUN mkdir oa
COPY oa.war $CATALINA_HOME/webapps/oa/oa.war
WORKDIR $CATALINA_HOME/webapps/oa
RUN jar xvf oa.war
RUN rm oa.war
#对外暴露的端口号
EXPOSE 8080
CMD ["/usr/local/src/apache-tomcat-7.0.55/bin/catalina.sh","run"]
(这一串自己研究哈,有注释)
3.2. 制作新的镜像文件,镜像名称为oa-tomcat版本号0.01
cd /usr/local/src
docker build -t oa-tomcat:0.0.1 -f Dockerfile ./ (./代表当前目录)
制作成功会显示“Successfully tagged oa-tomcat:0.0.1”(耐心等待)
制作好命令 docker images 查看镜像
3.3 用自己制作的镜像创建容器
docker run -d -p 9080:8080 --net dockernet --ip 172.18.0.13 --name oa-tomcat oa-tomcat:0.0.1
http://虚拟机IP:9080/oa 看到hello Word!就成功了
3.3.1 这里我们是做了个包含操作系统的容器,查看
docker exec -it oa-tomcat bash可以用这个命令查看容器内容文件结构 退出命令,exit
四,生成镜像文件,在三中,已经做好了一个完整的开发环境,现在把环境打包成镜像
命令:先查看存在的镜像docker images 在执行生成镜像文件命令
docker save -o oa-tomcat-0.0.1.tar oa-tomcat:0.0.1
这样就成功了
五:自己如果能尝试用我们这个oa-tomcat-0.0.1.tar镜像重新安装Tomcat容器并访问测试项目oa.war就学会docker容器了
总结:一定要想明白,服务器(1台或者多台)、访问端口号、镜像、容器、之间的关系是关键。
Docker容器一般用于部署重复相同的服务,如:redis集群,tomcat集群等。适用于快速高效集群扩展。整个过程全自动,省去了运维成本。
有多台服务器装同样的环境,使用docker优点是装的速度快,环境一致
在一台服务器用docker装出redis容器,nginx容器,mysql容器,tomcat容器,优点是可限制每个容器使用的cpu,内存,磁盘,
不用docker,在一台服务器上装nginx,redis,mysql,tomcat,有一个服务出问题,别的服务也会出问题。小的项目不用docker