Docker镜像与容器

理解虚拟化

计算机中,虚拟化是一种资源管理技术,打破计算机的内存、网络、硬盘等资源的不可切割的障碍,更好的进行的资源分配;

在实际生产环境中,虚拟化技术主要解决的是高性能的物理硬件性能过生和低性能硬件产能过低的重组重用,达到最大化的利用物理硬件,充分发挥其最大的作用

虚拟化技术的种类有很多,比如软件虚拟化,内存虚拟化,服务虚拟化,虚拟机等,比如VMware

理解Docker

Docker是实现轻量级的操作系统虚拟化解决方案,基于Linux容器

特别适用于微服务架构,我们也知道微服务架构是将一个应用拆成十几个微服务项目,Docker的容器就特别迎合这种部署架构;

一台宿主机可以创建多个Docker容器,每个容器互不影响,相互隔离,分别部署微服务架构的多个应用,尽可能的利用系统资源

虚拟化与Docker容器的比较

Docker容器是在操作系统层面上实现虚拟化,复用本地主机的操作系统,相当于调用一个应用一样,只要你有一个docker引擎,就能把本地操作系统复刻一个出来,当然系统还是只有一个系统

传统的虚拟机则是在硬件层面实现,在物理机上虚拟一个其他的系统,占用很多的内存,比如安装一个管理虚拟机的软件VMware,在Windows上通过虚拟机搭建Linux或者其他的环境,搭建的环境和本地操作系统是没有任何关系的

传统的虚拟机的启动和一个物理机的启动速度一致,比较慢且占大量内存,Docker容器技术并不是构建一个新的操作系统,而是调用本地的操作系统,所以启动速度比较快,且只占用小量的内存空间

Docker服务器与客户端

Docker是一个C/S架构程序(客服端-服务器),Docker客户端只需要向Docker服务器或守护线程发起请求,实现对Docker容器的管理,我们可以在一台机器上运行Docker的守护程序和客户端,也可以本地客户端连接远程Docker守护线程,实现远程管理

Docker镜像与容器

  • 镜像

镜像是构建Docker的基石,用户基于镜像来运行自己的容器,镜像的体积很小,易于分享、储存、更新,我们这样理解或许会好很多,镜像就是一个面向Docker引擎的只读模版,包含了文件系统,比如我们在装Windows系统时,通过镜像来安装的话,这个镜像可以只是一个干净的只有操作系统的镜像,也可以是安装了360全家桶等程序的不干净镜像,它将特定的一系列文件按照一定的格式制作成单一的文件,便于下载和使用

  • Docker容器

一个Docker容器简单来说,包含三个东西:

  • 一个镜像

  • 一些列标准操作

  • 一个执行环境

  

通过这张图,就能知晓容器的意义:

容器就像是一个轮船,上面装载了很多的软件,每一个软件看成一个集装箱,Docker使用Registry来保存用户构建的镜像,Registry分为公共和私有的两种,Docker公司运营的是Docker Hub,就像github一样的,我们可以在上面分享下载相关的镜像(速度超级慢!),私有的Registry需要我们自己构建

Docker的安装与启动

安装

yum包更新到最新:sudo yum update

安装需要的软件包:sudo yum install -y yum-utils device-mapper-persistent-data lvm2

设置yum源:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

查看Docker版本: yum list docker-ce --showduplicates | sort -r

默认安装最新免费版Docker: sudo yum install docker-ce

查看安装的docker版本:docker -v

设置ustc的镜像

直接去国外获取镜像特别慢,我们需要设置国内的源,ustc是一个Linux镜像服务提供者,是一个不需要注册的公共服务

我这里出了一点小问题,没有默认的docker的daemon.json配置文件,touch daemon.json创建之

然后在文件中配置如下数据: vi /etc/docker/daemon.json

{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]}

保存后重启即可:systemctl restart docker

Docker的启动相关命令

systemctl命令是系统服务管理指令

启动docker:systemctl start docker

停止docker:sysemctl stop docker

docker状态:systemctl status docker

重启docker:systemctl restart docker

开启启动docker:systemctl enable docker

docker概要信息: docker info

docker帮助文档:docker --help

Docker镜像相关命令

查看宿主机本地镜像:docker images

刚开始创建的Docker,本地是没有任何镜像的,所以下面没有数据

搜索镜像:docker search 镜像名称

拉取镜像:docker pull 镜像名称

查看本地镜像,就有tomcat的镜像了

删除镜像:docker rmi 镜像ID或者名称

之前我们拉取一个Tomcat镜像到本地,现在我们不想要它了,将其删除即可

docker rmi 365b0a528e2e 或者 docker rmi tomcat

Docker容器相关命令

  • 查看容器

查看当前正在运行的容器:docker ps

