Docker简介

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余 项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。 Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。 (背景),云计算兴起后,服务器硬件扩展非常便利,软件服务部署成为了瓶颈,docker 趁势而兴。

Docker作用

容器的启动可以在秒级实现,比传统的虚拟机方式要快得多 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器 docker 的出现,让开发/测试/线上的环境部署,成为便利一条龙。

Docker架构

Docker优势

1.更快速的交付和部署

对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正 常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直 接使用这个容器来部署代码。
Docker 可以快速创建容器,快速迭代应用程序,并让整个过 程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器 很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

2.更高效的虚拟化

Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实 现更高的性能和效率。即Linux内核加文件系统,形成一个独立的沙箱

3.更轻松的迁移和扩展

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以 增量的方式被分发和更新,从而实现自动化并且高效的管理。

4.更简单的管理

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以 增量的方式被分发和更新,从而实现自动化并且高效的管理。

Docker镜像

Docker 镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或 用户需要的其它应用程序。 镜像可以用来创建 Docker 容器。 Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接 从其他人那里下载一个已经做好的镜像来直接使用

Docker容器

Docker 利用容器来运行应用。 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互 隔离的、保证安全的平台。 可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空 间和网络空间等)和运行在其中的应用程序。

Docker仓库

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为 一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含 了多个镜像,每个镜像有不同的标签(tag)。 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。 最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 当然,用户也可以在本地网络内创建一个私有仓库。 当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这 样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

容器、镜像的运行关系

安装 Docker

注:Docker 支持 CentOS6 及以后的版本。

卸载旧版本

1.查询安装过的包 yum list installed | grep docker
--结果例子:docker-engine.x86_64 17.03.0.ce-1.el7.centos @dockerrepo
2.删除安装的软件包 yum -y remove docker-engine.x86_64
3.删除镜像/容器等 rm -rf /var/lib/docker

CentOS7

注:需要关闭selinux ,这个是7后加的安全级别很高的校验,导致很多软件不兼容,位置:/etc/sysconfig/selinux;用命令getenforce查看

CentOS7 系统 CentOS-Extras 库中已带 Docker,可以直接安装:

yum install -y docker # ##不是最新版本yum install -y yum-utils device-mapper-persistent-data lvm2 ##安装工具类yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ## 使用yum源管理包添加docker源,如果地址出错,会生成一个错误以地址为名的文件,删除即可.
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ##自己直接下载
yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y #按版本安装yum repolist all ## 查看yum仓库快速安装:需要先下载docker源,然后使用命令清楚缓存并重新加载缓存:
yum clean all && yum makecache fast$ sudo docker version  ## 查看版本
$ sudo docker info ## 查看docker信息
$ systemctl start docker ## 启动docker
$ systemctl enable docker ##设置随系统启动
$ systemctl disable docker ##关闭开机启动

配置docker阿里镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://ihkuvtmd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload # 配置重新加载生效
sudo systemctl restart docker # 重启docker## 也可以自己去aliyun.com去获取自己的配置信息

docker run hello-world ##测试—进入 docker 世界

到此,docker就已经安装完成了,下面开始docker的其他操作

Docker 基本操作

1、容器操作

docker [run|start|stop|restart|kill|rm|pause|unpause|inspect]
  • run/create[镜像名]: 创建一个新的容器并运行一个命令
  • start/stop/restart[容器名]:启动/停止/重启一个容器
  • kill [容器名]: 直接杀掉容器,不给进程响应时间
  • rm -fv [容器名]:删除容器 -f :强制, v:携带的数据也一起删除
  • pause/unpause[容器名]:暂停/恢复容器中的进程
  • inspect[容器名或ID] : 查看docker容器IP段
  • systemctl daemon-reload # 配置重新加载生效
  • systemctl restart docker # 重启docker
docker [ps|inspect|exec|logs|export|import]
  • ps:查看容器列表(默认查看正在运行的容器,-a 查看所有容器)
  • inspect[容器名]:查看容器配置元数据
  • exec -it [容器名] /bin/bash:进入容器环境中交互操作
  • whereis [容器名] : 查看安装目录
  • logs --since=“2019-02-01” -f --tail=10 [容器名]:查看容器日志
  • cp [容器名]:path1 path2 : 容器与主机之间的数据拷贝,path1:docker目录文件 path2:目标
  • export -o test.tar [容器名] / docker export [容器名]>test.tar : 文件系统作为一个 tar 归档文件
  • import test.tar [镜像名:版本号]:导入归档文件,成为一个镜像
  • search [镜像名] : 查找镜像,顺序:本地-私库/阿里-中央
