一、概念

1、容器( container-based )虚拟化方案,充分利用了操作系统本身已有的机制和特性,以实现轻量级的虚拟化(每个虚拟机安装的不是完整的虚拟机),甚至有人把他称为新一代的虚拟化技术, Docker 无疑就是其中的佼佼者

2、docker的组成

  Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

  一个完整的Docker有以下几个部分组成:

  (1)dockerClient客户端
  (2)Docker Daemon守护进程
  (3)Docker Image镜像
  (4)DockerContainer容器

3、docker与虚拟机的比较:

  (1)启动快比虚拟机 , 可以秒级启动
  (2)对资源占用小 , 宿主机上可运行千台容器
  (3)方便用户获取 , 分布 , 和更新应用镜像 , 指令简单 , 学习费用低
  (4)通过 Dockerfile 配置文件来灵活的自动创建和部署镜像 & 容器 , 提高工作效率
  (5)Docker 除了运行其中应用外 , 基本不消耗其他系统资源 , 保证应用性能同时 , 尽量减小系统开销

4、docker的主要用途

  (1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

  (2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

  (3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

5、docker底层依赖的核心技术

  (1)命名空间 (Namespaces):实现了容器键资源的隔离


  (2)控制组 (Control Groups):主要用来对共享资源进行隔离、限制、审计等
  (3)联合文件系统 (Union File System):控制为每一个成员目录设定只读 / 读写 / 写出权限
  (4)Linux 虚拟网络支持:本地和容器内创建虚拟接口

二、docker镜像

  镜像(docker image) --- Docker 运行容器之前需要本地存在镜像,若本能地不存在,那么 Docker 会找默认镜像仓库( Docker Hub 公共注册服务器中的仓科)下载,用户也可以通过配置使用自己的镜像库

  docker镜像的分层结构:支持通过扩展现有镜像,创建新的镜像

  分层的优势:(1)共享资源;(2)可写的容器层(copy-on-write)

  docker镜像常用的命令:

docker search nginx                        #查看注册表中是否有nginx镜像
docker image pull nginx:latest       #下载nginx镜像
docker images             #查看本地镜像
docker commit container-name image-name #基于修改后的容器创建镜像
docker load -i nginx.tar.gz        #导入nginx镜像
docker save -o nginx.tag.gz nginx:latest #导出nginx镜像
docker build -t centos:8 -f dockerfilePATH #基于dockerfile文件创建镜像
dcker inspect nginx             #显示nginx镜像的详细信息
docker rmi nginx                #删除镜像
docker push ip/nginx:v1           #推送镜像nginx到本地仓库
docker tag nginx:latest nginx:v1     #给镜像nginx标记标签v1
docker history nginx             #查看镜像nginx的历史构建信息

  Dockerfile 中最常用的指令:

FROM:指定 base 镜像。
MAINTAINER:设置镜像的作者,可以是任意字符串。
COPY:将文件从 build context 复制到镜像。
    COPY 支持两种形式:
        COPY src dest #shell格式
        COPY ["src", "dest"] #exec格式
     注意:src 只能指定 build context 中的文件或目录。
ADD:与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。(自带解压缩功能)
ENV:设置环境变量,环境变量可被后面的指令使用。例如:
    ...
    ENV MY_VERSION 1.3
    RUN apt-get install -y mypackage=$MY_VERSION
    ...
EXPOSE:指定容器中的进程会监听某个端口,Docker 可以将该端口暴露出来。我们会在容器网络部分详细讨论。
VOLUME:将文件或目录声明为 volume。
WORKDIR:为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。
RUN:在容器中运行指定的命令,RUN 指令通常用于安装应用和软件包。
CMD:容器启动时运行指定的命令。
    Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效。CMD 可以被 docker run 之后的参数替换。
ENTRYPOINT:设置容器启动时运行的命令,可让容器以应用程序或者服务的形式运行。
    Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。CMD 或 docker run 之后的参数会被当做参数传递给 ENTRYPOINT。

三、docker的镜像仓库

  仓库分为公共仓库和私有仓库

1、公共镜像仓库—Docker Hub 

2、搭建本地的registry仓库

  (1) 运行registry容器  

docker run -d -p 5000:5000 -v /test:/var/lib/registry  registry:2

  (2) 通过docker tag重命名镜像,使之与registry匹配

docker tag httpd  172.20.10.2:5000/httpd:v1

  (3) 修改damon.json文件  

在/etc/docker/daemon.json文件中添加:
  ”insecure-registries”:[“172.20.10.2:5000”]

  (4) 重启docker

systemctl restart docker

  (5) 上传镜像

docker push 172.20.10.2:5000/httpd:v1

  (6) 从其他主机进行下载镜像

docker pull 172.20.10.2:5000/httpd:v1

3、部署harbor私有镜像库

(1)harbor和registry的比较

  1)提供分层传输机制,优化网络传输

  2)提供web界面,优化用户体验

  3)支持水平扩展集群

  4)良好的安全机制

  5)harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。

