1.Docker学习之基础知识

2023-11-11

  • 0x00 Docker 快速入门

    • 1.基础介绍

    • 2.Docker 架构

    • 3.Docker 资源隔离

    • 4.Docker 容器文件系统

  • 0x01 Docker 安装

    • 1. Linux

    • 2. Windows

    • 3. MAC

    • 4. 加速器配置

  • 0x02 Docker 核心概念

    • 1.镜像 [image]

    • 2.容器 [Container]

    • 3.仓库 [Repository]

  • 0x03 Docker 数据管理

    • 1.数据卷

    • 2.数据卷容器

  • 0x04 Docker 网络管理

0x00 Docker 快速入门

1.基础介绍

描述:Docker [ˈdɑ:kə(r)] 是一个基于Go语言开发实现的云开源项目,目标是实现轻量级的操作系统虚拟化解决方案
,诞生于2013年初最初发起者是dotCloud公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,后续由于docker的发展后来也改名为Docker Inc,它是仅次于OpenStack最受欢迎的云计算开源项目;Docker 从 17.03版本之后分为 CE(Community Edition) 和 EE(Enterprise Edition)

与OpenStack的区别

  • 部署难度:Docker非常简单;OpenStack组件多部署繁琐

  • 启动速度:秒级;分钟级

  • 执行性能:和物理机几乎是一致;VM会占用一些资源

  • 镜像体积:镜像是MB级别的;虚拟机镜像是GB级别的

  • 管理效率:关键简单;组件相互依赖且管理复杂

  • 隔离性:隔离性高;彻底隔离

  • 可管理性:单进程;完整的系统管理

  • 网络连接:比较弱;借助于Neutron可以灵活组件各类网络架构

Docker 的目标是"Build,Ship and Run Any App,Anywhere",通过对应用组件的封装\[Packaging]-> 分发\[Distribution] -> 部署\[Deployment] -> 运行\[Runtime]等生命周期进行管理,达到应用级别"一次封装,到处运行";
例如:它可以独立运行一个Web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器;

Apache 2.0 授权 Github 项目开源 : https://github.com/docker/docker

Linux容器基础之LXC技术介绍:

描述:Docker引擎的基础是Linux容器(Linux Containers,LXC)技术,容器有效的将各个操作系统管理的资源划分到孤立的组,以便更好的在孤立的组之间平衡有冲突的资源使用需求。
容器可以在核心CPU本地运行指令,并不需要任何专门的解释机制;最早的容器技术可以追溯到1982年Unix系列操作系统上的chroot工具;用户操作容器就像操作一个轻量级虚拟机那样简单,也可以将容器比作为一种沙盒(Sandbox);

Docker 优势:

  • 1.更高效的利用系统资源:Docker容器不需要进行硬件虚拟以及运行完整操作系统等额外开销(资源远远小于虚拟机);

  • 2.更快速的启动时间:直接运行于宿主内核无需启动完整的操作系统,可以做到秒级、甚至毫秒级的启动时间;

  • 3.更快速的交付和部署:实现持续集成(Continuous Integration)、持续交付、自动部署(Continuous Delivery/Deployment),大量节约开发,测试,部署的时间;

  • 4.更高效的资源利用:不需要额外的虚拟化管理程序VMM以及Hypervisor的支持;

  • 5.更容易学习、迁移和扩展:一致的运行环境Docker 可以在很多平台上运行无论是物理机、虚拟机、公有云、私有云

  • 6.更简单的更新管理:使用Dockerfile只需要小小的配置修改,可以快速创建和删除容器,Docker hub 提供镜像平台方便共享镜像;

  • 7.基于 Docker 的 CI 持续集成和 CD 持续支付

  • 8.基于 Kubernetes, Docker Swarm 的集群弹性扩容和缩容

什么是虚拟化技术?
虚拟化技术是一个通用的概念,在不同的领域有不同的理解;在计算机领域一般指的是计算机虚拟化(Computer Virtualization)或者说是服务器虚拟化;虚拟化的核心是对资源进行抽象和管理,目标往往是为了在同一个主机上运行多个系统或者应用,从而提高系统资源的利用率,同时带来降低成本,方便管理和容错和容灾等好处;

  • 硬件虚拟化:真正意义上的基于它的技术不多见,少数网卡中的单根多IO虚拟化等技术;

  • 软件虚拟化(Virtualization)

    • 2.1 完全虚拟化

    • 2.2 硬件辅助虚拟化:利用硬件CPU辅助支持虚拟化技术Intel-VT和AND-V处理铭感指令来实现完全虚拟化的功能;

    • 2.3 部分虚拟化:只对部分硬件资源进行虚拟化,客户端系统需要进行修改;

    • 2.4 准虚拟化(Paravirtualization):如xen

    • 2.5 操作系统级虚拟化:内核通过创建多个虚拟化的操作系统实例内核和库来隔离不同的进程,dokcer以及其他容器都在这个范畴之内;

    • 1.应用虚拟化

    • 2.平台虚拟化:细分

传统虚拟机的比较:
8a095e6ead9b5191b2cb90b7a4602772.png

传统虚拟化方式与Docker虚拟化方式

  • 传统虚拟化方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层;

  • Docker虚拟化方式是在宿主系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级;
    ac087f06490ef2bfb1a164b572b595d9.png
    f6f290e9b71a0a401905399540bf28c5.png

物理机-虚拟机-Docker容器容易理解的对比

  • 一栋楼一户人家,独立地基独立花园(别墅)

  • 一栋楼包含多套房,一套房一户人家,共享地基、共享花园、独立卫生间、厨房和宽度(二室一厅)

  • 一套房隔成多个小隔间,每个小隔间住一位租户(胶囊式公寓)

Docker 应用场景

  • 使用docker容器开发、测试、部署服务:自动化测试和持续集成、发布;

  • 在服务型环境中部署和调整数据库或其他应用;

  • 统一、优化和加速本地开发和构建流程;创建隔离的运行环境,测试环境

  • 构建多用户的平台即服务(PaaS)基础设施

  • 提供软件即服务(SaaS)的应用程序

  • 高性能、超大规模的宿主机部署,web应用的自动化打包和发布

2.Docker 架构

Docker对使用者来讲是一个C/S模式的架构,而Docker的后端是一个非常松耦合的架构,模块各司其职并有机组合,支撑Docker的运行。

  • 用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者。

  • Docker Daemon作为Docker架构中的主体部分,首先提供Server的功能使其可以接受Docker Client的请求;

  • Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。

  • Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;

  • 当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;

  • 当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。

  • libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。

架构图:
631184447c7b6dc2fbbc48b7a9d0cf0c.png

引擎图:
4e72119008527ef866d32f5a76e5083b.png

3.Docker 资源隔离

Docker 本质是宿主机上的一个进程,docker通过namespace实现资源隔离以及轻量级虚拟化容器服务,通过cgroup实现了资源限制,通过写时复制技术(Copy-on-write)实现了高效的文件操作;

Docker通过由内核namespace提供实现的隔离,namespace的API包括clone(),sents()以及unshare()还有在/proc下的部分文件

  • 文件系统隔离:每个容器都有自己的 root 文件系统

  • 进程隔离:每个容器都运行在自己的进程环境中

  • 网络隔离:容器间的虚拟网络接口和 IP 地址都是分开的

  • 资源隔离和分组:使用 cgroups 将 CPU 和内存之类的资源独立分配给每个 Docker 容器