容器挂载

docker run -d --name nginx -v /docker/nginx:/etc/nginx/conf.d nginx

  • -v :表示挂载
  • /docker/nginx :表示宿主机目录
  • /etc/nginx/conf.d : 容器需要挂载的目录
  • 主机目录的东西就会覆盖容器里面被挂载的目录
  • 复制容器中默认配置到挂载目录下
  • nginx -t :检测配置

注: docker 是最小的Linux定制,只有ls命令

2、容器创建详解

docker run -d --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
  • -e MYSQL_ROOT_PASSWORD 这是mysql定制为root用户设置初始密码,其他容器不需要
  • mysql:5.7 表示mysql镜像服务,5.7为版本
  • 其他容器创建雷同
  • docker exec -it mysql-test /bin/bash 进入容器内部交互
  • docker inspect mysql-test 查看容器的元数据
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -p: 端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • –name=“nginx-lb”: 为容器指定一个名称;
  • –dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • -m :设置容器使用内存最大值;
  • –net=“bridge”: 网络连接类型,支持 bridge/host/none/container: 四种类型;
  • –link=[]: 添加链接到另一个容器;
  • –expose=[]: 开放一个端口或一组端口;
docker run -it --name nginx nginx /bin/bash
  • -it 前台进程运行
  • /bin/bash 进入容器内部交互,跟-it一起使用
  • exit 退出也关闭容器;
  • Ctrl+P+Q 退出不关闭容器
docker cp anaconda-ks.cfg nginx:/var
  • 复制主机文件到容器内

镜像操作

1、常用命令

docker images|rmi|tag|build|history|save|load]
  • images:列出本地镜像列表
  • rmi [镜像名:版本]:删除镜像
  • tag [镜像名:版本] [仓库]/[镜像名:版本]:标记本地镜像,将其归入某一仓库
  • build -t [镜像名:版本] [path]:Dockerfile 创建镜像
  • history [镜像名:版本]: 查看指定镜像的创建历史
  • save -o xxx.tar [镜像名:版本] / save [镜像名:版本]>xxx.tar : 将镜像保存成 tar 归档文件 - load --input xx.tar / docker load<xxx.tar : 从归档文件加载镜像

2、镜像的层级

  • 1、一组只读目录组成一个镜像。
  • 2、每一个目录是一个layer,多个layer按照一定的顺序组成一个stack。
  • 3、在容器创建时,docker增加在stack之上一个thin和writable layer

lowerDir 层级是不可修改的,但是为了能修改,docker 使用了覆盖策略如下:

  • 1、lower和upper目录最终被挂载到merged目录
  • 2、upper覆盖lower的同名文件 。
  • 3、upper合并lower的同目录文件。

3、镜像创建

3.1、由容器提交镜像(非主流)

docker 镜像与容器,使用联合文件技术管理文件。
镜像与容器由一层层的 layer 文件组装而成,如下图:

  • 1、当用镜像模板创建容器时,是直接在镜像的文件层级上,加一层容器读写层
  • 2、反过来,如果想要创建一个新的镜像,直接把容器对应的所有文件层,转为只读层 即可。commit 命令可达到这个效果
  • 3、docker inspect [镜像名] : 查看镜像信息

docker commit -a “作者名字” -m “备注信息” tomcat-firework tomcat:firework

  • tomcat-firework : 需要转为镜像的容器
  • tomcat:firework : 转为tomcat容器,版本为firework
3.2、dockerfile 方式(主流)

创建流程:

  1. 添加Dockerfile 文件
  2. 创建镜像:docker build -t [镜像名字]:[版本号] /path; ##path为 Dockerfile 脚本路径

Dockerfile 基本要素:

dockerfile 指令:

  • FROM:FROM {base 镜像}
    必须放在 DOckerfile 的第一行,表示从哪个 baseimage 开始构建
  • MAINTAINER: 可选的,用来标识 image 作者的地方
  • RUN
    RUN 都是启动一个容器、执行命令、然后提交存储层文件变更。
    第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造 成任何文件。
    而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能 继承前一层构建过程中的内存变化。
    而如果需要将两条命令或者多条命令联合起来执行需要加上&&。
    如:cd /usr/local/src && wget xxxxxxx
  • CMD:
    CMD 的作用是作为执行 container 时候的默认行为(容器默认的启动命令)
    当运行 container 的时候声明了 command,则不再用 image 中的 CMD 默认所定义 的命令;
    一个 Dockerfile 中只能有一个有效的 CMD,当定义多个 CMD 的时候,只有最后一个才会 起作用
  • EXPOSE:
    EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个 声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助 镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机 端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
  • entrypoint:
    entrypoint 的作用是,把整个 container 变成可执行的文件,且不能够通过替换 CMD 的方 法来改变创建 container 的方式。但是可以通过参数传递的方法影响到 container 内部
    每个 Dockerfile 只能够包含一个 entrypoint,多个 entrypoint 只有最后一个有效
    当定义了 entrypoint 以后,CMD 只能够作为参数进行传递
  • ADD & COPY:
    把 host 上的文件或者目录复制到 image 中(能够进行自动解压压缩包)
  • ENV:
    用来设置环境变量,后续的 RUN 可以使用它所创建的环境变量
  • WORKDIR: 用来指定当前工作目录(或者称为当前目录)
  • USER:运行 RUN 指令的用户
  • VOLUME:用来创建一个在 image 之外的 mount point

maven插件方式创建镜像:

  1. 在项目中加入maven插件
  2. 上传项目到Linux
  3. 执行命令:mvn clean package docker:build

镜像仓库

1、官方仓库

1.1、注册
https://hub.docker.com
自由注册,邮件激活即可使用
1.2、命令使用

Docker pull/search/login/push/tag

  • tag [镜像名:版本] [仓库]/[镜像名:版本]:标记本地镜像,将其归入某一仓库
  • Push [仓库]/[镜像名:版本]: 推送镜像到仓库 --需要登陆
  • Search [镜像名]:在仓库中查询镜像 – 无法查询到 tag 版本
  • Pull [镜像名:版本]: 下载镜像到本地
  • Login:登陆仓库

2、私有仓库

2.1、搭建

下载 registry 镜像:docker pull registry
-----可配置加速器加速下载

2.2、启动

docker run -d --name reg -p 5000:5000 registry

然后可以通过 restful 接口查看仓库中的镜像(当前仓库是空的)

2.3、配置 http 传输

私服默认只能使用 https,需要配置开放 http

配置完毕重启下 docker 服务
systemctl daemon-reload
systemctl restart docker

2.4、私服仓库推送镜像

docker tag hello-world 192.168.244.7:5000/hello-world

docker push 192.168.244.7:5000/hello-world

查询镜像仓库:http://192.168.244.5:5000/v2/_catalog

查询 hello 版本

数据管理-挂载

docker run -dit -v /root/peter_dir/:/pdir --name nginx nginx
  • 配置文件需要挂载到宿主机
  • 容器里面的业务数据要挂
  • 容器的日志要挂,方便查看

volume 文件挂载的探究

1、volume 参数创建容器数据卷

2、我们通过 docker inspect data 查看容器元数据,可看到挂载信息

volumes-from 引用数据卷

新启一容器,引入上一步的 data 容器目录

自动得到同一个目录,内容与 data 容器里挂载一样

删除数据卷

docker rm -v data

Compose 编排服务

docker-compose 安装

o curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose

  • uname-s :查看系统版本号
  • uname-m :内核版本

增加可执行权限

chmod +x /usr/local/bin/docker-compose

查看版本

docker-compose version

docker-compose 的命令

up 创建并启动容器:docker-compose up -d --scale 服务名=数字

  • d 表示后台运行,scale 是表示对应的服务同时启动几个容器

down 停止并删除容器: docker-compose down

  • 会停掉容器,并删除掉容器。如果不希望删除容器,请使用 stop

docker-compose 实战

配置文件

集群配置:

编写一个项目整体服务,一个网关 nginx + tomcat 外加 mysql 的集群,如上图 其中 nginx 服务,将配置文件挂载在主机当前项目目录的路径下:/docker/nginx

命令:docker-compose up -d

配置文件统一管理

// todo

Swarm 集群管理