(2)部署harbor

  1)下载harbor包

wget https://storage.googleapis.com/harbor-releases/release-1.4.0/harbor-offline-installer-v1.4.0.tgz

  2)解压包并进入目录

tar -zxvf harbor-offline-installer-v1.4.0.tgz -C /usr/local/
cd /usr/local/harbor

  3)编辑配置文件

vim harbor.cfg
hostname = 192.168.11.8 #对外访问地址
ui_url_protocol = http #访问方式
max_job_workers = 3 #最大处理进程数
customize_crt = on #是否要启动自定义证书,如果ui_url_protocol = http不生效,如果是https才会生效
  harbor_admin_password = Harbor12345 #admin用户的密码

  4)执行安装文件

[root@master harbor]# ./install.sh
注意:容器名字不能有registry这个名字,否则脚本执行失败

  5)修改访问地址

[root@master harbor]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://l10nt4hq.mirror.aliyuncs.com"],
"insecure-registries":["192.168.11.8"]
}

  6)重启docker服务

[root@master harbor]# systemctl daemon-reload
[root@master harbor]# service docker restart
Redirecting to /bin/systemctl restart docker.service

  7)在Linux下登录harbor

docker login 192.168.11.8

(3)上传镜像到harbor私有镜像仓库

  1)本地镜像重新打tag

docker tag SOURCE_IMAGE[:TAG] reg.yunwei.com/learn/IMAGE[:TAG]

  2)将重新打好tag的镜像上传到harbor镜像仓库

docker push reg.yunwei.com/learn/IMAGE[:TAG]

(4)harbor的启动和停止

  进入到harbor目录下,拥有docker-compose.yml的文件目录下执行如下的命令启动和关闭:

docker-compose start
docker-compose restart
docker-compose stop
docker-compose rm

四、docker容器的操作

docker create -it IMAGE:LABEL            #创建容器(并不是启动容器)
docker ps                       #查看所有处于开机状态的容器
docker ps -a                     #查看所有状态的容器
docker start CONTAINER_ID              #启动容器
docker stop NAME/ID               #终止容器
docker kill NAME/ID                 #终止容器
docker restart NAME/ID               #重启容器
docker run -it IMAGE:LABEL /bin/bash        #创建并运行一个容器,且直接进入容器里
docker run -<strong>d</strong>ti IMAGE:LABEL   #以后台守护进程形态运行(-d参数)
docker -rm -f NAME/ID                 #删除指定容器
docker rm $(docker ps -aq)              #一次性删除全部已经退出的容器
docker exec -it NAME/ID /bin/bash         #进入容器(实在容器中打开新的终端,并且可以启动新的进程)
docker attach NAME/ID                 #直接进入容器(不启动新的进程)   
docker export NAME/ID > nginxtest.tar       #导出容器(导出一个已经创建的容器到文件,不管容器是否运行)
cat nginxtest.tar | docker import - test   #将容器导入系统成为镜像
docker logs -f NAME/ID               #查看容器日志
docker pause NAME/ID                 #暂停容器
docker unpause NAME/ID                #取消暂停,继续运行容器

五、docker端口映射的四种方法(外网访问容器服务)

1、将容器中的一个端口映射成宿主机中的一个随机端口

docker run -d -P httpd       #P大写

2、将容器中的一个端口映射成宿主机中的一个端口

docker run -d -p  1234:80  httpd 

3、将容器中的一个端口映射成宿主机中的一个特定网卡上的随机端口

docker run -d -p 10.220.5.13: :80  httpd

4、将容器中的一个端口映射成宿主机中的一个特定网卡上的一个端口

docker run -d -p 10.220.5.13:80:80  httpd

六、数据卷Volume

