Docker安装、详解及使用

Docker详解及使用

前言:在日常开发中,我们都对容器这个概念多少有所了解,容器通俗来讲就是将许多我们所需要的东西集成于一起,方面后期使用,那么Docker呢?

Docker安装、详解及使用_第1张图片

1.关于Docker

Docker简介

Docker是一个开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 ; 而且容器是完全使用沙箱机制,相互之间不会有任何接口,容器性能开销极低 ; 简言之可以把它理解为一个应用程序执行的容器

对以上的简述可能还是有些不解,所以在真正理解Docker之前,可以先弄清楚Docker和虚拟机,那么Docker和虚拟机有什么区别呢?

  • 虚拟机性能依赖于硬件,而Docker是构件在操作系统中,开源轻量化
  • Docker轻量化适用于部署少量应用,在Docker上我们可以部署Nginx,redis或者Mysql等
  • Docker基于DockerFile进行容器的构建,可以手动编写DockerFile来指定相应的系统环境和依赖
    Docker安装、详解及使用_第2张图片

Docker 将应用程序与该程序的依赖,打包在一个文件里面,运行这个文件,就会生成一个虚拟容器,程序在这个虚拟容器里运行,类似于在真实的物理机上运行,而且也不需要担心环境问题

所以总体来说,Docker是属于Linux容器的一种封装,提供简单易用的容器使用接口,可以轻松的创建和使用容器,把自己的应用放入容器中,进行版本管理、复制、修改等

Docker优势

Docker容器的优势有很多,简单整理几条如下:

  1. 文件系统隔离,每个不同的容器都存在不同的独立文件系统中
  2. 资源隔离,每个容器都有自己独立的IP、网络和虚拟接口
  3. Docker将会收集和记录每个进行容器的标准流(stdout/stderr/stdin)用于实时检索或批量检索

Docker应用

那么说了这么多,Docker的应用场景有哪些呢?列举如下:

  • Web应用的自动化打包和发布
  • 自动化测试和持续集成、发布
  • 在服务型环境中部署和调整数据库或者其他应用后台

上面介绍了关于Docker的一些概念或者优势等,接下来分析Docker的几个概念及原理,在Docker中包含了三个概念:镜像、容器和仓库

镜像:Docker (Image)镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数,比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统

容器:镜像(Image)和容器(Container)基本上是一样的,可以比作面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体

仓库:仓库(Repository)可看着一个代码控制中心,用来保存镜像;一个 Docker Registry 中可以包含多个仓库 (Repository) ,每个仓库可以包含多个标签 (Tag),每个标签对应着一个镜像

Docker 官方提供了 Docker Registry镜像,可以直接使用做为私有 Registry 服务,当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了,下图可以看到 Docker 的架构:

Docker安装、详解及使用_第3张图片

Docker 使用 C/S 结构,即客户端/服务器体系结构,Docker 客户端与 Docker 服务器进行交互,Docker服务端负责构建、运行和分发 Docker 镜像 ;而且Docker 客户端和服务端可以运行在一台机器上,可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信…下面将会具体介绍Docker架构


2.Docker安装

Docker 分为 CE (社区版)和 EE (企业版,需要money)两大版本,安装前可以查看一下Docker的官方文档 https://docs.docker.com/install/,Docker CE 的安装文档如下:

  • MacOS:https://docs.docker.com/docker-for-mac/install/
  • Windows:https://docs.docker.com/docker-for-windows/install/
  • Ubuntu:https://docs.docker.com/install/linux/docker-ce/ubuntu/
  • Debian:https://docs.docker.com/install/linux/docker-ce/debian/
  • CentOS:https://docs.docker.com/install/linux/docker-ce/centos/
  • Fedora:https://docs.docker.com/install/linux/docker-ce/fedora/
  • 其他 Linux 发行版:https://docs.docker.com/install/linux/docker-ce/binaries/

博主这里以 Ubuntu 系统为例:

卸载旧版本

Docker 的旧版本被称为 docker,docker.io 或 docker-engine ,如果已安装,先卸载原有Docker:

sudo apt-get remove docker docker-engine docker.io containerd runc

安装Docker

在此我们安装Docker社区版,也就是Docker Engine-Community ,有两种安装方式,分别是使用 Docker 仓库进行安装 和 Shell脚本进行安装,这里我们通过Docker仓库进行安装

首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库,之后可以从仓库安装和更新 Docker

1.更新 apt 包索引:

sudo apt-get update

2.安装 apt 依赖包,用于通过HTTPS来获取仓库:

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

3.添加 Docker 的官方 GPG 密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4.9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证现在是否拥有带有指纹的密钥:

sudo apt-key fingerprint 0EBFCD88

5.使用以下指令设置稳定版仓库

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

安装 Docker Engine-Community

1.更新apt包索引

sudo apt-get update

2.安装最新版本的 Docker Engine-Community 和 containerd ,或者转到下一步安装特定版本:

sudo apt-get install docker-ce docker-ce-cli containerd.io

3.如果想自定义版本 Docker Engine-Community ,可列出可用版本,自己选择

4.测试 Docker 是否安装成功,输入以下指令验证

docker version

安装成功:

Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea838
 Built:             Wed Nov 13 07:29:52 2019
 OS/Arch:           linux/amd64
 Experimental:      false


3.Docker使用

输出 hello world
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序,比如输出 hello world

docker run ubuntu:18.04 /bin/echo "hello world"

