docker简介、安装

简介

docker容器化 服务部署 解决方案 ----软件 部署到 容器中

Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。

比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。

架构

在这里插入图片描述

Docker的三个概念

  1. 镜像(Image):打包项目带上环境就是镜像,类似于虚拟机中的镜像。
    docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像 -> run -> tomcat01容器,通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)

  2. 容器(Container):类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。

    Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
    启动、停止、删除,基本命令!

  3. 仓库(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前后的开发与运维

  1. 使用docker之前
    java - apk - 发布(应用商店) - 张三使用apk
  2. 使用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

这世上大部分抒情,都会被认作无病呻吟。

云边有个小卖部
张嘉佳

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值