DevOps系列——Docker基础知识总结

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

docker教程

1. Docker简介

1.1. Docker改名字

  • http://qbview.url.cn/getResourceInfo?appid=31&url=https%3A%2F%2Fjuejin.im%2Fentry%2F58fd44aada2f60005dc764f4%3Ffrom%3Dgroupmessage%26isappinstalled%3D1%26nsukey%3DDTbMCYAYx7KWTEJFceeNRaoz9GHcMQXYgPw01TJ95%252Bg6fMizRYxNZVQT5AX8h1QLh9J4pEJsda2awcM07Ba7ydCX1ATZA%252Bbqcv79Q0Qo1Jsi7PZzI73gmfNffMNDMewz0%252BT9Zc5Wz7%252Bk%252BB4d348%252FgoYMubEJxWIKXkA6EOrwcWBSCvol7YrFwFTuOFl0vKBW&version=10000&doview=1&ua=Mozilla%2F5.0+(Macintosh%3B+Intel+Mac+OS+X+10.11%3B+rv%3A52.0)+Gecko%2F20100101+Firefox%2F52.0&keeplink=0&reformat=0
  • https://yq.aliyun.com/articles/74437?spm=5176.8246799.0.0.7Fp6s9

1.2. 文档

1.2.1. 必看文档

  • 官网:https://www.docker.com/
  • Docker学习路线图:⭐️⭐️⭐️https://yq.aliyun.com/articles/40494?spm=5176.100239.blogcont65145.24.Jded85⭐️⭐️⭐️
  • Docker知识集锦:⭐️⭐️⭐️https://yq.aliyun.com/articles/65145?spm=5176.100240.searchblog.8.6GwPGf⭐️⭐️⭐️
  • gitbook:⭐️⭐️⭐️⭐️⭐️https://yeasy.gitbooks.io/docker_practice/content/appendix/repo/nodejs.html⭐️⭐️⭐️⭐️⭐️

1.2.2. 社区技术类博客

  • http://blog.csdn.net/liumiaocn/article/category/6328276
  • http://www.cnblogs.com/li-peng/category/875759.html

1.2.3. 其他文档

  • 中文社区:http://www.docker.org.cn/dockerppt/46.html
  • gitbook:http://www.widuu.com/chinese_docker/installation/redhat.html

1.3. 基础概念

1.3.1. 名词那些

2. Docker基础知识点

  • ⭐️⭐️⭐️⭐️⭐️http://www.he11oworld.com/system/390.html⭐️⭐️⭐️⭐️⭐️

2.1. Docker命令说明

  • 分为客户端命令和服务端命令,还有各种参数,所以看着会比较乱,命令很多大家把常用的记住就可以了
    • 比如docker run -t node 和 docker build -t web中的-t就不是一个意思,大家要有准备
  • 不过看下面这两个文档基本都包含了
    • https://yeasy.gitbooks.io/docker_practice/content/appendix/command/
    • http://www.docker.org.cn/dockerppt/106.html

2.2. Docker信息查询

  • docker help:查看帮助信息
    • docker run —help:可以查看某条命令的具体用法
  • docker info:查看docker的安装信息
    • 有时候会有docker权限问题,我们要为docker增加管理组
    • http://www.widuu.com/chinese_docker/articles/basics.html
  • which docker:查看docker的执行路径

2.3. 镜像管理

  • docker pull <镜像名:tag>:从官网拉取镜像
  • docker search <镜像名>:搜索在线可用镜像名
  • docker images:查询所有的镜像,默认是最近创建的排在最上
  • docker rmi <镜像名:tag>:删除镜像
  • docker rmi $(docker images -q -f dangling=true):批量删除无用镜像

    • 大家可以通过df -hl命令查看磁盘占用率
    • http://www.jb51.net/article/100416.htm
    • http://www.tuicool.com/articles/R7jMZfq
    • 效果

      • 有很多没用的镜像

      DevOps系列——Docker基础知识总结_第1张图片

      • 磁盘占用很高

      DevOps系列——Docker基础知识总结_第2张图片

      • 清除之后的效果

      DevOps系列——Docker基础知识总结_第3张图片