查看所有的容器:docker ps -a

查看停止的容器:docker ps -f status=exited

  • 容器的创建与启动

创建容器的常用参数说明:

创建容器的命令: docler run

-i:表示运行容器

-t:表示容器启动后会登录容器进去到其命令行,相当于一个伪终端

--name:为创建的容器命名

-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录)

可以使用多个-v做多个目录或者文件映射,

注意:最好做目录映射,在宿主机上做修改共享到容器中

-d:在run后跟-d,就会创建一个守护式容器在后台运行(这样创建容器不会自动登录容器)

-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口,可以使用多个-p做多个端口映射

  • 交互式方式 创建容器

创建:docker run -it --name=容器名称 镜像名称:标签 /bin/bash

如果镜像的标签是latest,可以不用标明,写一个镜像名称即可

下面我们创建一个包含了centos镜像的容器:

另开一个Linux连接终端,查看当前正在运行的容器:发现该容器

退出当前容器,容器也会关闭:exit

  • 守护式方式创建容器

创建:docker run -di --name=容器名称 镜像名称:标签

登录:docker exec -it 容器名称(Name or ID) /bin/bash

退出还是:exit

只不过我们知识退出了那个伪终端,容器还是运行着的,效果自测

  • 容器的启动与停止

启动: docker start 容器(Name or ID)

停止:docker stop 容器(Name or ID)

  • 文件拷贝

    有时候我们需要将文件拷贝到容器里去的需求,全程无需登录容器

docker cp 目标文件或文件夹 容器名称:容器目录

当然也可以从容器内拷贝数据出来

docker cp 容器名称:容器目录 指定资源存放路径

目录挂载

我们在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就尅通过修改宿主机上某个目录的文件从而实现对容器内想映射的文件的数据

创建容器时创建文件/文件夹映射:docker run -di --name=mycentos3 -v /usr/my.txt:/usr/my.txt centos

登录容器观察变化docker exec -it mydentos3 /bin/bash

我们在宿主机上修改my.txt,即可实现对容器内my.txt数据的修改

注意事项:如果挂载的是多级目录,可能会有权限不足的警告

查看容器IP地址

我们可以通过下面的命令来查看容器运行的各种数据:docker inspect 容器(Name or ID)

当然上面的信息太多了,一般我们就提取一个ip最为常用:

docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos3

前面均为固定格式,最后指定那个容器即可

删除容器

删除容器:docker rm 容器(Name or ID)

删除镜像:docker rmi 镜像(Name or ID)

这里说一下,当我们的镜像正在被某个运行着的容器使用着的时候是不能删除的,需要关闭相关的容器才能删除该镜像

常用软件的部署

MySQL部署

拉取镜像:docker pull centos/mysql-57-centos7

创建容器:docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7

  • -p:端口映射,位于前面的是宿主机的端口,处于后面的是容器里的端口

  • -e:代表添加环境变量,设置Mysql的Root用户的登陆密码

进入到MySQL容器: docker exec -it mysql /bin/bash

登录到MySQL

  • bash-4.2$ mysql -uroot -p Enter password: (不用键入密码,回车即可)

SQLYog连接MySQL试试:

Tomcat部署

还是和上面一致,首先搜索Tomcat :docker search tomcat

拉取最上面的那个tomcat镜像到本地:docker pull tomcat

创建容器:docker run -di --name=myTomcat -p 8080:8080 -v /usr/local/wabapps:/usr/local/tomcat/webapps tomcat

  • 这里做一个说明 -v是文件挂载,我们只需要将war包丢在宿主机下的/usr/local/wabapps目录即可对容器内的Tomcat起作用

  • /usr/local/tomcat/webapps:是Docker容器Tomcat的安装目录

为了方便测试,我们丢一个war包到宿主机的/usr/local/wabapps下

打开浏览器访问即可:OK

Nginx部署

到这里我相信大家闭着眼都知道怎么操作了吧?

  • 首先对我们安装的环境进行搜索:docker search nginx

  • 拉取镜像到本地 :docker pull nginx

  • 创建运行容器对外提供服务 :docker run -di --name=myNginx -p 80:80 nginx

当然到这里还没完,不然我也不会写出来了,Nginx还有一些需要特别注意的事项

现在环境倒是安装好了,Ngin如何对我们的静态资源进行代理?CP拷贝?Nginx配置文件不配?

首先我们进入到Nginx容器:

看一下这个配置文件呢?

先赋值一个副本出来,以防万一。我们在副本中动手脚

  • 到这里我们就可以动点脑壳了,如何才能对资源进行动态代理呢?将我们的资源拷贝到/usr/share/nginx/html/下?

  • 我们通过cp拷贝一个index.页面到 /usr/share/nginx/html/试试?

