(二)Docker----安装,docker镜像加速,容器管理,docker命令inspect

一. 安装Docker

在aliyun中找到Docker-ce下载Docker相关的源
里面有集体安装步骤

官方网址https://www.docker.com/

  1. 系统版本选择: Docker 目前已经支持多种操作系统的安装运行,比如 Ubuntu、CentOS、 Redhat、DebianFedora,甚至是还支持了 Mac 和 Windows,在 linux 系统上需要内核版本在 3.10 或以上,docker 版本号之前一直是 0.X 版本或 1.X 版本,例如 17.09 表示是 2017 年 9 月份发布的。

  2. Docker 版本选择
    2017 年推出(将 docker 更名为)新的项目Moby,github 地址:https://github.com/moby/moby,Moby 项目属于 Docker 项
    目的全新上游,Docker 将是一个隶属于的 Moby 的子产品,而且之后的版本之 后开始区分为 CE 版本(社区版本)和 EE(企业收费版),CE 社区版本和 EE 企业版本都是每个季度发布一个新版本,但是 EE 版本提供后期安全维护 1 年,而CE 版本是 4 个月,(稳定3. 6. 9. 12版本)本次演示的 Docker 版本为 18.03,以下为官方原文:
    https://blog.docker.com/2017/03/docker-enterprise-edition/
    在这里插入图片描述

1. 下载 rpm 包安装

官方 rpm 包下载地址:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
阿里镜像下载地址
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/

在这里插入图片描述

在这里插入图片描述

2. 通过修改 yum 源安装

直接下载.repo的yum源
直接wget
在这里插入图片描述

