Docker 容器化学习

文章目录

  • 前言
    • Docker架构
  • 1、 docker安装
  • 2、启动docker服务
  • 3、设置docker随机器一起启动
  • 4、docker体验
  • 5、docker常规命令
    • 5.1、容器操作
      • docker [run|start|stop|restart|kill|rm|pause|unpause]
      • docker [ps|inspect|exec|logs|export|import]
    • 5.2、镜像操作
      • docker images|rmi|tag|build|history|save|load]
        • history查看镜像组成:
        • 查看镜像文件
        • 查看镜像层文件
    • 5.3、镜像与容器总结
    • 5.4、仓库操作
    • 5.5、私有仓库使用
  • 6、容器创建详解
    • 6.1、交互式创建容器并进入:
    • 6.2、后台启动容器:
    • 6.3、进入已运行的容器
    • 6.4、绑定容器端口到主机
    • 6.5、挂载主机文件目录到容器内
    • 6.6、复制主机文件到容器内
  • 7、Docker卸载
    • 7.1、kill掉docker进程
    • 7.2、删除docker所在目录
    • 7.3、查询安装过的包
    • 7.4、删除安装的软件包
    • 7.5、查看卸载成功

前言

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

为什么要用docker?

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

与虚拟机做对比

特性容器虚拟机
启动秒级分钟级
硬盘占用MBGB
性能接近原生弱于
系统支持量单机支持上千容器一般几十个

优点:

  • 更快速的交付和部署
    对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
    开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
  • 更高效的虚拟化
    Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
  • 更轻松的迁移和扩展
    Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
  • 更简单的管理
    使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

Docker架构

在这里插入图片描述
在这里插入图片描述
容器和镜像的关系,就类似于类与对象的关系。
镜像之间也存在------层间继承关系
容器类似 镜像new的对象。

1、 docker安装

CentOS 7环境下,输入命令:

sudo yum install docker -y

安装的是默认版本,安装完后查看版本:

docker version

在这里插入图片描述
如果安装指定版本,则:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
sudo yum install docker-ce

2、启动docker服务

sudo service docker start

之后查看一下版本,可以看到客户端和服务端版本信息:
在这里插入图片描述

3、设置docker随机器一起启动

sudo chkconfig docker on

在这里插入图片描述

4、docker体验

运行 hello-world
在这里插入图片描述

5、docker常规命令

在这里插入图片描述

5.1、容器操作

docker [run|start|stop|restart|kill|rm|pause|unpause]

• run/create[镜像名]: 创建一个新的容器并运行一个命令
• start/stop/restart[容器名]:启动/停止/重启一个容器
• kill [容器名]: 直接杀掉容器,不给进程响应时间
• rm[容器名]:删除已经停止的容器
• pause/unpause[容器名]:暂停/恢复容器中的进程

tips:

docker run -d --name cont1
docker run dti --name cont2

docker [ps|inspect|exec|logs|export|import]

• ps:查看容器列表(默认查看正在运行的容器,-a查看所有容器)
• inspect[容器名]:查看容器配置元数据
• exec -it [容器名] /bin/bash:进入容器环境中交互操作
• logs --since=“2019-02-01” -f --tail=10 [容器名]:查看容器日志
• cp path1 [容器名]:path 容器与主机之间的数据拷贝
• export -o test.tar [容器名] / docker export [容器名]>test.tar : 文件系统作为一个tar归档文件
• import test.tar [镜像名:版本号]:导入归档文件,成为一个镜像

举个例子查看日志:
在这里插入图片描述
docker查看正在运行的容器:

docker ps -a

在这里插入图片描述

停止运行的单个&所有容器:

docker stop registry
docker stop $(docker ps -a -q)

删除容器:

docker rm registry 
# 删除全部同上格式

(这里记录一下:如果新开了一个容器运行了私有仓库,然后再次开启容器运行时会提示被占用,需要停止并删除原有的容器再次操作)

5.2、镜像操作

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 : 从归档文件加载镜像

history查看镜像组成:

docker history hello-world
在这里插入图片描述
显示镜像hello-world分三层,其中两个空层。

查看镜像文件

镜像存放在imagedb里;一般在image/pverlay2/imagedb/content/sha256下
在这里插入图片描述
打开一个镜像文件查看其内容:

cat f09fe80eb0e75e97b04b9dfb065ac3fda37a8fac0161f42fca1e6fe4d0977c80

