前言

首先一句话表达个人对docker的理解:与传统虚拟技术基于硬件及物理资源的虚拟化相比,Docker更加轻量化,docker为基于操作系统或内核级别的虚拟化,并且提供了从各种机制与操作以满足从开发环境到生产环境的各种定制化需要。

个人认为对前端而言,docker的意义在于:满足了前端环境的构建便利性与一致性的同时,降低了FE上手linux以及虚拟化技术的难度,同时docker借鉴了git的部分优点,更便于类比进行理解。

Docker为何如此好玩 !!! 自此开始分享前端工程化与docker相结合的各种玩法与姿势!!关于docker的FE相关环境也会及时更新到github上(顶部有传送门),请持续关注

坑会继续挖继续填,持续更新中。。。

首先记录一下常规操作:

Docker主要围绕仓库、镜像、容器三者展开,容器为核心。实际使用的时候也是主要与容器打交道。

linux基础,docker的安装等等非干货内容请自行学习,在此不做赘述。

镜像操作

  • 查看本地主机上已有镜像 docker images
  • 为本地镜像添加标签 docker tag ubuntu:18.04 myubuntu
  • 查看详细信息 docker inspect ubuntu:18:04
  • 查看json中的具体项 docker inspect -f {{".Architecture"}} ubuntu:18.04
  • 查看镜像历史 docker history ubuntu:10.04
  • 搜寻镜像 docker search [option] keywords
  • 删除镜像 docker rmi 镜像名或id 或者 docker image rm 镜像名或id
  • 清理镜像 docker image prune -f
  • 删除名称为none的镜像 docker rmi $(docker images | awk '/^<none>/ { print $3 }')

创建镜像

基于容器创建

  • 首先创建容器 docker run -it ubuntu:18.04
  • 在容器中自定义操作
  • 根据指定容器的containerID创建镜像 ,指定作者,提交信息,新镜像名称以及tag docker commit -a pomelott -m 'test commit' 9a9283d556f6 newubunto:v1

基于本地模板导入

  • 通过本地已有镜像导入 cat ubuntu-18.04-x86_64-minimal.tar.gz I docker import - ubuntu:l8.04

基于dockerfile创建

  • 在根目录下创建dockerfile,并写入dockerfile相关脚本(具体细节下文详解)
  • 在当前目录下执行 docker build -t 创建的镜像名称 dockerfile存放目录

镜像存出 & 导入

  • 将本地镜像存储文压缩文件以拷贝给他人使用 docker save -o ubuntu_18_04.tar ubuntu:18.04
  • 将压缩文件导入 docker load -i ubuntu_18_04.tar

