前言

首先一句话表达个人对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. SpringBoot + Mybatis + Redis 整合入门项目

    这篇文章我决定一改以往的风格,以幽默风趣的故事博文来介绍如何整合 SpringBoot.Mybatis.Redis. 很久很久以前,森林里有一只可爱的小青蛙,他迈着沉重的步伐走向了找工作的道路,结果发 ...

  2. 【String注解驱动开发】面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?

    写在前面 在前面的文章中,我们知道可以通过多种方式向Spring容器中注册bean.可以使用@Configuration结合@Bean向Spring容器中注册bean:可以按照条件向Spring容器中 ...

  3. linux最小化安装命令补全

    bash-completion 需要安装bash-completion才能补全,安装后,重新打开一个窗口就能生效.

  4. Ubuntu搭建Java开发环境-刘志敏-专题视频课程

    Ubuntu搭建Java开发环境-3人已学习 课程介绍        主要介绍在Ubuntu环境如何安装Java开发的基本环境课程收益    学会Ubuntu中安装jdk.mysql.maven和id ...

  5. 手把手教你使用Python生成图灵智能小伙伴,实现工作助手/闲聊功能

    /1 前言/ 在家闲着,做个小项目,基于Python,实现一个语聊小机器人,分享给大家.项目整体比较简单,官方文档介绍的非常详细,可快速上手. /2 目标/ 将图灵机器人放到桌面,实现工作助手/陪聊功 ...

  6. 二分查找法demo

    正文 中午闲着有点时间,做个demo睡觉去,这个例子网上应该都有,自己只是敲一下给自己做个记录. public static void main(String[] args) { int[] whit ...

  7. ceph对象存储RADOSGW安装与使用

    本文章ceph版本为luminous,操作系统为centos7.7,ceph安装部署方法可以参考本人其他文章. [root@ceph1 ceph-install]# ceph -v ceph vers ...

  8. JavaScript笔记- 函数声明和函数表达式(001)

    function 是 Javascript 中的第一类对象,这就意味着函数可以像其他值一样被传递.一个最常见的用法就是将一个匿名函数作为回调函数传递到另外一个异步函数中. 函数声明 ? 1 funct ...

  9. 【MyBtis】获取数据插入postgresql后返回的自增id

    问题描述 数据库采用的是postgresql,以下面的rule表为例,该表的id设置为自增,那么经常有这样的需求,在执行insert操作后,紧接着需要获取该记录的自增id往中间表中插入数据,或者是再根 ...

  10. Linux虚拟网络:Docker网络知识之基础篇

    我们在工作中应用了docker容器化技术,服务的部署.维护和扩展都方便了很多.然而,近期在私有化部署过程中,由于不同服务器环境的复杂多变,常常遇到网络方面的问题,现象为容器服务运行正常,但宿主机.容器 ...