即namespace的六项隔离(内核实现 namespace 资源隔离内容 - 系统调用参数)如下标所示:

名称 宏定义 隔离的内容
IPC CLONE_NEWIPC System V IPC, POSIX message queues (since Linux 2.6.19) 信号量消息队列和共享内存
NETWORK CLONE_NEWNET network device interfaces, IPv4 and IPv6 protocol stacks, IP routing tables, firewall rules, the /proc/net and /sys/class/net directory trees, sockets, etc (since Linux 2.6.24) 网络设备,网络栈,端口等
MOUNT CLONE_NEWNS Mount points (since Linux 2.4.19) 挂载点(文件系统)
PID CLONE_NEWPID Process IDs (since Linux 2.6.24) 进程编号
User CLONE_NEWUSER User and group IDs (started in Linux 2.6.23 and completed in Linux 3.8) 用户和用户组(3.8后内核支持)
UTS CLONE_NEWUTS Hostname and NIS domain name (since Linux 2.6.19) 主机名与域名(自Linux 2.6.19)
Cgroup CLONE_NEWCGROUP Cgroup root directory (since Linux 4.6) Cgroup根目录(自Linux 4.6)

cgroup的特点与功能:

  • cgroup的API以一个伪文件系统来实现的,用户态的程序通过文件操作实现cgroup的组织管理;

  • cgroup的组织管理操作单元可以细粒度级别,另外用户可以创建和销毁cgroup,从而实现资源再分配和利用;

  • 所有资源管理的功能都以子吸引的方式实现接口统一,子任务创建之初与其父任务处于同一cgroup的控制组;

  • cgroup四大功能:资源限制(资源总额进行限制),优先级分配(分配CPU时间片数量以及磁盘IO带宽大小),资源统计(CPU时长/内存用量),任务控制(执行挂起/恢复等操作);

4.Docker 容器文件系统

描述:从下面的图片可以看见出以下几点:

  • Docker 镜像代表了容器的文件系统里的内容,是容器的基础,镜像一般是通过 Dockerfile 生成的;

  • Docker 的镜像是分层的,所有的镜像(除了基础镜像)都是在之前镜像的基础上加上自己这层的内容生成的;

  • Docker 中每一层镜像的元数据都是存在 json 文件中的,除了静态的文件系统之外,还会包含动态的数据;

  • Docker 镜像生产容器后会在此基础之上加入挂载点到安装Docker宿主机文件系统之中,并提供一个读写层(Read-Write Layer),所以容器进程的所有操作都在读写层进行;

3d5b45fa8a7a62e45ba3e20d4a17d046.png

总结:

  • Docker通过为Linux容器技术提供更简洁的使用和管理方案、更高效的版本控制,Docker 让容器技术一下子变得灵活易用,随着云计算(Cloud Computing)的发展,它在Virtualization中的地位越来越重要.

  • 四大核心概念:镜像 [image] / 容器 [Container] / 仓库 [Repository] / Dockerfile

参考书籍:Docker技术入门与实战


0x01 Docker 安装

1. Linux

系统环境:docker最低支持centos7且在64位平台上,内核版本在3.10以上
官方安装文档:https://docs.docker.com/install/linux/docker-ce/centos/#
镜像开源安装站点:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/

  • Docker Engine改为Docker CE(社区版): 它包含了CLI客户端、后台进程/服务以及API。用户像以前以同样的方式获取。

  • Docker Data Center改为Docker EE(企业版): 在Docker三个定价层增加了额外的支付产品和支持。

官方一键安装脚本
补充时间:[2020年4月22日 11:00:59]
一键安装Docker-ce以及Docker-compose:

##[docker]
#国外
curl -fsSL https://get.docker.com | bash -s docker
#国内
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
curl -fsSL https://get.docker.com -o get-docker.sh && chmod +x get-docker.sh && ./get-docker.sh
#测试安装结果
docker-info

##[docker-compose]
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
#测试安装结果
docker-compose version

Yum安装Docker / Docker-compose

#删除历史docker版本
yum remove -y  docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

#下载docker repo包
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
#或者手动设置官方源
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

#下载安装docker-ce社区版本
#Docker Community Edition (CE)对于希望开始使用Docker并尝试基于容器的应用程序的开发人员和小型团队来说非常理想。
#Docker CE有三种更新通道:稳定通道、测试通道和夜间通道:
sudo yum install -y docker-ce docker-compose  #手动官方源执行 docker-ce-cli containerd.io

# 更新docker-ce
yum -y upgrade docker-ce

#按照版本号从高到低排序
[root@zabbix log]$ yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64            3:18.09.5-3.el7                    docker-ce-stable
docker-ce.x86_64            3:18.09.5-3.el7                    @docker-ce-stable  #当前使用版本

# Docker 是一个 C/S 架构的服务,安装好 docker 之后需要启动 docker 软件后才能使用 docker 命令;
systemctl start/status docker  # 启动docker-ce

# 查看docker启动状态
docker version
Client:
 Version:           18.09.5
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        e8ff056
 Built:             Thu Apr 11 04:43:34 2019
 OS/Arch:           linux/amd64

# 移出docker-ce
$ sudo yum remove docker-ce
#主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有图像、容器和卷:
$ sudo rm -rf /var/lib/docker


#测试 docker 下载 hello-world 或者 alpine
docker pull hello-world
docker images
docker run hello-world

e930839d669e80a91d9dc850e5a68d19.png

docker-compose的安装补充时间:[2020年1月22日 10:54:55]

  • 方式1:安装 docker-compose: [需要安装大于或者等于1.6版本的 Docker ]
    https://docs.docker.com/compose/ -> 选择InstallCompose
    2a75eef7145e2da529bc1b9fbd10f27a.png

#安装docker-compose
#切换为root权限下载并安装docker-compose ( current stable release (v1.25.0)  )
$ curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose    #添加执行权限
  • 方式2:安装Docker-Compose

#在centos7中使用python-pip安装docker-compose
$yum install -y python3
$pip3 install pip --upgrade
[root@vm-1575613390 ~]# pip --version
pip 19.3.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)

$pip3 install docker-compose

补充说明:[2020年4月22日 10:58:21]

  • 目前最新版本的 docker 默认优先采用 overlay2 的存储驱动,对于已支持该驱动的 Linux 发行版,不需要任何进行任何额外的配置

其它操作系统参考:
Ubuntu的安装:https://docs.docker.com/install/linux/docker-ce/ubuntu/

2. Windows

Windows 下安装 Docker:https://www.docker.com/products/docker-desktop
使用CPU虚拟化检测工具(LeoMoon CPU-V)检测环境:
34dd204dd19378bfeacdc38b896e5fb6.png

window 7
Step 1.下载 docker Tool box 进行全安装FULL Installation
Step 2.安装成功后会在桌面出现virtual VM,docker,Kitematic(Alpha)等等

  • Kitematic(Alpha):是一个Docker GUi工具.用户可能运行命令(docker run hello-world)在Docker客户端启动一个容器,在Kitematic中能观察结果. 用GitHub账号登陆.就可以看到自己创建的镜像,或是在GitHub上down下来的镜像.
    Oracle VM VirtualBox:虚拟机管理器,可以创建虚拟机;也可对当前正在运行的虚拟机进行管理.

