Docker系列01—Docker 基础入门
一、初识Docker和容器
1.1 什么是docker
容纳其他物品的工具,可以部分或完全封闭,被用于容纳、存储、运输物品。物体可以被放置在容器中,而容器则可以保护内容物。
容器? 容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名等。
总结:
与宿主机使用同一个内核,性能损耗小;
不需要指令级模拟;
容器可以在CPU核心的本地运行指令,不要要任何专门的解释机制;
避免了准虚拟机和系统调用替换中的复杂性;
轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机之间的资源共享。
1.2 docker容器技术与传统虚拟机技术的比较
1.3 要使用容器必须需要在内核级支持2种技术
namespace 名称空间
cotrol group(cgroup) 控制组
为什么centos6版本不能使用容器?
因为centos6的内核版本是2.6;容器需要一个user的名称空间,知道内核版本3.8才有:
control group(cgroup)
blkio: 块设备
cpu: CPU
cpuacct: CPU资源使用报告
cpuset: 多处理平台上的CPU集合
devices: 设备访问
memory: 内存用量及报告
perf_event: 对cgroup中的任务进行统一性能测试
net_cls: cgroup中的任务创建的数据报文的类别标识符
1.4 docker介绍
Docker是一个开放源代码软件项目,让应用程序布署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施。
依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。”
1.5 docker运行架构
二、安装启动Docker
2.1 安装环境
1)依赖的基础环境:
- 64位CPU
- Linux kernel(内核) 3.10+
- Linux kernel cgroups and namespaces
2) 查询自己服务器的状态
使用的服务器版本
[root@docker ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
内核版本
[root@docker ~]# uname -r
3.10.0-862.el7.x86_64
ip地址【这里使用的是腾讯云,不显示公网】
[root@docker ~]# hostname -I
172.17.32.10
2.2 安装docker
2.2.1 使用官方安装脚本自动安装 【缺点:不能安装自定义版本】
[root@docker ~]# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2.2.2 Centos7 【使用yum安装,推荐】
# 1. 添加docker-ce源信息
[root@docker ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo # 2. 修改docker-ce源
[root@python ~]# sed -i 's@download.docker.com@mirrors.tuna.tsinghua.edu.cn/docker-ce@g' /etc/yum.repos.d/docker-ce.repo # 3. 更新并安装docker-ce 【安装的默认是最新版本】
[root@docker ~]# yum makecache fast
[root@docker ~]# yum -y install docker-ce
=====安装指定版本的docker====
1,查看都有那些版本
[root@docker ~]# yum list docker-ce.x86_64 --showduplicates | sort -r
2,下载指定版本,我在这里下载的稳定版本
[root@docker ~]# yum -y install docker-ce-17.03.2.ce
2.3 升级docker 【需要了解】
2.3.1 查找主机上关于docker的软件包
[root@docker ~]# rpm -qa |grep docker
python36-docker-pycreds-0.2.1-2.el7.noarch
python36-dockerpty-0.4.1-10.el7.noarch
python36-docker-2.6.1-3.el7.noarch
docker-client-1.13.1-103.el7.x86_64
docker-1.13.1-103.el7.x86_64
docker-compose-1.13.1-103.el7.noarch
2.3.2 使用yum remove 卸载软件 【docker-client,docker-commen,docker-版本号】
[root@docker ~]# yum remove docker-client-1.13.1-103.el7.x86_64
[root@docker ~]# yum remove docker-1.13.1-103.el7.x86_64
[root@docker ~]# yum remove docker-compose-1.13.1-103.el7.noarch
2.3.3 使用curl 升级到最新版本 / 或者使用yum的方式
[root@docker ~]# curl -fsSL https://get.docker.com/ | sh
2.3.4 在线升级docker后出现的问题
【问题】: 原本启动的容器无法被启动,显示
Error response from daemon: Unknown runtime specified docker-runc
【解决】:
[root@docker ~]# grep -rl ‘docker-runc’ /var/lib/docker/containers/
[root@docker ~]# grep -rl 'docker-runc' /var/lib/docker/containers/ | xargs sed -i 's/docker-runc/runc/g'
[root@docker ~]# systemctl restart docker
2.4 启动docker
2.4.1 配置docker镜像加速 【docker cn 加速】
[root@docker ~]# mkdir -p /etc/docker
[root@docker ~]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
2.4.2 配置docker镜像加速 【阿里云】
注册阿里云账号,专用加速器地址路径:
https://cr.console.aliyun.com/#/accelerator
配置镜像加速地址
[root@docker ~]# mkdir -p /etc/docker
[root@docker ~]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF # 修改配置文件后需要重载配置文件和重启容器
[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl restart docker
2.4.3 启动docker服务
# 1.重新加载docker的启动配置 【一般在修改了daemon.json文件后使用】 [root@docker ~]# systemctl daemon-reload # 2. 将docker设置为开机自启 [root@docker ~]# systemctl enable docker # 3. 启动/重启docker服务 [root@docker ~]# systemctl start docker
[root@docker ~]# systemctl restart docker
-查看docker版本-
[root@docker ~]# docker version
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:27:04 2020
OS/Arch: linux/amd64
Experimental: false Server: Docker Engine - Community
Engine:
Version: 19.03.8
API version: 1.40 (minimum version 1.12)
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:25:42 2020
OS/Arch: linux/amd64
Experimental: false
三、Docker的基础命令
3.1 镜像操作
3.1.1 搜索官方仓库的镜像
[root@docker ~]# docker search nginx
搜索结果:
参数 |
说明 |
NAME |
镜像名称 |
DESCRIPTION |
镜像描述 |
STARS |
点赞数量(认同) |
OFFICIAL |
是否为官方 |
AUTOMATED |
是否是自动构建 |
3.1.2 拉取镜像
不带版本号默认拉取最新版本
[root@docker ~]# docker pull nginx
Using default tag: latest
[root@docker ~]# docker pull busybox
Using default tag: latest
带版本号即拉取指定服务版本
[root@docker ~]# docker pull nginx:1.17.0-alpine
1.17.0-alpine: Pulling from library/nginx
查看当前主机的镜像列表【这两种一样】
[root@docker ~]# docker images
[root@docker ~]# docker image ls
【说明:】 有两种实用的镜像:
BusyBox : 集成了一百多个最常用的linux命令的精简工具箱,不到2M。被称为'linux系统的瑞士军刀'。
Alpine : 面向安全的轻型linux发行版,关注安全,性能和资源效能。
3.1.3 导出镜像
[root@docker~]# docker image save busybox > save-busybox.tar.gz
[root@docker ~]# ll save-busybox.tar.gz
-rw-r--r-- 1 root root 1446400 Mar 27 17:13 save-busybox.tar.gz [root@docker ~]# docker image save -o /tmp/nginx_busybox.tar.gz busybox nginx
[root@docker ~]# ll /tmp/nginx_busybox.tar.gz
-rw------- 1 root root 155635200 Mar 27 18:20 /tmp/nginx_busybox.tar.gz
【参数说明: 】
· -o : 指定导出镜像的位置;
· 可以指定多个镜像打包为一个文件;
· 指定为.tar.gz的文件,可以解压。
3.1.4 删除镜像 【两种方式一样】
[root@docker ~]# docker rmi busybox
Untagged: busybox:latest [root@docker ~]# docker image rm busybox
Untagged: busybox:latest
3.1.5 导入镜像
[root@docker ~]# docker load -i save-busybox.tar.gz
a6d503001157: Loading layer [==================================================>] 1.437MB/1.437MB
Loaded image: busybox:latest
3.2 容器操作
3.2.1 启动容器
docker run 镜像名 eg: docker run [options] image [command] [arg..] options 常用命令选项: · -t : 打开一个终端,想使用交换机一样使用容器 · -i : 以交互模式运行容器,通常与 -t 同时使用 · --name : 为启动的容器起一个名字 · --network : 为启动的容器指定一个网络 · --rm : 容器一但停止,自动删除【一般用于测试】 · -d : 后台运行 容器,并返回容器ID · -a : 指定标准输入输出内容类型,可选【stdin | stdout | stderr】 · -h : 指定容器的hostname · -t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用 · -e : A="b",设置环境变量 · --env-file=[] : 从指定文件读入环境变量 · -m : 设置容器使用内存的最大值 · --net="" : 指定容器的网络连接类型,支持【bridge|host|none|container】类型 · --link=[] : 添加链接到另一个容器 · --expose=[] : 开放一个端口或一组端口 · --volume , -v : 绑定一个卷 · -P : 随机端口映射,容器内部端口随机映射到主机的高端口 · -p :指定端口映射,格式为:【主机(宿主)端口:容器端口】 · -dns 8.8.8.8 : 指定容器使用的DNS服务器,默认和宿主机一致 · -dns-search example.com : 指定容器DNS搜索域名,默认和宿主一致
示例:运行一个容器
[root@docker ~]# docker run -d --name web01 -p 1234:80 nginx:1.17.0-alpine
339995b22002ffaad4b86014608bd58818dafc6a942bb945c44a75a3411e3f0a
[root@docker ~]# docker port web01 # 查看端口映射情况
80/tcp -> 0.0.0.0:1234 #将容器的80/tcp端口,映射到宿主机的1234端口
[root@python ~]# docker ps -a # 显示全部容器状态
[root@python ~]# docker ps # 只显示运行的容器
参数说明:
CONTAINER ID: 容器的专属ID
IMAGE: 基于哪一个进项启动的
COMMAND: 服务运行的命令【后面详解】
CREATED: 创建时间,距离当前时间
STATUS: 容器的状态,up为运行,down为关闭
PORTS: 容器的映射端口
NAME: 容器的专属别名
示例:运行一个容器并进入
[root@docker ~]# docker run -it --name busybox_01 busybox /bin/sh
/ # ls
bin dev etc home proc root sys tmp usr var
/ # exit 退出进入的容器
[root@docker ~]#
3.2.2 停止运行中的容器
docker stop 关闭运行的容器 docker kill 杀死运行的容器
3.2.3 激活关闭中的容器
# docker start [root@docker ~]# docker start busybox_01
busybox_01
3.2.4 查看容器的详细信息
[root@docker ~]# docker inspect web01 显示详细信息
[root@docker ~]# docker inspect web01 | grep 'IPAddress'
"SecondaryIPAddresses": null,
"IPAddress": "172.18.0.2",
"IPAddress": "172.18.0.2",
3.2.5 删除容器
[root@docker ~]# docker kill web01 先关闭
web01
[root@docker ~]# docker rm web01 再删除
web01
[root@docker ~]# docker rm -f busybox_01 先关闭再删除
busybox_01
[root@python ~]# docker rm -f `docker ps -a -q`
删除所有容器, -f 强制删除
3.2.6 对运行的容器执行指定命令exec
[root@docker ~]# docker exec
[root@docker ~]# docker container exec
格式 Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] options 选项 · -d : 在后台运行命令 · -e : 设置环境变量 · -i : 交互式 · -t : 打开一个终端 · -u : 用户名或UID
示例:
[root@docker ~]# docker run -d -p 1234:80 --name web01 nginx:1.17.0-alpine
· 在容器外部执行命令[查看ip] [root@docker ~]# docker exec web01 ip a |grep '172'
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
3.2.7 查询容器内部日志
[root@docker ~]# curl 0.0.0.0:1234
[root@docker ~]# docker logs web01
172.18.0.1 - - [31/Mar/2020:06:09:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
3.2.8 图形总结命令
3.3 补充操作
# 类似于linux的 df 命令,用于查看Docker的磁盘使用情况
[root@docker ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 54 6 12.41GB 11.84GB (95%)
Containers 6 5 199B 0B (0%)
Local Volumes 3 2 146.9MB 15B (0%)
Build Cache 0 0 0B 0B # 用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
[root@docker ~]# docker system prune # 清理的更加彻底,可以将没有容器使用的Docker镜像都删除掉(慎重!)
[root@docker ~]# docker system prune -a
Docker系列01—Docker 基础入门的更多相关文章
- Docker系列03—Docker 基础入门
本文收录在容器技术学习系列文章总目录 1.概念介绍 1.1 容器 1.1.1 介绍 容纳其它物品的工具,可以部分或完全封闭,被用于容纳.储存.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. ...
- Docker系列一之基础快速入门企业实战
1.1什么是LXC LXC为Linux Container的简写.Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚 ...
- Docker系列01—容器的发展历程---Docker的生态圈
本文收录在容器技术学习系列文章总目录 Docker 和容器技术的发展可谓是日新月异,本文试图以全局的视角来梳理一下 docker 目前的生态圈.既然是概览,所以不会涉及具体的技术细节. Docker ...
- Docker系列之.NET Core入门(三)
前言 在Docker生态系统中除了上一节所讲解的基本概念,还有其他专业术语,本文我们将一笔带过,同时会开始陆续进入到在.NET Core中使用Docker. 专业术语 Docker Engine(Do ...
- 简明教程 | Docker篇 · 其一:基础入门
了解Docker Docker是什么 Docker是指容器化技术,用于支持创建和使用 Linux 容器,同时Docker也是软件容器平台. 什么是容器(container) 容器是主机上与其他进程隔离 ...
- Docker 系列01: Centos7.3 上安装docker
Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施.容器 ...
- Docker系列之Docker镜像(读书笔记)
一.基本概念 Docker包括三个基本概念镜像.容器.仓库. Docker镜像:就是一个只读的模板.例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Apache或其他应用程序.用 ...
- Docker系列05—Docker 存储卷详解
本文收录在容器技术学习系列文章总目录 1.存储卷介绍 1.1 背景 (1)docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加面成,启动容器时,docker会加载只读镜像层并在镜 ...
- Docker系列03—Docker 存储卷
一.存储卷介绍 1.1 背景 Docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在镜像栈顶部加一个读写层: 如果运行的容器修改了 ...
随机推荐
- spring-boot-route(十三)整合RabbitMQ
这篇是SpringBoot整合消息队列的第一篇文章,我们详细介绍下消息队列的相关内容. 消息队列简介 1. 什么是消息队列 MQ(Message Quene):通过典型的生产者和消费者模型,生产者不断 ...
- GIS和视频监控的集成
本文讨论了使用增强现实(AR)技术的三维(3D)地理信息系统(GIS)和视频监视系统的集成.进行这种集成的动机是要克服常规视频监视系统面临的问题.关于哪个摄像机当前监视此类系统中哪个区域的明确信息:因 ...
- ASP.Net Core3.1 生成二维码填坑
ASP.Net Core3.1 使用QrCode生成二维码 部署到Linux报错 The type initializer for 'System.DrawingCore.GDIPlus' threw ...
- day12 Pyhton学习
一.昨日内容回顾 1.函数名 函数名是一个变量名 可以作为集合类的元素 可以作为参数进行传递 def func(fn): fn() 可以作为返回值返回 def outer(): def inner( ...
- JDBC的学习(一)
JDBC的学习(一) 概念 所谓英文简写的意思是:Java DataBase Connectivity ,即 Java数据库的连接,用Java语言来操作数据库 本质 简单的来说,就是写这个JDBC的公 ...
- selenium等待机制学习笔记
转载至: https://blog.csdn.net/huilan_same/article/details/52544521 1. 强制等待 第一种也是最简单粗暴的一种办法就是强制等待sleep(x ...
- 【思维】UVA 11300 Spreading the Wealth
题目大意 vjudge链接 有n个人围圆桌而坐,每个人有Ai个金币,每个人可以给左右相邻的人一些金币. 若使得最终所有人金币数相等,求最小金币转移数. 数据范围 n<1000001 样例输入 3 ...
- Vue.js 学习笔记之五:编译 vue 组件
正如上一篇笔记中所说,直接使用 ES6 标准提供的模块规范来编写 Vue 组件在很多情况下可能并不是最佳实践.主要原因有两个,首先是市面上还有许多并没有对 ES6 标准提供完全支持的 Web 浏览器, ...
- PHP 超级全局变量 $_GET
https://www.php.cn/php/php-superglobals.html https://m.php.cn/code/11853.html
- go 解析path
使用库 https://github.com/antchfx/htmlquery package main import ( "fmt" "github.com/antc ...