1、功能和特性

  容器中数据的持久存储;容器间资源共享;容器的迁移(分布式);对数据卷的修改会立马生效;对数据卷的更新不会影响镜像;数据卷默认会一直存在,即使容器被删除。

2、数据卷Volume共享方式(3种)

(1)Bind mount volume用户需要明确指定容器中的目录和宿主机中的哪个目录进行绑定

docker run -it -v /ren:/data/  busybox

(2)Docker Management Volumedocker daemon自行管理将容器中的目录和宿主机中的哪个目录进行绑定

docker run -it -v  /data/ busybox

(3)基于一个现有容器实现多个容器之间文件共享

docker run -it  --volume-from ren1(启动的容器)  busybox [提前启动一个容器]

3、volume生命周期管理

(1)备份

  因为volume 实际上是 host 文件系统中的目录和文件,所以 volume 的备份实际上是对文件系统的备份

(2)恢复

  volume 的恢复也很简单,如果数据损坏了,直接用之前备份的数据拷贝到 /ren 就可以了。

(3)迁移

  如果我们想使用httpd,那就涉及到数据迁移,方法是:

  1) docker stop 当前容器;

  2) 启动新版本容器并mount原有volume(docker run -d -v /ken:/var/www/html  httpd)  这里要确认新版本的默认数据路径是否发生改变

(4)销毁

  对于 docker managed volume,在执行 docker rm 删除容器时可以带上 -v 参数,docker 会将容器使用到的 volume 一并删除,但前提是没有其他容器 mount 该 volume,目的是保护数据,非常合理。

  如果删除容器时没有带 -v 呢?这样就会产生孤儿 volume。可用docker volume ls 查看。如果想批量删除孤儿 volume,可以执行:docker volume rm $(docker volume ls -q)

七、docker网络

1、docker的四种网络模式

(1)bridge模式:docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。

(2)none模式:此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。

(3)host模式:此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。

(4)container模式:此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。

2、自定义网络

  除了none,host,bridge这三个自动创建的网络,用户也可以根据业务需要创建user-defined 网络。

创建命令:
docker network create --driver bridge ren 创建网段时指定—subset和—gateway参数:
docker network create –driver bridge –subnet 172.21.0.0/16 --gateway 172.21.0.1 ren1 容器使用新定义的网络:
docker run –it –network=ren1 busybox 指定分配IP:
docker run -it –network=ren1 –ip=172.121.0.7 busybox

3、容器间通信

  容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信。

  (1) 通过IP通信:处于同一网段的容器间可以通信;如果两个容器处于不同网段,可以通过给一个容器添加另一个容器所处网段的网卡,命令为:

docker network connect ren1 container1(现有容器)

  (2) Docker DNS server通信:通过 IP 访问容器虽然满足了通信的需求,但还是不够灵活。因为我们在部署应用之前可能无法确定 IP,部署之后再指定要访问的 IP 会比较麻烦。对于这个问题,可以通过 docker 自带的 DNS 服务解决。方法很很简单,在启动容器时给容器命名就可以,访问直接ping容器名即可。但要注意:使用 docker DNS 有个限制:只能在 user-defined 网络中使用

  (3) joined容器:joined 容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息。实现如下:先启动一个名为web1的容器,然后再创建busybox容器并通过—network=container:web1 指定jointed容器为web1。这时busybox和web1的网卡mac地址与IP完全一样。

  joined 容器非常适合以下场景:

  1) 不同容器中的程序希望通过 loopback 高效快速地通信,比如 web server   与 app server。

  2) 希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。

4、容器与外界交互

(1).容器访问外部世界:只要宿主机可以访问外网,默认容器时可以访问外网的;

(2).外部世界访问容器:通过端口映射来。

八、docker容器监控

1、自带的监控命令:ps、top、stats

2、weave scope监控:Weave Scope 的最大特点是会自动生成一张 Docker 容器地图,让我们能够直观地理解、监控和控制容器。还可以监控多主机,只需在主机上安装weave scope。