在这里插入图片描述参数解析:

  • docker: Docker 的二进制执行文件
  • run: 与前面的 docker 组合来运行一个容器
  • ubuntu:18.04 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像
  • /bin/echo “Hello world”: 在启动的容器里执行的命令

运行交互式的容器

通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力:

docker run -i -t ubuntu:18.04 /bin/bash

在这里插入图片描述
参数解析:

  • -t: 在新容器内指定一个伪终端或终端
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互

注意第二行 root@6c43359b8b15:/#,说明已经进入 ubuntu18.04 系统的容器,可以查看当前目录与系统版本信息
在这里插入图片描述
可以通过 exit 命令退出当前系统

exit

启动容器

使用以下命令创建一个以进程方式运行的容器

 docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

在这里插入图片描述
可以看到输出结果并没有之前的 “hello world”,而是一个长字符换;这个长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器情况

首先需要确认容器有在运行,可以通过 docker ps 命令来查看

docker ps

在这里插入图片描述参数解析:

  • CONTAINER ID: 容器 ID
  • IMAGE: 使用的镜像
  • COMMAND: 启动容器时运行的命令
  • CREATED: 容器的创建时间
  • STATUS: 容器状态
  • PORTS: 容器的端口信息和使用的连接类型(tcp\udp)
  • NAMES: 自动分配的容器名称

在宿主主机内使用 docker logs 命令,查看容器内的标准输出

docker logs 2b1b7a428627

Docker安装、详解及使用_第4张图片
关闭容器

通过docker ps 查看想要终止的容器ID,通过docker stop id 命令关闭容器

docker stop aa851391f865

在这里插入图片描述可以看到终止正在运行的容器之后,通过 docker ps 查询没有正在运行的容器 ;如果想重新开启已关闭的容器,首先通过 docker ps -a 查看所有容器之后再通过命令 docker start “开启容器id”即可,如下:
在这里插入图片描述

后台运行

部分的场景下,我们希望 docker 的服务是在后台运行的,可以过 -d 指定容器的运行模式,-d 参数默认不会进入容器

docker run -itd --name ubuntu-test ubuntu /bin/bash

docker安装Ubuntu、nginx等

docker安装Ubuntu,redis或者mysql等基本原理都一样,这里不一一介绍,基本流程就是可以取官方查支持版本,然后通过 docker pull 命令拉取即可,列举如下:

  • docker pull ubuntu 或 docker pull ubuntu:latest
  • docker pull mysql:latest
  • docker pull nginx:latest

最后可以通过 docker images 命令查看本地所有镜像


4.Docker架构

之前说到的docker的基本架构,了解到Docker 使用的是 C/S 结构,即客户端/服务器体系结构;Docker 客户端与 Docker 服务器进行交互时, Docker 服务端负责构建、运行和分发 Docker 镜像;Docker 客户端和服务端可以运行在一台机器上;可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信等

Docker安装、详解及使用_第5张图片

从上图也可以看出Docker的整体架构,包括了五个核心组件:Docker Client、Docker daemon、Docker Image、Docker Registry、Docker Container

1.Docker Client 就是 Docker 的客户端,客户端可以构建,运行和停止应用程序,还可以远程与Docker_Host进行交互,常用docker客户端就是docker命令,可以通过docker命令在host上构建和运行容器
Docker安装、详解及使用_第6张图片

2.Docker daemon是服务器组件,以Linux后台服务的方式运行,是Docker核心的后台进程,也称为守护进程,该进程会在后台启动一个 API Server 来负责docker client的请求,收到的请求将通过Docker daemon 内部的一个路由分发调度,由具体的函数来执行请求

Docker安装、详解及使用_第7张图片

3.Docker Image就是上面说的镜像,可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数,镜像不包含任何动态数据,其内容在构建之后也不会被改变

4.Docker registry 是存储 docker image 的仓库,运行docker push、docker pull、docker search时,其实是通过 docker daemon 与 docker registry 通信,如图所示:

Docker安装、详解及使用_第8张图片

5.Docker Container(容器)就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方,Docker Container 提供了系统硬件环境,可以使用 Docker Images 这些制作好的系统盘,加上项目代码通过 run 命令提供服务


5.关于DockerFile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,换句话说就是DockerFile自定义镜像,然后通过Docker命令运行镜像,那么如何使用Dockerfile 自定义镜像呢?以定制Nginx镜像为例:

1.创建一个名为Dockerfile文件,并在文件内添加如下内容:

FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

Docker安装、详解及使用_第9张图片
构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件

参数解释:

  • FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像
  • RUN:用于执行 RUN 后面的命令

2.开始构建Nginx镜像,进到 Dockerfile 文件的存放目录下,通过目录下的Dockerfile 构建一个Nginx.test(镜像名称:镜像标签)

//test后面的 . 即为上下文路径,意思是指 docker 在构建镜像,如果需要使用到
//本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的
//所有内容打包;如果未说明最后一个参数,那么默认上下文路径就是
// Dockerfile 所在的位置
执行命令 : docker build -t nginx:test .

Docker安装、详解及使用_第10张图片

构建完成之后通过 Docker images 查看下,说明已经成功了:在这里插入图片描述

结语:本文主要介绍了关于Docker的安装、详解以及使用,包括Docker的架构分析等,下篇博客将主要针对于springboot项目如何整合到Docker容器上

你可能感兴趣的:(Docker系列,Docker,Docker安装)