{
	"architecture": "amd64",
	"config": {
		"Hostname": "",
		"Domainname": "",
		"User": "",
		"AttachStdin": false,
		"AttachStdout": false,
		"AttachStderr": false,
		"Tty": false,
		"OpenStdin": false,
		"StdinOnce": false,
		"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
		"Cmd": ["/hello"],
		"ArgsEscaped": true,
		"Image": "sha256:a6d1aaad8ca65655449a26146699fe9d61240071f6992975be7e720f1cd42440",
		"Volumes": null,
		"WorkingDir": "",
		"Entrypoint": null,
		"OnBuild": null,
		"Labels": null
	},
	"container": "8e2caa5a514bb6d8b4f2a2553e9067498d261a0fd83a96aeaaf303943dff6ff9",
	"container_config": {
		"Hostname": "8e2caa5a514b",
		"Domainname": "",
		"User": "",
		"AttachStdin": false,
		"AttachStdout": false,
		"AttachStderr": false,
		"Tty": false,
		"OpenStdin": false,
		"StdinOnce": false,
		"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
		"Cmd": ["/bin/sh", "-c", "#(nop) ", "CMD [\"/hello\"]"],
		"ArgsEscaped": true,
		"Image": "sha256:a6d1aaad8ca65655449a26146699fe9d61240071f6992975be7e720f1cd42440",
		"Volumes": null,
		"WorkingDir": "",
		"Entrypoint": null,
		"OnBuild": null,
		"Labels": {}
	},
	"created": "2019-01-01T01:29:27.650294696Z",
	"docker_version": "18.06.1-ce",
	"history": [{
		"created": "2019-01-01T01:29:27.416803627Z",
		"created_by": "/bin/sh -c #(nop) COPY file:f77490f70ce51da25bd21bfc30cb5e1a24b2b65eb37d4af0c327ddc24f0986a6 in / "
	}, {
		"created": "2019-01-01T01:29:27.650294696Z",
		"created_by": "/bin/sh -c #(nop)  CMD [\"/hello\"]",
		"empty_layer": true
	}],
	"os": "linux",
	"rootfs": {
		"type": "layers",
		"diff_ids": ["sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3"]
	}
}

在这里插入图片描述

查看镜像层文件

层文件在layerdb里

ll /var/lib/docker/image/overlay2/layerdb/sha256

在这里插入图片描述
镜像层文件内结构:
在这里插入图片描述

5.3、镜像与容器总结

一个镜像就是一层层的layer层文件,盖楼而成,上层文件叠于下层文件上,若上层文件有与下层文件重复的,则覆盖掉下层文件重复的部分,如下图:
在这里插入图片描述
---------初始挂载时读写层为空。
---------当需要修改镜像内的某个文件时,只对处于最上方的读写层进行了变动,不复写下层已有文件系统的内容,已有文件在只读层中的原始版本仍然存在,但会被读写层中的新版本文件所隐藏,当 docker commit 这个修改过的容器文件系统为一个新的镜像时,保存的内容仅为最上层读写文件系统中被更新过的文件。
---------联合挂载是用于将多个镜像层的文件系统挂载到一个挂载点来实现一个统一文件系统视图的途径,是下层存储驱动(aufs、overlay等) 实现分层合并的方式。

5.4、仓库操作

官方仓库:http://hub.docker.com
在这里插入图片描述
一般拉取镜像前我们先查看有哪些版本,如拉取mysql时:

docker search MySQL

(ps: 这里我出现问题访问网络失败,no route to host 参见:no route to host)

在这里插入图片描述
这里带 OK 标识的表示 是 Docker官方的镜像~
但是又看不到具体有哪些版本,使用如下命令,指定版本查看,没有则结果为空:

docker search MySQL:5.7

在这里插入图片描述

比如拉取 MySQL 镜像:

docker pull MySQL

但是该指令默认拉取最新版本,拉取指定版本使用如下指令:

docker pull MySQL:5.7

删除镜像使用指令:

docker image rm MySQL:5.7

5.5、私有仓库使用

使用官方提供的registry镜像创建私有仓库。

下载registry镜像:

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

在这里插入图片描述
重要步骤:

  • 1、启动本地私有仓库容器并映射端口:
docker run -d --name reg -p 5000:5000 registry

在这里插入图片描述

  • 2、然后记得配置私有仓库地址!(否则后面push时会提示:Get “https://192.168.32.212:5000/v2/”: http: server gave HTTP response to HTTPS client

原因:Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交互时出现以上错误)
在这里插入图片描述
(这里再解释一下 bip,这个设置是自定义给定容器ip的网段,指定后,后续所有docker创建的容器都在网段5之下;不指定时,默认是0.可以输入ip addr查看一下 docker 0 地址)
在这里插入图片描述

  • 3、重新加载并启动docker:
systemctl daemon-reload | systemctl restart docker

给本地镜像打标签归入私有仓库,并重命名(名称及版本):

