Docker基础
来自于狂神,详见狂神的B站 https://www.bilibili.com/video/BV1og4y1q7M4
核心思想是隔离,通过隔离机制可以实现的服务器性能
容器化技术也是一种虚拟化技术。
相比较虚拟机技术:
- 传统的虚拟机技术,虚拟出一套硬件,运行一个完整的操作系统,在这个操作系统上面运行安装软件
- 容器内应用直接运行宿主机的内容,无自己的内核,无虚拟硬件
- 容器间相互隔离,每个容器内部均有自己的一套文件系统,互不影响
Docker的优势
- 应用更快速的交付与部署
- 更加便捷的升级与扩缩容
- 更加简单的系统运维
- 更高效的计算资源利用
Docker的基本名词
镜像(imager):相当于一个模板,借此来创建相应的容器服务。镜像可以创建多个容器。
容器(container):Docker利用容器技术,独立运行一个或者一组运行,通过镜像来创建。
仓库(repository):镜像的仓库
Docker的安装
使用阿里云的源
# yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Docker的底层原理
Docker是一个C/S结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问。DockerServer的接受到DockerClient的指令就会执行
Docker比VM快的原因:
- docker比VM少更多抽象层
- Docker利用的是宿主机的内核,VM需要额外搭建一个Guest OS
Docker的基本命令
https://docs.docker.com/reference/
出现报错deamon runing处理方式
systemctl daemon-reload
service docker restart
service docker status
出现pull time out 的问题
一遍使用阿里云的源就可以解决,yum以后需要restart docker
systemctl start docker
docker search mysql
docker pull 镜像名:tag
docekr rmi -f 镜像id
docker run [可选参数] image
#参数说明
--name=="Name" 容器名称用以区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看相应的内容
-p 指定容器端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-P
docker ps 查看运行的容器
-a 查看当前运行的容器+历史的运行的容器
docker rm 容器id 删除容器
exit 退出容器
Ctrl +P +Q 不停止退出
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
docker run -d 镜像名
#存在的问题:后台的运行必须要有一个前台进程,docker没有发现应用,就会自动停止
docker tops 容器id
#进程信息
docker inspect
#查看容器的元数据
#使用后台运行方式的容器需要进入修改配置
docker exec -it 容器id bashShell #开启新的终端
docker attach 容器id #进入正在执行的终端
#拷贝内容
docker cp id:路径 目的主机路径
Docker镜像
镜像是一种轻量级可执行的独立软件包,里面包括软件运行所需要的代码、运行时库、环境变量与配置文件
Docker镜像加载原理
UnionFS 联合文件系统
UnionFS是一种分层轻量级的高性能文件系统,支持对文件系统的修改作为一次提交来进行叠加,同时可以将不同的目录文件加载到统一的虚拟文件系统下。
Docker镜像加载原理
Docker镜像实际上是一层一层的文件系统组成。即UnionFS
boorfs主要包括bootloader和kernel,bootloader主要是引导加载kernel。Linux刚启动的时候会加载bootfs,docker类似。包括boot加载器与内核,boot 加载完成以后内核就存在与系统中,内存的使用权限有bootfs移交给内核,系统卸载bootfs。
rootfs是bootfs之上,标准的Linux系统的文件目标,是不同操作系统的发行版。精简的os相应的rootfs特别小,只需要包括最基本的命令工具与程序库,底层直接使用的是host的kernel。
分层原理
所有的镜像都起始于一个基础镜像,当存在新的内容或者修改时,在当前镜像之上创建新的镜像层
Docker通过存储引擎(新版使用的是快照机制)实现镜像层堆栈,从而保证多镜像层对外展示为统一的文件系统。
Dokcer镜像是只读的,容器启动的时候,一个新的可写层加载到镜像底部,即容器层。
commit镜像
docker commit 提交容器为一个新的副本
-m="提交的描述信息"
-a="作者"
容器id
目标镜像名:tag
容器数据卷
含义
容器之间的数据共享技术:将容器的目录挂载到Linux上面
实现容器的同步化与持久操作
容器之间的数据共享
使用方法
使用命令来挂载 -v
docker run -it -v 主机目录:容器目录
是一种双向绑带的过程
具名挂载与匿名挂载
#匿名挂载
docker run -d -P --name nginx01 -v /ect/nginx nginx
#查看容器内部卷
docker volume ls
#具名挂载
docker run -d -P --name nginx02 -v juming:/etc/nginx nginx
#查看具体地址
docker volume inspect juming
在没有指定目录的情况下,所有的地址默认在"/var/lib/docker/volumes/juming/_data"
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机:容器 #指定路径挂载
#进一步可以添加相应ro re实现读写权限 一旦设置了权限,ro只能通过宿主机来改变,容器内部无法改变
数据卷容器
docker run -it --name docker01 --volume-from docker02 目录
相当于使用该命令完成容器间数据的继承关系 使用这个方法可以实现容器间的数据共享
容器之间的配置信息的传递,容器数据生命周期可以时持续到使用完成。也可以通过本地实现持久化。
DockerFile
DcokerFile是用来 构建的docker镜像的文件
- 编写dockerfile文件
- docker build构建成一个镜像
- docker run 运行镜像
- docker push 发布
DockerFile 的构建过程
所有的关键字的必须是大写,顺序执行
#表示的是注释
每一个指令都会创建的一个新的镜像层 并提交
DockerFile是构建文件,定义了相应的源文件与代码
DockerImage是通过DockerFIle构建生成的镜像,是最终发布运行的产品
DockerFile命令
FROM #基础镜像
MAINTAINER #维护者
RUN #构建镜像时候的命令
ADD #步骤 添加内容
WORKDIR #工作目录
VOLUEME #挂载目录
EXPOSE #暴露端口
CMD #容器启动的时候要执行的命令
ENTRYPOINT #可以直接追加命令
ONBUILD #当构建一个被继承的DOckerFile 会运行相应,触发指令
COPY #类似ADD将文件拷贝到相应的镜像里面
ENV #构建的时候设置相应的环境变量
docker build -f dockerfile文件路径 -t 镜像名:[tag]
发布自己的镜像
跟github一样的
阿里云的话
登录===》找到容器镜像服务===》创建命名空间====》创建容器镜像
Docker网络
原理
- docker自身使用桥接模式的建立一个网段,docker0相当于网卡,使用的是veth-pair技术
- 容器内部的网卡都是成对出现的,veth-pair虚拟设备接口,一端连着协议。一端彼此相连
容器联通
通过 --link即可联通
原理就是修改host。。。
自定义网络
网络模式:
-
Bridge 默认
-
none
-
host:和宿主机共享网络
-
container:容器网络连接(局限大)
docker network creat --dirver brisge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
创建自己的容器使用自己的网络
docker run -d -P --name tomcat --net mynet
使用自己的网络可以搭建完成相应的IP与容器名相应的连续使用,不需要的使用–link
docker exec -it tomcat01 ping tomcat02
可以在不同的集群之间使用的不同的子网 从而保证集群的健康
网络连通
一个容器两个IP 即类似公网IP与内网IP
使用命令就是 dooker network connect