Redis部署

按部就班,天黑请闭眼

  • 首先对我们安装的环境进行搜索:docker search redis

  • 拉取镜像到本地 :docker pull redis

  • 创建运行容器对外提供服务 :docker run -di --name=myRedis -p 6379:6379 redis

  • 就不做过测试了,这个没什么好说的,我们使用客户端连接一下即可:

Docker迁移与备份

容器保存为镜像

  • 当我们将该容器保存为镜像的时候,该容器的数据还是一五一十的全部存在的

docker commit 容器(Name or Id) 生成的镜像Name

镜像备份

docker save -o mynginx.tar mynginx_i

镜像迁移与恢复

  • 为了做测试,我们就想myNginx这个容器和与之相关的镜像都删掉,然后通过mynginx.tar 去创建新的镜像和容器

  • 再补上一步,删除我们容器保存下来的镜像:docker rmi mynginx_i

  • 然后我们通过之前备份的镜像文件 mynginx.tar试图恢复:docker load -i mynginx.tar

  • 镜像已经恢复,我们创建容器用它创建容器,再次提供服务试试:

docker run -di --name=myNginx -p 888:80 mynginx_i

Dockerfile脚本

Dockerfile简单介绍

Dockerfile就是一系列命令和参数构成的脚本,在基础镜像创建新镜像的时候被运用,说起来可能有点抽象,下面我们演示一下,你就会尤其有深刻的印象

先把常用的命令记下来,后面在解释:

命令 解释
FROM 镜像:tag 定义了使用那个基础镜像构建新的镜像
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量,可以写多条
RUN command 是Dockerfile和核心部分,可以写多条,在容器内会被执行
ADD file file 将宿主机上的文件复制到容器内,如果是压缩文件,会自动解压
COPY file file 和ADD相似,区别在于如果是压缩文件,不会自动解压
WORKDIR pathDir 设置工作目录
EXPOSE port1 port2 指定端口,使容器内的应用可以和外界进行交互
CMD argument 在构建容器时,会被docker run 后的argument覆盖
ENTRYPOINT argument 和CMD相似,但不会被docker run后指定的参数覆盖
VOLUME 将本地文件夹或者其他容器的文件挂在到容器中

使用脚本创建镜像

首先我们上传我们的jdk8到Linux上,我把它上传到:/usr/local/jdk8/ 下

然后我们对其进行解压,获得它解压后的名称后即可删掉解压了得文件,留下压缩包即可

创建一个固定文件名的Dockerfile文件,作为脚本文件,并键入数据:

保存退出,执行以下命令,通过这个脚本创建

新的镜像: docker build -t='jdk1.8' .

  • docker build :构建命令

  • -t=' ' :给创建的新镜像命名

  • . :指定Dockerfile的路径, .表示在当前路径下

然后就报错了:没有这个文件或者文件夹?然后我又试着修改了一下

再次构建试试:构建成功了一个基于Centos环境基础的带有jdk的镜像

创建容器测试:OK

Docker私有仓库

私有仓库的搭建和配置

dockerhub用于托管一些共同的镜像,就想github一样,一般在企业中都是不会将代码托管到开放到公共的平台上,这个时候,我们都会搭建一个私服,用于存放我们自己自定义的一些数据,一方面是为了安全,另一方面是想完成小范围的共享;

在docker容器中运行原生的私有仓库:

  • docker pull registry

运行仓库:

  • docker run -di --name=regirstry -p 5000:5000 regirstry

私有仓库就算是搭建完成了,我们可以启动浏览器测试一番:看到这里私有仓库就算搭建完成了

修改daemon.json。让docker信任私有仓库地址

  • vi /etc/docker/daemon.json,上一条数据是我们的的镜像源地址

重启Docker服务即可完成

私库镜像的上传与下载

在本地镜像的上传之前,我们需要将registry服务开起来:

  • docker start registry

上传第一步:打标签,标记此镜像为私有仓库的镜像

  • docker tag jdk1.8 192.168.159.189:5000/jdk1.8

上传第二部:推送到私服

  • docker push 192.168.159.189:5000/jdk1.8

通过浏览器,查看:镜像推送成功

当我们想要下载该镜像的时候,记得修改daemon.json对该私服的信任,重启docker

  • docker pull 192.168.159.189:5000/jdk1.8即可完成下载

...待补充线

