前言:在日常开发中,我们都对容器这个概念多少有所了解,容器通俗来讲就是将许多我们所需要的东西集成于一起,方面后期使用,那么Docker呢?
Docker简介
Docker是一个开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 ; 而且容器是完全使用沙箱机制,相互之间不会有任何接口,容器性能开销极低 ; 简言之可以把它理解为一个应用程序执行的容器
对以上的简述可能还是有些不解,所以在真正理解Docker之前,可以先弄清楚Docker和虚拟机,那么Docker和虚拟机有什么区别呢?
Docker 将应用程序与该程序的依赖,打包在一个文件里面,运行这个文件,就会生成一个虚拟容器,程序在这个虚拟容器里运行,类似于在真实的物理机上运行,而且也不需要担心环境问题
所以总体来说,Docker是属于Linux容器的一种封装,提供简单易用的容器使用接口,可以轻松的创建和使用容器,把自己的应用放入容器中,进行版本管理、复制、修改等
Docker优势
Docker容器的优势有很多,简单整理几条如下:
Docker应用
那么说了这么多,Docker的应用场景有哪些呢?列举如下:
上面介绍了关于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 使用 C/S 结构,即客户端/服务器体系结构,Docker 客户端与 Docker 服务器进行交互,Docker服务端负责构建、运行和分发 Docker 镜像 ;而且Docker 客户端和服务端可以运行在一台机器上,可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信…下面将会具体介绍Docker架构
Docker 分为 CE (社区版)和 EE (企业版,需要money)两大版本,安装前可以查看一下Docker的官方文档 https://docs.docker.com/install/,Docker CE 的安装文档如下:
博主这里以 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
输出 hello world
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序,比如输出 hello world
docker run ubuntu:18.04 /bin/echo "hello world"
运行交互式的容器
通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力:
docker run -i -t ubuntu:18.04 /bin/bash
注意第二行 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
在宿主主机内使用 docker logs 命令,查看容器内的标准输出
docker logs 2b1b7a428627
通过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 images 命令查看本地所有镜像
之前说到的docker的基本架构,了解到Docker 使用的是 C/S 结构,即客户端/服务器体系结构;Docker 客户端与 Docker 服务器进行交互时, Docker 服务端负责构建、运行和分发 Docker 镜像;Docker 客户端和服务端可以运行在一台机器上;可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信等
从上图也可以看出Docker的整体架构,包括了五个核心组件:Docker Client、Docker daemon、Docker Image、Docker Registry、Docker Container
1.Docker Client 就是 Docker 的客户端,客户端可以构建,运行和停止应用程序,还可以远程与Docker_Host进行交互,常用docker客户端就是docker命令,可以通过docker命令在host上构建和运行容器
2.Docker daemon是服务器组件,以Linux后台服务的方式运行,是Docker核心的后台进程,也称为守护进程,该进程会在后台启动一个 API Server 来负责docker client的请求,收到的请求将通过Docker daemon 内部的一个路由分发调度,由具体的函数来执行请求
3.Docker Image就是上面说的镜像,可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数,镜像不包含任何动态数据,其内容在构建之后也不会被改变
4.Docker registry 是存储 docker image 的仓库,运行docker push、docker pull、docker search时,其实是通过 docker daemon 与 docker registry 通信,如图所示:
5.Docker Container(容器)就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方,Docker Container 提供了系统硬件环境,可以使用 Docker Images 这些制作好的系统盘,加上项目代码通过 run 命令提供服务
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,换句话说就是DockerFile自定义镜像,然后通过Docker命令运行镜像,那么如何使用Dockerfile 自定义镜像呢?以定制Nginx镜像为例:
1.创建一个名为Dockerfile文件,并在文件内添加如下内容:
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件
参数解释:
2.开始构建Nginx镜像,进到 Dockerfile 文件的存放目录下,通过目录下的Dockerfile 构建一个Nginx.test(镜像名称:镜像标签)
//test后面的 . 即为上下文路径,意思是指 docker 在构建镜像,如果需要使用到
//本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的
//所有内容打包;如果未说明最后一个参数,那么默认上下文路径就是
// Dockerfile 所在的位置
执行命令 : docker build -t nginx:test .
构建完成之后通过 Docker images 查看下,说明已经成功了:
结语:本文主要介绍了关于Docker的安装、详解以及使用,包括Docker的架构分析等,下篇博客将主要针对于springboot项目如何整合到Docker容器上