前言
首先一句话表达个人对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
- 多容器共享, 使用数据卷宗器(也是一个容器)供容器与容器间通信,个人理解类似桥接的模式
- 创建数据卷容器,并且在/root/file 创建一个数据卷
docker run -it -v /root/file --name filedata ubuntu:18.04
, filedata为数据卷容器的名字 - 在其他容器中使用 --volumes-from 来挂载 filedata 容器中的数据卷,如创建容器 test_db1并挂载filedata数据卷容器
docker run -it --volumes-from filedata --name test_db1 ubuntu:18.04
,进入容器后可以查看 /root/file是否存在 - 同理再创建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
,分为以下几步:
- 使用ubuntu:18.04镜像,通过上文创建的filedata容器(其实上文中任意一个都ok,filedata,test_db1, test_db2)创建backup-container容器
- 将本地的
、root/backup
目录挂载至容器的/root/file
- 将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
anddocker run -idt --name link2 --link link1:link1-alias ubuntu:18.04
, 在进入容器后可以通过env 查看以link1_alias(链接的别名)