docker学习

本文深入解析Docker的常用参数,如网络配置、端口映射、环境变量传递等,同时探讨如何通过CPU、内存和blockIO限制管理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结束进程
   ONBUILD  嫁衣打法,格式:ONBUILD <其它指令>。ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。 
ONBUILD用法

docker学习

上面就是调用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      

docker学习

这里就是ONBUILD的用法,给调用镜像做嫁衣,这样就可以设置一个初始化环境,别的镜像调用次容器构建。
     ARG 传递参数veriable_name

docker学习
docker学习

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

<think>嗯,用户想了解Docker学习路径。首先我得理清楚Docker的基础知识,然后分步骤来规划。可能用户是刚开始接触容器技术,需要从最基础的概念讲起。 首先应该介绍Docker是什么,为什么需要它。然后安装和环境配置,这部分可能需要涵盖不同操作系统的安装步骤,比如Windows、macOS和Linux。接着是基本命令,像镜像和容器的管理,这部分比较实用,用户可能需要实际操作例子。 接下来是Dockerfile和镜像构建,这是关键部分,用户需要学会如何自定义镜像。之后是数据管理和网络配置,这些在实际项目中很重要,比如卷的使用和容器间通信。然后是Docker Compose,处理多容器应用,用户可能会用到这个来部署复杂应用。 高级部分可能需要包括Docker Swarm和Kubernetes的基础,但用户可能暂时不需要太深入,可以简要提一下。最后是安全性和最佳实践,确保用户了解如何安全地使用Docker。 还要考虑用户可能的应用场景,比如开发、测试或者生产环境部署。可能需要推荐一些实践项目,比如搭建Web应用,帮助用户巩固知识。另外,学习资源方面,官方文档和社区资源很重要,可以推荐一些书籍或者在线课程。 需要检查是否有遗漏的部分,比如是否提到监控和日志管理,或者与其他工具集成,比如CI/CD。不过作为学习路径,可能先集中在核心内容,高级话题可以后续扩展。 最后,确保结构清晰,步骤由浅入深,让用户能够循序渐进地学习。避免使用过于专业的术语,保持解释的易懂性。同时,注意使用正确的Markdown格式,特别是数学公式部分,不过在这个问题中可能用不上,但需要遵守系统指令中的格式要求。</think>以下是分阶段Docker学习路径(建议配合实践操作): 一、基础入门阶段(1-2周) 1. 核心概念理解 - 容器与虚拟机的本质区别(资源隔离 vs 硬件虚拟化) - 镜像分层存储原理(联合文件系统) - 容器生命周期管理(创建→运行→停止→销毁) 2. 环境搭建 ```bash # Linux安装示例 curl -fsSL https://get.docker.com | bash -s docker sudo systemctl enable --now docker ``` 3. 基础指令实践 ```bash docker run -d -p 80:80 --name web nginx:alpine # 启动Nginx容器 docker exec -it web sh # 进入容器shell docker logs --tail 50 web # 查看日志 ``` 二、进阶应用阶段(2-4周) 1. Dockerfile编写技巧 ```dockerfile FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"] ``` 2. 数据持久化方案 ```bash docker volume create db-data docker run -d -v db-data:/var/lib/mysql mysql:8.0 ``` 3. 网络配置实践 ```bash docker network create app-net docker run -d --net=app-net --name db redis:6 docker run -d --net=app-net -p 8080:80 webapp ``` 三、生产级部署阶段(1-2个月) 1. Docker Compose编排 ```yaml version: '3.8' services: web: build: . ports: - "5000:5000" depends_on: - redis redis: image: "redis:alpine" ``` 2. 镜像优化策略 - 多阶段构建(减少最终镜像体积) - 安全扫描(使用docker scan) - 镜像签名验证 3. 容器监控方案 ```bash docker stats # 实时资源监控 docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer ``` 四、持续学习建议 1. 官方文档精读(https://docs.docker.com) 2. 实验平台练习(推荐Play with Docker) 3. 参与社区项目(Docker GitHub仓库issue区) 4. 云原生技术延伸(Kubernetes、Service Mesh) 重点实践项目建议: 1. 构建完整LNMP环境 2. 实现CI/CD流水线 3. 搭建微服务架构演示系统 4. 容器安全加固实验 避坑指南: - 避免使用latest标签 - 容器内不要存储重要数据 - 生产环境限制容器资源配额 - 定期更新基础镜像版本 学习资源推荐: - 《Docker——容器与容器云(第2版)》 - 极客时间《深入剖析Kubernetes》(前4章) - Docker官方认证课程(DCA) - Katacoda交互式学习平台 建议每天保持1小时实践时间,通过实际项目巩固知识体系。遇到问题时,善用docker inspect命令分析容器状态,多查阅Docker官方文档的CLI参考手册。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值