用前端姿势玩docker【一】Docker通俗理解常用功能汇总与操作埋坑

时间:2022-09-30 18:22:48

前言

首先一句话表达个人对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&sol;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&sol;await理解

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

  7. 【Docker】Docker概述

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

  8. Centos &plus; docker&comma;Ubuntu &plus; docker介绍安装及详细使用

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

  9. 运行第一个Docker容器-Docker for Web Developers&lpar;1&rpar;

    1. Docker介绍 Docker由dotCloud公司发起的一个内部项目,后来Docker火了,dotCloud公司改名为Docker了: Docker使用了Go语言开发,基于 Linux 内核的 ...

随机推荐

  1. div层调整zindex属性无效原因分析及解决方法

    在做的过程中,发现了一个很简单却又很多人应该碰到的问题,设置Z-INDEX属性无效.在CSS中,只能通过代码改变层级,这个属性就是z- index,要让z-index起作用有个小小前提,就是元素的po ...

  2. WPF学习(三)--Menu、TabControl和DataGrid控件介绍

    Menu Menu提供了菜单栏方式的多级菜单的管理和操作: 这里对Menu的样式不做任何的定制和管理 下面来对Menu进行测试: 将Menu添加到页面中 运行后,效果如下: 这里没有考虑界面效果和样式 ...

  3. 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据

    http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...

  4. &lbrack;读书笔记&rsqb; 一、Spring boot项目搭建与配置文件

    读书笔记:[JavaEE开发的颠覆者 Spring Boot实战] 作者:汪云飞 从今天开始坚持读书,并记录下此读书笔记. 一,初接触 Spring boot 项目Hello world搭建 1.po ...

  5. video标签

    Video标签的使用 Video标签含有src.poster.preload.autoplay.loop.controls.width.height等几个属性, 以及一个内部使用的标签<sour ...

  6. J2EE 项目本地发布路径及修改

    J2EE的项目Run on Server后,在tomcat安装目录下的webapps没有出现所建立的工程名字. 很明显项目并没有自动部署到tomcat的webapps中而是部署在了别的容器中. 在内置 ...

  7. asp&period;net 下载视频 保存视屏

    第一张图片为html,第一站图片为js上传视频并播放,限定大小,第三张图片是将视频保存到以字节流的方式保存到数据中,或者是将视频保存到项目中 String filename=this.Filevide ...

  8. str类型

    str:字符串类型,用单引号或双引号. #索引 s1 = s[0] 切片 : 顾头不顾尾 : s[首:尾:步长] 字符串的操作: 1.首字母大写: s = 'alexWUsir' s1 = s.cap ...

  9. EF Code First模型约束

    总之,EF比较复杂.如果不想深究,建议简单用用.基本对应就行,大项目标准开发还是ModelFirst(先建立DB各种约束),然后再c#类约束.定义. 当然写原型时用ef很快.

  10. 【转】深入理解C&plus;&plus;中public、protected及private用法

    首先明白以下两点: 1.类的一个特征就是封装,public和private作用就是实现这一目的. 即:用户代码(类外)可以访问public成员而不能访问private成员:private成员只能由类成 ...