Step 3.点击 Docker Quickstart Terminal进行下载boot2docker.iso 运气好不报错的话可以说明安装完成
Step 4.而我win7启动 Docker Quickstart Terminal报错,解决方法也是很简单
9ccfa90d01a4476e4bb20bc0e5f1950a.png

下载后放在C:\Users\WeiyiGeek.docker\machine\cache\boot2docker.iso即可
c38842e6735160e5ba241ec525d4ddd7.png

解决上述问题后,验证安装:

docker pull hello-world
docker images
docker run hello-world

9b6130577d46e7b034916d6f4b510a63.png

Step 5.安装后的docker是可以通过ssh连接的,boot2docker用户和密码

docker	tcuser	ssh
root	command:sudo -i (docker用户下执行)

eff08088df3e71d03a172a213f3d77e7.png

window 10
Step 1.设置docker进行安装,加入到PATH之中
Step 2.安装成功,关闭窗口
Step 3.安装后利用powershell进行查看docker版本

> docker version
> docker run hello-world

Step 4.查看docker pull下来得镜像,并且运行

> docker images  #查看镜像
> docker run -it hello-world

cf5d61af293220b01cfc5bf05fccd1b0.png

3. MAC

77248c8bedb2c781f207ef8d76c9cdfe.png

4. 加速器配置

方式1:使用DaoCloud加速器
简介:DaoCloud 加速器 是广受欢迎的 Docker 工具,解决了国内用户访问 Docker Hub 缓慢的问题。DaoCloud 加速器结合国内的 CDN 服务与协议层优化,成倍的提升了下载速度。
DaoCloud官网:
https://www.daocloud.io/mirror#accelerator-doc

方式2:使用阿里云容器镜像服务加速器
推荐安装1.10.0以上版本的Docker客户端,您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

#方法1.常规加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xlx9erfu.mirror.aliyuncs.com"]
}
EOF

#方法2:对于 1.12 以前的版本, dockerd 换成 docker daemon
#注:编辑docker.service文件
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --registry-mirrors=https://xlx9erfu.mirror.aliyuncs.com

#方法3:Docker-CE17.12版本以及之后(CentOS7.0)
vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --registry-mirror=https://xlx9erfu.mirror.aliyuncs.com

#通用启动
sudo systemctl daemon-reload   #重载守护
sudo systemctl restart docker

#检查加速器是否生效
sudo ps -ef | grep dockerd
root 5346 1 0 19:03 ? 00:00:00 /usr/bin/dockerd --registry-mirror=https://jxus37ad.mirror.aliyuncs.com

ef97a5e05f7c7342bd6a78a181c2efb4.png

补充一键配置:

# Docker中国 mirror
# export REGISTRY_MIRROR="https://registry.docker-cn.com"
# 腾讯云 docker hub mirror
# export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
# 华为云镜像
# export REGISTRY_MIRROR="https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com"
# DaoCloud 镜像
# export REGISTRY_MIRROR="http://f1361db2.m.daocloud.io"
# 阿里云 docker hub mirror
# export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
export REGISTRY_MIRROR=https://xlx9erfu.mirror.aliyuncs.com
curl -sSL https://kuboard.cn/install-script/set_mirror.sh | sh -s ${REGISTRY_MIRROR}

0x02 Docker 核心概念

描述:三大核心概念镜像/容器和仓库,通过三大核心概念所构建的高效工作流程;

1.镜像 [image]

描述:images 类似于虚拟机镜像,可以将它理解成为一个面向Docker引擎的只读模板包含文件系统;

  • 镜像是创建Docker容器的基础,然后通过版本管理和增量的文件系统;

  • 用户基于镜像来运行自己的容器,镜像是基于 Union 文件系统的层式结构;

Docker运行容器前本地必须存在对应的镜像,如果不指定镜像名将会默认自动采用Docker Hub公共注册服务器仓库中该名称的镜像;
Docker 镜像使用帮助:https://lug.ustc.edu.cn/wiki/mirrors/help/docker

关键点:

docker search [镜像名称] #搜索关于Archlinux镜像
#支持的参数:
--automated=false #仅仅显示自动创建的镜像(官方)
--no-trunc=false  #输出信息不截断显示
-s,--stars=0    #指定仅显示评价为指定星级以上的镜像

#仓库名(Repository) 或者 标签名[不指定着默认latest,即最新]
docker pull name/[repository[:tag]] #获取Hub镜像如果不指定TAG将默认选择仓库中最新颁布的镜像
docker push DockerHubUser用户/test:latest  #上传到docker仓库

docker images   #列出本机已有镜像

docker tag 原仓库[:标签] 新仓库名[:标签]  #为本地镜像添加一个新标签 [注意仓库名称必须小写]
docker tag <image id> username/name:devel #修改镜像的标签

docker inspect [image id]  #获取镜像的详细信息
docker inspect -f {{".Architecture"}} 550(images Id 前面3位)  #-f 获取单个属性 返回JSON
  
docker rmi [<image id>|<repository> ]   #删除镜像 镜像id|仓库名称
docker rmi -f <images id>   #不建议强行删除正在容器中运行的镜像文件

docker save -o 保存文件名.tar  [repository[:tag]]  #将镜像文件打包存出到磁盘
docker save [repository[:tag]] > 保存文件名 #将镜像文件打包存出到磁盘

docker load --input 保存文件名.tar   #将打包的镜像文件进行载人
docker load < 保存文件名.tar


_运行案例:_

$ sudo docker pull ubuntu:16.04                #下载14.04 tag的镜像
Using default tag: latest
latest: Pulling from library/ubuntu
#从下面可以看出镜像文件一般是由若干组成,行首f476d66f5408代表了各层的ID,下载过程中会获取并输出镜像各层信息
#层(Layer)其实是AUFS(Advanced Union File System联合文件系统)重要概率是实现增量保存于更新的基础
f476d66f5408: Pulling fs layer
8882c27f669e: Pulling fs layer
d9af21273955: Pulling fs layer
f5029279ec12: Waiting

$ sudo docker pull registry.hub.docker.com:5000/ubuntu   #从指定长仓库进行下载

$ sudo docker run -t -i Ubuntu /bin/bash        #利用dockerubuntu镜像创建一个容器 仓库后面是接的命令
root@634e7ed26d76:/# w
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
 03:34:47 up  1:59,  0 users,  load average: 0.00, 0.05, 0.06
root@634e7ed26d76:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"


$ sudo docker images   #列出镜像
#其中Image id的信息十分重要,它唯一标示了镜像,Tag信息来区分发行版本(如14.04,16.04)
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              d131e0fa2585        9 days ago          102MB
centos              latest              9f38484d220f        7 weeks ago         202MB
#REPOSITORY (来自哪个仓库)  TAG (镜像的标签信息)   IMAGE ID (镜像的ID号,唯一)    CREATED [Created:建立时间] VIRTUAL SIZE (镜像大小)


$ sudo docker tag ubuntu:latest ubuntu18.04:latest #修改镜像名称使用该方式进行添加新标签原来的不会被删除
$ sudo docker tag d131e0fa2585 ubuntutls:latest
$ sudo docker images
#更改后镜像的ID是完全一致的,其实都指向了同一个镜像文件相当于别名而已;
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntutls           latest              d131e0fa2585        9 days ago          102MB
ubuntu18.04         latest              d131e0fa2585        9 days ago          102MB

