Docker考点

https://blog.csdn.net/zsh2050/article/details/83005085

虚拟化技术无疑是云计算的核心技术,而容器虚拟化方案,更是充分利用了操作系统已有的机制和特性,可以实现轻量级的虚拟化。Docker无疑是其中的佼佼者。

一.Docker的核心概念

1.镜像(Image)
可以将它理解为一个面向Docker引擎的只读模板,包含了文件系统。


2.容器(Container)
容器是镜像的一个运行实例。Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,这些容器都是相互隔离的。镜像自身是只读的,容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变。

3.仓库(Repository)
Docker仓库类似于代码仓库,是Docker集中存放镜像文件的场所。


二.Docker核心技术

Docker引擎的基础是Linux容器(Linux Containers, LXC)技术。从操作系统功能上看,Docker底层依赖的核心技术主要包括以下几部分:
1.命名空间(Namespaces)
每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响。在操作系统中,所有资源都是进程共享的。要实现虚拟化,除了要实现对内存、CPU、网络IO、硬盘IO、存储空间等的限制外,还要实现文件系统、网络、PID、IPC等的相互隔离。随着Linux系统对于命名空间功能的逐步完善,已经实现了这些需求,让进程在彼此隔离的命名空间中运行。

2.控制组(Control Groups)
控制组(CGroups)是Linux内核的一个特性,主要用来对共享资源进行隔离、限制、审计等,可以提供对容器的内存、CPU、磁盘IO等资源进行限制。对Docker来说控制组最重要的功能是根据组的命名空间执行组之间进程、网络连接、文件系统等资源的隔离。

3.联合文件系统(Union File Systems)
联合文件系统(UnionFS)是一种轻量级的高性能分层文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加。联合文件系统是实现Docker镜像的技术基础。

4.虚拟网络支持
Docker的网络实现是利用了Linux上的网络命名空间和虚拟网络设备。

三.Docker技术要点

1.容器:
(a)容器的名称是唯一的。
(b)当Docker容器中指定的应用终结时,容器也自动终止。
(c)docker run添加 -d参数,使容器以守护态运行,添加 --rm 标记,容器终止后会立刻删除。--rm和-d不能同时使用。

2.数据卷:
(a)Docker挂载数据卷的默认权限是读写(rw),用户也可以通过,ro指定为只读。
(b)直接挂载文件到容器,可能造成inode改变,导致错误,所以推荐挂载目录。
(c)可以从其它已经挂载了容器卷的容器来挂载数据卷。如果删除了挂载的容器,数据卷并不会被自动删除。
(d)通过--privileged=true解决volume访问权限问题。

3.Dockerfile
(a)每个Dockerfile只能有一条CMD命令,如果指定多条,只有最后一条会被执行。如果容器启动时指定了运行命令,则会覆盖掉CMD命令。
(b)每个Dockerfile只能有一条ENYRTPOINT命令,如果指定多条,只有最后一条会被执行。ENYRTPOINT命令,不可被docker run提供的参数覆盖。ENTRYPOINT指令指定的内容必须是前台运行的。
(c)每运行一条RUN指令,镜像添加新的一层,并提交。
(d)dockerfile中的EXPOSE指令指定端口,如果没做映射docker会随机指定一个端口映射。

4.网络
(a)默认情况下,容器可以主动访问外部网络,但外部网络无法访问到容器。
(b)外部访问容器内应用,可以在Docker启动时,通过-P或-p参数来指定端口映射。
(c)docker默认是允许container互通,通过-icc=false关闭互通。一旦关闭了互通,只能通过-link name:alias命令连接指定container。
(d)使用link会在/etc/hosts中生成对应的ip映射,这样会通过主机别名而不是ip进行访问,这样的好处是可以防止ip变化。

https://www.jianshu.com/p/e8884f522408

1. docker是什么?

Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。假设你写的某个代码依赖了很多三方库,甚至mysql等多个数据库,那么通过docker可以快速的把代码部署到目标机器而节省了环境搭建的环节。

2. linux下安装docker

wget https://get.docker.com -O docker.sh
sudo bash docker.sh
# 推荐设置添加镜像源,否则可能出现docker pull时失败的情况。
echo "DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io"" | sudo tee -a /etc/default/docker

