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 [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