zoukankan      html  css  js  c++  java
  • 学习Docker(一)

    一、docker介绍

    docker是半虚拟化,比完全虚拟化性能高,可以使用物理机性能100%

    Docker 镜像(Images):  用于创建 Docker 容器的模板
    Docker 容器(Container): 独立运行的一个或一组应用
    Docker 客户端(Client):  客户端通过命令或 Docker API 与 Docker 的守护进程通信
    Docker 主机(Host): 一个物理或者虚拟的机器,用于执行 Docker 守护进程和容器
    Docker 仓库(Registry): 仓库用来保存镜像,可以理解为代码控制中的代码仓库
    Docker Machine Docker: 一个简化Docker安装的命令工具
    Docker项目的目标: 实现轻量级的操作系统虚拟化解决方案
    Docker的基础: linux容器(LXC)等技术

     二、安装

    1、centos 6 安装
    yum源:https://mirrors.ustc.edu.cn/epel/6/x86_64/
    yum install -y docker-io
    /etc/init.d/docker start
    
    2、centos 7 安装
    yum源:https://mirrors.ustc.edu.cn/epel/7/x86_64/
    yum -y install docker
    systemctl start docker

    三、镜像管理

    1、搜索镜像

    docker search centos

    2、获取镜像

    docker pull  centos

    3、查看镜像

    docker images

    4、删除镜像

    docker rmi  centos
    docker rmi  镜像名或ID  -f 强制删除

    5、导出镜像

    docker save centos > /opt/centos.tar.gz
    docker save -o /opt/centos.tar.gz  centos:6

    6、导入镜像

    docker load < /opt/centos.tar.gz
    docker load --input  /opt/centos.tar.gz

    7、镜像打标签

    docker tag nginx nginx_1.12.2                     #打标签
    docker tag nginx_1.12.2:latest  nginx:latest #修改标签

    四、容器管理

    1、启动Docker容器

    docker run --name mydocker -itd centos /bin/bashdocker start  12(id)                          #前二位数就可以

    2、查看容器

    docker ps -a
    docker ps -a -q                                #列出所有启动容器的ID
    docker inspect #查看容器的详细信息(JSON格式)
    docker inspect -f {{".Architecture"}} nginx #-f 指定某一项

    3、停止容器

    docker stop 961fd1162c2f
    docker kill 23sdjlf33331

    4、删除容器

    docker rm    c599b569f387                     #删除已经停止的容器
    docker rm -f 302f39c202c9                     #强制删除运行或停止的容器
    docker rm $(docker ps -a -q) #删除所有停止的容器

    5、进入容器

    1、attach命令
    docker attach 867e6627a194                    #当多个窗口同时用attach,操作同一个容器时,所有窗口会同步显示,当某个窗口阻塞时,其他窗口也无法操作
    
    2、exec命令(推荐方式) docker exec -it mynginx /bin/bash
    3、nsenter工具 yum install -y util-linux #安装nsenter工具 docker inspect --format "{{.State.Pid}}" 5d2k9d #获取PID nsenter -t 4851 -m -u -i -n -p
    脚本:
    #!/bin/bash
    PID=`docker inspect --format "{{.State.Pid}}" $1`
    nsenter -t $PID -u -i -n -p

    6、导出容器

    docker export 84acb55af1f9 > centos.tar.gz

    7、导入容器

    cat /tmp/centos.tar |docker import - centos:6

    五、docker的基础命令

    # docker -h
    --config string            #客户端配置文件的位置
    -D, --debug               #启用Debug调试模式
    --help                    #查看帮助信息
    -H, --host list              #守护进程的套接字(Socket)连接
    -l, --log-level string       #设置日志级别
    -v, --version                #打印版本信息并退出
    Commands:
      attach                      #进入一个正在运行的容器
      build                 #通过Dockerfile创建镜像
      commit                      #提交当前容器为一个新的镜像
      cp                          #从容器中拷贝指定文件或者目录到宿主机中
      create                      #创建一个新的容器
      diff#查看docker容器变化
      events                      #从docker服务获取容器实时事件
      exec                        #在一个已经运行的容器中运行一条命令
      export                      #导出容器的内容流作为一个tar归档文件
      history                     #展示一个镜像形成历史
      images                      #列出系统当前镜像
      import                      #导入一个镜像
      info                        #显示系统信息
      inspect                     #查看容器详细信息
      kill                        #kill指定docker容器
      load                        #从一个tar包中加载一个镜像(对应save)
      login                       #注册或者登陆一个docker源服务器
      logout                      #从当前Docker registry退出
      logs                        #输出当前容器日志信息
      pause                       #暂停容器
      port                        #查看映射端口对应的容器内部源端口
      ps                          #列出容器列表
      pull                        #从docker镜像源服务器拉取指定镜像或者库镜像
      push                        #推送指定镜像或者库镜像至docker源服务器
      rename                      #重命名容器
      restart                     #重启运行的容器
      rm                          #移除一个或者多个容器
      rmi                         #移除一个或者多个镜像
      run                         #创建一个新的容器并运行一个命令
      save                        #保存一个镜像为一个tar包(对应load)
      search                      #在docker hub中搜索镜像
      start                       #启动容器
      stats                       #统计容器使用资源
      stop                        #停止容器
      tag                         #给源中镜像打标签
      top                         #查看容器中运行的进程信息
      unpause                     #取消暂停容器
      update                      #更新一个或多个容器的配置信息
      version                     #查看容器版本号
      wait                        #截取容器停止时的退出状态值

     六、端口映射

    1、映射所有接口地址
    docker run -d -p 5000:5000 centos_nginx bash
    docker run -d -p 5000:5000 -p 8082:80 centos_nginx bash
    
    2、映射到指定地址的指定端口
    docker run -d -p 127.0.0.1:5000:5000 centos_nginx bash
    
    3、映射到指定地址的任意端口
    docker run -d -p 127.0.1.1::5000 centos_nginx bash
    
    4、查看端口映射情况
    docker port container_name/container_id

     七、数据管理

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

    1)数据卷(Data Volumes)
    2)数据卷容器(Data Volumes Dontainers)

    1、数据卷

    docker run -itd  --name web2 -v /data:/data centos  
    -v 指定挂载目录,前面的/data/为本地目录,后面的/data/为容器里的目录,会在容器中自动创建

    2、数据卷容器

    1、创建一个数据卷dbdata容器
    docker run -it -v /dbdata --name dbdata centos
    
    2、创建容器,挂载dbdata数据卷到容器中 docker run -it --volumes-from dbdata --name db1 centos
    3多个容器挂载多个数据卷 docker run -itd --name db5 --volumes-from db1 --volumes-from db4 centos
    4、从其他的容器(已挂载容器卷),挂载容器卷 docker run -it --name db2 --volumes-from db1 centos
    5、备注
    挂载数据卷的容器,不用运行,删除了挂载的容器,数据卷不会删除,若要删除容器和数据卷,用docker rm -v命令

    3、利用数据卷容器迁移数据

    1、备份
    docker run --volumes-from dbdata -v /backup:/backup --name work centos tar cvf /backup/backup.tar /dbdata
    创建一个容器,挂载数据卷,并将本地目录挂载到容器里,使用tar 压缩备份
    
    2、恢复
    docker run -itd -v /dbdata --name db6 centos bash
    docker run --volumes-from db6 -v /backup:/backup --name db7 centos tar xvf /backup/backup.tar 
    新建一个容器,挂载数据卷,并将本地的目录挂载容器里,使用tar 解压恢复

    八、镜像制作

    1、手动构建

    1、启动centos容器
    docker run -itd  --name mynginx centos
    
    2、进入容器并安装nginx docker exec -it mynginx bash yum -y install wget gcc gcc-c++ make openssl-devel pcre-devel wget http://nginx.org/download/nginx-1.10.2.tar.gz useradd -s /sbin/nologin -M www tar xf nginx-1.10.2.tar.gz cd nginx-1.10.2 ./configure --prefix=/usr/local/nginx --user=www --group=www make && make install echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf 3、创建镜像 docker commit -m "my nginx" 335573f3663c wuhg/mynginx:v1 -m: 描述 wuhg: dockerhub的用户名 mynginx: 制作后的镜像名 v1: 版本号 4、启动镜像 docker run -d -p 91:80 wuhg/mynginx:v1 /usr/local/nginx/sbin/nginx 启动容器并启动nginx

    2、自动构建

    1)编辑dockerfile文件

    # vim Dockerfile
      FROM centos
      MAINTAINER  wuhg
      RUN yum install -y wget gcc gcc-c++ make openssl-devel pcre-devel
      ADD http://nginx.org/download/nginx-1.12.2.tar.gz 
      RUN tar zxvf nginx-1.12.2.tar.gz
      RUN useradd -s /sbin/nologin -M www
      RUN cd nginx-1.12.2 && ./configure --prefix=/usr/local/nginx --user=www --group=www && make && make install
      RUN rm -fv /usr/local/nginx/conf/nginx.conf
      ADD http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf
      RUN echo "mynginx" > /usr/local/nginx/html/index.html
      RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
      EXPOSE 80
      ENTRYPOINT /usr/local/nginx/sbin/nginx

    2)创建镜像

    # docker build -t wuhg/mynginx:v2 /tmp/

    3)查看创建的镜像,并启动

    # docker images
    # docker run -itd -p 92:80 wuhg/mynginx:v2 bash

    备注:
    # docker run -e myname=tom centos #-e 设置变量

    Dockerfile指令

    FROM:              基础镜像
    MAINTAINER:        维护者
    RUN:               执行命令
    ADD:               添加文件,自动解压
    workdir:           当前工作目录(类似cd)
    volume :           目录挂载
    EXPOSE:            打开的端口
    CMD:                指定启动容器时,默认执行的命令
    ENV                 指定一个环境变量(如: MySql)
    COPY                复制文件或目录
    ENTRYPOINT          指定镜像的默认入口命令
    USER                运行容器时的用户名
    WORKDIR             ENTRYPOINT指令配置工作目录
    ARG                 指定镜像内使用的参数
    SHELL               指定使用shell的默认类型

     

    九、资源限制和隔离

    容器资源分配

    1)安装stress压力测试
    # vim Dockerfile
      FROM centos:6
      ADD epel.repo  /etc/repos.d/
      RUN  yum -y install stress
      ENTRYPOINT ["stress"]
    
    epel源:https://mirrors.aliyun.com/epel/6/x86_64/
    # docker build -t stress:V1 /root/
    
    2)CPU资源控制
    docker run -itd --cpu-shares 100 stress:V1 --cpu 1     #--cpu-shares默认1024,--cpu 1是stress压力测试参数
    docker run -itd --cpuset-cpus 0-2 stress:V1            #创建的容器只能使用012这三个核心
    cat /cgroup/cpuset/docker/CONTAINTER_ID/cpuset.cpus
    docker exec CONTAINER_ID taskset -c -p1                #查看容器内进程与cpu的绑定,容器内第一个进程的编号一般为1

    3)内存资源控制
    docker run -itd -m 128m stress:V1 --vm 1 --vm-bytes 128m --vm-hang 0 #-m设置容器使用最大物理内存,不含swap,--vm是压力测试参数
    cat /cgroup/memory/docker/CONTAINER_ID/memory.limit_in_bytes
    cat /cgroup/memory/docker/CONTAINER_ID/memory.memsw.limit_in_bytes

    十、私有仓库

     创建和使用私有仓库

    1、自动下载registry镜像并启动容器,创建本地私有仓库。
    docker run -d -p 5000:5000 registry
    
    2、默认仓库创建的容器在/tmp/registry或/var/lib/registry
    docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
    
    3、上传到私有仓库
    docker tag nginx:v1 192.168.4.10:5000/nginx     #必须带有私有仓库的ip:port
    docker push 192.168.4.10:5000/nginx             #上传到私有仓库
    
    http上传方式:
    # vim /etc/sysconfig/docker
      other_args="--insecure-registry 192.168.4.10:5000"
    # /etc/init.d/docker restart
    
    4、下载
    # vim /etc/sysconfig/docker
      other_args="--insecure-registry 192.168.4.10:5000"
    # /etc/init.d/docker restart
    # curl http://192.168.4.10:5000/v2/_catalog
    # docker pull 192.168.4.10:5000/nginx

    十一、web管理软件shipyard

    搭建过程( v2版):

    1、修改docker监听ip和端口
    # vim /etc/sysconfig/docker
      other_args="-H tcp://0.0.0.0:235 -H unix:///var/run/docker.sock"
    # /etc/init.d/docker restart
    
    2、启动rethinkdb
    1)获取一个/data的数据卷
    docker run -itd --name shipyard-rethinkdb-data  --entrypoint /bin/bash shipyard/rethinkdb -l
    2)使用数据卷/data启动RethinkDB
    docker run -itd -P  --name shipyard-rethinkdb  --volumes-from shipyard-rethinkdb-data shipyard/rethinkdb
    
    3、启动shipyard控制器
    docker run -itd -p 8080:8080  --name shipyard   --link shipyard-rethinkdb:rethinkdb shipyard/shipyard
    
    4、测试
    通过浏览器访问http://192.168.4.10:8080
    默认用户名/密码为 admin/shipyard
    
    5、启动和停止顺序
    docker stop  shipyard shipyard-rethinkdb shipyard-rethinkdb-data
    docker start shipyard-rethinkdb-data shipyard-rethinkdb shipyard
    启动两个镜像(获取/data数据卷,使用数据卷/data启动rethinkdb),最后启动shipyard控制器

    v3版本

    curl -sSL https://shipyard-project.com/deploy | bash -s  (一键安装)   

    十二、docker网络

    1、查看docker网络
    docker network ls
    
    2、网络驱动
    bridge:        NAT模式,默认模式
    host :         复制物理机网卡
    none :         不会配置网络(要自定义配置)
    
    3、案例
    docker run -it  --net=host -p 80:80 centos bash
    docker run -itd --net=none --name=ng1 nginx
    
    4、自定义docker网络(用脚本执行,删除ip地址,ssh连接不上)
    ip link set docker0 down                            #禁用网桥docker0
    brctl delbr docker0                                 #删除网桥docker0
    brctl addbr br0                                     #添加网桥br0
    ip addr add 192.168.4.2/24 dev br0                  #br0网卡添加ip地址
    ip addr del 192.168.4.2/24 dev eth0                 #eth0网卡删除ip地址(
    brctl addif br0 eth0                                #网桥br0绑定eth0
    ip link set br0 up                                  #启用网桥br0
    route add default gw 192.168.4.254                  #添加网关

     十三、使用 Supervisor 来管理进程

    # vim supervisord.conf
      [supervisord]
      nodaemon=true
      [program:nginx]
      command=/usr/sbin/nginx
      [program:php-fpm]
      command=/usr/sbin/php-fpm
      [program:mysql]
      command=/usr/bin/mysqld_safe

                                                                                           

  • 相关阅读:
    哨兵模式(工作中使用)
    JVM调优-考虑方向
    Spring Cloud Gateway+Nacos出现服务乱串的问题记录
    golang笔记-cache组件应用: freecache/groupcache/golang-lru
    C++优化笔记: -O2/-O3/-ffast-math/SIMD
    linux笔记-查看L1/L2/L3 cache大小
    Dom4j 如何输出 Document 中的内容到文本
    是应该是用 Log 还是 Logger 来定义 Log
    IntelliJ IDEA 如何针对Java 代码快速打印 println
    如何用 Java 判断一个给定的数是不是素数
  • 原文地址:https://www.cnblogs.com/wuhg/p/10407768.html
Copyright © 2011-2022 走看看