docker学习

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker学习相关的知识,希望对你有一定的参考价值。

docker参数:
-h hostname 指定hostname
--dns 114.114.114.114  指定域名 会直接修改容器的resolv.conf文件
--dns-search ilinux.io 指定搜索域 会直接修改容器的resolv.conf文件
--add-host host:ip   自动注入到容器的hosts文件解析记录
docker port docker_name 查看开放端口
-p 宿主机端口:容器端口  绑定宿主机端口和容器的映射
-p 宿主机ip地址:宿主机端口:容器端口  绑定宿主机地址和端口和容器的映射
-P 暴漏所有端口 --public-all
-e --env 传递环境变量
--rm  推出容器 即删除容器
--network  nat|host|new|container 指定网络
--network container:其他容器名字(网络共享) 相当于运行在服务器的两个进程
--volumes-from  复用其他容器的存储设置
docker run -itd -p 8088:80  --mount type=bind,src=/data/soft/nginx,dst=/usr/share/nginx/html --name=nginx1 nginx
docker run  -it --name nginx3 --network container:nginx1  -p 8087:80 --volumes-from nginx1 nginx

自定义docker的网络属性

/etc/docker/daemon.json

"bip": "10.0.0.1/24"
"fixed-cidr": "10.20.0.0/16"
"fixed-cidr-v6": "2001:db8:::/64"
"mtu":  1500
"default-gatway": "10.0.0.1"
"dns": ["10.0.0.1","10.0.0.3"] #至少一个至多三个

默认启动监听的/var/run/docker.sock文件

想要别的服务器可以连接需要设置/etc/docker/daemon.json

"bip": "10.0.0.1/24"  #docker绑定ip地址
"hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
"fixed-cidr": "10.20.0.0/16"
"fixed-cidr-v6": "2001:db8:::/64"
"mtu":  1500
"default-gatway": "10.0.0.1"
"dns": ["10.0.0.1","10.0.0.3"] #至少一个至多一个

查看volume存储卷

docker volume inspect hanye  -f .CreatedAt   获取CreatedAt字段

查看容器主机详情

docker inspect nginx1 -f .NetworkSettings.IPAddress 查看ip地址

Dockerfile编写

FROM              #指定容器调用的镜像
     FROM 可以指定repository仓库地址拉去镜像   FROM <repository>:<tag>
MAINTAINER  #指定镜像制作者详细信息 后期可能会替换为LABLE标签
    LABLE   key=value,........  比如:project=online han=v1
ADD <src>  <dest>      #宿主机文件  容器文件   自动解压压缩包
  <src> 可以是网络路径 也可以是本地宿主机路径 
        网络地址不会自动解压下载到容器指定位置
        本地路径会自动解压到容器指定位置
  <dest> 容器指定位置目录
WORKDIR dir  #指定工作目录位置  exec登录位置是此位置
VOLUME  <mountpoint> 或者 VOLUME ["mountpoint"]   #用于在image中创建一个挂载目录,以挂在Docker hst上的卷或者其他容器上,如果此前已经创建此文件,则会把新文件复制过去。注意此处指的是容器内的文件
      例如: VLOLUME /data/mysql
 RUN                #指令是用来执行命令行命令的
 COPY  <src> ...<dest> #用于宿主机复制文件值新创建的容器文件
       <src>        #复制的源文件或者目录 支持通配 必须是build的上下文路径 不能是其父目录中的文件,且目录自身不会被复制
       <dest>      # 目标路径  建议使用绝对路径 否则则以WORKDIR为其起始路径。如果事先不存在会自动创建
 EXPOSR <port>[/<protocol>]......  容器暴漏端口
      例子: EXPOSE 11211/udp 11211/tcp
 ENV  定义所需要的环境变量,可以被ENV ADD COPY调用
     调用模式: $variable_name 或 $variable_name 
     ENV <key> <value>   #只能设置一种,key之后的所有内容会被视为value
     ENV <key>=<value>  #可以一次设置多种 每一个key对应=后面的value值 如果value里面包含空格需要(\)转义 反斜线可用于续行
     CMD <command> 或者
     CMD ["<executable>","<param1>",<param2>,........]或者
     CMD ["<param1>","<param2>",...........]
             第一种代表 shell命令 并且以 “/bin/sh -c” 来运行它,意味着进程在容器中的PID为0,不能接受UNIX信号,因此docker stop停止容器,此进程接受不了信号。多个CMD进最后一个生效
 RUN command #容器运行的命令
 USER  UID|USER #运行容器的用户,容器必须存在此用户
 HEALTHCHECK <CMD> 监控监控状态检测
               --interval=   #重试机制时间间隔 默认30s
                 --timeout=   #超时时长  默认30s
                 --start-period #等待多久开始健康检查 默认0s
                 --retries       #重试机制重试次数  默认3次
   STOPSIGNAL  signal 传递进程id,只有1进程才能接受docker stop结束进程
 ARG 传递参数veriable_name

技术图片
技术图片