上传镜像

  • 为镜像修改标签 docker tag myubuntu:latest pomelott/myubuntu:18.04
  • 推送至远程docker Hub docker push pomelott/myubuntu:18.04

    注意:push需要推送至国外dockerHub源,会异常缓慢。修改镜像源只能解决pull的问题,就像npm,publish的时候也只能切回npm的官方源才可以。
  • 解决慢的问题: 1、docker私库 2. github 基于dockerfile进行build 3. 解决网络问题(_

容器

  • 创建容器 docker create -it ubuntu:18.04, 可以通过 docker ps -a 查看
  • 启动容器 docker start [containerID] 可以通过 docker ps 查看
  • 创建并启动 docker run [containerID/镜像名]
  • 通过交互式bash启动(启动后不会立即停止) docker run -itd ubuntu:18.04 /bin/bash
  • 某些时候,执行 docker run 时候因为命令无法正常执行容器会出错直接退出, 此时可以查看退出错误代码,命令执行后出错,会默认返回命令。

    125 : Docker daemon 执行出错,例如指定了不支持的 Docker 命令参数;

    126 :所指定命令无法执行,例如权限出错

    127: 容器内命令无法找到
  • 查看容器的输出值 docker logs [containerID/name]
  • 暂停容器 docker pause [containerID/name], 取消暂停 docker unpause [containerID/name]
  • 终止容器 docker stop [containerID/name] ,此时通过 docker ps 无法看到已终止的容器
  • 终止所有容器 docker stop $(docker ps -aq)
  • 重启容器(将一个运行状态的容器先终止,再启动) docker restart [containerID/name]
  • 强行终止容器 docker kill [containerID/name]
  • 清除掉所有处于停止状态的容器 docker container prune
  • 进入容器(与本机的标准输入输出绑定) docker attach [containerID/name],通过exit退出后,容器即终止。
  • 进入容器(类似ssh远程登录)docker exec -it [containerID/name] /bin/bash, 通过exit退出后,容器不会终止。
  • 删除处于终止或退出状态的容器 docker rm [containerID/name]
  • 导出容器为tar文件 docker export -o export_ubuntu.tar ce5
  • 导入容器为镜像 docker import export_ubuntu.tar tate-ubuntu:v1.0
  • 查看容器详情 docker inspect [containerID/name]
  • 查看容器内进程 docker top [containerID]
  • 查看容器统计信息 docker stats [containerID]
  • 复制文件,在容器与宿主机之间传递文件:将本机当前目录的test.js复制到容器的/root/ 目录下 docker cp test.js 385e9dfbf889:/root/
  • 查看变更: 查看在原容器基础之上的操作 docker diff [containerID]
  • 查看容器的端口映射 docker port [conainerID]
  • 更新容器:更新容器的一些运行时配置,主要是一些资源限制份额 docker update [container]

    — blkio-weight uintl6 :更新块 IO 限制, 10 1000 ,默认值为 ,代表着无限制;

    — cpu-period int :限制 CPU 调度器 CFS (Completely Fair Scheduler )使用时间,单位为微秒,最小 1000;

    — cpu-quota int :限制 CPU 调度器 CFS 配额,单位为微秒,最小 1000;

    — cpu-rt period int :限制 CPU 调度器的实时周期,单位为微秒

    — cpu-rt runtime int :限制 CPU 调度器的实时运行时,单位为微秒;

    — c, -cpu-shares in 限制 CPU 使用份额;

    — cpus decimal :限制 CPU 个数;

    — cpuset-cpus string :允许使用的 CPU 核,如 0-3, 0,1;

    — cpuset mems string :允许使用的内存块,如 0-3' 0, 1;

    — kernel-memor bytes :限制使用的内核内存;

    — m, -memory bytes 限制使用的内存;

    — memory-reservation bytes :内存软限制;

    — memory-swap bytes :内存加上缓存区的限制, 表示为对缓冲区无限制;

    — restart string 容器退出后的重启策略

数据管理

主要做本地与容器、容器与容器之间的数据通信

— mount 项支持三种类型的数据卷,包括

volume 普通数据卷,映射到主机/var/ lib /docke /volumes 径下;

bind :绑定数据卷,映射到主机指定路径下;

tmpfs :临时数据卷,只存在于内存中

数据卷

  • 启动容器,并将本机目录挂在到容器的指定目录 docker run -idt -P --name web --mount type=bind,source=/root/file,destination=/root ubuntu:18.04
  • 多容器共享, 使用数据卷宗器(也是一个容器)供容器与容器间通信,个人理解类似桥接的模式
  1. 创建数据卷容器,并且在/root/file 创建一个数据卷 docker run -it -v /root/file --name filedata ubuntu:18.04, filedata为数据卷容器的名字
  2. 在其他容器中使用 --volumes-from 来挂载 filedata 容器中的数据卷,如创建容器 test_db1并挂载filedata数据卷容器 docker run -it --volumes-from filedata --name test_db1 ubuntu:18.04,进入容器后可以查看 /root/file是否存在
  3. 同理再创建test_db2 docker run -it --volumes-from filedata --name test_db2 ubuntu:18.04, 进入任意容器后,在挂载点 /root/file 下做部分操作,然后再其他容器中看是否做出响应

数据迁移、备份与恢复

  • 数据备份:同样是通过新创建容器对指定挂载点的数据做备份。拿此命令(可能比较长,请细品)来说 docker run --volumes-from filedata -v /root/backup:/root/file --name backup-container ubuntu:18.04 tar cvf /root/file/backup.tar /root/file,分为以下几步:
  1. 使用ubuntu:18.04镜像,通过上文创建的filedata容器(其实上文中任意一个都ok,filedata,test_db1, test_db2)创建backup-container容器
  2. 将本地的、root/backup 目录挂载至容器的/root/file
  3. 将backup-container容器下的 /root/file 目录压缩为backup.tar并输入至 容器的/root/file/目录下

    结果: 本机的 /root/backup 与数据卷容器 filedata 的 /root/file 与 备份容器的 /root/file 三者相互挂载,至此本地的 /root/backup 目录下就会出现backup.tar文件了,备份完成!
  • 数据的迁移与恢复同理备份,都是通过数据卷或者数据卷容器进行挂载实现的。

容器间访问

端口映射

  • 指定本机端口8888访问容器9999 docker run -idt -p --name testport2 8888:9999 ubuntu:18.04
  • 映射到指定地址的指定端口 IP:HostPort:ContainerPort docker run -itd -p 127.0.0.1:8888:9999 --name specific-map ubuntu:18.04
  • 映射指定地址的任意端口 IP::ContainerPot, 映射本机的任意端口至容器的8899 docker run -idt -p 127.0.0.1::8899 --name any-map ubuntu:18.04

容器互联

  • link1 与link2 互联 docker run -idt --name link1 ubuntu:18.04 and docker run -idt --name link2 --link link1:link1-alias ubuntu:18.04, 在进入容器后可以通过env 查看以link1_alias(链接的别名)

用前端姿势玩docker【一】Docker通俗理解常用功能汇总与操作埋坑的更多相关文章

  1. 用前端姿势玩docker【四】基于docker快速构建webpack的开发与生产环境

    目录 用前端姿势玩docker[一]Docker通俗理解常用功能汇总与操作埋坑 用前端姿势玩docker[二]dockerfile定制镜像初体验 用前端姿势玩docker[三]基于nvm的前端环境构建 ...

  2. 用前端姿势玩docker【五】快速构建中类Unix系统与Windows系统的差异化处理

    目录 用前端姿势玩docker[一]Docker通俗理解常用功能汇总与操作埋坑 用前端姿势玩docker[二]dockerfile定制镜像初体验 用前端姿势玩docker[三]基于nvm的前端环境构建 ...

  3. ES7前端异步玩法:async/await理解 js原生API妙用(一)

    ES7前端异步玩法:async/await理解   在最新的ES7(ES2017)中提出的前端异步特性:async.await. 什么是async.await? async顾名思义是“异步”的意思,a ...

  4. 用前端姿势玩docker【三】基于nvm的前端环境构建技巧

    前言 安装docker啥的就不说了,这里重点强调一下,docker的环境问题.本人的环境: 虚拟机centos => docker => NAT => container 因为需要不 ...

  5. 用前端姿势玩docker【二】dockerfile定制镜像初体验

    前言 书接上文,关于dockerfile指令的api在此处不做赘述,在此只是记录下注意事项: '示坑以埋之'. 配置指令 FROM dockerfile必须以此开头 一个dockerfile可执行添加 ...

  6. ES7前端异步玩法:async/await理解

    在最新的ES7(ES2017)中提出的前端异步特性:async.await. 什么是async.await? async顾名思义是"异步"的意思,async用于声明一个函数是异步的 ...

  7. 前端程序员初步认识 docker

    初步认识 docker 为什么要学习 docker 有同学说他开发工作中有两大神器,一个是 vim 编辑器,另一个就是 Docker. 什么是 docker Docker 是一个开源的应用容器引擎. ...

  8. 【Docker】Docker概述

    [Docker] Docker可以说是近几年非常热门的技术之一了.不管是别人敦促我还是从自己的想法来说,都觉得Docker这玩意儿肯定是要好好学习一下的,无奈没啥时间专门播出来给Docker,一直以来 ...

  9. Centos + docker,Ubuntu + docker介绍安装及详细使用

    docker笔记 常用命令 设置docker开机自启:sudo chkconfig docker on 查所有镜像: docker images 删除某个镜像:docker rmi CONTAINER ...

随机推荐

  1. ca72a_c++_标准IO库:面向对象的标准库

    /*ca72a_c++_标准IO库:面向对象的标准库继承:基类->派生类3个头文件9个标准库类型IO对象不可复制或赋值 ofstream, f--file,文件输出流ostringstream, ...

  2. VM virtualBox中文版 v6.0.12.133076官方版(64/-虚拟机

    virtualBox中文版 v6.0.12.133076官方版(64/-虚拟机 http://www.onlinedown.net/soft/82464.htm http://8dx.pc6.com/ ...

  3. 【asp.net core 系列】- 11 Service层的实现样板

    0.前言 在<asp.net core 系列>之实战系列中,我们在之前的篇幅中对项目有了一个大概的认知,也搭建了一个基础的项目骨架.那么就让我们继续完善这个骨架,让它更加丰满.这一篇,我将 ...

  4. Python分支结构与流程控制

    Python分支结构与流程控制 分支结构 if 语句 分支结构在任何编程语言中都是至关重要的一环,它最主要的目的是让计算机拥有像人一样的思想,能在不同的情况下做出不同的应对方案,所以if语句不管是在什 ...

  5. 深入理解JVM(③)虚拟机的类加载时机

    前言 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制. 类加载的时机 一个类型 ...

  6. Java笔试面试总结—try、catch、finally语句中有return 的各类情况

    前言 之前在刷笔试题和面试的时候经常会遇到或者被问到 try-catch-finally 语法块的执行顺序等问题,今天就抽空整理了一下这个知识点,然后记录下来. 正文 本篇文章主要是通过举例的方式来阐 ...

  7. Dynamics CRM 365 不用按钮工具,直接用js脚本控制按钮的显示隐藏

    Dynamics CRM 365 不用按钮工具,直接用js脚本控制按钮的显示隐藏: try { // 转备案按钮 let transferSpecialRequestButton = parent.p ...

  8. Vue父子之间的值传递

    将通过两个input框实现父子之间的值传递作为演示,效果图 先注册父子各一个组件,代码如下 <div id="app"> <parent></pare ...

  9. ORA-04063: package body "DBSNMP.BSLN_INTERNAL" has errors

    ORA-04063: package body "DBSNMP.BSLN_INTERNAL" has errors 问题描述: 警告日志出现报错: Sun Jun 21 00:00 ...

  10. 【Oracle】Oracle wrong result一则(优化器问题)

    现象如下: SYS@proc> select * from v$version where rownum=1; BANNER ---------------------------------- ...