2.4. 容器管理

  • docker ps:查看所有运行中容器
  • docker ps -a:查看所有容器
  • docker ps -l: 查看最后启动的容器的信息
    • -l:最后的那个
  • docker top {容器ID|容器名称}:显示容器内运行的进程
  • docker run <镜像名1> <镜像名2> <镜像名3>:同时运行几个
  • docker run <镜像名> apt-get install -y ping:在容器中安装新程序
    • 一定要加-y,为什么不太记得了
  • docker run -it ubuntu /bin/bash:运行一个可交互的容器
    • -i:-i表示允许我们对容器内的 (STDIN) 进行交互
    • -t:表示在新容器内指定一个伪终端或终端
    • 我们在容器内还指定了一个新的命令:/bin/bash 。这将在容器内启动 bash shell
  • docker run -e <名称>=<参数> node:设置容器环境
  • docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done:执行后台任务
  • docker run --name web training/webapp:为容器起名字
  • docker run —rm <镜像名> 用完就删除,不能与-d一起使用
  • docker exec -it sso-server-dev /bin/bash:docker启动后执行一些命令操作
  • docker run —restart always node:挂了重启
  • docker tag {容器ID|容器名称} <镜像名:tag>:给镜像加tag
  • docker stop {容器ID|容器名称}:停止容器
  • docker start {容器ID|容器名称}:启动容器
  • docker cp 7bb0e258aefe:/etc/debian_version .:从container中拷贝文件,当container已经关闭后,在里面的文件还可以拷贝出来。把容器中的/etc/debian_version拷贝到当前目录下。

2.5. 容器日志

  • docker inspect {容器ID|容器名称}:docker容器的配置和状态信息
  • docker inspect -f '{{ .NetworkSettings.IPAddress }}' {容器ID|容器名称}:过滤信息
  • docker logs {容器ID|容器名称}:查询某个容器的所有操作记录,标准输出流
  • docker logs -f {容器ID|容器名称}: 实时查看容易的操作记录

2.6. 网络端口映射

  • docker run -P <镜像名>
    • -P:它将会把容器内部的5000端口映射到本地Docker主机的高位端口上(这个端口的通常范围是 32768 至 61000)。
  • docker run -p <主机端口号>:<容器端口号> mongo:
    • 1:1 映射方式能够保证映射到本地主机端口的唯一性
  • docker run -p 127.0.0.1:5001:5002 mongo:指定绑定的网络地址
  • docker run -p 80:5000 training/webapp python app.py:指定主机和容器端口号
  • docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py:绑定udp端口
  • docker port mongo 5000:查询容器内的端口号映射到哪个本地地址,127.0.0.1:49155
  • docker port -p 1111:1111 -p 2222:2222 -p 3333:3333 mongo: -p可以使用多次

2.7. 容器链接

  • docker run -d -P --name web --link <容器名称>:<别名> <镜像名>
    • 之后你的项目中需要使用ip地址的地方都可以用别名代替了
// 实例
sudo docker run -d --name mongo mongo
sudo docker run -d -P --name web --link mongo:db node

$ docker ps
CONTAINER ID  IMAGE                     COMMAND               CREATED             STATUS             PORTS                    NAMES
349169744e49  training/postgres:latest  su postgres -c '/usr  About a minute ago  Up About a minute  5432/tcp                 db
aed84ee21bde  training/webapp:latest    python app.py         16 hours ago        Up 2 minutes       0.0.0.0:49154->5000/tcp  db/web,web

我们连接容器做什么?我们发现连接的两个容器是父子关系。这里的父容器是db可以访问子容器web。为此docker在容器之间打开一个安全连接隧道不需要暴露任何端口在容器外部。
你会注意到当你启动db容器的时候我们没有使用-P或者-p标识。我们连接容器的时候我们不需要通过网络给PostgreSQL数据库开放端口。
  • Docker在父容器中开放子容器连接信息有两种方法
    • 环境变量
    • 更新/etc/hosts文件。
    • 参考文章:http://www.widuu.com/chinese_docker/userguide/dockerlinks.html

