Docker
一. Docker概述
1. Docker简介
现在有一个问题,我开发的程序在我的电脑上可以正常运行,版本更新或其他的一些操作可能会导致服务不可用,但是配置环境是十分痛苦的,相信这个大家都有体会😥,在服务器上面配置各种Redis, MySQL, jdk等极其的麻烦,而且还不能跨平台,因此docker诞生了,它给以上的问题给出了一个解决方案。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
下面是Docker的文档和仓库
2. Docker与虚拟机技术的比较
-
传统的虚拟机,虚拟出一条硬件,运行出完整的操作系统,然后在这个系统上安装和运行我们的软件、
-
容器内的应用直接运行在宿主机,容器是没有自己的内核的,也没有虚拟的硬件,所以就会轻便许多
-
每个容器之间是互相隔离的,每个容器的内部有自己的文件系统,互不影响
二. Docker的安装
- 卸载旧版本
1 |
|
- 安装需要的安装包
1 |
|
- 设置镜像仓库
1 |
|
这里使用的是阿里云的镜像
- 这里最好再更新一下
1 |
|
- 开始安装
1 |
|
安装docker相关的
-ce社区
-ee 企业版
- 启动docker
1 |
|
- 查看是否安装成功
1 |
|
可以打印出以上信息,说明成功了
- 测试是否可以正常运行
1 |
|
- 查看镜像
1 |
|
首先卸载 Docker 引擎、CLI 和 Containerd 软件包:
1 |
|
主机上的映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷:
1 |
|
1. 配置阿里云镜像加速器
1 |
|
三. Docker常用的一些命令
docker version 查看docker 版本信息
docker info 查看docker的系统信息,包括镜像和容器的数量
docker --help 查看帮助文档
1 |
|
1. 镜像命令
1.1 查看镜像
1 |
|
1.2 搜索镜像
docker search
1 |
|
1.3 下载镜像
docker pull 镜像名[:tag]
1 |
|
指定版本下载
1 |
|
1.4 删除镜像
1 |
|
全部删除
1 |
|
2. 容器命令
2.1 启动和退出容器
1 |
|
退出容器
1 |
|
2.2 列出所有运行的容器
1 |
|
2.3 删除容器
1 |
|
2.4 启动和停止容器的操作
1 |
|
docker run 后面指定的是一个镜像,而docker start指定的是一个容器,docker run是利用镜像生成容器,并启动容器,而docker start是启动一个之前生成过的容器
3. 常用的其他命令
3.1 后台启动容器
1 |
|
首先,docker run -it centos 的意思是,为centos这个镜像创建一个容器, -i和-t这两个参数的作用是,为该docker创建一个伪终端,这样就可以进入到容器的交互模式?(也就是直接进入到容器里面)后面的/bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这样当你使用docker ps 查看启动的容器时,就会发现你刚刚创建的那个容器并不在已启动的容器队列中。这个/bin/bash就表示启动容器后启动bash,但是有些镜像不适合bash shell风格,会报错。
3.2 查看日志
1 |
|
3.3 查看进程信息
1 |
|
3.4 查看镜像的元数据
1 |
|
3.5 进入当前正在运行的容器
1 |
|
3.6 从容器拷贝文件到主机上
1 |
|
4. 小小的来实战一波
4.1 安装nginx
1 |
|
测试
1 |
|
4.2 安装可视化操作面板portainer
1 |
|
没什么讲的,尽量不适用可视化面板
四. Docker镜像讲解
1. 镜像是什么
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时的库环境变量和配置文件。所有的应用,直接打包docker镜像,就可以直接跑起来
- 从远程仓库下载
- 拷贝
- 自己制作一个DockerFile
2. Docker镜像加载原理
UnionFS(联合文件系统)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种集体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到文件系统,联合加载会把各层文件叠加起来,这样最终的文件系统会包含所有的文件和目录
docker的镜像实际上哟一层一层的文件系统组成,这种层级的文件系统UnionFS.
bootfs(boot file system) 主要包含bootloader和kernal,bootloader主要是引导加载kernal,linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix 系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时额你存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs
rootfs(root file system),在bootfs之上。包含的就是典型Linux系统的 /dev,/proc/,/bin,/etc等标准目录和文件。rootf就是各种不同操作系统发行版。比如Ubuntu,Centos等等
简单的来说就是,这个centos只有最基本的一些命令,是不完全的centos,是被阉割过的(刀法精准),因此才会比较小
3. 分层理解
从之前的下载就可以看出,docker下载的时候是分层下载的
最大的好处就是资源共享,比如这里有多个镜像都从相同的Base镜像构建而来,那么宿主机只需要在磁盘上面保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
Docker的镜像都是只读的,当容器启动的时候,一个新的可写层被加载到镜像的顶部,这一层就是我们通常所讲的容器层,而容器之下的都叫镜像层。
五. 容器数据卷
总的来说就是容器的持久化和同步操作,容器之间也是可以数据共享的,这里就需要把容器内的内容同步一下
挂载命令:docker run -it -v 主机目录: 容器内的目录
1 |
|
这里的挂载是双向同步,哪一边修改了,都会进行同步
可以使用inspect命令查看挂载,里面的mount即是挂载相关的配置
1 |
|
我们这里就可以想到一个实际的用途(不然发明挂载干什么🤣) ,比如修改容器内的nginx的配置文件,
1. 持久化mysql数据实战
安装mysql
1 |
|
启动和配置
1 |
|
我们再额外配置一下端口映射
1 |
|
假设将容器删除,挂载到本地的数据卷依旧并不会丢失,实现持久化功能
2. 具名挂载和匿名挂载
1 |
|
查看一下这个卷
1 |
|
所有的docker容器内的卷,没有指定目录情况下都是在/var/lib/docker/volumes/xxxx/_data
1 |
|
1 |
|
3. 多个容器数据同步
1 |
|
容器之间的数据传递,数据卷容器的生命周期一直持续到容器停止使用为止,但如果持久化到了本地,便不会丢失
六. DockerFile
1. 初识Docker
介绍:
构建步骤
- 编写dockerfile文件
- docker build构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像
基础知识
每个关键字 (指令)都必须是大写字母
执行从上到下顺序执行
# 表示注释
每一个指令都会创建提交一个新的镜像层,并提交
2. dockerfile命令
-
FROM 基础镜像,一切从这里构建
-
MAINTAINER 镜像是谁写的,姓名+邮箱
-
RUN 镜像构建的时候需要运行的命令
-
ADD 步骤,添加镜像内容
-
WORKDIR 镜像的工作目录
-
VOLUME 挂载的目录
-
EXPOSE 暴露端口
-
CMD 指定这个容器启动的时候需要的命令 只有最后一个会生效可以被替代
-
ENTRYPOINT 指定这个容器启动的时候需要的命令可以追加命令
-
ONBUILD 当构建一个被继承DockerFile 这个时候就会运行ONBUILD 的指令
-
COPY 类似ADD 将我们文件拷贝到镜像中
-
ENV 构建的时候设置环境变量
通过这个脚本生成镜像
1 |
|
3. 构建一个自己的centos
从源码中可以发现dockerhub中大部分的镜像都是从scratch 过来的,然后配置需要的软件来进行构建
- 编写一个dockerfile文件
1 |
|
编写脚本安装 vim 和 net-tools
1 |
|
2.build
1 |
|
3.测试运行
1 |
|
- 我们可以列出变更的历史
1 |
|
4. CMD和ENTRYPOINT区别
CMD
1 |
|
ENTRYPOINT
1 |
|
5. 实战tomcat镜像
-
准备tomcat jdk压缩包
-
编写Dockerfile 官方命名Dockerfile
1 |
|
- 构建镜像
1 |
|
一定需要注意最后面有个点
- 启动测试
1 |
|
可以看到正常加载了,说明成功了,然后就可以在挂载的目录里面直接发布项目了
6. 发布自己的镜像
6.1 DockerHub
- 登录
1 |
|
1 |
|
- 更改项目名
就是在前面加上自己的用户名后面家伙是那个版本号
1 |
|
- 推送
尽量带上版本号
1 |
|
6.2 阿里云
官方文档里面写得非常的清楚
1 |
|
小结
docker的全部流程
七. Docker网络
1. 初识docker网络
首先我们知道通过ip addr 可以查看IP的相关信息
1 |
|
查看容器相关的ip信息
1 |
|
容器无法执行相关的指令,需要进入容器安装,执行apt update && apt install -y iproute2
发现eth0@if43地址,这就是docker分配的网络
1 |
|
每启动一个docker容器 docker就会给docker容器分配一个ip 只要安装了docker 就会有一个网卡docker0桥接模式吗,使用的技术是evth-pair技术
容器带来的网卡都是一对一对的,evth-pair 就是一 对的虚拟设备接口,他们都是承兑出现的,一段连着协议,一段彼此相连
正因为有这个特性,evht-pair充当着桥梁 连接着各种虚拟网络设备启动容器后再次查看容器的ip信息,可以看到多了43这一行,并且后面信息跟着42
1 |
|
再启动一个tomcat
1 |
|
测试tomcat01 ping tomcat02是可以ping通的,原理就是下面这张图
2. 容器互联 --link
再来一个容器,把它和tomcat02连接起来
1 |
|
在容器内执行 apt-get update && apt-get install iputils-ping
再ping一下
1 |
|
反向来一下子
1 |
|
我们来看一下tomcat03的容器配置,可以看到tomcat03在本地配置了tomcat02的配置
1 |
|
再来看看tomcat02的
1 |
|
因此反向是ping不通的
3. 网络模式
- bridge: 桥接 docker默认
- none 不配置网络
- host 和容器共享网络
- container 容器网络联通
1 |
|
自定义网络
1 |
|
网络和容器联通
1 |
|
=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=END~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=