docker tag hello-world http://192.168.102.2:5000/hello-world

上传镜像到自己的私有仓库:

docker push http://192.168.102.2:5000/hello-world

查询本地仓库

curl http://192.168.102.2:5000/v2/_catalog  |  http://192.168.102.2:5000/v2/hello-world/tags/list

在这里插入图片描述
浏览器访问也可:
在这里插入图片描述


另外,假设已知官方网站自己新建的仓库名,还可以:

docker pull 仓库名/镜像   # 若不指定仓库名,默认是官方仓库下拉取

实现拉取。但是前提需要先登录一下自己在官方docker创建的私有仓库:

docker login   #然后输入账户名密码

最标准拉取:

docker pull ip:port/仓库/镜像(:版本)

6、容器创建详解

在这里插入图片描述

6.1、交互式创建容器并进入:

在这里插入图片描述

docker run -it --name centos centos /bin/bash(前台进程)
---- exit退出也关闭容器; Ctrl+P+Q退出不关闭容器
在这里插入图片描述

6.2、后台启动容器:

在这里插入图片描述
docker run -d --name nginx nginx

6.3、进入已运行的容器

docker exec -it nginx /bin/bash

查看容器的元数据:

docker inspect nginx

6.4、绑定容器端口到主机

docker run -d -p 8080:80 --name nginx nginx:latest

6.5、挂载主机文件目录到容器内

docker run -dit -v /root/peter_dir/:/pdir --name cent centos

6.6、复制主机文件到容器内

docker cp anaconda-ks.cfg cent:/var

7、Docker卸载

7.1、kill掉docker进程

ps -ef|grep docker

kill -9 pid

7.2、删除docker所在目录

rm -rf /etc/docker

rm -rf /run/docker

rm -rf /var/lib/dockershim

rm -rf /var/lib/docker

7.3、查询安装过的包

yum list installed | grep docker

docker-engine.x86_64                 17.03.0.ce-1.el7.centos         @dockerrepo

7.4、删除安装的软件包

yum -y remove xxx 

7.5、查看卸载成功

docker version

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/63238.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入了解 PostgreSQL 扩展插件

深入了解 PostgreSQL 扩展插件 在 PostgreSQL 数据库中&#xff0c;扩展插件是极具价值的工具&#xff0c;它们为我们提供了丰富多样的功能增强。本篇博客将深入介绍几个常用的 PostgreSQL 扩展插件&#xff0c;包括 pg_stat_statements、uuid、postgis 以及 postgis_raster。…

vector模拟实现

vector模拟实现 构造函数拷贝构造函数析构函数赋值运算符重载容量大小相关的函数size()capacity()reserveresize 修改容器内容相关函数push_backpop_backinserteraseswap 访问容器内容相关函数operator[] 与迭代器相关函数begin()和end()关于迭代器失效的问题 构造函数 vector…

【JVM】垃圾回收 ——自问自答2

Q: System.gc() 的理解 System.gc()底层调用的是 Runtime.getRuntime.gc(),会现实出发FullGC。 但是&#xff0c;它的调用附带一个免责声明&#xff0c;无法保证对垃圾收集器的调用。 Q&#xff1a; 内存溢出和内存泄漏&#xff1f; 内存溢出&#xff1a; 简而言之&#xf…

删除这4个文件夹,流畅使用手机无忧

在现代社会中&#xff0c;手机已经成为我们生活中不可或缺的一部分。然而&#xff0c;随着使用时间的增长&#xff0c;我们可能会遇到手机卡顿和内存不足的问题&#xff0c;让我们感到十分困扰。手机卡顿不仅影响使用体验&#xff0c;还可能导致应用程序运行缓慢&#xff0c;甚…

3分钟白话RocketMQ系列—— 核心概念

白话3分钟&#xff0c;快速了解RocketMQ基础&#xff0c;包括适用场景&#xff0c;以及基本概念。 看完如果不了解&#xff0c;欢迎来打我。 关键字摘要 低延迟、高可用、高可靠、高并发 的消息中间件适合在线业务分为producer、consumer、nameserver、broker等角色另外还有主…

第3章 语言基础

引言 任何语言的核心所描述的都是这门语言在最基本的层面上如何工作&#xff0c;涉及语法、操作符、数据类型以及内置功能&#xff0c;在此基础之上才可以构建复杂的解决方案 本章接下来的内容主要基于ECMAScript第6版。ES6 语法 js的语法借鉴了c/c&#xff0c;java。js是相对…

快速消除视频的原声的技巧分享