2.8. 容器网络

  • docker可以主动访问外网,但是外网不能主动访问docker内部,必须处理
  • docker中有四种网络,主机和主机之间,外网访问docker内部都是问题
  • 为了做到完全隔离,网络最好用自定义的,这样才是真正的隔离
    • 先看:https://yq.aliyun.com/articles/137?spm=5176.100239.blogcont65145.32.iFVPLT
    • 再看:https://yeasy.gitbooks.io/docker_practice/content/advanced_network/
    • 最后看:http://www.docker.org.cn/dockerppt/111.html
    • 不用看:https://yq.aliyun.com/articles/62628?spm=5176.100239.blogcont65145.46.iFVPLT

2.9. 管理容器数据

  • 整理的很好了:https://yq.aliyun.com/articles/138?spm=5176.100239.blogcont65145.33.iFVPLT
  • 数据卷

    • 数据卷在容器创建的时候进行初始化。如果容器的镜像在特定的Mount点下有数据,那么已有的数据将被拷贝到指定目录
    • docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
    • docker run --name jupiter-install -v $(pwd):/home -w /home --rm node_tools npm install
      • v是把当前文件夹的代码完全复制到容器中,-w的作用就是cd进我们想要进入的目录
  • 数据卷容器

    • 果你希望在容器间共享卷,那么就可以使用数据型容器
  • 数据备份还原和迁移

2.10. 创建镜像

2.10.1. 官方拉取

  • docker pull node:从官网下载node镜像

2.10.2. Dockfile使用

  • docker build -t node-pomelo ./:通过Dockerfile创建镜像
  • docker build -t node-pomelo -f Dockerfile.pomelo.env ./:通过配置文件指定Dockerfile文件

2.10.3. 镜像增量

  • docker commit <容器id> <新镜像名称>
  • docker commit -m="注释信息" -a="user信息" node:v2
  • docker history node:v2:查看镜像提交历史
    • 可以在一些容器里面动态的添加一些东西,然后打包成新的镜像,该镜像是原始镜像与容器的整合
    • 无论容器里做什么操作,写文件,删文件。该容器的基本镜像都不会有任何改变。这是因为Docker从父镜像建立增量镜像,只存储每个容器的更改。因此,如果你有一个300MB的父镜像,如果你在容器中安装了50MB的额外应用或服务,你的容器只有50MB,父镜像还是300MB。但是可以使用Dockfile或commit命令来,把增量镜像和父镜像一起生成一个新的镜像。

2.10.4. 从零开始创建纯镜像

2.10.4.1. 简单介绍

2.10.4.1.1. 术语介绍

  • 在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。
  • 由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不可写,所以镜像是无状态的。

2.10.4.1.2. 父镜像

  • 每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。我们有时说,下层那个镜像是上层镜像的父镜像。

2.10.4.1.3. 基础镜像

  • 一个没有任何父镜像的镜像,谓之基础镜像。

2.10.4.1.4. 镜像ID

  • 所有镜像都是通过一个 64 位十六进制字符串 (内部是一个 256 bit 的值)来标识的。为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的碰撞机率,所以服务器总是返回长ID。

2.10.4.2. 思路

  • http://www.widuu.com/chinese_docker/articles/baseimages.html
  • http://www.cnblogs.com/alexkn/p/3879540.html
  • 大概的思路就是将整个系统打一个rar,然后用docker把这个压缩包导入,再创建一个image
  • 不过不推荐这么用,应该是一层一层的加东西,如果打包一个纯原始的image,那么不仅很大,而且不符合分离的这种思想
  • 网上的一些单独的node,mongodb,nginx都是非常小的,我们可以找官方推荐的那些比较纯净的,不要找那种集成的,然后把下载的东西记录一下

2.11. 容器迁器

  • docker save debian02 > /root/debian02.tar:debian02:镜像打成压缩包
  • docker load < debian02.tar:在另外的机器上导入镜像
  • docker images:查看存在的镜像
  • docker容器迁移简单方便,可以任意的拷贝部署,以后再也不怕新部署环境了,一堆依赖装的想死有木有。
  • save和export的对比参考地址:
    • http://www.fanli7.net/a/bianchengyuyan/C__/20140423/452256.html

2.12. 发布到镜像网站

2.12.1. Docker Hub

  • 网址:https://hub.docker.com/ 上到到阿里docker镜像,中国的阿里dcloud https://dev.aliyun.com/search.html www.daocloud.io另一个

