docker系统学习

这篇文章给大家分享的是学习docker系统的知识总结,相信大部分人都还不熟悉docker系统的各项操作,这篇文章不仅包含docker系统的概念还详细讲述了操作步骤,一起往下看吧。

10年积累的网站设计制作、做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有平度免费网站建设让你可以放心的选择与我们合作。

下载地址
http://www.linuxidc.com/Linux/2014-01/95513.htm
根据上面安装之后,启动不起来。yum update device-mapper*  之后启动ok.

linux与docker版本的兼容性问题
uname -r
yum update
yum remove docker  docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install docker-ce
systemctl start docker
systemctl enable docker
docker version

镜像删除不了办法:

  1. cd  /var/lib/docker/image/overlay2
  2. cat repositories.json
    {"Repositories":{}}
  3. rm imagedb/content/sha256/*
  4. rm layerdb/sha256/*
  5. systemctl restart docker

概念

  hostos:宿主机操作系统
  guestos:虚拟机操作系统 

一、主机级别虚拟化

1.完全虚拟化:vmware,kvm,xen(hvm)

|---guestos--------------|
|--------vmm-------------|
|----------hostos--------|
|------------hardware----|

2.半虚拟化:xen,uml
  hypervisor(vmm)直接运行在硬件层

|---guestos(modfiled)----|
|--------vmm-------------|
|------------hardware----|     

3.模拟:qemu

二、用户空间虚拟化(容器)

lxc,openvz,solaris containers,freebsd jails

三、库虚拟化

wine cygwin

四、应用程序虚拟化

jvm,pvm

用户空间虚拟化(容器)
chroot+6个名称空间+cgroups=容器

lxc,openvz,solaris containers,freebsd jails

隔离:namespace名称空间

    uts(主机名域名),mount,ipc,pid,user,net
    其中user是内核3.8以后才加进内核

control groups(cgroups):是Linux内核提供的进程资源限制机制,对资源进行分组。

lxc-linux container
docker 是lxc的增强版

分层联合挂载:每层都是只读,比如系统一层,应用一层。每层叠加放入容器。写的时候在顶层加一层可以读写层。删只读层东西就是标记不可见。每个容器共享只读层。
迁移,容器内部不要保存有效数据,需要的话挂载外网分布式系统。

基础用法
docker 架构:c/s架构

他们直接通信使用https/http 默认https.
client:docker build
docker pull
docker run

docker host: docker deamon
containers
images

registry: 认证+仓库+其他 组成
仓库:仓库名+标签唯一标识一个镜像(nginx:1.1/nginx:latest;nginx:1.0/nginx:stable)

镜像:静态
容器:动态,有生命周期

docker 对象:images,containers,networks,volumes,plugins 这些对象都可以增删改查。

安装:内核3.10+ 必须大于3.8
yum install docker-ce  #注意,使用extras里的是yum install docker
systemctl start docker.service
配置文件:/etc/docker/daemon.json

docker镜像加速:
docker cn
阿里云加速器
中国科技大学
cat /etc/docker/daemon.json 显示如下内容:

  { 
     "registry-mirrors":["https://registry.docker-cn.com"]
  }

docker命令:
格式1: docker 命令
格式2:docker 分组 命令

  docker version
  docker info
  docker search nginx
  docker image pull nginx:1.14-alpine
  docker image ls 
  docker image ls --no-trunc #显示完整image id信息
  docker image rm  nignx:1.14-alpine # docker rmi

  docker containers create
  docker containers start
  docker containers stop
  docker containers kill
  docker containers rm
  docker containers run #创建并运行

  docker run [options] image [command line] [arg..]
  docker run --name wbl -it busybox:latest   #i,t是终端交互模式
  docker run --name wbl2 -d busybox:latest   #-d是后台运行模式
  docker network ls
  docker ps   #查看容器列表
  docker ps -a  #查看停止后的容器列表
  docker container ls
  docker container ls -a
 docker run -a  # -a, --attach=[], 登录容器(必须是以docker run -d启动的容器)

  docker inspect wbl  #查看容器详细信息
  docker start -ai wbl #a是attach,i是交互。启动容器

  docker kill wbl  #相当于-9
  docker rm wbl    #删除

#注意:容器中程序不能运行在后台,否则会终止

  docker exec -it wbl /bin/sh  #进入正在运行的容器
  docker logs wbl              #查看容器里日志,容器里进程日志不存文件而是输出到控制台。

镜像介绍:
docker镜像含有启动容器所需文件系统及其内容。用于创建启动镜像。
docker镜像采用分层机制:bootfs和rootfs
bootfs:是引导文件系统,包括bootloader和kernel,容器启动完成后就卸载了。
rootfs: 在bootfs之上,表现为docker容器的根文件系统,挂载为只读模式,而后通过联合挂载一个外挂载可写层。
启动时候先从底层一层层联合挂载,只读的并是与其他容器共享的。最顶层是可写层。删除容器时可写层一并删除。

  联合挂载需要专用分层文件系统:aufs,overlayfs,overlay2fs,btrfs,devicemapper
  docker info 可以查看存储类型
  启动容器时,docker daemon 会试图从本地获取相关镜像,本地镜像不存在,将从registry中下载该镜像并保存到本地。

  docker client -----http----> docker daemon ----https-> docker registry
  docker registry分类:
                 sponsor registry:第三方,供客户和docker社区使用
                 mirror registry: 第三方,只让客户使用
                 vendor registry: 由发布docker镜像的供应商提供
                 private registry: 自建的有防火墙的安全的私有实体提供的。

 registry 组成:
          1)repository
             一个registry有多个仓库,一个仓库可以分为顶层仓库(比如nginx)和用户仓库(wbl/nginx),每个仓库还可以有多个tag
          2)index
            维护用户账户,镜像的校验以及公共信息。为registry提供用户检索功能。

 docker registry中镜像通常有开发人员制作,而后推送公共或私有registry保存,以供其他人员使用。
 docker hub功能:
        image repositories:
        automated builds: 可以基于dockerfile;也可以commit
        webhooks:
        organizations:
        dcoker pull [:]/[/]:
        git -> git hub -> docker hub -> docker repository 
        其他镜像仓库:quay.io : docker pull quay.io/coreos/flannel

镜像生成途径:
dockerfile
基于容器制作
docker hub automated builds

        dockerfile------------build---------> images ----------push-------> docker registry
                                              images <---------pull-------- docker registry
                                              images ----------save--------> backup.tar
                                              images <----------load-------- backup.tar
                                              images -----------run--------> container
                                              images <----------commit------ container

       基于容器制作:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
                    docker commit -p wbl nginx/wbl:v1.1.1   #-p 是暂停
                    docker commit -a "wbl" -c 'CMD ["/bin/httpd","-f","-h","/data/www"]' -p 基于镜像名  新镜像名和tag

      push到docker-hub:
                   docker login -u wbl1232002a
                   [root@iZj6chmozc373fzvc4vs9sZ docker]# docker image ls
                   REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
                   nginx/wbl           v.wbl.1             219619953381        2 days ago          16.8MB
                   nginxdemos/hello    latest              aedf47d433f1        18 months ago       16.8MB

                   docker tag nginx/wbl:v.wbl.1 wbl1232002a/nginx-wbl:v.wbl.1   #注意上传的仓库名需要和docker-hub一样。
                   docker push wbl1232002a/nginx-wbl

      镜像的导入和导出:docker save  和 docker load                      
                       docker save -o aaa.gz  image1 image2
                       docker load -i aaa.gz

docker网络

     docker network ls   #查看docker的网络模式,桥接,仅主机
     docker network inspect bridge
     查看网卡相关命令:ifconfig ; brctl show ; ip link show #yum install bridge-utils

     叠加网络 overlay network :使用隧道技术,在原有包外再封装一层物理网卡的包。

  bridge 桥接模式:
     docker 启动后会创建一个docker0的交换机默认是桥接模式,还会默认配置好ip。docker创建容器后,会分配一对网卡,一半连接容器,一半连接docker0交换机。
            并且自动修改防火墙添加nat

            容器 eth0---->vethxx docker0 (nat)-----> 物理机网卡ip   #开启ip forward

  host模式: 容器共享宿主机的物理网卡ip,容器里的ip就是外网物理ip
    user,mount,pid    
                    ---> 共享(宿主机)的uts,net,ipc  
    user,mount,pid 

 container模式:       
    user,mount,pid    
                    ---> 共享(容器)的uts,net,ipc 
    user,mount,pid 

 封闭模式none: 容器没有network namespace,只有lo口。保证的容器的安全。

 ip命令:ip netns help
         ip netns add r1           #创建一个网络命名空间名字是r1
         ip netns exec r1 ifconfig -a #在r1里执行命令查看网卡信息

         ip link help
         ip link show
         ip link add name veth2.1 type veth peer name veth2.2  #创建一对网卡

         ip link set dev veth2.1 netns r1   #将网卡veth2.1 移到网络命名空间r1
         ip netns exec r1 ifconfig -a
         ip netns exec r1 ip link set dev veth2.1 name eth0 #更改namesapce r1里网卡名称
         ip netns exec r1 ifconfig eth0 192.168.5.1/24 up

docker 命令参数 暴露端口

bridge桥接模式:
   docker port wbl  #显示指定容器的映射。
   docker -p #映射容器端口到物理端口地址 -p 80 容器80映射到物理网卡随机端口。
   docker -P #大P,将容器所有要暴露端口全部映射到主机端口。容器是80,宿主机就是80.
   docker run wbl:v.1 --name wbl2 -p hostip::80   #映射物理ip端口随机 到容器的80
   docker run wbl:v.1 --name wbl2 -p hostip:80:80  #映射物理ip端口80 到容器的80
   docker run wbl:v.1 --name wbl2 -p 80:80  #映射物理所有ip端口80 到容器的80

host模式:
docker run wbl:v.1 --name wbl2 --network host

container模式:
docker run wbl:v.1 --name wbl2 --network container:wbl1  #共享容器wbl1的网络命名空间

none:
docker run wbl:v.1 --name wbl2 --network none

修改docker0桥默认的ip地址: vi /etc/docker/demon.json  
{
"registry-mirrors" : ["https://registry.docker-cn.com"],
"bip" : "192.168.74.1/24",
"hosts" : ["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"
}
systemctl daemon-reload
systemctl restart docker
重启docker 服务器即可。
自定义网络模式:

  1. 创建网络
    docker network create wbl --subnet 192.168.75.0/24  #网关默认就是第一个ip
  2. 使用网络
    docker run -tid --name t8800 --network wbl nginx:v.8800

存储卷

cow:写时复制 ,就是在修改写入只读层数据时候,先复制数据到可写层,然后修改数据。

删除数据:就是标志只读层数据为删除。然后用户层不可见。

为什么使用volume:

  1. 关闭并重启容器,数据不受影响,但是删除docker容器,则其更改会全部丢失。
  2. 存储于联合文件系统中,不易于宿主机访问。
  3. 容器之间数据共享不便
  4. 删除容器数据丢失
    解决方案:使用卷volume
    通过外部挂载到容器目录方式。

    volume卷类型:

  5. 手动创建容器和宿主机的目录,并挂载
  6. 手动创建容器目录,docker自动管理挂载宿主机目录。/var/lib/docker/vfs/
    这种方式,如果删除容器后再启动,docker再次自动挂载的目录可能和上次不一样。因此数据不一样。

    命令:
    docker run -it --name wbl123 -v /data nginx:v1.1   #-v 指定容器目录,自动创建宿主机上的卷并挂载
    docker run -it -v 宿主机dir:容器dir --name wbl123 nginx:v1.1  #手动指定方式;两边目录不存在都会自动创建;hostdir 是宿主机目录:容器目录
    docker inspect -f {{.Mounts}} wbl123   #查看详细内容,-f是指定,过滤意思                
    docker run -it --rm --name wbl0 -v /data/wbl0:/data/wbl0 nginx-wbl:v8800 ls /data

    sharing volumes复制其他容器的卷:
         docker run -it --name wbl1 -v /wbl:/data nginx:v.1.1
         docker run -it --name wbl3 --volumes-from wbl1 nginx:v.1.1
    
         docker run -it --name wbl4 --network container:wbl --volumes-from wbl1 nginx:v.1.1 #可以使用一个容器做基础容器。只有存在就好。

Dockerfile: 命令 docker build #docker build -t wbl:v.1 .
前导:
想改变nginx的配置文件三种方式:{1:进入容器修改;2:容器的挂载卷使用宿主机;3:自己制作镜像}
自己制作镜像有两种方式:{1:基于容器自制镜像;2:基于Dockerfile自制镜像}

        dockerfile格式:{指令:参数}#指令不区分大小写,但是潜规则都是大写。

        工作逻辑:
            创建一个专用工作目录wbl; wbl目录里要有文件Dockerfile(首字母必须大写,没有后缀),所有文件都需要放入wbl目录不能是wbl的父目录。
            隐藏文件.dockeringore可以排除目录文件,一行一个,可以使用通配符。

        docker build: 基于wbl目录里的基础镜像和文件,隐藏启动一个容器,然后制作成新的镜像,和人工制作镜像雷同。

  docker 指令:

        FROM: 必须为dockerfile第一个非注释行,引用基于哪个基础镜像来制作镜像。后续所有指令运行都是基于此镜像提供的环境。
              docker build的时候它会先在主机本地查找,不存在会从docker hub registry拉取

              语法:FROM 仓库名:tag #没有tag就是latest
                   FROM 仓库名@digest   #为了安全使用hash码

        MAINTAINER: 作者信息
        LABEL: 高版本代替maintainer 
               LABLE  KEY=VALUE  #LABLE maintainer="wbl"

        COPY: 从宿主机的当前wbl目录里的文件复制到创建的新镜像中
              COPY aaa   /data/aaa2
              COPY ["aaa","/data/aaa2"]   #目标使用绝对路径,否则,COPY指定以WORKDIR为起始路径;源文件是目录的话,子目录和文件会递归复制,但是目录本身
                                          # 不会复制
                                          #如果源目录是多个或者使用通配符,目标必须是目录,并且以/结尾
                                          #如果目标目录不存在,会自动创建

        ADD: 类似COPY,支持打包压缩和url路径。

             例如: ADD  http://www.aaa.com/a.tar.gz  /data/wbl/  #a.tar.gz 会下载到/data/wbl 目录下,不展开
                    ADD  a.tar.gz  /data/wbl/    #a.tar.gz 会自动解压展开到/data/wbl目录下。

       WORKDIR:/data/wbl           # ADD a.tar.gz  ./   workdir相当于根路径

       VOLUME:镜像里的哪个挂载路径到宿主机上  # VOLUME /data/wbl   意思是把容量里/data/wbl目录 的卷使用的是宿主机的卷。docker inspect 查看

       EXPOSE:指定暴露给外部的端口。只有指定了之后,在启动容器时候加-P才可以暴露出去。
               一次可以指定多个端口
              EXPOSE 11211/udp 11211/tcp  #不加协助默认tcp

       ENV: 定义环境变量
            ENV key value #wbl=123   ;如果value包括空格,可以\转义,也可以对value加引号,另外\也可以续行
            ENV key=valude #wbl 123 456   ; 123 456 都是变量 调用${wbl}

            EVN DOC_ROOT=/data/wbl/ \
                NAME=wbl

            启动容器时候,可以传入变量
           docker run --name wbl --rm -P 镜像名  printenv   #打印环境变量
           docker run --name wbl --rm -P -e NAME="WBL2" 镜像名  printenv

      文件----docker build{RUN}---->image ------docker run{CMD}------>容器 #RUN是生成镜像时候运行命令。镜像生成后运行为容器时候RUN里命令不再执行的。CMD会执行。

      RUN: 使用在制作镜像的过程中所要运行命令,基于基础镜像环境的命令。
          语法:
               RUN commad
               RUN ["commad","param1","param2"]

          RUN COMMAND1 && \
              COMMAND2 
          RUN yum install -y lrzsz

          说明:第一种通常是一个shell命令,以"/bin/sh -c"运行它,在容器进程pid不为1,不能接收unix信号,docker stop 停止容器时,此进程接收不到信号。
                第二种是json格式数组,这种格式命令不会以/bin/sh -c 发起运行。因此常见shell操作比如通配符不会起作用。想使用shell操作可以使用下面写法
                RUN ["/bin/bash","-c","commad","param1"]

      CMD: 类似RUN,启动容器指定默认要运行程序,且运行结束后容器也终止,CMD指定命令会被docker run的命令选项覆盖。

           和RUN的区别是:{1,运行时间点不同(RUN是docker build成镜像时候运行;CMD是docker run成容器时候执行,这个时候RUN里运行命令已经生成静态的镜像了。);
                           2,运行命令次数不同(RUN可以多次,CMD只有最后一次生效)}

          语法:CMD command
                CMD ["command","param1","param2"]
                CMD ["param1","param2"]

          第三种用于为ENTRYPOINT指令提供默认参数         

ENTRYPOINT: 类似CMD,为容器指定默认运行程序,与CMD不同的是,ENTRYPOINT启动进程不会被docker run 命令指定参数覆盖,并且会被当做参数传给ENTRYPOINT指定程序。
注意:docker run --entrypoint 可以覆盖ENTRYPOINT指定的程序。
docker run 命令传入参数会覆盖CMD的内容并当ENTRYPOINT命令的参数。
Dockerfile文件可以用多个ENTRYPOINT,但只有最后一个生效。
ENTRYPOINT ["ls"]

     USER: 

     HEALTHCHECK: 健康检查

                 HEALTHCHECK --interval=35s  CMD curl http://ip:8090/test.html
                             --interval=35s  #检查间隔,default:30s
                             --timeout=35s   #超时.default:30s
                             --start-perid=15s #容器起来之后15秒开始检查,default:0s
                             --retries=2     #重试几次,default:3
                 命令返回值:
                           0:success
                           1:unhealthy
                           2: 保留,不使用
                 example:
                          HEALTHCHECK --interval=5m --timeout=3s \
                                      CMD curl http://ip:8090/test.html || exit 1

     SHELL: 指定使用的shell,默认 /bin/sh -c

     STOPSIGNAL: 语法:STOPSIGNAL 9  #默认是15

     ARG:适用于build time 时候传入参数
         ARG aaa
         ENV  WBL2=${aaa:-/data/wbl1/wbl2}           
          docker build --build-arg aaa="/data/wbl1/wbl3" -t  镜像名:v.1.1  ./  

     ONBUILD: 在dockerfile中定义一个触发器;自己在用dockerfile制作镜像时候可以添加触发器,在其他人使用这个镜像做其他dockerfile的基础镜像时候被触发。
              除了FROM,MAINTAINER和ONBUILD之外其他所有指令可以使用。
              命名标签如 ruby:2.0-onbuild
              注意:使用ADD COPY 小心人家那边没有那个文件。

              语法: ONBUILD COPY a b  #命令是dockerfile的指令。

实例:
[root@izj6chmozc373fzvc4vs9sz build-image]# cat Dockerfile
FROM nginx-wbl:v8800
MAINTAINER wbl:test.1
ARG AAA
ENV WBL2=${AAA:-/data/wbl1/wbl2}
RUN mkdir -pv $WBL2
#VOLUME $WBL2
COPY h.txt $WBL2
ADD zzz.tar.gz $WBL2
CMD ["/bin/sh"]
#ENTRYPOINT ["ls"]
[root@izj6chmozc373fzvc4vs9sz build-image]# ls
Dockerfile  h.txt  zzz.tar.gz
[root@izj6chmozc373fzvc4vs9sz build-image]# docker build -t nginx-wbl:v8801

以上就是docker系统的知识汇总,内容较为全面,小编相信有部分知识点可能是我们日常工作可能会见到或用到的。希望你能通过这篇文章学到更多知识。


当前题目:docker系统学习
当前链接:http://pwwzsj.com/article/gjcpip.html