【随手记录】关于docker的一些基础

1.1、服务器docker安装

  找下对应的安装环境,本地还是生产环境,搜下安装教程

1.2、docker配置、命令

  1.2.1、配置文件

    位于/etc/docker/daemon.json

    常见配置:

默认网段:

  "bip": "168.188.0.1/16"

文件存储路径:

  "data-root": "/data/lib/docker"

镜像仓库:

  "registry-mirrors": [

      "https://reg-mirror.qiniu.com",

      "http://hub-mirror.c.163.com"

  ]

日志相关:
  #日志驱动
  "log-driver": "json-file",  

  "log-opts": {

      "max-size": "10m",

      "max-file": "3"

  }
存储驱动:

  "storage-driver": "overlay2"

私有仓库信任:

  "insecure-registries": [

      "http://172.20.1.208:8080"

  ]

docker日志驱动类型:

    改完保存配合文件,重启docker,docker info可以查看docker一些配置信息

  1.2.2、镜像

    docker pull xx 仓库拉取镜像(默认中央仓库) ,默认latest版本 中央仓库地址: https://hub.docker.com/

    docker images -a 展示所有镜像

    docker load -i xx.rar 导入镜像

    docker save cent:v1 -o ~/desktop/xx 保存镜像

    docker login --username=xx --password=xxx1234! https://dockerhub.yndk.cn     登陆私有仓库

    docker push dockerhub.yndk.cn/fwgl/fwgl-consumer-app:1.8 推送镜像

  1.2.3、容器   

  docker run -d -p 8090:8090 -v `pwd`/my_opts:/opt/iserverOPTs supermap/iserver:latest 启动一个容器

    -d 后台运行

    -v 挂载

    -p 端口映射出来

    -it xx bash 进入镜像交互

    --restart=always    开机自启动

    --name yolov3_spp 起个名称

  docker ps -a 查看所有容器

  docker stats --no-stream -a 容器占用资源情况查看

  1.2.4、dockerfile & docker build构建镜像 

  FROM python:3.6-alpine 基础镜像(alpine精简版 - 安全)

  ADD . /code

  WORKDIR /code

  RUN pip install redis flask

  CMD ["python", "app.py"]

    docker build -t nginx:v3 . 打镜像

      -t 是选项 指定新定义镜像名称、版本

     后面那个 . 指的是镜像操作上下文,docker本身是一个cs架构,我们的命令行好比一个客户端,通过命令 然后转成restAPI然后去访问docker engine 我们的docker build命令也是在服务端进行构建镜像的,同时 有时候我们的构建里 不仅仅是run指令还有其他指令 比如 copy add这些,用来给镜像添加文件, 这时候构建之前需要把所需的文件拷贝到服务端engine,然后再进行操作,这时候就需要指定需要拷贝的文件所在的路径,也就是镜像上下文

      一般是 新建一个目录 把需要的文件 和 Dockerfile一起放进去 特别是别放在根目录下 太大了!

     Sending build context to Docker daemon 2.048 GB    <---像这样,这句表示要发给docker守护进程要打镜像了,文件有多大!

     .dockerignore 配置文件可以写不需要拷贝到镜像的文件

     docker build本质还是docker的daemon守护进程在基础镜像基础上,开始一条条的执行每一行命令,没执行一行就会commit一次!docker 镜像其实本质是文件目录,可以把镜像解压缩,可以看到每个镜像都是一些文件组成的,包含一个manifest元信息文件,里面记录了该镜像对应的配置文件(开放端口、挂载目录、环境变量)、层文件(具体文件)、清单文件(需要哪些文件)拉取镜像时候会先拉 manifest文件,然后再根据manifest拉取各类清单文件,如果清单文件本地有则不用获取(上传也是一个道理 避免重复)

    docker构建一些要点:

     1、精简、官方镜像

     2、RUN等命令合并

     3、上下文、.dockerignore 可以写不需要处理的文件

     4、分阶段构建,基础环境打一个镜像,使用打一个,类似 cent:v1 公司object

    官方构建文档:

       https://docs.docker.com/engine/reference/builder/  

      1.CMD docker 容器启动之后 默认运行的命令,docker容器本身也是一个进程,CMD意思是这个进程启动之后运行的命令!可以在启动容器时候 + 命令 替换默认的! ----> docker run xxx cat xxx 
      2.ENTRYPOINT 也是添加容器启动时候去运行的命令 和 参数,但是区别在于 ENTRYPOINT 会把 启动时候的参数 和 dockerfile写的命令拼接起来一起执行 而CMD 是启动时的参数直接替换原本dockerfile写的参数!
      3.RUN   && 可以把多条指令融合, 顺序执行! 每条指令的末尾 可以加 \表示换行! 每行开头可以加 #注释 如果有下载安装过程,最后一条命了需要把多余的安装包给清理掉! apt-get purge -y --auto-remove $buildDeps  docker是多层存储的 前一层的内容不会被后一层操作!要是留着安装包 永远操作不了了!
        4.ENV name=xyl age=xxx 设置环境变量,便于统一管理操作!
      5.ARG 也是设置环境变量,但是在容器运行时候 这些环境变量都会被替换成 值引用不再存在,但是可以在docker history里查看历史!
       --build-arg <参数名>=<值>  可以在docker build --build-arg <参数名>=<值> 来替换默认的变量!
      6.VOLUME /data 匿名卷,为了避免用户运行容器时候 忘记创建数据卷添加的匿名卷! 可以在 docker run -v myvolume:/data xx替代匿名!
      7.EXPOSE <端口1> [<端口2>...] 只是声明容器可能用这个端口! 并不会真的暴露!
      8.WORKDIR
        如该目录不存在,WORKDIR 会帮你建立目录,创建的目录 是相对于当前的路径的 比如 workdir /a workdir b --> /a/b这样! 目录不存在帮忙创建!
      UN 分层存储,每层都是一个新的工作目录 互相不影响、不能操作!WORKDIR 意思是之后的层都用统一的工作目录 可以相互操作!
      9.USER    跟WORKDIR一样,WORKDIR是改变统一的工作目录,USER是改变工作用户!但是这个用户需要存在!
      10.Label "key" = "value" key="value" 可以添加多个,主要是给容器添加元数据!
      11.Add 有缺点,可能导致镜像缓存失效,从而导致镜像构建的特别慢!
      12.COPY /xx /xx    这里copy的源 目录是相对于工作目录的(就是docker build xx . 最后这个点对应的目录!) 

  1.2.4、docker网络相关

    docker port dockerId 查看容器开放端口

      https://www.jianshu.com/p/04b33284f742

  1、如果你对一个容器使用的是host网络驱动,这个容器的网络栈并不是和docker宿主机隔离的。例如,你启动了一个容器绑定的是80端口,使用的host网络驱动,而你的应用程序将使用主机的ip和端口。

    host驱动只支持 Linux 且必须打开端口!

  2、bridge 桥接网络,虚拟网络设备,连接 docker容器 和 外部网络!

  3、OverLay网络

    多个 docker宿主机 之间架构了一个分布式网络!允许加入该网络的容器互联!

  4、none 禁用网络

  5、container模式

  container: docker镜像内部通信

   * docker run -it --name xx1 image sh

   * docker run -it --name xx2 --network xx1 image sh

  1.2.5、docker-compose

  version: ""  https://docs.docker.com/compose/compose-file/   这个version不是随便写的!  需要跟版本对应!!

  services:

  image: xxx/xx

  build:

     context: ./

  dockerfile: xxx/xxx

  args:
  depends_on:

    -db

   -redis ---> 依赖镜像, 服务不会等待 redis db 「完全启动」之后才启动,只要依赖开始启动就算! 启动xxx时候 也会启动depends,关闭时候先关闭xxx再关闭依赖!

 dns:

    - 8.8.8.8

    - 114.114.114.114 

env_file:

  - ./common.env

  - ./apps/web.env

  - /opt/secrets.env 在配置文件设置环境变量! 如果与environment冲突,则以environment为主!  配置文件注释可以以 # 开头的注释    相对于compose.yml路径!

 healthcheck: 健康检查!

  test: ["CMD", "curl", "-f", "http://localhost"]

  interval: 1m30s

  timeout: 10s

  retries: 3

 network_mode: "bridge"

 networks:

 ports:

 ulimits:

    nproc: 65535 最大进程数

    nofile: 文件数

      soft: 20000

      hard: 40000

  volumes:

  - /var/lib/mysql

 logging

   driver: "json-file"

  options:

    max-size: "200k"

    max-file: "10"

docker-compose -f xxx.yml up -d 启动容器

docker-compose -f xxx.yml down
posted @ 2022-05-05 21:00  空知大仙人  阅读(64)  评论(0编辑  收藏  举报