张嘴高并发,闭口微服务,Docker不了解一下?的更多相关文章

  1. 微服务 + Docker + Kubernetes 入门实践 目录

    微服务 + Docker + Kubernetes 入门实践: 微服务概念 微服务的一些基本概念 环境准备 Ubuntu & Docker 本文主要讲解在 Ubuntu 上安装和配置 Dock ...

  2. spring cloud微服务docker启动

    1. 背景 将系统拆分成微服务,一个系统可能拆分成十几个服务,服务太多会影响发布和管理,所以容器话之后易于管理和版本发布,鉴于此将spring cloud微服无docker容器化. 2.依赖环境 Ce ...

  3. Python Tornado搭建高并发Restful API接口服务

    Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快能实现高并发.得利于其 非阻塞的方式和对epoll的运用,Torn ...

  4. 使用Redis实现高并发分布式序列号生成服务

    序列号的构成 为建立良好的数据治理方案,作数据掌握.分析.统计.商业智能等用途,业务数据的编码制定通常都会遵循一定的规则,一般来讲,都会有自己的编码规则和自增序列构成.比如我们常见的身份证号.银行卡号 ...

  5. SpringCloudAlibaba微服务docker容器打包和部署示例实战

    概述 我们使用前面<SpringCloudAlibaba注册中心与配置中心之利器Nacos实战与源码分析(中)>的两个微服务示例,分别是库存微服务和订单微服务,基于Nacos注册中心和配置 ...

  6. 个人项目开源之c++基于epoll实现高并发游戏盒子(服务端+客户端)源代码

    正在陆续开源自己的一些项目 此为c++实现高并发的游戏盒子,平台问题需要迁移重构,所以有一些遗留问题,客户端异常断开没有处理,会导致服务器崩溃,还有基于快写代码编程平台实现的小程序切换,线程读写缓存没 ...

  7. 跟我学SpringCloud | 第十八篇:微服务 Docker 化之基础环境

    1. 容器化 Docker 的横空出世,给了容器技术带来了质的飞跃,Docker 标准化了服务的基础设施,统一了应用的打包分发,部署以及操作系统相关类库等,解决了测试生产部署时环境差异的问题.对于运维 ...

  8. SpringCloud微服务Docker部署

    前两写了两篇,都是为SpringCloud+Docker部署做准备,在部署的时候,不同服务器,不同的Docker容器之间的通信,还好没有掉到坑里去,在公司里用了新技术,还是很开心的,小有成就感,之前一 ...

  9. 弘康人寿基于 RocketMQ 构建微服务边界总线的实践

    随着互联网+和平台化战略的兴起,各个行业的 IT 系统都在向互联网架构发展,涉及的主要技术包括微服务.消息和弹性计算等,采用微服务架构实现服务高内聚.低耦合,通过异步消息完成交易快速响应和高并发.由于 ...

随机推荐

  1. Administrator 被禁用

    Administrator 被禁用 问题: 重装系统后出现输入用户名和密码的情况,原因是Administrator被禁用. 解决方法: 1.开机后shift+重启 –>选择疑难解答 --> ...

  2. vue学习笔记(五)— 组件通信

    关于vue父子组件通信 作者:狐狸家的鱼 本文链接:vue组件通信 GitHub:sueRimn 如果组件是一个单页面,组件之间存在父子关系,数据传递就需要根据父子不同的地位使用不同的办法. 借助新建 ...

  3. cocos2D-X call JNIHelper

    #ifndef _WIN32 JNIEnv *j = JniHelper::getEnv(); if (j == nullptr || j == NULL) {test += "JNIEnv ...

  4. boost regex expression

    Boost.Regex provides three different functions to search for regular expressions 1. regex_match #inc ...

  5. toleft时设置TabSequence属性为tsReversetoright时设置TabSequence属性为tsStandard

    使用这2人控件时,属性taborientation设为toleft时有个问题,具体如下设为toleft时tab会跑到左侧,这时的tab上的文字是反的.当设置为toright时,tab在右侧,这时的ta ...

  6. vue+express+mysql +node项目搭建

    项目搭建前需要先安装node环境及mysql数据库. 1.利用vue-cli脚手架创建一个vue项目 a.全局安装 npm install -g vue-cli b.初始化项目 vue init we ...

  7. tp5.0如何获取header的Authorization值

    tp5.0如何获取header的Authorization值$request->header();好像没有这个值的但是发送请求头部有的 解决方案: 在.htaccess 文件中加入 设置 Set ...

  8. SpringBoot之Spring@Value属性注入使用详解

    在使用Spring框架的项目中,@Value是使用比较频繁的注解之一,它的作用是将配置文件中key对应的值赋值给它标注的属性.在日常使用中我们常用的功能都比较简单,本篇文章系统的带大家来了解一下@Va ...

  9. (55)C# windows 消息

    窗体捕获消息 namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeC ...

  10. Struts1.3——Struts入门

    1.Struts的几个基本概念 1.struts是一个开源框架(frameset) 2.struts是一个Web框架 3.struts是一个基于MVC的Web框架 2.为什么有struts 因为我们对 ...