$ sudo docker inspect d131e0fa2585 #获取该镜像的详细信息
$ sudo docker inspect -f {{".Architecture"}} d131  #获取系统架构 通常使用镜像ID的前三位
amd64

65a74ad519f5439cd27f5cbe6b79f21b.png

当该镜像在容器运行存在的时候,镜像文件默认是无法被删除的;必须停止/删除容器ID才能删除镜像文件;

#当同一个镜像有多个标签的时候rmi命令只是删错了该进行的标签而且,并不影响镜像文件
#但当只剩下一个标签的时候就要小心了,如果在停止的状态下再次使用rmi命令则会删除该镜像
$ sudo docker rmi ubuntu18.04
Untagged: ubuntu18.04:latest
$ sudo docker rmi ubuntu ubuntutls
Untagged: ubuntu:latest
Untagged:  #删除了这个镜像文件的所有AUFS层
ubuntu@sha256:d26d529daa4d8567167181d9d569f2a85da3c5ecaf539cace2c6223355d69981

$ sudo docker rmi -f ubuntutls  #强制删除
Untagged: ubuntutls:latest
Deleted: sha256:d131e0fa2585a7efbfb187f70d648aa50e251d9d3b7031edf4730ca6154e221e

创建镜像有三种办法:

  • 1.从已有镜像的容器创建

  • 2.基于本地模板导入:使用操作系统模板导入一个镜像文件;这里推荐使用OpenVZ提供的模板来常见

  • 3.基于Dockerfile导入

######### 从已有镜像创建 ############
$sudo docker commit [option-选项] ContainerId [Repository[:Tag]]
$sudo docker commit -m "xx" -a "oo" ContainerID(被修改过的ID) [Repository[:Tag]] 
# -a,--author="作者"
# -m,--message="更改信息"
# -p,--pause=ture 提交时暂停容器Container运行

$sudo docker run -it centos:latest /bin/bash
[root@32a481e170c6 ~]$ touch {1..10}.txt  #上面这个容器ID非常重要在进行修改之后

$sudo docker container ls -a   #查看容器记录
#创建一个新的镜像
$sudo docker commit -m "Zabbix base in Centos7" -a "Weiyigeek" 32a481e170c6 centoszabbix:latest
sha256:680ddb57c4b80c625ef68e113f553ee932a06f25d4685d25a0b6464cf5d60982  #成功会给出一个镜像ID

######### 从本地模板导入 ############
$sudo cat ubuntu-14.04.tar.gz | docker import - ubuntu:14.04  #本地导入镜像命令

存出和载人镜像并上传镜像到DockerHub中实例:

$docker save -o zabbixcentos.tar centoszabbix:latest
ls -alh zabbixcentos.tar
-rw------- 1 root root 200M 5月   6 13:16 zabbixcentos.tar
$docker load --input zabbixcentos.tar
Loaded image: centoszabbix:latest

$docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centoszabbix (上面从已有镜像文件中创建)       latest              622b7661c06b        13 minutes ago      202MB

#用户需要在DockerHub网站注册后才能进行上传镜像
$docker login  #在及其上进行登录
# Login with your Docker ID to push and pull images from Docker Hub. If you don have a Docker ID, head over to https://hub.docker.com to create one.
# Username: weiyigeek
# Password: 输入hub密码
# WARNING! 账号密码base64编码存放于 /root/.docker/config.json 文件中
# echo "d2VpeW********VrO***ldlaXllMjAxOQ==" | base64 -d
# weiyigeek:Docker
# https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded  #表示登录成功

$docker push weiyigeek/czabbix:latest
The push refers to repository [docker.io/weiyigeek/czabbix]
484404f26982: Pushed
d69483a6face: Mounted from library/centos
latest: digest: sha256:c1d891c2d56a0677ff28639189fa7252790d3b8ef417816570fb3a7654bc4e05 size: 736  #表示上传成功返回的票据

95199b70b850137c5817cfb84b43da9b.png

镜像的实现原理
Docker 镜像是怎么实现增量的修改和维护的?
答:每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去。
通常 Union FS 有两个用途:(Docker 在 AUFS 上构建的容器也是利用了类似的原理)

  • 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下

  • 就是将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作


2.容器 [Container]

描述:Docker容器Container类似于一个轻量级的沙箱,也可以看做一个简易版的Linux系统环境;因为容器是运行应用程序的,所以必须得先有一个操作系统为基础

Docker利用容器来运行和隔离应用;

  • 容器是从镜像创建的应用独立运行的实例;

  • 可以进行启动/开始/停止/删除容器,而这些容器都是相互隔离,互不可见的;

  • 镜像自身只读的,容器从镜像启动的时候会在镜像的最上层创建一个可写层,镜像本身将保持不变;

  • 创建容器、启动容器、终止容器、进入容器、删除容器、导入导出容器实现容器迁移;

当创建并运行容器时候Docker在后台运行的标准操作包括:

  • 检查本地是否存在指定镜像,不存在就从公有仓库下载

  • 利用镜像创建并启动一个容器

  • 分配一个文件系统,并在只读的镜像层外面挂载一个可读写层

  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去

  • 从地址池配置一个IP地址给容器

  • 执行用户指定的应用程序

  • 执行完毕后容器被终止

启动容器有两种方式:

  • 一种是基于镜像新建一个容器并启动

  • 另外一个是将在终止状态(stopped)的容器重新启动。

关键命令:

docker create -it repository[:tag] #创建容器但处于停止状态

docker start -a -i <container id>   #启动创建的容器
# -a 参数   连接容器并打印输出或错误 -
# -i 参数   启动容器并进入交互模式

docker run -t -i repository[:tag]  /bin/bash #创建并启动容器 等同于上面两条命令
# -t:让Docker分配一个伪终端(pseudo-tty)并绑定在容器的标准输入上.
# -i:则让容器的标准输入保持打开.
# CTRL+Z 和 Exit 则退出容器Container
docker run -d repository[:tag] /bin/sh -C "echo hello word" #守护态运行
# -d 参数即可后台运行,用户无法看到容器中的信息
# -c 执行的Command
# --rm 添加这个标记,容器会在停止后立即删除自身   (注意:与-d不能同时使用)
# --name 使用--name web 标记可以为容器重新命名

docker logs <Container-id>      #获取容器的输出信息

docker attach [names]  #采用ps -a NAMES 进入容器

docker exec -it <Container-id>  /bin/bash  #docker exec 至1.3版本起可以在容器中运行命令

docker ps -aq   #显示本机上的所有容器ID运行的容器ID信息

docker restart <container id>  #重启容器

docker stop <container id>  #停止容器
docker kill <cantainer id>  #强行终止容器 可以直接发送SIGKILL信号来终止容器

docker rm <container id>    #删除容器删除依赖该镜像的容器ID,前3位即可
# -f,--force=false 强制终止并删除一个运行中的容器[默认会发生SIGKILL信号]
# -l,--link=false  删除容器连接但保留容器
# -v,--volumes=false  删除容器挂载的数据卷

docker export <container id> >导出文件.tar  #导出容器

docker import - repository[:tag] #导入容器

5094225e27c9beddaa77ee0ea57dfb25.png

实例命令:

#创建容器
$sudo docker create -it weiyigeek/czabbix
2b72a3410be576aeb9023ef2c41488e7b2630cf2282b8a0b1dddce771f22231f