Swarm 简介

Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机 抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。 除了前面所说的打通的网络问题外,它主要为我们提供以下服务:

  1. 与 Docker Engine 集成
  2. 使用分散设计:去中心化设计,可大规模部署
  3. 声明式服务模式
  4. 弹性服务:通过 schedule(调度器)Constraint(约束条件)affinity(共同 关系)弹性服务
  5. 期望状态协调:管理节点收集集群中所有的信息,进行感知和调度
  6. 多主机联网:指定 overlay 网络,swarm 管理器自动将地址分配给覆盖网 络上的容器
  7. 服务发现:service
  8. 负载均衡:使用内建 DNS Round-Robin 实现集群内的负载均衡,也支持外 部负载均衡
  9. 滚动更新:高可用和故障恢复机制意味着用户可以创建超过一个 master 的 Swarm

Swarm 概念

  • Swarm 集群是由多个运行 swarm 模式的 Docker 主机组成,关键的是,Docker 默认集成 了 swarm mode。swarm 集群中有 manager(管理成员关系和选举)、worker(运行 swarm service)。
  • 当你创建一个 service 时,你定义了它的理想状态(副本数、网络、存储资源、对 外暴露的端口等)。Docker 会维持它的状态,例如,如果一个 worker node 不可用了,Docker 会调度不可用 node 的 task 到其他 nodes 上。
  • 运行在容器中的一个 task,是 swarm service 的一部分,且通过 swarm manager 进行管 理和调度,和独立的容器是截然不同的。
  • swarm service 相比单容器的一个最大优势就是,你能够修改一个服务的配置:包括网络、 数据卷,不需要手工重启服务。Docker 将会更新配置,把过期配置的 task 停掉,重新创建 一个新配置的容器。

Swarm组件概念

  • swarm:是一组docker引擎的集群
  • node:是单个docker引擎的实例,可以在一个物理机上也可以在多个
  • application:是应用
  • manager node:部署应用的时候会有一个manager node节点
  • Worker nodes:对应的就是Worker nodes
  • service:然后service是一堆被workder执行的任务
  • replicated services:是负载均衡节点
  • global services:则是全局的,在所有节点上都会执行的一个服务
  • task:一个task就是一个docker的容器,是Swarm的工作单元

初始化创建

修改 docker 监听端口(TCP 端口 2375)

vi /lib/systemd/system/docker.service

重启 docker 服务:
systemctl daemon-reload
systemctl restart docker

创建管理节点

docker swarm init --advertise-addr 192.168.3.200

查看节点
docker node list

添加工作节点到集群

在工作机上,执行前面管理节点提示的命令

节点退出
docker swarm leave

添加管理节点

可以再引入一个管理节点到集群来
先用 docker swarm join-token manager 得到加入指令

在经引入机器上执行提示命令串

服务管理

创建服务

创建一个 nginx 集群,3 台机器

  • docker service create --name nginx --replicas 3 -p 80:80 nginx:1.7.9
  • 查看服务列表:docker service ls
  • 查看服务详情:docker service ps nginx
  • 在工作节点上查看服务,可以看到有了一个 nginx 容器 — docker ps
  • 访问服务,任意一台节点机 ip,都可访问
服务维护

服务集群运行后,会以期望的状态方式管理整个集群。如,刚刚创建的 3 中 nginx 组成 的集群。如果其中一台宕机,swarm 会自动新建一台,来补足 task 数量

  • 在一个节点机器上,删除一个容器
  • 在管理节点上查询

    可以看到,又新启了一台服务
滚动升级

更新原来的 nginx 版本为 1.9.7

  • docker service update --image nginx:1.9.7 nginx

查看服务,可看到 nginx 已经升级为 1.9.7

动态扩容

服务还可以动态在节点集群上进行扩容

  • docker service scale nginx=4


再次查看,发现服务已经扩为四个服务

网络通讯

swarm 管理的集群,内部建立一个统一的网络层,你绑定的端口,并非是直接绑定到宿 主机,而是绑在这个 overlay 网络。对于集群来说,相当于都绑在网络的一个端口上,启用 负载策略来转发请求,如下图