docker总结复习的更多相关文章

  1. docker知识复习

    1.镜像基于内容寻址 基于内容寻址的实现,使用了两个目录:/var/lib/docker/image和/var/lib/docker/overlay, 后面的这个根据存储驱动的名称不同,而目录名不同. ...

  2. 使用Kafka的一些简单介绍: 1集群 2原理 3 术语

    目录 第一节 Kafka 集群 Kafka 集群搭建 Kafka 集群快速搭建 第二节 集群管理工具 集群管理工具 集群 Issues 第三节 使用命令操纵集群 第四节 Kafka 术语说明 第五节 ...

  3. K8S系列第四篇(Dockerfile)

    DokcerFile 镜像定制 更多精彩内容请关注微信公众号:新猿技术生态圈 定制docker镜像的方式有两种: 手动修改容器内容,导出新的镜像. 基于dockerfile自行编写指令,基于指令流程创 ...

  4. docker interact example

    此为docker 第一篇,插下杂七杂八的东西,好找,就这么简单,,,, yum -y install docker-io //install cp /var/tmp/cap.data /var/lib ...

  5. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

  6. 网络模型 - 每天5分钟玩转 Docker 容器技术(169)

    本节我们讨论 Kubernetes 网络这个重要主题. Kubernetes 作为编排引擎管理着分布在不同节点上的容器和 Pod.Pod.Service.外部组件之间需要一种可靠的方式找到彼此并进行通 ...

  7. [docker]通过阿里云源安装docker && flannel不通问题解决(try this guy out)

    docker清理容器 # 容器停止后就自动删除: docker run --rm centos /bin/echo "One"; # 杀死所有正在运行的容器: docker kil ...

  8. centos7下安装docker(7docker base command 命令词典)

    上一章中我总结了学习docker 镜像时所用过的命令,今天先来将docker base command 记录一下,参考:https://docs.docker.com/edge/engine/refe ...

  9. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境(转)

    前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装.部署和升级,非常 ...

随机推荐

  1. 201871030131-谢林江 实验二 个人项目—《D{0-1} KP》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.学习编写PSP2.完成个人项目实验要求3.在Github建仓 这个作业在哪些方面帮助我实现学习目标 1.首次编 ...

  2. (十)struts2的异常处理机制

    成熟的MVC框架应该提供成熟的异常处理机制.当然可以在方法中手动捕捉异常,当捕捉到特定异常时,返回特定逻辑视图名. 这种方式非常繁琐,需要在方法中写大量try catch块,最大的缺点还是一旦需要改变 ...

  3. html页面自定义文字水印效果案例

    在系统开发过程中,一些数据或页面比较敏感的地方,客户会要求实现水印效果,防止内部人员截图或拍照泄露信息. 自定义文字水印顾名思义就是利用js在完成页面渲染的同时,往页面的最底层动态生成多个带水印信息的 ...

  4. 期末考试复习c#时总结的抽象类与接口的一些区别

    抽象类: (1)抽象类中可以定义抽象方法,属性,变量 (2)抽象类的派生类必须实现所有的抽象方法.要求所有的派生非抽象类都要用override重写实现抽象方法. (3)抽象类可以存放抽象方法,属性,也 ...

  5. 对象存储服务MinIO安装部署分布式及Spring Boot项目实现文件上传下载

    目录 一.MinIO快速入门 1. MinIO简介 2. CentOS7更换成阿里云镜像 3. 安装 3.1 下载 3.2 运行测试 4. 配置脚本执行文件 4.1 创建配置执行文件 4.2 执行 二 ...

  6. Dynamics CRM实体系列之图表

    本节开始讲解Dynamics CRM的图表功能.任何产品基本上都会有数据分析的工具,Dynamics CRM当然也不例外,作为一个专门做销售管理的软件数据分析自然也是对于销售管理者的决策有很大的作用的 ...

  7. xss-labs全关教程

    0x01 Level 1 查看源码,可以看到接收了name参数,并直接嵌入到HTML页面中了 没有任何过滤,而且直接会当作代码执行. 0x02 Level 2 先传入<script>ale ...

  8. 整合Atomikos、Quartz、Postgresql的踩坑日记

    前言 由于业务需要,在单体Spring Boot项目中需要引入分布式事务,来保证单体应用连接的多个数据源的事务统一. 而说到分布式事务,小伙伴们肯定会想到阿里的Seata,阿里Seata强大的AT模式 ...

  9. jira 改变issue状态触发jenkins构建/发布

    目录 jira中issue状态的改变触发Jenkins构建 jira中定制新的workflow,作为jenkins发布使用流程 大家可以参考我的这个workflow 设置workflow 使用Tran ...

  10. 关于sysmon.exe高cpu占用

    sysmon.exe是干嘛的? 这里面有介绍:https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon 是windows官方提供的监 ...