Docker 虚拟技术总结

课堂分享的东西 ,划水~~~

Posted by BY Diego on November 24, 2020

什么是Docker

一种新兴的虚拟化方式

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制严格限制代码对本地系统资源访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏),

相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?

用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。

如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:”它在我的机器可以跑了”(It works on my machine),言下之意就是,其他机器很可能跑不了。

环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

docker 架构

Docker 与 虚拟机 的对比

虚拟机缺点:

(1)资源占用多

(2)冗余步骤多

(3)启动慢

docker 优点:

(1)启动快

(2)资源占用少

(3)体积小

(4) 一致的运行环境

(5)更轻松的维护和扩展

(6)更轻松的迁移

传统虚拟化

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程

**Docker **

容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

Docker 的用途

Docker 的主要用途,目前有三大类。

(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

快速寻找合适系统

如 ubuntu、centos、debian

快速搭建编译环境

各版本java、python、php、c、c++、perl、go、node、ruby等语言环境

快速搭建服务

  • 中间件 tomcat、apache、nginx、iis

  • 数据库 mysql、sqlite、mssql、oracle、redis

  • 应用 flask、django、消息队列 Rabbitmq 、博客wordpress 、ssr 、 区块链go-ipfs

网盘 baiduupcs-web

(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

Docker 基本概念

Docker 包括三个基本概念

  • 镜像(Image
  • 容器(Container
  • 仓库(Repository

容器 是启动起来的镜像 类似 进程是执行中的程序

Docker 的使用

安装

apt install docker.io

启动 、 停止 、状态查看

service docker start
servcie docker stop
service docker status

docker 镜像操作

查看本地的 docker 镜像

docker images

  • repository 镜像的对应仓库 及其镜像名称
  • tag 标签(一般用来表示版本)
  • Image ID 镜像的id
  • created 镜像创建时间
  • size 镜像所占空间

搜索镜像

docker search [OPTIONS] TERM

  • name 镜像所在仓库 及名字
  • DESCRIPTION 镜像描述
  • stars 获得的星数
  • official 是否为官方镜像
  • AUTOMATED 是否为自动构建

https://hub.docker.com 官方仓库

获取镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

删除镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]

docker 容器操作

启动镜像

docker run -dit ubuntu:16.04
  • -d 后台运行

  • -i 交互式操作

  • -t 终端

  • –name 定义一个别名

  • -p 端口映射

docker 容器的生命周期是同容器中的前置进程相关在一起的,这也是我们平时可能会遇到一些容器只是运行几秒便自动退出的原因:因为容器中没有一个常驻的前置进程,前置进程运行结束后,容器便自动退出了。

docker run ubuntu:16.04

查看正在运行的容器

docker ps 

查看所有容器

包括退出的容器

docker ps -a

进入容器

docker exec -it <id> /bin/bash  

容器 与 宿主 文件交换

docker cp  1.txt <id>:/tmp/1.txt
docker cp  <id>:/tmp/1.txt 1.txt

容器暂停(相当于虚拟机的挂起)

docker stop <id> 

容器恢复

docker start <id>

删除容器

docker rm <id>

查看容器ip

docker inspect <id> |grep IP 

查看容器日志

docker logs <id>

端口映射

docker run -dit -p 8000:80 nginx
  • -p 宿主主机端口 : docker 端口

Docker 的网络模式

Bridge模式

Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。

容器启动时从docker0子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关

Host 模式

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面如文件系统、进程列表等还是和宿主机隔离的

docker run -dit --network host ubuntu

docker 中网卡

宿主机

Container 模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。

network container

None模式

使用none模式,Docker 容器拥有自己的 Network Namespace,但是,并不为Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等

Docker 打包与发布

容器打包成镜像

docker commit <id>  <name>

往容器随便写个文件

打包

进入自己构建的容器,又存在的文件

docker 发布

docker hub 为例

① 注册 docker hub 账号

② 本地 连接docker hub

docker login -u xxx -p xxx

③ 将 制作好的镜像 重命名(打个标签

docker tag  <本地制作好的镜像名>  <注册的用户名>/<想要发布时用的镜像名>:<tag>

否则会出现 权限不允许

④ 上传镜像

自己的仓库

⑤ 他人下载

定制Docker

Dockerfile 是一个用来构建镜像的文本文件,可以很方便的定义一个单独的应用容器

文本内容包含了一条条构建镜像所需的指令和说明。

利用 dockerfile 可以将自己的项目 部署过程全部装在一个dockerfile 文件里,

在移植的时候仅需将dockerfile 及相关源码 转移到其他机器上即可,无需担心环境问题

简单例子 利用dockerfile 编写一个执行 index.py 的容器并执行脚本

Dockerfile 内容如下

FROM codenvy/python27:latest

COPY ./index.py /tmp/index.py


RUN cp /tmp/index.py ~/index.py  # 一般用来前期准备


CMD ["/usr/bin/python","/tmp/index.py"] # 一般用来最后启动服务

index.py

for x in range(0,10):
	print(x)

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行。
  • RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

目录结构

构建

docker build -t <name> .

运行

docker run <name>

Docker compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

负责快速的部署分布式应用,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。它允许用户通过一个单独的 docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目

例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器或者缓存服务容器,甚至还包括负载均衡容器等

如 分别启动一个nignx 和 mysql

version : '3'
services:
    nginx :
        image: nginx
        container_name : nginx_text
        hostname : nignz_text
        ports:
            - 8000:80
        environment:
            - DEBUG=false
    db:
        image: mysql
        command: --default-authentication-plugin=mysql_native_password
        restart: always
        environment:
             MYSQL_ROOT_PASSWORD: 123456
        ports:
            - 8001:3306

docker-compose up

容器运行结果