网络上下载的视频都会有视频原声或者背景音乐&#xff0c;如果不喜欢并且想更换新的BGM要怎么操作呢&#xff1f;今天小编就来教你如何快速给多个视频更换新的BGM&#xff0c;很简单&#xff0c;只需要将原视频的原声快速消音同时添加新的背景音频就行&#xff0c;一起来看看详…

c语言函数作为形参的注意事项

1、c语言数组作为形参会退化成数组指针 #include "stdio.h" #include <stdlib.h>//数组作为函数的形参会退化成指针 void print_arr(int a[5]);// int *b int main() {int arr[5] { 1,2,3,4,5 };print_arr(arr);return 0; }void print_arr(int a[5]) {printf…

UVA1347 旅行 Tour (样例解释 + 思路心得 + 代码)

目录 题目大意 样例解释 第一组样例解释 第二组样例解释 有注释的代码 没有注释的代码 题目大意 样例解释 &#xff08;多组样例&#xff09; 第一组样例解释 第二组样例解释 &#xff08;没有注释的代码实际上很短 在后面&#xff09; 有注释的代码 思路和心得都在代码里, 快…

【Linux】计算机网络的背景和协议分层

文章目录 网络发展协议何为协议网络协议协议分层OSI七层模型TCP/IP五层模型&#xff08;四层&#xff09; 基本通信流程mac地址和ip地址网络通信本质 网络发展 从一开始计算机作为一台台单机使用&#xff0c;到现在网络飞速发展&#xff0c;从局域网Lan建立起局域网&#xff0…

git bash 安装sdkadmin

1.下载相关安装包,复制到git 安装目录 D:\software\Git\mingw64\bin 2. 运行 curl -s "https://get.sdkman.io" | bash

Service not registered 异常导致手机重启分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、Service not registered 异常导致手机重启二、Service not registered 解决方案 一、Service not registered 异常导致手机重启 1.重启 的部分Log如…

某大型医院门户网站性能分析案例

故障现象 门户网站近期出现少量的访问体验慢现象&#xff0c;主要是由于服务器响应时间慢。出现慢页面的页面簇为&#xff1a;http://www.xxx.ac.cn/。 分析过程 下面将分析异常原因:页面的URL信息&#xff1f;页面慢的原因&#xff1f; 性能问题分析&#xff0c;定位到慢访…

不可错过的家装服务预约小程序商城开发指南

在当今社会&#xff0c;家装行业发展迅速&#xff0c;越来越多的人开始寻求专业的家装预约和咨询服务。对于不懂技术的新手来说&#xff0c;创建一个自己的家装预约咨询平台可能听起来很困难&#xff0c;但实际上通过一些第三方制作平台和工具&#xff0c;这个过程可以变得简单…

ES6 数组的用法

1. forEach() 用来循环遍历的 for 数组名.forEach(function (item,index,arr) {})item:数组每一项 , index : 数组索引 , arr:原数组作用: 用来遍历数组 let arr [1, 2, 3, 4]; console.log(arr); let arr1 arr.forEach((item, index, arr) > {console.log(item, index…

客服型电话呼叫中心系统,助力企业提升客户服务质量

客服型电话呼叫中心系统是企业客户服务的重要工具之一&#xff0c;它通过电话和网络等方式&#xff0c;为客户提供快速、便捷、高效的服务。客服型电话呼叫中心系统具备自动接听来电、自动路由、管理知识库、录音和监控、生成报表分析等多种功能&#xff0c;有利于企业提高客户…

【前端 | CSS布局】 网格布局(grid)

概述 网格布局&#xff08;Grid&#xff09;是最强大的 CSS 布局方案。 它将网页划分成一个个网格&#xff0c;可以任意组合不同的网格&#xff0c;做出各种各样的布局。以前&#xff0c;只能通过复杂的 CSS 框架达到的效果&#xff0c;现在浏览器内置了。 上图这样的布局&am…

VS+QT+VTK treeView树型结构模型加载隐藏实例

程序示例精选 VSQTVTK treeView树型结构模型加载隐藏实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<VSQTVTK treeView树型结构模型加载隐藏实例>>编写代码&#xff0c;代码…

uniapp h5支付宝支付后端返回Form表单,前端如何处理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.调取接口拿到后端返回的form表单 前言 uniapp h5 支付宝支付&#xff0c;后端返回一串form表单&#xff0c;前端如何拿到支付串并且调用支付 1.调取接口拿到…

内容动态展示抽屉组件

知识点 mousemove与mouseenter的区别在于mousemove会触发事件冒泡&#xff0c;mouseenter不会&#xff0c;mouseleave同理。 mousemove会触发事件冒泡&#xff0c;因此鼠标在范围区域内移动时会一直触发。 mouseenter只触发一次&#xff0c;鼠标移入后触发&#xff0c;鼠标移…