这是官网推荐的安装脚本,会自动安装docker-ce的最新稳定版本。支持常见的很多发行版,比如centos7,fedora,debian,ubuntu等。详情看docker.sh那个脚本。

3. Dockerfile

ddocker build配合Dockerfile生成镜像,生成的镜像可以用于发布到网上传播,比如hub.docker.com中就有很多编译好的docker镜像。下面展示最简单的hello world的镜像如何生成,注意一点后面docker build时会尝试将当前文件夹下所有内容发送到docker服务作为上下文,所以建议单独新建一个文件夹,并在其中新建一个文件名为Dockerfile,填入以下内容:

 # 下面内容会基于bionic版本的ubuntu作为基础镜像
FROM ubuntu:bionic   
MAINTAINER spring
# 每个docker镜像需要一个入口点,也就是运行时运行的程序
ENTRYPOINT ["/bin/echo", "Hello world"]   

后面通过docker build编译,通过docker run运行:

[root@centos hello]# sudo docker build -t hello .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu:bionic
 ---> ea4c82dcd15a
Step 2/3 : MAINTAINER spring
 ---> Running in dc34172ee1bb
Removing intermediate container dc34172ee1bb
 ---> 1898011b7a45
Step 3/3 : ENTRYPOINT ["/bin/echo", "Hello world"]
 ---> Running in 52c83794a370
Removing intermediate container 52c83794a370
 ---> 33c4e1f5d398
Successfully built 33c4e1f5d398
Successfully tagged hello:latest
[root@centos hello]# sudo docker run hello
Hello world

但是事实上Dockerfile能定义的东西有很多,比如当我使用mysql镜像时,我需要传入宿主机的某个文件夹做用于存放数据库真实数据,此时需要VOLUME指令。同时mysql是需要供别的服务使用的,此时就需要EXPOSE开放指定端口。下面的Dockerfile是我项目中实际在使用的(不要尝试编译这份配置,只是做个示范):

FROM ubuntu:bionic
MAINTAINER spring

USER 0
COPY libcrypto.so.1.1 /usr/local/lib/
COPY config.json /app/
COPY server /app/
RUN  ldconfig
VOLUME ["/mnt/data","/data"]
EXPOSE 80
WORKDIR "/app"
ENTRYPOINT ["/app/server"]

4. docker镜像与docker容器

docker镜像的获得有多种方法:

  1. 如果公司内部有docker仓库,则使用docker login登陆,并使用docker pull获取镜像。
  2. docker官方提供一个公共仓库: hub.docker.com,在这个网站找到想要的镜像后不需要login可以直接pull。
  3. 使用docker build构建属于自己的镜像。
    docker images命令可以查看本地已有的docker镜像。这里image概念如同OOP中的class,当需要使用某个镜像时需要将类实例化,也就是这里的docker create命令,就得到了container(容器)。针对docker 容器常见的操作有docker start,docker stop,docker rm等。但在很多情况下,使用docker create之后都希望立即启动它,所以就有了docker run,它相当于docker createdocker start的合并。

5. docker-compose服务编排

docker-compose的出现只怪上面的docker命令太难搞了,特别对于有对于多个服务要一起启动时就更崩溃了。但是在我实践过程中发现,除了hello world这种不用带任何参数的docker可以一行一行敲以外,其他容器都会有文件夹映射,端口映射等很多其他参数,在这种情况下你使用docker run就想直接找块豆腐撞死。
docker-compose的安装:

url="https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)"
sudo wget "$url" -O /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

示范一个项目中正在使用的docker-compose.yml配置文件:

version: "3"
services:
    evidence:
        container_name: server
        image: "xxxxxx:1.0"
        volumes:
          - /data:/data:rw
        ports:
          - "80:80"
        environment:
          - TOKEN_URL=http://192.168.1.2
          - DATA_DIR=/data
        restart: always

总的概念上讲与上面的Dockerfile类似,只是换了一下语法,后续就可以通过docker-compose up -d启动服务并放置于后台运行,通过docker-compose down停止这些服务。当然docker-compose的功能远远不止如此,项目中常用的还有depends_on控制关联服务器的启动,使用networks将各个服务置于一个网段,也可以给每个容器配置静态ip地址等等。

