docker学习

1.docker一般由四部分组成

DockerClient客户端
Docker Daemon守护进程
Docker Image镜像:就是一个轻量级的,独立运行的软件包,用来打包运行环境和在这个环境运行的的软件,包括代码,运行时需要的环境变量,库,配置文件。可以从远程pull,拷贝其他人的,还有自己通过dockerFile来制作一个。
DockerContainer容器

2.docker和虚拟机有啥不一样

Docker不是虚拟化方法。它依赖于实际实现基于容器的虚拟化或操作系统级虚拟化的其他工具。为此,Docker最初使用LXC驱动程序,然后移动到libcontainer现在重命名为runc。Docker主要专注于在应用程序容器内自动部署应用程序。应用程序容器旨在打包和运行单个服务,而系统容器则设计为运行多个进程,如虚拟机。因此,Docker被视为容器化系统上的容器管理或应用程序部署工具。

(1)与虚拟机不同,容器不需要引导操作系统内核,因此可以在不到一秒的时间内创建容器。此功能使基于容器的虚拟化比其他虚拟化方法更加独特和可取。

由于基于容器的虚拟化为主机增加了很少或没有开销,因此基于容器的虚拟化具有接近本机的性能

(2)对于基于容器的虚拟化,与其他虚拟化不同,不需要其他软件。

主机上的所有容器共享主机的调度程序,从而节省了额外资源的需求。

(3)与虚拟机映像相比,容器状态(Docker或LXC映像)的大小很小,因此容器映像很容易分发。

(4)容器中的资源管理是通过cgroup实现的。Cgroups不允许容器消耗比分配给它们更多的资源。虽然主机的所有资源都在虚拟机中可见,但无法使用。

这可以通过在容器和主机上同时运行top或htop来实现。所有环境的输出看起来都很相似。

常用指令(每种镜像的执行指令有所不同,这就好像我们应用开发打包go镜像,可以写自己的子命令集作定时任务和一次性任务)

1.run和exec的区别
在这里插入图片描述
2.docker run的可选参数
在这里插入图片描述
在这里插入图片描述

3.docker exec 指令
在这里插入图片描述

4.docker logs 指令
docker logs 容器名 查看容器log
在这里插入图片描述

