一、初识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镜像加速 【阿里云】

  1. 注册阿里云账号,专用加速器地址路径:

    https://cr.console.aliyun.com/#/accelerator

  1. 配置镜像加速地址

[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 拉取镜像

  1. 不带版本号默认拉取最新版本

[root@docker ~]# docker pull nginx
Using default tag: latest
[root@docker ~]# docker pull busybox
Using default tag: latest
  1. 带版本号即拉取指定服务版本

[root@docker ~]# docker pull nginx:1.17.0-alpine
1.17.0-alpine: Pulling from library/nginx
  1. 查看当前主机的镜像列表【这两种一样】

[root@docker ~]# docker images
[root@docker ~]# docker image ls
  1. 【说明:】 有两种实用的镜像:

    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 基础入门的更多相关文章

  1. Docker系列03—Docker 基础入门

    本文收录在容器技术学习系列文章总目录 1.概念介绍 1.1 容器 1.1.1 介绍 容纳其它物品的工具,可以部分或完全封闭,被用于容纳.储存.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. ...

  2. Docker系列一之基础快速入门企业实战

    1.1什么是LXC LXC为Linux Container的简写.Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚 ...

  3. Docker系列01—容器的发展历程---Docker的生态圈

    本文收录在容器技术学习系列文章总目录 Docker 和容器技术的发展可谓是日新月异,本文试图以全局的视角来梳理一下 docker 目前的生态圈.既然是概览,所以不会涉及具体的技术细节. Docker ...

  4. Docker系列之.NET Core入门(三)

    前言 在Docker生态系统中除了上一节所讲解的基本概念,还有其他专业术语,本文我们将一笔带过,同时会开始陆续进入到在.NET Core中使用Docker. 专业术语 Docker Engine(Do ...

  5. 简明教程 | Docker篇 · 其一:基础入门

    了解Docker Docker是什么 Docker是指容器化技术,用于支持创建和使用 Linux 容器,同时Docker也是软件容器平台. 什么是容器(container) 容器是主机上与其他进程隔离 ...

  6. Docker 系列01: Centos7.3 上安装docker

    Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施.容器 ...

  7. Docker系列之Docker镜像(读书笔记)

    一.基本概念 Docker包括三个基本概念镜像.容器.仓库. Docker镜像:就是一个只读的模板.例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Apache或其他应用程序.用 ...

  8. Docker系列05—Docker 存储卷详解

    本文收录在容器技术学习系列文章总目录 1.存储卷介绍 1.1 背景 (1)docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加面成,启动容器时,docker会加载只读镜像层并在镜 ...

  9. Docker系列03—Docker 存储卷

    一.存储卷介绍 1.1 背景 Docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在镜像栈顶部加一个读写层: 如果运行的容器修改了 ...

随机推荐

  1. spring-boot-route(十三)整合RabbitMQ

    这篇是SpringBoot整合消息队列的第一篇文章,我们详细介绍下消息队列的相关内容. 消息队列简介 1. 什么是消息队列 MQ(Message Quene):通过典型的生产者和消费者模型,生产者不断 ...

  2. GIS和视频监控的集成

    本文讨论了使用增强现实(AR)技术的三维(3D)地理信息系统(GIS)和视频监视系统的集成.进行这种集成的动机是要克服常规视频监视系统面临的问题.关于哪个摄像机当前监视此类系统中哪个区域的明确信息:因 ...

  3. ASP.Net Core3.1 生成二维码填坑

    ASP.Net Core3.1 使用QrCode生成二维码 部署到Linux报错 The type initializer for 'System.DrawingCore.GDIPlus' threw ...

  4. day12 Pyhton学习

    一.昨日内容回顾 1.函数名 函数名是一个变量名 可以作为集合类的元素 可以作为参数进行传递 def  func(fn): fn() 可以作为返回值返回 def outer(): def inner( ...

  5. JDBC的学习(一)

    JDBC的学习(一) 概念 所谓英文简写的意思是:Java DataBase Connectivity ,即 Java数据库的连接,用Java语言来操作数据库 本质 简单的来说,就是写这个JDBC的公 ...

  6. selenium等待机制学习笔记

    转载至: https://blog.csdn.net/huilan_same/article/details/52544521 1. 强制等待 第一种也是最简单粗暴的一种办法就是强制等待sleep(x ...

  7. 【思维】UVA 11300 Spreading the Wealth

    题目大意 vjudge链接 有n个人围圆桌而坐,每个人有Ai个金币,每个人可以给左右相邻的人一些金币. 若使得最终所有人金币数相等,求最小金币转移数. 数据范围 n<1000001 样例输入 3 ...

  8. Vue.js 学习笔记之五:编译 vue 组件

    正如上一篇笔记中所说,直接使用 ES6 标准提供的模块规范来编写 Vue 组件在很多情况下可能并不是最佳实践.主要原因有两个,首先是市面上还有许多并没有对 ES6 标准提供完全支持的 Web 浏览器, ...

  9. PHP 超级全局变量 $_GET

    https://www.php.cn/php/php-superglobals.html https://m.php.cn/code/11853.html

  10. go 解析path

    使用库 https://github.com/antchfx/htmlquery package main import ( "fmt" "github.com/antc ...