例子1:
         vim Dockerfile
            FROM debian 
            MAINTAINER hz7726@163.com
            ENV nginx_tar="nginx-1.17.2"                 nginx_dir=/usr/local/src
            ADD $nginx_tar.tar.gz  $nginx_dir:-/usr/local/nginx   #代表如果$hanye没有值,则使用默认值为:/usr/local/nginx
                            RUN yum install -y tar openssl openssl-devel pcre pcre-devel make   &&                                                            cd $
            COPY nginx.html /usr/share/
            VOLUME /usr/share
            EXPOSE 80/tcp 443/tcp
    可以使用 printenv打印容器的环境变量 
   docker build -t hanye:web3 .
   root@mysql-2:/data/soft/nginx# docker run -it --name=hanye_web4   --rm  hanye:web3   printenv
      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
      HOSTNAME=15df399148e8
      TERM=xterm
      nginx_tar=nginx-1.17.2
      nginx_dir=/usr/local/src
      HOME=/root            
ENV  等同于docker run -e key=value设置
 root@mysql-2:/data/soft/nginx# docker run -it --name=hanye_web4 -e han="nginx_ll"   --rm  hanye:web3   printenv
           PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
           HOSTNAME=daccbd9486bc
           TERM=xterm
           han=nginx_ll
           nginx_tar=nginx-1.17.2
           nginx_dir=/usr/local/src
           HOME=/root
例子2:
      FROM centos
      LABLE MAINTAINER=“hz7726@163.com”  hanye=“v2”
      ENV nginx_tar="nginx-1.17.2"                nginx_dir=/usr/local/src                              nginx_html=/usr/local/nginx
      ADD $nginx_tar.tar.gz  $nginx_dir
      COPY nginx.html /usr/share/
      WORKDIR $nginx_dir
      RUN yum install -y epel-release && yum makecache && yum  install -y  wget curl  tar pcre pcre-devel  openssll openssl-devel make gcc-c++ gcc  &&           cd nginx-1.17.2 &&           ./configure --prefix=$nginx_html &&           make && make install &&           yum install -y net-tools &&           echo "daemon off;" >>$nginx_html/conf/nginx.conf

      VOLUME $nginx_html/html
      EXPOSE 80/tcp 443/tcp
      HEALTHCHECK --start-period=4s CMD wget -O - -q http://$IP:-0.0.0.0:$PORT:-80/
      CMD ["$nginx_html/sbin/nginx"]   #可以调用ENV
                #CMD /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #不可以调用ENV设置的变量
                可以修改为手动执行/bin/sh -c方式
                #CMD ["/bin/sh","-c","$nginx_html/sbin/nginx","-c","$nginx_html/conf/nginx.conf"]
例子3: 

      FROM nginx:1.15.1
      ARG online="nginx"
      LABLE web="$online" version="1151"
      ENV nginx_dir="/usr/local/nginx"           nginx_sbin="/usr/local/nginx/sbin"
      ADD nginx.html $nginx_dir/html
      EXPOSE 80 443
      HEALTHCHECK --start-period=4s CMD wget -O - -q http://$IP:-0.0.0.0:$PORT:-80/
      CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
 docker build -t hanye:nginx1 . #默认LABLE 中的web为nginx 想要修改则修改为:
 docker build -t hanye:nginx1 --build-arg online="test"  ./

docker资源限制及验证

默认docker是没有资源限制的,服务可以耗尽宿主机资源。 从cpu,memory,block io三方面限制Docker容器,依赖于Linux系统内核的capailities的支持。

内存资源

一旦服务器发生OOM。任何进程都可能被杀死,包括docker daemon,Docker设置了docker daemon的OOM的优先级,但是没有设置容器的优先级。
 -m, --memory bytes                #限制内存大小
          例如: 限制内存使用为4m    -m 4m
 --memory-reservation bytes  
 --memory-swap bytes            #限制swap内存大小
 --memory-swappiness int    
 --oom-kill-disable                    #如果系统出现OOM删除进程,此条件设置为禁止删掉
 --kernel-memory bytes
  #如果-m 设置为正数M   --memory-swap 设置为正数S   那么容器可用为S,其中ram为M,Swap为S-M,如果S=M那么则没有Swap可用
  #如果 -m 设置为正数M   --memory-swap 设置为0 表示未设置Swap
  #如果 -m 设置为正数M   --memory-sawp为unset 表示Swap为2*M
  #如果 -m 设置为正数M  --memory-swap设置为-1 表示Swap为宿主机的Swap
  #所以使用free -m看到的swap没有实际意义

cpu限制

  0-99代表是内核运行的进程,100-139代表其他进程运行的进程
  -c ,--cpu-shares int    #代表使用多少核心,比如 1,2 表示运行到1,2核心
  --cpus decimal       
  --cpuset-cpus string      #cpu只能运行到那个cpu上1,2代表跑到200%性能
  --cpuset-mems string   
例子:可以使用docker-stress-ng来压测 docker pull lorel/docker-stress-ng
  查看帮助:docker run -it --name=stress --rm   lorel/docker-stress-ng --help
       --cpu 8启动子进程     
         --io 4 对io压测 
         --vm 2 启动几个进程进程内存压测 
         --vm-bytes 128M  每隔进程占用内存
         --fork 4 fork 4个子线程 
         --timeout 10s

docker run --name stress -it --rm --cpuset-cpus="1,2" lorel/docker-stress-ng stress --cpu 2
docker run --name stress -it --rm -m 128m lorel/docker-stress-ng stress --vm 2

以上是关于docker学习的主要内容,如果未能解决你的问题,请参考以下文章

Docker学习目标

docker学习 docker-compose使用示例

Linux学习--Docker学习

docker 学习路线

从零开始学习Docker (初识Docker)

十分钟了解Docker(我的Docker学习笔记)