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结束进程
   ONBUILD  嫁衣打法,格式:ONBUILD <其它指令>。ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。 
ONBUILD用法

上面就是调用ONBUILD创建一个镜像,
  root@mysql-2:/data/soft/node# docker build  -t hanye:testApl .
   root@mysql-2:/data/soft/node# docker run -it --rm --name=hanyeApl hanye:testApl 
   /home # ls
   /home #
	上面发现 ONBUILD并没有执行。然后在写一个Dockerfile调用上面的镜像,实现构建
	root@mysql-2:/data/soft/node/node1# cat Dockerfile 
  FROM hanye:testApl
  RUN ls /home
  docker build  -t hanye:12 .		  
  docker run -it --name=hanyeapl --rm hanye:12      

这里就是ONBUILD的用法,给调用镜像做嫁衣,这样就可以设置一个初始化环境,别的镜像调用次容器构建。
	 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