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