Docker 总结

一、概念

Docker官网:Docker: Accelerated Container Application Development

Docker Hub Container Image Library | App Containerization

Docker:容器技术之一 【C/S】 基于Linux内核

三大件:镜像、容器、仓库 +【主机、客户端、服务端】

Build 》Ship 》 Run === 构建 》 运输 》 运行

存储引擎:overlay2

容器管理工具:LXC,Pouch,Podman

容器运行的地方:runtime

runtime 类型:LAC,Libcontainer,Runc,Rkt

依赖技术:容器网络、容器监控、服务发现、数据管理、日志收集

优势:快速部署、节省开销、简化配置、环境统一、可快速迁移扩展

定义工具:Docker images、Docker file、ACI

编排工具:Docker compose、Docker swarm、Mesos + Marathon、K8s

四个进程:Dockerd、Docker-proxy、containerd、containerd-shim

MNT:磁盘文件系统隔离

IPC:进程通信隔离

UTS:内核、主机名、域名隔离

PID:进程隔离

NET:网络隔离

USER:用户隔离

Cgroups:资源限制

二、常用命令

docker
    run -d  # 放后台
        -p  # 指定端口【宿主机:容器:协议】
        -P  # 生成随机端口,从 32768 开始
        -H  # 远程连接
        -it # 分配一个终端
        --name  # 定义容器名称
        -h  # 定义内部主机名称
        -v  # 挂载路径 [宿主机路径]:[容器路径]:[ro/rw]
        -e  # 传参/传递变量 --env=[file]
        --restart=always    # 加入自启动
        --privileged    # 提权 root
        --dns=x.x.x.x   # 指定DNS
  
    ps  -a  # all
        -s  # size
        -f  # 条件查询
        -l  # 最新创建
        -q  # 显示运行中容器ID
        -qa # 所有容器ID
  
    exec -it [ID/name] [sh | bash | /bin/bash]  # 进入容器
    attach  # 进入容器,类似VNC
    option  # 进入容器
  
    save -o [name].tar [name]:[tag] # 导出
    load -i [name].tar  # 导入
  
    search  # 搜索
    tag [name]:latest [name]:[tag]  # 打标签
    inspect [name]  # 查看版本
    cp  [path] [name]:[path]    # 从宿主机复制文件到容器
    history [name]  # 镜像构建历史
    port [name] # 查看端口映射关系
    logs -f [name]  # 查看日志
    stats   # 查看状态
    top # 查看进程信息
    events  # 查看事件

三、Dockerfile

# 手动构建镜像
docker commit -a "test<test@123@qq.com>"    # 标签,作者信息
              -c    # 要执行的命令 "EXPORT 80 443"
              -m    # 备注,做了哪些事情
              -p    # "在提交期间暂停容器,默认true"

build -t $NAME:$TAG # 通过 file 文件,批量构建镜像

# Dockerfile
FROM [name] # 指定基础镜像
LABLE version="v1" # 元数据,镜像作者信息等

RUN echo hello  # 方式一:执行命令支持环境变量
    ["/bin/bash","-c","echo hello"] # 方式二:不支持环境变量

ENV <key1> <value>  # 设置环境变量
    <key2>=<value>  
ARG <name>="myx"    # 与ENV同名会被覆盖

COPY [--chown=<user>:<group>] ["<src>","<dest>"]    # 复制文件

ADD # 复制文件,自动解包,可以接链接

CMD ["命令","参数1","参数2"]  # 方式一:不支持环境变量
    命令 参数1 参数2  # 方式二:支持环境变量

EXPORT 80/tcp 443   # 指定暴露端口,协议,默认TCP协议

VOLUME  [容器内路径] # 匿名卷
        ["/data1","/data2"]
  
WORKDIR /data   # 指定进入容器的默认目录

ONBUILD RUN <命令>    # 子镜像引用父镜像指令,父镜像不会执行

USER <user>[:<group>]   # 指定当前用户,默认root
     <UID>[:<GID>]

HEALTHCHECK [选项] CMD <命令>
            --interval=<间隔> # 默认30s
            --timeout=<时长>  # 默认30s,超时为失败,返回1
            --retries=<次数>  # 默认30s
            --start-period=<FDURATION>  # 启动后多久执行检查
      
            NONE # 基础镜像如果自带检查,用此项可屏蔽其他检查命令
                 # 返回值:0:健康 
                 #       1:不健康
                 #       2:保留
           
.dockerignore   # 排除指定文件

四、常用操作

Ctrl + p + q    # 退出,但不终止前台进程
docker rm -f `docker ps -q`     # 删除所有运行中容器
docker rm -f `docker ps -qa`    # 删除所有容器
docker rmi -f `docker ps -qa`   # 删除所有镜像

# 常用保留前台进程方式
tailf /etc/hosts
nginx -g daemon off;
httpd -f -h /data/html
httpd -D foreground
/use/bin/sshd -D    # 包:openssh-server