DevOps系列——Docker基础知识总结 4年前

docker教程

1. Docker简介

1.1. Docker改名字

1.2. 文档

1.2.1. 必看文档

1.2.2. 社区技术类博客

1.2.3. 其他文档

1.3. 基础概念

1.3.1. 名词那些

2. Docker基础知识点

2.1. Docker命令说明

2.2. Docker信息查询

  • docker help:查看帮助信息
    • docker run —help:可以查看某条命令的具体用法
  • docker info:查看docker的安装信息
  • which docker:查看docker的执行路径

2.3. 镜像管理

  • docker pull <镜像名:tag>:从官网拉取镜像

  • docker search <镜像名>:搜索在线可用镜像名

  • docker images:查询所有的镜像,默认是最近创建的排在最上

  • docker rmi <镜像名:tag>:删除镜像

  • docker rmi $(docker images -q -f dangling=true):批量删除无用镜像

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在父容器中开放子容器连接信息有两种方法

2.8. 容器网络

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的对比参考地址:

2.12. 发布到镜像网站

2.12.1. Docker Hub

docker hub的自动化构建

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. 镜像加速

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. 文档

4. Docker Compose实现自动化部署

5. Swarm实现集群

6. Docker的监控

7. Docker部署

7.1. 蓝绿部署

7.2. 灰度发布

8. 特别感谢

9. 免责说明

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

10. 追责声明

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

个人公众号

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

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

image
云淡风静
文字只活在创作之时,滚烫的文字的生命,刚刚诞生却又极速冷却,留下的只有尸骸,后人于是能在这尸骸上,让这璀璨的生命与脑海中重生。
4
发布数
3
关注者
9876
累计阅读

热门教程文档

Lua
21小节
C#
57小节
C++
73小节
Typescript
31小节
Linux
51小节
广告