#启动容器ID执行交换登录,start可以进入到任何在容器中运行
$sudo docker start -i 2b7
# [root@2b72a3410be5 /]# whoami
# root
# [root@2b72a3410be5 /]# exit
#对于创建后的容器采用exit命令退出后该容器自动处于终止状态;
#提示:正常退出不关闭容器请按Ctrl+P+Q进行退出容器

$sudo docker ps -a  #显示本机上存在的所有容器
# CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                           PORTS               NAMES
# 634e7ed26d76        d131e0fa2585        "/bin/bash"         About an hour ago   Exited (130) About an hour ago                       recursing_goodall
# b72a3410be5        weiyigeek/czabbix   "/bin/bash"         41 seconds ago      Up 21 seconds                           priceless_chaplygin

$docker run -t -i centos /bin/bash  #创建容器并且运行
# [root@0b9aef4876d3 /]# hostname
# 0b9aef4876d3

$ddocker run -d centoszabbix /bin/sh -c "echo Hello World,Docker Container"
4e62768b1d9196fc79fd740c103df79c8e3bb09d9c6810aa43976abeda036a26

$ddocker logs 4e62  #获取容器输出的信息
Hello World,Docker Container

$docker attach priceless_chaplygin  #通过上面的ps -a 中names进入想对应的容器
#当多个窗口同时 attach 到同一个容器的时候 所有窗口都会同步显示 。当某个窗口因命令阻塞时,其他窗口也无法执行操作了
# [root@b72a3410be5 /]$ hostname
# b72a3410be5

$docker exec -ti b72 /bin/echo "whoami"   #可以通过exec直接执行命令和进入shell
# whoami


#停止容器
#当需要删除一个在容器中运行的镜像的时候,会导致不能删除镜像[Image]这时候必须先停止再删除容器[container]:
$sudo docker stop 634e7ed26d76

#镜像的容器ID,前3位即可,然后在删除镜像
$sudo docker rm 634      #此时再用镜像ID来删除进行,成功则会打印出删除各层信息
$sudo docker rmi -f d131e0fa2585     #镜像的容器ID,前3位即可,然后在删除镜像

#导出镜像
$sudo docker export 092 > czabbix.tar

