简介
docker容器化 服务部署 解决方案 ----软件 部署到 容器中
Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。
比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。
架构
Docker的三个概念
-
镜像(Image):
打包项目带上环境就是镜像
,类似于虚拟机中的镜像。
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像 -> run -> tomcat01容器,通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的) -
容器(Container):类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
启动、停止、删除,基本命令! -
仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分。
仓库分为
公有仓库和私有仓库
,
Docker Hub(默认是国外的)
阿里云、华为云等等,都有容器服务器(配置镜像加速,和maven类似)
为什么要使用docker
环境(切换/配置)麻烦
其实我们在学习编程中,很多时间都浪费在“环境”上:
环境配置是十分的麻烦,每一个机器都要部署环境(集群redis,es,hadoop…),有时候还会部署错,更有甚者得从头来过,费时费力。
- 发布一个项目需要把war/jar包跑起来可能只需要几分钟,但是部署环境,包括(redis、mysql、jdk、ES等等),有时候得部署一天。
那么能不能把jar包和环境一块打包,上传到服务器呢?这就是docker能够做的
- 开开心心地跟着博主给出的步骤去写Demo,但总是有Bug。(这里我将版本/依赖也归纳在环境的范畴里边)。
- 好不容易在测试环境下跑起来了,在生产环境就各种出错!
- 跟着教学视频做分布式/集群的项目,跑一堆的虚拟机,每个虚拟机都要安装对应的环境。
应用之间需要隔离
比如我写了两个应用(网站),这两个应用部署在同一台服务器上,那可能会出现什么问题?
- 如果一个应用出现了问题,导致CPU占100%。那另一个应用也会受到关联,跟着一起凉凉了。
- 这两个应用是完全不同技术栈的应用,比如一个PHP,一个.NET。这两个应用
各种的依赖软件
都安装在同一个服务器上,可能就会造成各种冲突/无法兼容
,这可能调试就非常麻烦了。例如端口冲突
docker是如何解决上述问题的
解决环境(切换/配置)
不知道大家有没有装过系统,比如说装Linux虚拟机,重装Windows系统,都是需要镜像
的。
有了这个镜像,我们就可以运行
这个镜像,来进行安装系统的操作(此处省略N个下一步),于是我们的系统就装好了。一般来说,我们去官方渠道下载的镜像,都是纯净
的。比如去官方下载Windows镜像,装完后之后桌面只有一个回收站。
但有过了解装系统的同学可能就会知道,有的镜像装完可能还有360这些软件,但系统的的确实是变了
。简单来说,就是这些镜像添加
了其他的东西(比如360软件、腾讯、千千静听等等软件)。
Docker也是这种思路,可以将我们的想要的环境构建(打包)
成一个镜像,然后我们可以推送
(发布)到网上去。想要用这个环 境的时候,在网上拉取
一份就好了。
有了Docker,我们在搭环境的时候,跟以前的方式就不一样了。
之前
:在开发环境构建出了一个war包,想跑到Linux下运行。我们得先在Linux下载好Java、Tomcat、MySQL,配置好对应的环境变量,将war包丢到Tomcat的webapps文件夹下,才能跑起来。现在
:在Linux下直接拉取一份镜像(各种环境都配好了),将镜像运行起来,把war/jar包丢进去就好了。
解决应用之间隔离
- 之前,Windows和Mac使用Docker实际上就是跑了一层Linux虚拟机。
比如在Windows下安装的是Docker Toolbox,它需要Oracle Virtual Box来跑Docker - 现在,Windows和Mac都已经原生支持Docker了。但需要一些安装的条件,详情可以查看官网
比如Windows:Docker for Windows requires 64bit Windows 10 Pro and Microsoft Hyper-V
使用docker的好处
DevOps(开发、运维)
- 应用更快速的交付和部署
- 传统:一堆帮助文档,安装程序
- Docker:打包镜像发布测试,一键运行
- 更便捷的升级和扩缩容
使用了Docker之后,我们部署应用就和搭积木一样!- 例如SpringBoot 1.5 Redis 5 tomcat 8都要进行升级,之前就是每一个进行升级
- 使用Docker之后就是把镜像整体升级一下。
- 更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。 - 更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器事例,服务器的性能可以被压榨到极致。
使用docker前后的开发与运维
- 使用docker之前
java - apk - 发布(应用商店) - 张三使用apk - 使用docker之后
- 开发
java - jar(环境) - 打包项目带上环境(镜像) - docker仓库 - 运维
下载我们发布的镜像 - 直接运行即可!
总结:docker可以干嘛
- 将一整套环境打包封装成镜像,
无需重复配置环境
,解决环境带来的种种问题。 - Docker容器间是进程隔离的,谁也不会影响谁。
安装Docker
环境
linux版本 CentOs7(6版本不支持docker,非要安装的话还得先装点别的)
// 系统内核是 3.10以上的
[root@lala/]# uname -r
3.10.0-1160.el7.x86_64
在线安装
// 卸载旧的docker
// 这个命令是官网的,但貌似只能卸载docker服务,不能卸载docker客户端
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
// 安装需要的安装包
yum install -y yum-utils
// 设置镜像的仓库
// 这是默认的,国外的
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
// 建议安装阿里云
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
// 更新yum软件包索引
yum makecache fast
// 安装docker docker-ce社区版 ee企业版
yum install docker-ce docker-ce-cli containerd.io
// 安装指定版本
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-19.03.13 docker-ce-cli-19.03.13
// 启动docker
systemctl start docker
docker version
// 测试docker
docker run hello-world
// 开始会找不到镜像,回去下载
// 出现 Hello from Docker! 则下载成功
// 查看 hello-world 镜像
docker images
// 开机自启
systemctl enable docker
离线安装
# 将镜像使用ftp工具上传服务器
tar -zxvf docker-18.06.3-ce.tgz
cp docker/* /usr/bin/
# 这两个文件可以去在线安装docker的目录直接复制过来就可以
# centos7 systemctl 管理 docker 的文件
cp docker.socket /etc/systemd/system
# 运行docker所需要的文件
cp docker.service /etc/systemd/system
chmod 777 /etc/systemd/system/docker.service
chmod 777 /etc/systemd/system/docker.socket
systemctl daemon-reload
systemctl start docker
# 设置开机启动
systemctl enable docker.service
阿里云镜像加速
开通容器镜像服务
登录查找 容器镜像服务
,然后找到镜像加速器,就是下面需要配置的地址。
// 在镜像加速器目录
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":
// 这个地址不对,用自己的
["https://xxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
// 查看当前docker镜像仓库的地址
docker info
// Registry Mirrors,如果是默认的话好像是就没有这个key的
卸载docker client
// 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
// 删除docker的默认工作路径
rm -rf /var/lib/docker
docker私有仓库的搭建和配置
// 私有仓库也是一个镜像,名为registry
docker run -di --name=registry -p 5000:5000 registry
// 访问地址
http://ip:5000/v2/_catalog
// 修改docker配置文件,使用私有仓库
vi /etc/docker/daemon.json
{
"insecure-registries":["172.26.63.95:5000"]
}
// 镜像上传至私有仓库
// 为镜像做个标记
docker tag jdk1.8 ip:5000/jdk1.8
// 上传至私有仓库
docker push ip:5000/jdk1.8
使用docker的maven插件
// 让docker可以远程访问
vi /lib/systemd/system/docker.service
// 添加的是中间的一行
--userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
-H unix:///var/run/docker.sock -H 0.0.0.0:2375 \
$OPTIONS \
systemctl daemon-reload
systemctl restart docker
docker start registry
maven插件配置
<!--配置实用docker的Maven自动部署插件,配置的是内网ip-->
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!--配置私有仓库的位置,根据实际情况填写,访问地址要能被访问到-->
<imageName>ip:5000/${project.artifactId}:${project.version}</imageName>
<baseImage>jdk1.8</baseImage>
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}
</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<dockerHost>http://ip:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>
# 上传到私有仓库
clean package docker:build -DpushImage
docker run之后发生了什么(run的运行流程)
docker的底层原理
守护进程就相当于docker服务
docker为什么比VM快
估计大家都用过虚拟机,虚拟机也能实现对应用的隔离,安装特定的镜像也能跑出我们想要的环境。虚拟机已经发展了很久了,为什么我们还需要Docker呢?
- 传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,然后在这个操作系统上安装和运行软件
- 容器内的应用直接运行在宿主机上,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
一句话总结:Docker容器比虚拟机轻量
多了!
docker镜像讲解
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来
docker镜像加载原理
Union(联合文件系统)
例如一个软件的 a 版本和 b 版本(或者说两个软件也行),都需要c文件,那么c文件其实可以共用。
我们下载的时候看到的一层一层的就是这个!
如何得到镜像:
- 从远程仓库下载
- 自己制作一个镜像 DockerFile
镜像原理之分层理解
- 第一层为centos、mysql、tomcat
第二次为redis、es、app1.0
如果app升级为2.0,则其他不需要动,只需要替换掉app1.0即可,达到复用的效果 - 如果此时要发布另一个app,它也需要centos、mysql、tomcat,则下载镜像的时候不会下载分层一的文件,直接复用即可
例如从远程仓库下载了tomcat镜像,这个镜像是只读的,无法操作的,run 之后 ,tomcat镜像依然是只读,你所有是又在另一层上,此时你操作的那一层和只读的tomcat就是一个镜像了。
docker其他知识点
禁止docker绕过iptables防火墙
docker通过绕过宿主机的防火墙,来实现宿主机与容器之间的隔离,但有些时候需要禁止docker的这种操作
#需要修改/usr/lib/systemd/system/docker.service
vi /usr/lib/systemd/system/docker.service
#找到 ExecStart=/usr/bin/dockerd -H fd://xxxxx 在中间添加 --iptables=false
修改之后 :
ExecStart=/usr/bin/dockerd --iptables=false -H fd://xxxxxx
:wq 保存退出
#然后
systemctl daemon-reload
systemctl restart docker
转载自:
B站狂神说JAVA
这世上大部分抒情,都会被认作无病呻吟。
云边有个小卖部
张嘉佳