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

docker學習
docker學習

例子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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章