6.知识点总结

1.linux中docker的安装(务必不要使用snap版本的docker,有深坑!!!!)
2.使用Dockerfile编译自己的docker镜像
3.docker基本概念:仓库,镜像,容器。docker常用命令: create,start,stop,rm,rmi,run,logs,inspect等等。
4.使用docker-compose部署docker服务。尽量使用environment传递参数,不要使用config文件再映射到容器的做法。

2019年1月23日更新(docker镜像中文乱码):

  1. 以debian:9这个docker镜像为例,默认情况下无法输入中文而且显示中文乱码,此时在构建镜像时需要在Dockerfile里面添加:ENV LANG C.UTF-8 ,即可解决中文乱码问题。

https://www.cnblogs.com/Super-It/p/11418681.html

Docker知识点总结

一. docker介绍

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

1.一个完整的docker组成部分:1.dockerClient客户端,2.docker Daemon守护进程,3.docker Image镜像,4.dockerContainer容器

2.Docker和KVM的对比

kvm: 1.虚拟机;2.使用复杂;3.启动过程慢(分钟);4.模板文件大;5.和物理机完全隔离;6.模拟的是一个完成系统,可以登入并实现管理。

docker1.直接虚拟出一个用户空间;2.使用简单;3.启动非常快(秒级);4.模板文件小;5.在一定程度上和物理机隔离;6.仅仅是模拟一部分用户空间,不方便管理。

3.docker使用理由

1.快速部署服务;2.实现隔离;3.让一个主机运行多个容器;4.提高开发效率;5.实现软件的跨平台。

二.docker镜像的操作命令

复制代码

  1.docker search nginx                                查看注册表中是否有nginx镜像
  2.docker  image pull  nginx                          下载nginx镜像
  3.docker  image  ls                                  查看本地镜像
  4.docker  image load < redis-img.tar.gz              导入redis镜像
  5.docker  image save nginx > nginx.tar.gz            导出nginx镜像
  6.dcker  inspect nginx                               显示nginx镜像的详细信息
  7.docker image rm nginx                              删除镜像
  8.docker  push  ip/nginx:v1                          推送镜像nginx到本地仓库
  9.docker  tag  nginx   nginx:v1                      给镜像nginx标记标签v1
  10.docker history  nginx                             查看镜像nginx的历史构建信息

复制代码

三.docker容器的操作命令

复制代码

 1.docker run -d redis                                后台启动容器
  2.docker ps                                         查看启动的容器
  3.docker  stop/start  redis                         停止/启动容器
  4.docker exec -it redis  bash                       登入容器(常用用法)
  5.docker rm -f redis                                删除容器
  6.docker rm $(docker ps -aq)                        删除全部已退出的容器

复制代码

四.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 /ken:/data/  busybox

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

  主要实现命令:docker run -it -v  /data/ busybox

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

  主要实现命令:docker run -it  --volume-from ken1(启动的容器)  busybox [提前启动一个容器]

3.volume生命周期管理

(1).备份

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

(2).恢复

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

(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)

六.实现容器的底层技术

cgroup:实现资源限额;namespace实现资源隔

1.对内存限制:docker run -it -m 512 busybox

2.对cpu限制:docker run -c 1024 httpd

Namespace:主要有六种资源:Mount,UTS,IPC,PID,Network和User

Mount namespace:让容器看上去拥有整个文件系统;

UST namespace:让容器有自己的hostname

IPC namespace:让容器拥有自己的共享内存和信号量来实现进程间通信,而不会与host和其他容器的IPC混在一起

PID namespace:容器在host中以进程形式运行。容器拥有自己独立的一套PID。

Network namespace:让容器拥有自己独立的网卡,IP,路由等资源。

User namespace:让容器能够管理自己的用户,host不能看到容器创建的用户。

七.docker镜像构建的两种方式:

1.docker commit构建镜像

三步:运行容器,修改容器,将容器保存为新的容器

如:docker run -it centos(进入容器)>yum install vim -y(容器里下载)>docker commit container id  centos-vim(推出容器运行,使用commit存为新的镜像)

注意:但是docker不建议使用这种方式创建镜像,原因如下:

这是一种手工创建镜像的方式,容器出错,而且效率低且可重复性弱