docker hub的自动化构建

  • http://www.widuu.com/chinese_docker/docker-hub/builds.html

2.12.2. 阿里Docker Hub

  • 网址:https://dev.aliyun.com
  • ``发布到dockerhub
    • docker login
      • 这个命令将提示你输入用户名和密码。你的用户信息将被纪录在~/.docker/config.json文件中。
    • docker push yourname/newimage
    • 发布镜像到dockerhub:docker push shiguoqing/imagename

2.12.3. 镜像加速

  • https://yeasy.gitbooks.io/docker_practice/content/install/mirror.html

2.12.4. 常用镜像介绍

  • 同一技术有很多镜像,最好选官方认证的镜像
  • 这些镜像的网址介绍了该镜像的构成和使用说明
  • mongo
  • node
  • redis

2.13. Docker开机自启动

2.13.1. docker的自启动

  • 首先需要了解你所使用的系统用的什么启动管理工具,在ubuntu 15.04及其以上版本使用的是systemd,在14.10及其以下使用的是upstart。在15.04及以上版本需要执行:
  • 启动服务:sudo service docker restart
  • 停止服务:sudo service docker stop
  • 自启动:systemctl enable docker
  • 参考文档:https://yq.aliyun.com/articles/132?spm=5176.100239.blogcont65145.27.SRH5q8

2.13.2. docker中容器的自启动

  • docker run -i -t node /etc/rc.local
    • 在容器中把所有需要开机自的启动命令放在/etc/rc.local中,就可以达到当docker启动的时候多容器自动启动

3. DockerFile文件

3.1. 为什么要用DockerFile

  • 配置文件的优点:标准,可知,可复用
  • 你用了配置文件别人才敢用你的镜像,否则别人不放心你的镜像中是否安装了一些不安全的东西

3.2. 文档

  • 参考文档:
    • https://yeasy.gitbooks.io/docker_practice/content/image/commit.html
    • http://www.docker.org.cn/dockerppt/114.html
    • https://yq.aliyun.com/articles/140?spm=5176.100239.blogcont65145.35.iFVPLT
    • https://yq.aliyun.com/articles/69893?spm=5176.100239.blogcont140.20.qhk3vB
    • 补充:http://www.docker.org.cn/dockerppt/114.html
  • 这句话待考证:镜像不用删除,因为镜像的名称相同所以会覆盖之前的镜像,每次执行dockerfile会不会每次都是下载,会去请求一次,但是镜像会有一个sha值,他会判断有更新就更新,你可以用docker pull hello-world

4. Docker Compose实现自动化部署

  • sudo nohup docker-compose up
  • https://yeasy.gitbooks.io/docker_practice/content/compose/intro.html

5. Swarm实现集群

  • https://yeasy.gitbooks.io/docker_practice/content/swarm/intro.html

6. Docker的监控

7. Docker部署

7.1. 蓝绿部署

7.2. 灰度发布

8. 特别感谢

  •  

9. 免责说明

  • 本文档中的部分内容摘自网上的众多博客,仅作为自己知识的补充和整理,并分享给其他需要的coder,不会用于商用。
  • 因为很多博客的地址看完没有及时做保存,所以很多不会在这里标明出处,非常感谢各位大牛的分享,也希望大家理解。
  • 如果原文作者感觉不适,可以及时联系我[email protected],我将及时删除争议部分内容

10. 追责声明

  • 如有大段引用超过全文50%的内容,请在文档结尾标明原文出处:龙马行空-石国庆-https://my.oschina.net/u/1416844/blog,否则将视为抄袭,予以法律追究,请各位尊重个人知识产权。

个人公众号

  • 大家可以关注我的公众号,我会举办线下代码操练活动

     DevOps系列——Docker基础知识总结_第4张图片

  • 本人提供所有前端知识的付费咨询服务,本咨询可提升企业核心竞争力
    • Html5和Css3系列
    • Vue全家桶系列
    • JS面向对象系列
    • 微信开发系列(完善中)
    • RN开发系列(完善中)
    • DevOps系列
  • 价格请邮箱联系:[email protected],有愿意提供场地的公司也可以联系我,会有优惠

 

转载于:https://my.oschina.net/u/1416844/blog/893839

你可能感兴趣的:(DevOps系列——Docker基础知识总结)