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

Stella981
• 阅读 558

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基础知识总结

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这