centos操作系统容器如下
在这里插入图片描述
3.docker ps (后面不加参数只显示运行的
-a (不运行的也显示)
在这里插入图片描述

在这里插入图片描述
**

启动mysql容器指令[参考]

**(https://www.cnblogs.com/Cl0ud/p/12940683.html)

在这里插入图片描述
建一个mysql容器的坑:
指令docker run --name liumysql03 -p3307:3306 -e MYSQL_USER=root -e MYSQL_PASSWORd=123456 -d mysql是错误的
1.mysql的name不能是root
2.MYSQL_PASSWORd写错应该是MYSQL_ROOT_PASSWORD
在这里插入图片描述

拷贝容器内文件到本地,本地执行:docker cp 容器名:目录/文件 本地目录

在这里插入图片描述

运行一个nginx容器(mysql也是这样子运行)

docker run -d --name 名字 -p暴露端口 容器名字

-d表示后台方式运行

在这里插入图片描述

端口暴露的概念

每个容器相当于一个小的linux环境,每个容器里面有一个自己的防火墙,要开放80端口,外面主机暴露3344端口,每个容器的端口是隔离的,但是本机的一个端口不能同时映射到两个容器。

在这里插入图片描述
不可重复开放同一个端口
在这里插入图片描述

浏览器访问:
在这里插入图片描述

进入nginx容器 docker exec -it nginx01 /bin/bash
在这里插入图片描述

tomcat容器实践

在这里插入图片描述

docker镜像的原理 联合文件管理系统

联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。
1.Docker存储
Docker目前通过插件化方式支持多种文件系统后端.
Docker 中使用的 AUFS(AnotherUnionFS)就是一种联合文件系统。 AUFS 支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS 里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。
Docker镜像自身就是多个文件层组成,每一层有唯一的编号,可以通过docker history来查看一个镜像由哪些层组成

镜像的底层核心用的是操作系统的内核简化版,很小

在这里插入图片描述

docker run起来了之后的镜像相当于加了一层,叫容器层,所有操作放在这一层

docker history +镜像名字 看有多少层

在这里插入图片描述

提交一个新的镜像 docker commit

把一个容器提交后成为一个新的镜像,相当于把gitlab上的代码打包成为一个镜像
在这里插入图片描述

数据卷技术

为了避免上了容器就会把容器内数据删掉的危险(例如mysql容器),可以把容器内的路径挂载到本地或虚拟机的目录,实际是关联起来,同步起来,本地目录可以被多个容器挂载关联,这样子就可以实现多个容器的共享数据
在这里插入图片描述
指定路径挂载:
docker run -it -v 主机目录(要绝对路径既要/开头):容器目录 镜像名字 /bin/bash
在这里插入图片描述
在这里插入图片描述

目录会自动同步 两个本机和容器两个目录;

通过docker inspect 容器id查容器配置

在这里插入图片描述

数据卷技术好处:可以不进入容器就可以改动容器内的配置.
匿名挂载:-v时不指定主机目录时的挂载
在这里插入图片描述

docker volume ls 查看数据卷挂载地方

在这里插入图片描述

具名挂载
在这里插入图片描述

在这里插入图片描述

dockerFile文件

除了可以通过修改原来有的文件然后commit可以制作镜像,通过dockerFile文件也可以制作镜像,通过这个脚本dockerFile可以制作一个镜像

vim DockerFile1

在这里插入图片描述

docker build构建

在这里插入图片描述

运行dockerFile生成的镜像
在这里插入图片描述

DockerFile基础知识

在这里插入图片描述

dockerFile更多指令使用参考

RUN:是在构建容器时候执行的命令
CMD:在容器启动时执行的命令
在这里插入图片描述

数据卷容器:

多个容器利用数据卷技术实现相互挂载,利用数据卷容器可以实现mysql主从

自己构建的本地docker容器发布到远程仓库(类似于git)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

docker commit 指令

例如把安装了ping 指令 ip addr指令的容器生成一个新的镜像
在这里插入图片描述

docker总结图解

在这里插入图片描述

在这里插入图片描述

docker link指令

一个网络下可以使用ip来ping通,link只要是把容器名字解析成ip

同一局域网下:1.是bridge容器名不能直接ping通,2.自定义网络能直接ping容器名
不同局域网不能用link,
docker link指令指定a容器能联通b容器,实质是修改了a容器的etc/host文件的域名解析映射,ping b的容器名解析到b的ip
但是docker link现在不建议使用,太繁琐了,建议使用docker的自定义网络
在这里插入图片描述
在这里插入图片描述

容器没安装ping指令 ,ip addr 指令报错

1.一旦用到ping指令就报:OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused “exec: “ping”: executable file not found in $PATH”: unknown
解决办法

  1. 进入容器,
    sudo docker run -i -t 容器名 /bin/bash

  2. 运行安装指令
    apt-get update
    apt install net-tools # ifconfig
    apt install iputils-ping # ping

2.没有ip addr 指令
1.apt update && apt install -y iproute2
2.apt install -y iproute2

docker容器与宿主机的网络关系(网桥)

1.宿主机和docker网络的路由器(例如docker0)是直联(NAT)的,宿主机新建一个网络多一个网卡的虚拟mac地址是docker0端的接口
2…每一个容器启动不使用–- net指定自定义网络,就会得到一个由docker0分配的ip局域网地址,都会走这个docker0这个默认的路由器容器;但是这个默认网络下的容器在同一个网络可以互通但是只能通过ip地址来ping,不用用容器名,除非使用–link
3.docker0容器作为路由器,给所有容器作桥接进行通行,这个技术叫veth-pair。这是一个虚拟设备接口,成对出现充当一个桥梁。Virtual Ethernet Pair简称veth pair,是一个成对的端口,所有从这对端口一 端进入的数据包都将从另一端出来,反之也是一样.

在这里插入图片描述
在这里插入图片描述

安装docker时就多一个网卡
在这里插入图片描述

每次启动一个容器就可以在宿主机上执行ip addr可以查到多一个网卡,可以理解为计算机网络上的mac硬件地址在这里插入图片描述
由上图发现,宿主机的网卡每新建一个容器都隔一个数字后再出现,这是因为网卡都是成对出现的,在容器内再执行ip addr可以参见45的网卡
这种技术叫做veth-pair技术,主机是46容器是45,正因为有这种虚拟接口设备的存在才能宿主机能ping通容器内部
宿主机网卡信息
容器网卡信息

容器ping宿主机ip
在这里插入图片描述
宿主机ping容器
在这里插入图片描述

docker network 指令

bridge:桥接,(默认使用,自己搭建也是使用这模式)
host:和宿主机共用
none:不使用网络
在这里插入图片描述

在这里插入图片描述

docker network create创建自己的局域网

和装wifi一样需要指定
1.管理网络的程序(默认是-- driver使用网桥)
2.指定子网格式(–subnet,掩码随便使用了192.168.0.0、16
3.指定设计的局域网(子网)的的网关(192.168.0.1用作路由网关了,能编排的容器ip范围是(192.168.0.2~192.168.255.255)
什么是网关:??网关实质上是一个网络通向其他网络的IP地址
那么网关到底是什么呢?网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)与主机的IP 地址作 “与” 运算的结果不同判定两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。网络A向网络B转发数据包的过程。
所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。那么这个IP地址是哪台机器的IP地址呢?网关的IP地址是具有路由功能的设备的IP地址,**具有路由功能的设备有路由器、启用了路由协议的服务器(**实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。
在这里插入图片描述
查看新建的网络(liuqinhuanet)配置
在这里插入图片描述
新建一个网络自后ip addr后会发现宿主机多一个
在这里插入图片描述

新建一个子网掩码相同的会爆:池与此地址空间上的另一个池重叠错误;
在这里插入图片描述

–net指定自己的网络新建容器不用link

之前使用run启动一个容器虽然没加–net但默认使用了name=bridge 和driver=bridge的网络新建的
现在使用刚才自己新建的name=liuqinhuanet,driver=bridge的网络
(mac下docker的网络都用不了)
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

视频教程不用link,同一个网络下的容器是可以网络互通的
在这里插入图片描述

网络联通 docker network connect

路由器与路由器是打不通的,容易可以和网络路由容器打通
把a网络下的容器a和另外一个网络b打通,打通之后一个容器就是在两个网络下,那么一个容器就有两个ip,应用场景中比如一个私网ip和公网ip
查看自定义网络liuqinhuanet联通前配置
在这里插入图片描述
联通指令:
在这里插入图片描述
连通后查看liuqinhuanet配置

在这里插入图片描述
查看connect后的容器的配置 docker inspect;发现在两个网络有两个ip
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值