#导入镜像
$cat czabbix.tar | docker import - test:latest
sha256:bbb9dbcaa5fff9c5b1b99c978df4dcaeeca3d2200d82fc466f5064931bd3bba2
[root@zabbix ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                latest              bbb9dbcaa5ff        14 seconds ago      202MB


**补充:使用nsenter工具进入Docker容器**

#获取容器的PID
$PID=$(docker inspect --format "{{ .State.Pid}}" <container id>)
#通过得到的这个PID,就可以连接到这个容器:
$nsenter --target $PID --mount --uts --ipc --net --pid

#手动获取docker container 运行的PID
[root@zabbix ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED
092d1b82c6a0        weiyigeek/czabbix   "/bin/bash"         17 minutes ago      ck
[root@zabbix ~]$ docker inspect --format "{{ .State.Pid}}" 092
9030
[root@zabbix ~]$ nsenter --target 9030 --mount --uts --ipc --net --pid
[root@092d1b82c6a0 /]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
#成功进入该容器,9030就是容器092d1b82c6a0的进程PID


**Docker load 与 Docker import 的比较** 描述:导入容器和导入镜像是差不多的但是实际上又是有所区别的 - load:导入镜像存储文件到本地镜像库 而 import:导入一个容器快照到本地镜像库 - 容器快照:文件将丢失所有的历史记录和元数据信息(即保留容器当时的快照状态),导入的时候还需要重新制定标签等元数据信息; - 镜像存储:文件将保存完整的记录,并且体积也要大;

总结:

  • 容器的名称是唯一性的如果不指定名称,将会自动生成一个容器名称;

  • 容器是直接提供应用服务的组件,也是Docker实现快速启停和高效服务器性能的基础

  • 在生产环境中因为容器自身的轻量性,建议在容器前段引入HA(高可靠性)机制,当出现错误的时候能快速切换到其他容器之中,还能自动重启故障容器;

3.仓库 [Repository]

描述:Docker 仓库(Repository)类似于代码仓库,是Docker集中存放镜像文件的场所;该概念的引入为Docker镜像文件的分发和管理提供了便捷的途径。
仓库注册地址:https://hub.docker.com/
安装帮助文档:http://www.widuu.com/docker/installation/ubuntu.html

注册服务器是存放仓库的地方,其上往往存放着多个仓库,每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签[TAG]来进行区分;

  • 目前最大的公开仓库是 Docker Hub 存放了数量庞大的镜像提供用户下载

  • 国内的公开仓库包括Docker Pool等等可以提供稳定的国内访问。

例如:对于仓库地址dl.dockerpool.com/ubuntu来说,dl.dockerpool.com是注册服务器,ubuntu是仓库名;
0ceb8fad38abc5746d88720ddbc072e2.png

Docker 仓库分类:

  • 公开仓库(Public)

  • 私有仓库(Private)

官方与用户提供的镜像比较:

  • 官方:centos 由Docker维护的基础或根镜像;

  • 个人:user/centos 表示由user用户维护的centos基础镜像;

关键点:

docker login   #连接并初始化hub仓库 需要输入用户名和密码认证,然后存放于/root/.docker/config.json 文件中
docker pull [repository]  #下载指定仓库到本地
docker push [imges]

#实例
$docker pull dl.dockerpool.com:5000/ubuntu:12.04 #连接其他的注册服务器
$docker images
$docker tag dl.dockerpool.com:5000/ubuntu:12.04 ubuntu:12.04   #更新标签与官方标签保持一致
$docker push dl.dockerpool.com:5000/ubuntu:12.04  #上传到私有镜像


**(1)创建和使用私有仓库:** 最快捷还是搭建本地的仓库服务器(注意:配置不当会导致漏洞)

$ docker run -d -p 5000:5000 registry
#默认情况下仓库创建在容器的/tmp/register目录下,-v 通过镜像文件存放在宿主机本地的指定路径/opt/data/registry上;
$ docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
# -d:容器启动后会进入后台,用户无法看到容器中的信息.
# -p:指定仓库镜像的端口.
# -v:将镜像的存放位置放在本地指定的路径上.

此时会在本地启动一个私有仓库服务,监听端口为5000; 更新标签本地仓库地址并上传到私有仓库之中:

$docker tag ubuntu:14.04 10.0.2.2:5000/test  #更改镜像的标签
$docker pull 10.0.2.2:5000/test              #下载镜像

#可以以这个来测试是不是存在docker 5000未授权访问漏洞
$ curl http://10.0.2.2:5000/v1/search  #上传成功后可以查看到返回的json字符串

(2)自动创建[Automated Builds]
该功能是对于需要经常升级镜像内程序来说十分的方便,用户创建镜像发生更改的时候进行手动更新镜像,并能通过自动创建功能跟踪目标网络,一旦项目发现新的提交则自动执行创建;配置自动创建步骤如下:

  • 创建登录Docker Hub 绑定Github;

  • 在Docker Hub中配置一个自动创建

  • 选取一个目标网站中的项目(需要Dockerfile和分支)

  • 指定Dockerfile的位置并提交创建,可以在"自动创建页面"跟踪每次创建的状态;

总结:

  • 仓库管理镜像的设计理论与Git差不多,工作流程为文件分发和合作带来的众多优势。

0x03 Docker 数据管理

Data Management,在使用Docker时候必然会在容器内产生数据,或者需要将容器内的数据进行备份,甚至多个容器之间进行数据共享,这时数据管理变得尤为重要;
74ec72dfc298b8c6360fbfc042cc981c.png

容器中管理数据的主要有两种方式:

  • 数据卷:Data Volumns

  • 数据卷容器:Data Volume Dontainers

数据管理共享的方式:

  • 使用数据卷容器在容器和主机

  • 容器和容器之间共享数据

1.数据卷

描述:是一个可供容器使用的数据目录,并且让文件系统提供很多有用的特性,数据卷的使用类似于Linux对目录或者文件进行mount操作;

特性:

  • 数据库可以在容器之间共享和重用

  • 数据卷修改后会立马生效

  • 对数据卷的更新不会影响镜像

  • 卷会一直存在,即使容器被删除

Q:如何在容器内创建一个数据卷?

#### 创建一个web容器并创建一个数据卷挂载到容器的/webapp目录下(默认将宿主机/根映射到容器中webapp目录中)
$ sudo docker run -d -P 5000 --name web(新建容器) -v /webapp(容器目录) training/webapp(镜像) python app.py
# --name 指定容器的名称
# -v:将镜像的存放位置放在本地指定的路径上.
# -P:是允许外部访问容器需要暴露的port
# -d:是容器的后台运行守护

#cp 把容器文件copy到宿主机,或者把宿主机的文件copy到容器
$docker cp 容器id或者name:/home/wwwroot/1.php /home/Lcy/ #把容器的1.php拷贝到宿主机家目录
$docker cp config.php 容器id或者name:/home/wwwroot/    #把宿主机的config.php拷贝到容器

挂载主机目录/文件作为数据卷:

#挂载一个主机目录作为数据卷 /src/webapp[主机目录]:/opt/webapp[容器目录]:rw (权限)
$ sudo docker run -d -P --name web -v  /src/webapp:/opt/webapp:rw training/webapp python app.py
# Docker挂载数据卷的默认权限 rw,ro[只读]          //加入ro后数据卷的数据就无法修改了

#挂载一个本地文件作为数据卷(注意再挂载文件得时候尽量设置ro自读,防止inode不一致报错)
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
# --rm :当它退出自动移除容器 即docker ps -aq 不能查询到
2.数据卷容器

描述:IF用户需要在容器之间共享一些持续的数据,最简单的方式就是使用数据卷容器(实际上就是一个普通容器);
使用数据卷容器可以让用户在容器之间自由地升级和移动数据卷;

首先创建一个数据卷容器dbdata并在其中创建一个数据卷挂载到/dbdata上;

$ sudo docker run -it -v /dbdate --name dbdate ubuntu

#然后在容器中进行使用 创建两个容器db1 / db2
$ sudo docker run -it --volumes-from dbdate --name db1 ubuntu
$ sudo docker run -it --volumes-from dbdate --name db2 ubuntu
#使用--volumes-from参数所挂载数据卷的容器自身并不需要保持运行状态


#修改目录中其中任何一个文件,其他容器的该目录都会改变
$ sudo docker run -d --name db2 --volumes-from db1 tarining/postgresql      #可以从已有挂载了容器卷的容器来挂载数据卷
#删除挂载的容器(dbdata 、 db1 、db2)数据卷饼不会被自动的删除,必须在删除最后一个挂载着它容器时显示使用Docker rm -v 命令来指定同时删除关联的容器;

(1) 数据卷容器迁移数据
可以利用数据卷容器对其中的数据卷进行备份、恢复以实现数据的迁移;

#备份: 创建一个worker容器 ,将本地当前目录挂载到容器中backup目录,进行选择数据目录备份压缩
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdate

#恢复: 首先创建一个带有数据卷的容器dbdata2
$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
#解压备份文件到挂载的数据卷中
$ sudo docker run --volumes-from dbdata2 $(pwd):/backup busybox tar xvf /backup/backup.tar

实例演示:

#挂载
$docker run --name web --rm -dit -v /opt:/opt/ centos /bin/bash
5b3d35fe3305fb458e8b33f39d5fedfbd7d9cb1f6742bcf725cfbf2ecd0245fc
#进入容器
$docker start -i 5b3
#建立一个文件
[root@5b3d35fe3305 opt]$ vi containerDokcer.txt
#宿主机器目录查看
[root@zabbix opt]$ cat containerDokcer.txt
#!/bin/bash
docker

#挂载单个文件
$docker run --rm -it -v ~/.bash_history:/root/.bash_history centos /bin/bash
$docker rm -vf web  #删除容器和数据卷
$docker ps -a  #由于使用--rm参数则会在容器退出时候删除容器

补充说明::Z与:z的区别

#配置selinux标签如果使用selinux,可以添加z或z选项来修改挂载到容器中的主机文件或目录的selinux标签
#:z选项指示绑定挂载内容在多个容器之间共享。
#:Z选项表示绑定挂载内容是私有和非共享的。
#重要:当使用绑定与服务挂载时,selinux标签(:z和:Z)以及:ro将被忽略,设置了z选项以指定多个容器可以共享绑定挂载的内容,此时不能使用——mount标记修改selinux标签
docker run -d --restart=always --name zhcx-v /disk/webapp/war/:/usr/local/tomcat/webapps:z -p 4081:8080 -e JAVA_OPTS=-Dsome.property=value -e Xmx=1536m tomcat-base:6.0.85-jre8

总结:

  • 推荐直接挂载文件目录到容器中,如果直接挂载一个文件到容器中在使用文本编辑工具时候可能会报错;

  • 可以多次使用--volumes-from参数从来多个容器挂载多个数据卷;锁挂载的容器自身并不需要保持在运行状态

  • 推荐使用数据卷和数据容器之外的物理备份存储系统,如RAID或者分布式系统如Ceph,GPFS,HDFS等


0x04 Docker 网络管理

大量互联网服务包括多个服务组件往往需要多个容器之间进行网络通信相互配合,Docker目前提供了映射容器端口与宿主主机和容器互联机制来为容器提网络服务;并且采用Linux系统知道的网络系统来实现对网络服务的支持使之能提供稳定支持以及快速的高性能转发;

当在一台未经过特殊网络配置的centos 或 ubuntu机器上安装完docker之后,在宿主机上通过ifconfig命令可以看到多了一块名为docker0的网卡;不难想到docker0就不只是一个简单的网卡设备了而是一个网桥。

$ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
$route -n
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0

#下图即为Docker默认网络模式(bridge模式)下的网络环境拓扑图,创建了docker0网桥,并以eth pair连接各容器的网络,容器中的数据通过docker0网桥转发到eth0网卡上。
#网桥(等同于交换机)

#在Linux中,可以使用brctl命令查看和管理网桥(需要安装bridge-utils软件包),比如查看本机上的Linux网桥以及其上的端口:
$yum install bridge-utils
$brctl show
bridge name     bridge id               STP enabled     interfaces
br-63791a62ad5a   8000.024258a66d6e       no        veth4ce6e0e
                                                    vethe5abf0f
br-6cde78afe495   8000.02420a2496c6       no      veth93e8dc0
                                                  vethfda7b14
docker0   8000.024216e63d3c       no

#docker0网桥是在Docker daemon启动时自动创建的,其IP默认为172.18.0.1/16,之后创建的Docker容器都会在docker0子网的范围内选取一个未占用的IP使用,并连接到docker0网桥上。

#除了使用docker0网桥外,还可以使用自己创建的网桥,比如创建一个名为br0的网桥,配置IP:
brctl  addbr br0
ifconfig  br0 18.18.0.1

#在Docker容器和外界通信的过程中,还涉及了数据包在多个网卡间的转发(如从docker0网卡转发到宿主机ens160网卡)
#需要内核将ip-forward功能打开即将ip_forward系统参数设1
echo 1 > /proc/sys/net/ipv4/ip_forward

f492d657fb71d9d174258eb913bd2b7d.png


在Docker在1.9版本中network子命令和跨主机网络支持,为了标准化网络的驱动开发步骤和支持多种网络驱动,Docker公司在libnetwork中使用了CNM(Container Network Model)定义了构建容器虚拟化网络的模型。_libnetwork和Docker daemon及各个网络驱动的关系图:_ Docker daemon通过调用libnetwork对外提供的API完成网络的创建和管理等功能,libnetwrok中则使用了CNM来完成网络功能的提供; ![WeiyiGeek.](https://cdn.jsdelivr.net/gh/WeiyiGeek/blogimage/2019/20190512201625.png)

CNM中主要有沙盒(sandbox)、端点(endpoint)、网络(network)3种组件:

  • (1)Sandbox:包含了一个容器网络栈的信息,实现对容器的接口、路由和DNS设置等进行管理;

  • (2)Endpoint:它可以加入一个沙盒和一个网络,且一个端点只可以属于一个网络并且只属于一个沙盒;

  • (3)Network:可以直接互相联通的端点(包含多个端点),网络的实现可以是Linux bridge、VLAN等

libnetwork共有5种内置驱动:bridge驱动、host驱动、overlay驱动、remote驱动、null驱动。

  • (1)bridge驱动: Docker默认设置驱动,它可以将创建出来的Docker容器连接到Docker网桥常规方法能满足容器基础需求,然后在复杂场景下使用又诸多限制(使用NAT转发)

  • (2)host驱动:它将不为Docker容器创建网络协议栈(不会创建独立的network namespace),即容器于宿主机共用一个network namespace并使用宿主机的网卡/IP端口等等信息,该驱动适用于对于容器集群规模不大的场景;

  • (3)overlay驱动: 采用IETE标准的VXLAN方式,并且是VXLAN中被普遍认为最适合大规模的云计算虚拟化环境的SDN controller模式,使用时候需要额外的配置存储服务(例如Consul、etcd和zookeeper)

  • (4)remote驱动: 该驱动并未做真正的网络服务实现而是调用了用户自行实现的网络驱动插件,使libnetwork实现了驱动的可插件化,更好地满足了用户的多种需求

  • (5)null驱动: 容器拥有自己的网络命名空间,但并不为Docker容器进行任何网络配置;容器除了network namespace自带的loopback网卡名,没有其他任何网卡、IP、路由等信息(需要用户对齐配置)

libnetwork官方示例:
4c2f53fbbb453b1e311f8534aae30ca0.png

(1)端口映射实现访问容器
通过-P或者-p来指定端口,

  • 使用-P时候:会进行选择 49000 ~ 49900 端口随机分配映射;

  • 使用-p时候:会让你您设置固定与容器映射的端口;

支持的格式:

  • hostPort:containerPort < 映射到本地指定端口以及容器端口

  • ip:hostPort:containerPort < 映射到本地指定地址以及本地指定端口和容器端口

  • ip::containerPort < 映射本地指定IP的任意端口和容器端口 (注意此处是:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1.Docker学习之基础知识 的相关文章

  • Python 中的这种赋值方式叫什么? a = b = 真

    我知道关于元组拆包 http docs python org tutorial datastructures html tuples and sequences但是当一行中有多个等号时 这个赋值被称为什么 阿拉a b True 它总是让我有
  • Android 解析 JSON 卡在 get 任务上

    我正在尝试解析一些 JSON 数据 我的代码工作了一段时间 我不确定我改变了什么突然破坏了代码 当我运行代码时 我没有收到任何运行时错误或警告 我创建一个新的 AsyncTask 并执行它 当我打电话时 get 在这个新任务中 调试器在此行
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • 多线程——更快的方法?

    我有一堂有吸气剂的课程getInt 和一个二传手setInt 在某个领域 比如说领域 Integer Int 一个类的一个对象 比如说SomeClass The setInt 这里是同步的 getInt isn t 我正在更新的值Int来自
  • 改变 Java 中凯撒移位的方向

    用户可以通过选择 1 向左或 2 向右移动字母来选择向左或向右移动 左边工作正常 右边不行 现在它显示了完全相同的循环 但我已经改变了所有 and 以不同的方式进行标记 最终我总是得到奇怪的字符 如何让程序将字符向相反方向移动 如果用户输入
  • 在 Windows 上使用 IPython 笔记本时出现 500 服务器错误

    我刚刚在 Windows 7 Professional 64 位上全新安装了 IPython 笔记本 我采取的步骤是 从以下位置安装 Python 3 4 1http python org http python org gt pip in
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • 有没有办法只安装mysql客户端(Linux)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有不需要安装整个mysql db安装包的Linux mysql命令行工具 我想做的是从服务器 1 应用程序服务器 执行将在服务器 2
  • Python Flask 是否定义了路由顺序?

    在我看来 我的设置类似于以下内容 app route test def test app route
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • Java 中处理异步响应的设计模式

    我读过类似问答的答案 如何在 JAVA 中创建异步 HTTP 请求 https stackoverflow com questions 3142915 how do you create an asynchronous http reque
  • Java:一个函数有多种返回类型...可以使用泛型吗?

    为了简单起见 我有一些程序 如下所示 public String fetchValueAsString String key public DateTime fetchValueAsDateTime String key 我想要类似的东西
  • Java String ReplaceAll 方法给出非法重复错误?

    我有一个字符串 当我尝试运行时replaceAll方法 我收到这个奇怪的错误 String str something op str str replaceAll o n it works fine str str replaceAll n
  • 如何将库添加到 LIBGDX 项目的依赖项 gradle

    一切都在问题中 我已经尝试了在 SO 和其他网站中找到的所有答案 但没有运气 这就是我迄今为止尝试过的 adding compile fileTree dir lib include jar 到我的 build gradle adding
  • CSV 在列中查找最大值并附加新数据

    大约两个小时前 我问了一个关于从网站读取和写入数据的问题 从那时起 我花了最后两个小时试图找到一种方法来从输出的 A 列读取最大日期值 将该值与刷新的网站数据进行比较 并将任何新数据附加到 csv 文件而不覆盖旧的或创建重复项 目前 100
  • 将 bash 脚本作为守护进程运行

    我有一个脚本 它每 X 次运行我的 PHP 脚本 bin bash while true do usr bin php f my script php echo Waiting sleep 3 done 我怎样才能将它作为守护进程启动 要从
  • Pandas 在特定列将数据帧拆分为两个数据帧

    I have pandas我组成的 DataFrameconcat 一行由 96 个值组成 我想将 DataFrame 从值 72 中分离出来 这样 一行的前 72 个值存储在 Dataframe1 中 接下来的 24 个值存储在 Data
  • CXF:通过 SOAP 发送对象时如何排除某些属性?

    我使用 Apache CXF 2 4 2 当我将数据库中的某个对象返回给用户时 我想排除一些属性 例如密码 我怎样才能做到这一点无需创建临时的班级 有这方面的注释吗 根据 tomasz nurkiewicz 评论我应该使用 XmlTrans
  • 具有指定置信区间的 Seaborn 条形图

    我想在 Seaborn 条形图上绘制置信区间 但我已经计算出置信区间 如何让 Seaborn 绘制我的置信区间而不是尝试自行计算它们 例如 假设我有以下 pandas DataFrame x pd DataFrame Group 1 0 5
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐

  • Hbase 单机环境搭建

    大数据处理场景 比如我要想对十几亿数据进行排序 肯定不能放在关系型数据库排序 首当其冲就要想到一个能高效存储与高效读取的数据库 这里我想到了分布式数据库Hbase 今天我们就只讲下Hbase安装 后面会讲到数据读取出来了如何高效进行排序 H
  • LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置

    LeetCode 34 在排序数组中查找元素的第一个和最后一个位置 解题思路 这里先使用二分法寻找到第一个位置 在从第一个位置开始挨个 循环 寻找最后一个位置 当然 最后一个位置也可以使用二分的方法完成 代码实现 class Solutio
  • Echarts中国地图的china.js下载

    今天用到了Echarts的中国地图map 但Echarts官网的地图js已经停止提供下载了 找了下其他的链接放到这里 一些其他会用到的js文件也在里面可以找到 省的下次用现找 https github com apache incubato
  • Linux 搭建Redis 哨兵集群

    目录 1 安装环境 2 下载安装包 3 安装依赖环境和编译 4 启动 5 集群搭建 6 启动哨兵 7 设置开机自启动 8 redis卸载 1 安装环境 阿里云centos7 9版本 2 下载安装包 地址 Index of releases
  • 代码覆盖生态系统的库和软件包

    如果您已经编写了测试驱动的代码已有一段时间了 那么您将了解代码覆盖率 也称为测试覆盖率 如果您不熟悉该术语 则有两个简短定义 维基百科将其定义为 一种度量 用于描述特定测试套件运行时程序源代码的执行程度 根据Martin Fowler的说法
  • 深入学习jquery源码之append()和prepend()

    深入学习jquery源码之append 和prepend append content fn 概述 向每个匹配的元素内部追加内容 这个操作与对指定的元素执行appendChild方法 将它们添加到文档中的情况类似 参数 content St
  • 《算法图解》总结第 2 章:数组和链表,选择排序

    仅用于记录学习 欢迎批评指正 大神勿喷 系列文章目录 算法图解 总结第 1 章 二分查找 大O表示法 算法图解 总结第 2 章 数组和链表 选择排序 算法图解 总结第 3 章 while循环 递归 栈 算法图解 总结第 4 章 分而治之 快
  • VSCode LSP 语言服务器协议总结

    为什么使用语言服务器协议 LSP Language Server Protocol 语言服务器是一种特殊的 Visual Studio Code 扩展 可为许多编程语言提供编辑体验 使用语言服务器 您可以实现自动完成 错误检查 诊断 跳转到
  • android的fragment用法,Android Fragment用法知识点的讲解

    Android Fragment用法的讲解 碎片 它的出现是为了更好展示UI的设计 让程序更加得到充分的展示 Fragment的出现 如微信的额主界面包含多个Fragment 使得微信功能更加简洁明了 Fragment组件 Fragment
  • Nim游戏(C++)

    题目 给定 n 堆石子 两位玩家轮流操作 每次操作可以从任意一堆石子中拿走任意数量的石子 可以拿完 但不能不拿 最后无法进行操作的人视为失败 问如果两人都采用最优策略 先手是否必胜 输入格式 第一行包含整数 n 第二行包含 n 个数字 其中
  • 微信小程序开发笔记—设置页面密码

    文章目录 一 功能概述 二 实现效果 三 实现方法 1 新建个人登陆页面 2 设计密码获取判别函数和响应函数 1 定义变量 2 设计密码获取判别函数 3 设计响应函数 3 设计页面内容 1 input组件设计 2 button组件设计 四
  • 如何显示远程桌面_库卡机器人之远程桌面RDP

    前面已经介绍过使用VNC和RSV来实现库卡机器人的远程连接 其实还有一些方法 比如Teamviewer或Virture Remote Pendant 简称VRP 这里就不再介绍如何来实现 今天主要介绍通过windows自带的RDP来实现这种
  • Verilog 学习笔记(4)——语句块,多路分支语句、循环语句、连续赋值语句

    本章主要讲解Verilog语言中的语句部分 Verilog 语句块主要包括顺序块和并行块 语句类型有多路分支语句 case语句 casex casez 语句 循环语句 while 循环 for 循环 repeat 循环 forever 循环
  • 前端18K面试题总览,往这方面准备就对了

    Vue面试题 生命周期函数面试题 1 什么是 vue 生命周期 2 vue生命周期的作用是什么 3 第一次页面加载会触发哪几个钩子 4 简述每个周期具体适合哪些场景 5 created和mounted的区别 6 vue获取数据在哪个周期函数
  • AI数字人应该怎么制作?详细教程

    现在市面上有很多可以制作AI数字人的平台工具 本文主要针对使用腾讯智影来制作数字人 附免费教程 1 腾讯智影介绍 腾讯推出的在线智能视频创作平台 智影是一款云端智能视频创作工具 无需下载即可通过PC浏览器访问 支持视频剪辑 素材库 文本配音
  • C语言之 printf() 和 scanf() 函数详解

    文章目录 前言 一 printf 函数详解 1 函数原型 2 参数说明符详解 3 代码示例及易错点示例 二 scanf 函数详解 1 函数原型 2 参数说明符详解 3 代码示例及易错点示例 前言 printf scanf 两个函数相信大家并
  • 产品经理需要向上思考

    上一篇文章说了产品经理如何锻炼自己看透事物本质的能力 王诗沐老师在其 幕后产品 一书中还提到向上思考能力 读完后对我有一定的启发 我加一些自己的思考 和大家聊聊这个话题 很多人在产品经理面试的时候 可能会被问到这样一个题目 就是你如何看待X
  • 数据库第五周实验——单表查询——例题实现

    文章目录 一 选择表中的若干列 1 查询指定列 2 查询全部列 3 查询经过计算的值 二 选择表中的若干元组 1 消除取值重复的行 DISTINCT 2 查询满足条件的元组 WHERE 1 比较大小 2 确定范围 3 确定集合 4 字符匹配
  • typescript第三天—接口和类

    接口 作一个简历的自动筛选程序 很简单 年龄小于 25 岁 胸围大于 90 公分的 可以进入面试环节 我们最开始的写法是这样的 新建一个文件 Demo8 ts 然后编写如下代码 const screenResume name string
  • 1.Docker学习之基础知识

    0x00 Docker 快速入门 1 基础介绍 2 Docker 架构 3 Docker 资源隔离 4 Docker 容器文件系统 0x01 Docker 安装 1 Linux 2 Windows 3 MAC 4 加速器配置 0x02 Do
Powered by Hwhale