更重要的是。使用者并不知道镜像是如何创建出来的。里面是否有恶意程序

2.Dockerfile构建镜像

(1).Dockerfile常用命令:

FROM:指定base镜像

COPY:将文件从build context复制到镜像

ADD:与copy类似,不同的是,如果复制的是归档文件(tar,zip,tgz,xz),文件会被自动解压到dest.

ENV:设置环境变量,环境变量可被后面的指令使用

EXPOSE:指定容器中的进程监听某个端口,docker可以将该端口暴露出来

VOLUME:将文件或目录声明为volume

WORKDIR:为后面的run,entpypint,add,copy指令设置镜像中的当前工作目录(容器目录)

RUN:在容器中运行指定的命令

CMD:容器启动时运行指定的命令。Dockerfile中可以有多个CMD指令,但只有最后一个生效。CMD可以被docker run 之后的参数替换。

ENTRYPOINT:设置容器启动时的命令。Dockerfile中可以有多个ENTRYPOINT,但只有最后一个生效,CMD或者docker run之后的参数会被当作参数传递给ENTRYPOINT.

(2)Dockerfile演示

3.RUN,CMD,ENTRYPOINT区别

RUN:执行命令创建新的镜像层,RUN经常用于安装软件包

CMD:设置容器启动后默认执行的命令及参数,但CMD能够被docker run后面跟的命令行参数替换

ENTRYPOINT:配置容器启动时运行的命令

(1).使用 RUN 指令安装应用和软件包,构建镜像。

(2).如果 Docker 镜像的用途是运行应用程序或服务,比如运行一个 MySQL,应该优先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可为 ENTRYPOINT 提供额外的默认参数,同时可利用 docker run 命令行替换默认参数。

(3).如果想为容器设置默认的启动命令,可使用 CMD 指令。用户可在 docker run 命令行中替换此默认命令。

八.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 ken

创建网段时指定—subset—gateway参数:docker network create –driver bridge –subnet 172.21.0.0/16  --gateway 172.21.0.1 ken1

容器使用新定义的网络:docker run –it –network=ken1 busybox

指定分配IP: docker run -it –network=ken1 –ip=172.121.0.7 busybox

3.容器间通信

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

(1)通过IP通信:处于同一网段的容器间可以通信;如果两个容器处于不同网段,可以通过给一个容器添加另一个容器所处网段的网卡,命令为:docker network connect ken1 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.公共镜像仓库—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文件  

在文件中添加:”insecure-registries”:[“172.20.10.2:5000”]

(4) 重启docker和容器

(5) 上传镜像

Docker push 172.20.10.2:5000/httpd:v1

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

Docker pull 172.20.10.2:5000/httpd:v1

十.docker容器监控

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

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

 十一.docker日志管理

1.docker logs

2.ELK:开源的日志管理方案。

Elasticsearch一个近乎实时查询的全文搜索引擎。Elasticsearch 的设计目标就是要能够处理和搜索巨量的日志数据。

Logstash读取原始日志,并对其进行分析和过滤,然后将其转发给其他组件(比如 Elasticsearch)进行索引或存储。Logstash 支持丰富的 Input和Output 类型,能够处理各种应用的日志。Kibana一个基于 JavaScript 的 Web 图形界面程序,专门用于可视化 Elasticsearch 的数据。Kibana 能够查询 Elasticsearch 并通过丰富的图表展示结果。用户可以创建 Dashboard 来监控系统的日志

3.ELK日志处理流程:

Logstash 负责从各个 Docker 容器中提取日志,Logstash将日志转发到Elasticsearch 进行索引和保存,Kibana 分析和可视化数据。

4.Filebeat

ELK 提供了一个配套小工具 Filebeat,它能将指定路径下的日志文件转发给 ELK。同时 Filebeat 很聪明,它会监控日志文件,当日志更新时,Filebeat 会将新的内容发送给 ELK。

在配置filebeat时,配置文件/etc/filebeat/filebeat.yml中需告诉filebeat两件事:1.监控哪些日志?2.将日志发送到哪?

 ---

下面是基础教程

 https://www.runoob.com/docker/docker-architecture.html

猜你喜欢

转载自blog.csdn.net/weixin_39875161/article/details/105157830