学习笔记---Docker相关推荐

  1. homeassistant mysql_HomeAssistant学习笔记docker安装的ha更换数据库

    HomeAssistant学习笔记docker安装的ha更换数据库 用了一段时间之后发现日志和历史打开的速度越来越慢,在论坛里查了半天发现是因为HA官方所用数据库导致,官方也给出了相关文档,https ...

  2. homeassistant mysql_学习笔记 篇三:HomeAssistant学习笔记docker安装的ha更换数据库

    学习笔记 篇三:HomeAssistant学习笔记docker安装的ha更换数据库 2018-11-15 12:06:58 4点赞 18收藏 3评论 是返乡过年?还是就地过年?最新一届#双面过节指南# ...

  3. 阿龙的学习笔记--- Docker 的一些概念总结

    借鉴这些文章: https://zhuanlan.zhihu.com/p/57024225 https://wangguoping.blog.csdn.net/article/details/8104 ...

  4. 狂神说--docker学习笔记-docker安装,常用命令,以及使用

    狂神说bilibili视频地址:https://www.bilibili.com/video/BV1og4y1q7M4?p=1 1. Docker概述 1.1 Docker为什么出现? 大家经常做一款 ...

  5. Docker学习笔记 — Docker私有仓库搭建

    2019独角兽企业重金招聘Python工程师标准>>> 和Mavan的管理一样,Dockers不仅提供了一个中央仓库,同时也允许我们使用registry搭建本地私有仓库. 使用私有仓 ...

  6. Docker学习笔记 - Docker Compose

    一.概念 Docker Compose 用于定义运行使用多个容器的应用,可以一条命令启动应用(多个容器). 使用Docker Compose 的步骤: 定义容器 Dockerfile 定义应用的各个服 ...

  7. Docker学习笔记 - Docker容器的日志

    docker logs  [-f]  [-t]  [--tail]  容器名 -f -t --tail="all" 无参数:返回所有日志 -f 一直跟踪变化并返回 -t 带时间戳返 ...

  8. 狂神 Docker学习笔记 从基础到进阶 一步到位

    Docker 学习笔记 感谢狂神的分享.附上B站视频链接. https://www.bilibili.com/video/BV1og4y1q7M4?from=search&seid=92256 ...

  9. Docker基础03--Dockerfile详解与镜像发布--(狂神说docker学习笔记)

    文章目录 1. Dockerfile介绍 2. Dockerfile指令说明 3. 制作Centos镜像 3.1 编写Dockerfile的文件 3.2 通过这个文件构建镜像(注意最后加个点!!!) ...

最新文章

  1. Android基础是什么,Android基础概念
  2. java 不退出_Java项目不挂断运行,即当账户退出或终端关闭时,程序仍然运行,并附上执行脚本...
  3. [原]Java程序员的JavaScript学习笔记(12——jQuery-扩展选择器)
  4. BeautifulSoup库之find_all函数_Python系列学习笔记
  5. 集群NAS+SSD如虎添翼
  6. eval 函数 代替函数_eval()函数以及JavaScript中的示例
  7. OpenJudge——0003:jubeeeeeat
  8. 视觉SLAM笔记(12) 四元数
  9. 支付宝jsapi_使用小程序Serverless开发支付宝小程序
  10. c调用python keras模型_tensorflow中调用keras训练模型作为一个计算过程
  11. 学了这么久Java都没搞懂位运算符
  12. 2021 年中国开源优秀人物揭晓
  13. docker php 一键部署_提升10倍生产力:IDEA远程一键部署SpringBoot到Docker
  14. 拓端tecdat|python爬虫进行Web抓取LDA主题语义数据分析报告
  15. 怎么用计算机同步文件夹,DSynchronize同步电脑本地文件夹教程
  16. 机器学习基本概念简介上
  17. 是时候重估“返利网”的市场价值了
  18. 知识付费的本质是什么?现在入行知识付费行业晚吗?
  19. 5.11 Go语言文本大数据处理(2):文件分割与入库
  20. BEV最新综述 | 学术界和工业界方案汇总!优化方法与tricks

热门文章

  1. 童言无忌之小瑈与甲虫
  2. CNN入门详解及TensorFlow源码实现--深度学习笔记
  3. mint-ui的学习入门实例
  4. windows 系统重装
  5. Photoshop - 如何用 PS 合成一张 Sprite 图(雪碧图)
  6. 基于物联网云平台的离心泵工况诊断系统
  7. 拨号上网“769”错误的原因之一
  8. Android实现地图照片墙原理
  9. Python实践5:基于word模板批量生成邀请函
  10. 05.Beetl标签函数以及定界符、占位符介绍---《Beetl视频课程》