狂神Docker笔记从入门到入坑指南
Docker-狅神说
隔离:Docker核心思想!打包装箱!每个环境相互隔离。
Docker通过隔离机制,可以将服务器利用到极致!
本质:所有的技术都是出现了需要我们去解决,才去学习
2014.4.9Docker1.0发布!
Docker:隔离,镜像(只包含最核心的环境!)
VM:虚拟机是一个完整的系统!
Docker是基于go语言开发,开源项目!
官网:http://www.docker.com
文档(非常详细):http://docs.docker.com
仓库:http://hub.docker.com
Docker能干嘛
之前的虚拟机技术
虚拟出一套硬件,运行一个完整的操作系统!
缺点:
- 资源占用多
- 冗余步骤多
- 启动速度慢
容器化技术
- **容器化技术不是模拟一个完整的操作系统!**容器内的应用直接运行在宿主主机上的,容器是没有自己的内核,也没用虚拟出硬件所以很轻便
- 每个容器间是相互隔离的,每个容器内都有一个属于自己的文件系统,互不影响!
DevOps(开发、运维)
应用更快速的交付和部署
- 传统:一堆帮助文档,安装程序。。。
- Docker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容
使用Docker之后,我们部署应用就像搭积木一样。
更简单的系统运维
在使用Docker之后,我们的开发,测试环境都是高度一致。
更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例,服务器的性能可以被压榨到极致
只要学不死,就往死里学!
Docker安装
Docker基本组成:
- 镜像(iamge):通过这个模板来创建容器服务,
docker镜像就好比是一个模板,可以通过这个模板来创建服务,Tomcat镜像==»run==»Tomcat1容器(提供服务器),通过这个镜像可以创建多个容器(最终运行或者项目运行就是在容器中的)。
- 容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
启动、停止、删除,基本命令!
可以把Docker理解为一个极简的Linux系统。
- 仓库(repository):
仓库就是存放镜像的地方!
仓库分为共有仓库和私有仓库!
Docker安装
|
|
查看安装文档
- 卸载旧的Docker
- 安装需要的安装包
- 设置镜像的仓库
- 更新软件包
- 安装Docker相关的(docker-ce社区版、docker-ee企业版)
- 启动docker
- 使用
docker version
查看安装成功与否 - 查看下载镜像
docker images
卸载docker:
- 卸载依赖
- 删除资源
rm rf /var/lib/docker
默认工作路径
阿里云镜像加速
- 登录阿里云
- 找到镜像加速
- 配置使用
参考阿里云文档
ubuntu
|
|
官网地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
|
|
底层原理
docker是怎么工作的?
docker是一个Client-Server结构的系统,docker的守护进程运行在主机上。通过socket从客户端访问!
docker为什么比VM快
docker有着比虚拟机更少的抽象层
docker利用的实宿主机的内核,vm需要Guest OS。
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这一复杂的过程,秒级的。
Docker的常用命令
帮助命令
|
|
镜像命令(增删改查)
docker images查看所有本地docker镜像命令
|
|
docker search搜索镜像
|
|
docker pull下载镜像
|
|
docker rmi
删除镜像
|
|
阿里云镜像加速配置(详情查看阿里云官网镜像加速项)
Run流程
容器命令
说明:有了镜像才可以创建容器,Linux,下载一个centos镜像来测试学习
|
|
新建容器并启动
|
|
列出所有运行的容器
|
|
退出容器
|
|
删除容器
|
|
启动和停止容器的操作
|
|
常用其他命令
后台启动容器不进入
|
|
查看日志命令
|
|
查看容器中进程信息
|
|
查看镜像元数据
|
|
进入当前正在运行的容器
|
|
从容器拷贝文件到主机
|
|
小结
作业练习
docker安装Nginx
|
|
端口
- 从外网访问docker需要经过的防火墙,都要放行才能访问
思考问题:我们每次改动nginx的配置文件都要进入容器内部?十分的麻烦,我要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改? -v 数据卷!
docker 装Tomcat
|
|
思考问题:我们以后部署项目,如果每次都进入容器是不是十分麻烦?我要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就可以自动同步到内部就好了!
作业练习:
部署es-kibana es(elasticsearch)
|
|
|
|
作业:使用es连接kibana
docker网络原理
可视化
- portainer(先用这个)
|
|
- Rancher(CI/CD再用)
什么是portainer?
Docker图形化界面管理工具!提供一个后台面板供我们操作!
访问测试:外网ip:8088
Docker镜像讲解
镜像是什么?
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含某个软件所需要的所有内容,包括代码、运行时、库、环境变量和配置环境。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到应用:
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作一个Dockerfile
Docker镜像加载原理
UnionFS(联合文件系统)
Docker镜像加载原理
分层理解
………
特点:
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!
如何提交一个自己的镜像
commit镜像
|
|
学习方式说明:理解概念,但一定要实践,最后实践和理论相结合搞定这个知识。
如果想保存当前容器的状态,就可以通过commit来提交,获得一个镜像
到这里就算入门docker了
容器数据卷
需求:数据可以持久化存储
卷技术:目录的挂载,将我们容器内的目录,挂载到Linux上面,容器中产生的数据,同步到本地
总结:容器的持久化和同步操作!容器间也可以数据同步!
使用数据卷
方式一:直接使用命令来挂载 -v
|
|
好处:我们以后修改只需要在本地修改即可,容易内会自动同步!
实战:安装MySQL
思考;MySQL的数据持久化的问题
|
|
具名和匿名挂载
|
|
如何确定是具名 挂载还是匿名挂载,还是指定路径挂载:
|
|
拓展
|
|
初识DockerFile(方式二)
Dockerfile就是用来构建docker镜像的构建文件!(命令脚本)
通过这个脚本(Dockerfile)可以生成一个镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
|
|
这个卷和外部一定有一个同步的目录
|
|
这种方式我们未来使用的十分多,因为我们通常会自己构建自己的容器!
假设构建镜像时没有挂载卷,就要手动镜像挂载 -v 卷名:容器内路径!
数据卷容器
例如:两个MySQL同步数据
参数:--volume-from可以实现容器间的数据共享(数据属于双向拷贝)
删除容器,只要还有一个容器在使用数据就不会被删除
多个MySQL实现数据共享
|
|
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦持久化到本地,本地的数据就不会被删除
Dockerfile
Dockerfile介绍
Dockerfile就是用来构建docker镜像的构建文件!(命令脚本)
通过这个脚本(Dockerfile)可以生成一个镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
构建步骤:
- 编写一个Dockerfile文件
docker build
构建成为一个镜像docker run
运行镜像docker push
发布镜像(DockerHub、阿里云镜像仓库)
Dockerfile构建过程
基础知识:
每个保留关键字(指令)都是必须是大写字母
执行顺序:从上到下
#
表示注释每个指令都会创建提交一个新的镜像层,并提交!
Dockerfile:构建文件,定义了一切的步骤,相当于源代码
DockerImages:通过Dockerfile构建生成的镜像,最终发布和运行的产品
docker容器:容器就是镜像运行起来提供服务器
Dockerfile的指令(命令)
|
|
实战测试
Docker Hub中99%镜像都是从这个基础镜像过来的FROM scratch
,然后配置需要的软件和配置来进行的构建
创建一个自己的centos
==Dockerfile==
|
|
==docker build==
|
|
==docker run==
|
|
docker history id
可以查看镜像变更历史
|
|
CMD 和 ENTRYPOINT 区别
|
|
Dockerfile中很多的命令都是十分相似的,我们需要了解他们的区别,我们最好的学习就是对比他们的然后测试效果!
实战:Tomcat镜像
准备镜像文件Tomcat压缩包,jdk的压缩包!
编写Dockerfile文件,官方命名
Dockerfile
,build
会自动寻找这个文件,就不需要-f
来指定了!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
FROM centos MAINTAINER iuv<me@iuuovvi.com> COPY README.md /usr/local/README.md ADD jdk-8ull-linux-x64.tar.gz /usr/local/ ADD apach-tomcat-9.0.22.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_11 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.22/bin/starup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
构建镜像
1
docker build -t diytomcat .
启动镜像
访问测试
发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布)
发布镜像
地址:https://hub.docker.com
在自己的服务器上提交自己的镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
❯ docker login --help Log in to a Docker registry or cloud backend. If no registry server is specified, the default is defined by the daemon. Usage: docker login [OPTIONS] [SERVER] [flags] docker login [command] Available Commands: azure Log in to azure Flags: -h, --help Help for login -p, --password string password --password-stdin Take the password from stdin -u, --username string username Use "docker login [command] --help" for more information about a command. ❯ docker login -u iuvi Password: Login Succeeded Logging in with your password grants your terminal complete access to your account. For better security, log in with a limited-privilege personal access token. Learn more at https://docs.docker.com/go/access-tokens/
登录后就可以提交自己的镜像,
docker push
阿里云镜像服务
…….
小结:
Docker网络
未完待续……