rm -rf /etc/yum.repos.d/*

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install docker-ce -y

3. 验证

  1. 启动并验证 docker 服务
    systemctl start docker
    systemctl enable docker
    记住能不重启就不要重启,重启会丢失Docker所有的内容,包括镜像等
    在这里插入图片描述
  2. 验证 docker 版本

在这里插入图片描述

  1. 验证 docker0 网卡
    在 docker 安装启动之后,默认会生成一个名称为 docker0 的网卡并且默认 IP 地 址为172.17.0.1 的网卡
    在这里插入图片描述
  2. 验证 docker 信息

在这里插入图片描述

  1. docker 存储引擎

目前 docker 的默认存储引擎为 overlay2,需要磁盘分区支持 d-type 文件分层功能,因此需要系统磁盘的额外支持
官方文档关于存储引擎的选择文档:
https://docs.docker.com/storage/storagedriver/select-storage-driver/
Docker 官方推荐首选存储引擎为 overlay2 其次为 devicemapper,但是devicemapper 存在使用空间方面的一些限制,虽然可以通过后期配置解决,但是官方依然推荐使用 overlay2,以下是网上查到的部分资料:
https://www.cnblogs.com/youruncloud/p/5736718.html
在这里插入图片描述

如果 docker 数据目录是一块单独的磁盘分区而且是 xfs 格式的,
那么需要在格式化的时候加上参数-n ftype=1
否则后期在启动容器的时候会报错不支持 d-type
在这里插入图片描述
报错界面
在这里插入图片描述

  1. docker 服务进程
    通过查看 docker 进程,了解 docker 的运行及工作方式
    查看宿主机进程树
    在这里插入图片描述
    18.06 及之前的 docker 版本,进程关系
    在这里插入图片描述
    7 . 查看 containerd 进程关系
    有四个进程
    dockerd:被 client 直接访问,其父进程为宿主机的 systemd 守护进程。
    docker-proxy实现容器通信,其父进程为 dockerd

containerd:被 dockerd 进程调用以实现与 runc 交互
containerd-shim:真正运行容器的载体,其父进程为 containerd
在这里插入图片描述

containerd-shim命令使用

在这里插入图片描述

容器的创建与管理过程

通信流程

  1. dockerd 通过 grpccontainerd 模块通信,dockerd 由 libcontainerd 负责和 containerd 进行交换,dockerd 和 containerd 通信 socket 件:/run/containerd/containerd.sock
  2. containerd 在 dockerd 启动时被启动,然后 containerd 启动 grpc 请求监听containerd 处 理 grpc 请求,根据请求做相应动作。
  3. 若是 start 或是 exec 容器,containerd 拉起一个 container-shim , 并进行相应的操作。
  4. container-shim 别拉起后,start/exec/create 拉起 runC 进程,通过 exit、control 文件和containerd 通信,通过父子进程关系和 SIGCHLD 监控容器中进程状态
  5. 在整个容器生命周期中,containerd 通过 epoll 监控容器文件监控容器事件

在这里插入图片描述

grpc 简介

gRPC 是 Google 开发的一款高性能、开源和通用的 RPC 框架,支持众多语言客户端

在这里插入图片描述

二. Docker 镜像加速配置

国内下载国外的镜像有时候会很慢,因此可以更改 docker 配置文件添加一个加速器,可以通过加速器达到加速下载镜像的目的。

获取加速地址
浏览器打开 http://cr.console.aliyun.com注册或登录阿里云账号,点击左侧的镜像加速器,将会得到一个专属的加速地址,而且下面有使用配置说明
在这里插入图片描述

三. Docker 镜像管理

Docker 镜像含有启动容器所需要的文件系统及所需要的内容,因此镜像主要用于创建并启动 docker 容器。

Docker 镜像含里面是一层层文件系统,叫做 Union FS联合文件系统),联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统,虚拟文件系统的目录结构就像普通 linux 的目录结构一样,docker 通过这些文件再加上宿主机的内核提供了一个 linux 的虚拟环境,每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的,构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统,一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样,当使用镜像的时候,我们只会看到一个完全的整体,不知道里面有几层也不需要知道里面有几层,结构如下

在这里插入图片描述

一个典型的 Linux 文件系统由 bootfs 和 rootfs 两部分组成,bootfs(boot file system) 主要包含 bootloader 和 kernel,bootloader 主要用于引导加载 kernel, 当 kernel 被加载到内存中后 bootfs 会被 umount 掉rootfs (root file system) 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件,下图就是 docker image 中最基础的两层结构,不同的 linux 发行版(如 ubuntu 和 CentOS ) 在 rootfs 这一层会有所区别。

但是对于 docker 镜像通常都比较小,官方提供的 centos 基础镜像在 200MB 左 右,一些其他版本的镜像甚至只有几 MB,docker 镜像直接调用宿主机的内核,镜像中只提供 rootfs,也就是只需要包括最基本的命令、工具和程序库就可以
了,比如 alpine 镜像,在 5M 左右。下图就是有两个不同的镜像在一个宿主机内核上实现不同的 rootfs
在这里插入图片描述
容器、镜像父镜像
在这里插入图片描述
docker 命令是最常使用的 docker 客户端命令,其后面可以加不同的参数以实现响应的功能

搜索镜像search

在官方的 docker 仓库中搜索指定名称的 docker 镜像,也会有很多三方镜像。

	#带指定版本号
docker search centos:7.2.1511 
	#不带版本号默认 latest
docker search centos 

下载镜像

从 docker 仓库将镜像下载到本地,命令格式如下

 docker pull 仓库服务器:端口/项目名称/镜像名称:tag(版本)号
 
 docker pull alpine
 docker pull nginx
 docker pull hello-world
 docker pull centos

查看本地镜像

下载完成的镜像比下载的大,因为下载完成后会解压

docker images

在这里插入图片描述

镜像导出

可以将镜像从本地导出问为一个压缩文件,然后复制到其他服务器进行导入使用。

  1. 导出方法 1:
docker save centos -o /opt/centos.tar.gz 

ll /opt/centos.tar.gz 
-rw------- 1  205225472 Nov 1 03:52 /opt/centos.tar.gz
  1. 导出方法 2:
docker save centos > /opt/centos-1.tar.gz

ll /opt/centos-1.tar.gz 
-rw-r--r-- 1  205225472 Nov 1 03:52 /opt/centos-1.tar.gz

查看镜像内容

cd /opt/

tar xvf centos.tar.gz

#包含了镜像的相关配置,配置文件、分层
cat manifest.json 
[{"Config":"196e0ce0c9fbb31da595b893dd39bc9fd4aa78a474bbdc21459a3ebe855b
7768.json","RepoTags":["docker.io/centos:latest"],"Layers":["892ebb5d1299cbf459f6
7aa070f29fdc6d83f40
25c58c090e9a69bd4f7af436b/layer.tar"]}]

分层为了方便文件的共用,即相同的文件可以共用

[{"Config":" 配置文件 .json","RepoTags":["docker.io/nginx:latest"],"Layers":[" 分 层
1/layer.tar","分层 2 /layer.tar","分层 3 /layer.tar"]}]

镜像导入

将镜像导入到 docker

scp /opt/centos.tar.gz 192.168.10.206:/opt/

docker load < /opt/centos.tar.gz
或
docker load -i /opt/centos.tar.gz

删除镜像

docker rmi centos

获取运行参数帮助

docker daemon --help

命令总结

	#导入本地镜像
docker load -i centos-latest.tar.xz 
	#centos #导出镜像
docker save > /opt/centos.tar 

	 #删除指定 ID 的镜像,通过镜像启动容器的时
	 		候镜像不能被删除,除非将容器全部关闭
docker rmi 镜像 ID/镜像名称

	#删除容器
docker rm 容器 ID/容器名称 
	#强制删除正在运行的容器
docker rm 容器 ID/容器名-f 

  删除none镜像
docker rmi -f `docker images |grep '<none>'|awk '{print $3}'`

四. 容器操作基础命令

命令格式

docker run [选项] [镜像名] [shell 命令] [参数]

	#单次执行,没有自定义容器名称
docker run [参数选项] [镜像名称,必须在所有选项的后面] [/bin/echo 'hello wold'] 
	 #启动的容器在执行完 shel 命令就退出了
docker run centos /bin/echo 'hello wold'

1. 容器基本操作

从镜像启动一个容器
直接进入到容器,并随机生成容器 ID 和名称

				bash默认有
docker run -it docker.io/centos bash
[root@11445b3a84d3 /]#


退出容器不注销
ctrl+p+q


-d  后台运行

-q 取出PID

显示正在运行的容器

docker ps

显示所有容器
包括当前正在运行以及已经关闭的所有容器:

docker ps -a

删除运行中的容器
即使容正在运行当中,也会被强制删除掉

docker rm -f 11445b3a84d3

2. 随机映射端口

	#下载 nginx 镜像
docker pull nginx 

	#前台启动并随机映射本 地端口到容器的 80
docker run -P docker.io/nginx 

前台启动的会话窗口无法进行其他操作,除非退出,但是退出后容器也会退出
在这里插入图片描述
随机端口映射,其实是默认从 32768 开始
在这里插入图片描述
在这里插入图片描述

3. 指定端口映射

方式 1:本地端口 81 映射到容器 80 端口:

		-d后台运行
		--name 指定名字
docker run -p 81:80 --name nginx-test-port1 nginx
docker run -it -d -p 81:80  nginx

方式 2:本地 IP:本地端口:容器端口

docker run -p 192.168.10.205:82:80 --name nginx-test-port2 docker.io/nginx

方式 3:本地 IP:本地随机端口:容器端口

docker run -p 192.168.10.205::80 --name nginx-test-port3 docker.io/nginx

式 4:本机 ip:本地端口:容器端口/协议,默认为 tcp 协议

docker run -p 192.168.10.205:83:80/udp --name nginx-test-port4 docker.io/nginx

方式 5:一次性映射多个端口+协议:

docker run -p 86:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-test-port5  docker.io/nginx

在这里插入图片描述

查看容器已经映射的端口:

				或者ID
docker port nginx-test-port5

在这里插入图片描述

给镜像打标签

相当与软连接

			旧				新
docker tag centos:latest centos:7.6.1810

在这里插入图片描述

查看运行的容器

在这里插入图片描述

查看 Nginx 容器访问日志

 #一次查看
 			后面这个可以是id
docker logs nginx-test-port3
 #持续查看
docker logs -f nginx-test-port3 

测试访问一下

自定义容器名称

docker run -it --name nginx-test nginx

后台启动容器

	-d 后台运行
docker run -d -P --name nginx-test1 docker.io/nginx

创建并进入容器

		-t分配一个tty
		-i 标准输入
docker run -t -i --name test-centos2 docker.io/centos 
/bin/bash
	#创建容器后直接进入,执行 exit 退出后容器关闭
[root@a8fb69e71c73 /]# 

在这里插入图片描述

 docker run -d --name centos-test1 docker.io/centos

单次运行
容器退出后自动删除:

docker run -it --rm --name nginx-delete-test docker.io/nginx

传递运行命令
容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令。

docker run -d centos /usr/bin/tail -f '/etc/hosts'

在这里插入图片描述
容器的启动和关闭

docker stop f821d0cd5a99
docker start f821d0cd5a99

4. 进入到正在运行的容器

  1. 使用 attach 命令:
    使用方式为 docker attach 容器名,attach 类似于 vnc,操作会在各个容器界面显示,所有使用此方式进入容器的操作都是同步显示的且 exit 后容器将被关闭,且使用 exit 退出后容器关闭,不推荐使用,需要进入到有 shell 环境的容器,比如 centos 为例:
    也就是有多个窗口在这个容器中,那么使用attach就会同时操作
docker run -it centos bash
[root@63fbc2d5a3ec /]#

 docker attach 63fbc2d5a3ec
[root@63fbc2d5a3ec /]#

在另外一个窗口启动测试页面是否同步

在这里插入图片描述

  1. 使用 exec 命令推荐
    在这里插入图片描述

  2. 用 nsenter 命令
    推荐使用此方式,nsenter 命令需要通过 PID 进入到容器内部,不过可以使用docker inspect 获取到容器的 PID:

	#安装 nsenter 命令
yum install util-linux 

	#查看所有的参数
docker inspect ID

docker inspect -f "{{.NetworkSettings.IPAddress}}"  id
	//结果 172.17.0.2
	
	#获取到某个docker 容器的 PID,可以通过 PID 进入到容器内
docker inspect -f "{{.State.Pid}}"  mydocker 

docker inspect -f "{{.State.Pid}}" centos-test3
	5892
			#通过PID进入容器
nsenter -t 5892 -m -u -i -n -p
# ls

在这里插入图片描述
在这里插入图片描述

  1. 脚本方式
    将 nsenter 命令写入到脚本进行调用,如下:
cat docker-in.sh 
#!/bin/bash
docker_in(){
 NAME_ID=$1
 PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID})
 nsenter -t ${PID} -m -u -i -n -p }
 docker_in $1


#测试脚本是否可以正常进入到容器且退出后仍然正常运行:

chmod a+x docker-in.sh 

 ./docker-in.sh centos-test3
 
[root@66f511bb15af /]# pwd
/
[root@66f511bb15af /]# exit
logout
[root@docker-server1 ~]# ./docker-in.sh centos-test3
[root@66f511bb15af /]# exit
Logout

查看容器内部的 hosts 文件

docker run -it --name test-centos3 docker.io/centos 
/bin/bash

cat /etc/hosts 

127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

172.17.0.4 056bb4928b64 #默认会将实例的 ID 添加到自己的 hosts 文件

ping 容器 ID

5. 关闭 / 删除容器

批量关闭正在运行的容器

	#正常关闭所有运行中的容器
		-q 取ID
docker stop $(docker ps -a -q) 

批量强制关闭正在运行的容器
针对与java容器
批量启动也一样start

	#强制关闭所有运行中的容器
docker kill $(docker ps -a -q) 

批量删除已退出容器

docker rm -f `docker ps -aq -f status=exited`

批量删除所有容器

docker rm -f $(docker ps -a -q)

6. 指定容器 DNS

dns 服务,默认采用宿主机的 dns 地址
是将 dns 地址配置在宿主机
是将参数配置在 docker 启动脚本里面 --dns=1.1.1.1

docker run -it --rm --dns 223.6.6.6 centos bash

cat /etc/resolv.conf 
nameserver 223.6.6.6

记住不要重启Docker,重启会丢失Docker所有的内容,包括镜像等

注意:

docker容器
会生成iptables规则
切记里面的iptables规则
一般需要备份

iptables-restore < iptables-rule.txt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值