Docker

1. Docker 官网

在这里插入图片描述

1.1 官网

docker 官网: http://www.docker.com

在这里插入图片描述

Docker Hub 仓库: https://hub.docker.com/

在这里插入图片描述

1.2 安装

前提说明:

​ Docker 并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境。

​ Docker 实质上是在已运行的Linnux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的Linux主机。

​ 因此,Docker 必须部署在Linux内核的系统上,如果其它系统想部署 Docker 就必须安装一个虚拟Linux环境。

在这里插入图片描述

[注] 要求系统为64位、Linux系统内核版本为3.8以上。

# uname命令用于打印当前系统相关信息
[wang@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[wang@localhost ~]$ uname -r
3.10.0-1160.el7.x86_64

安装指南 :https://docs.docker.com/engine/install/centos/

在这里插入图片描述

1.2.1 卸载旧版本

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

1.2.2 yum安装gcc相关

  1. 连接上网络

  2. yum -y install gcc

  3. yum -y install gcc-c++

1.2.3 安装需要的软件包

sudo yum install -y yum-utils

1.2.4 配置stable镜像仓库

[] 不推荐使用该命令,此目标服务器地处国外,访问速度较慢,经常导致报错(Errno14或12)
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
# 国内阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

在这里插入图片描述

1.2.5更新yum软件包索引

yum makecache fast

1.2.6 安装DOCKER CE

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

报错:(尝试在命令行中添加 ‘–allowerasing’ 来替换冲突的软件包 或 ‘–skip-broken’ 来跳过无法安装的软件包 或 ‘–nobest’ 来不只使用软件包的最佳候选)
解决方法: yum remove runc ,然后重新执行安装。
参考文章:docker安装包冲突问题解决

1.2.7 启动docker

sudo systemctl start docker
# 检验:ps命令(全称:process status)是linux查看当前系统中进程状态的常用命令
# 可以通过管道符和grep命令进行过滤,查看指定的进程
ps -ef|grep docker

1.2.8 测试

# 运行hello-world镜像,验证Docker引擎是否正确安装。
sudo docker run hello-world

在这里插入图片描述

# 打印docker版本信息
docker version

在这里插入图片描述

1.2.9 卸载

# 停止docker服务
systemctl stop docker
# 移除docker的……
yum remove docker-ce docker-ce-cil containerd.io
rm -rf/var/lib/docker
rm -rf/var/lib/contaonerd

1.3 配置阿里云镜像加速

1.3.1 官网

​ https://ac.aliyun.com/

1.3.2 步骤

  1. 注册一个阿里云账户(可复用淘宝账户)

    在这里插入图片描述

  2. 选择容器镜像服务

    在这里插入图片描述

    在这里插入图片描述

  3. 获取加速器地址

    在这里插入图片描述

  4. 依照文档执行命令

mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://eg11kzkk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

测试hello-world

成功则出现Hello from Docker!

在这里插入图片描述

2.Docker 帮助启动类命令

  1. 启动docker

    systemctl start docker
    
  2. 停止docker

    systemctl stop docker
    
  3. 重启docker

    systemctl restart docker
    
  4. 查看docker状态

    systemctl status docker
    
  5. 开机启动docker

    systemctl enable docker
    
  6. 查看docker概要信息

    docker info
    
  7. 查看docker总体帮助文档

    docker --help
    
  8. 查看docker命令帮助文档

    docker 具体命令 --help
    

3. Docker 镜像

3.1 概述

3.1.1 镜像

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),打包好的运行环境就是image镜像文件。

3.1.2 分层的镜像

以pull为例,镜像下载是分层执行的

在这里插入图片描述

UnionFS 联合文件系统

​ Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持*对文件系统的修改作为一次提交来一层层的叠加*,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。

​ 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

​ 特性:一次同时加载多个文件系统,但从外表看起来只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

3.1.3 镜像加载原理

​ docker的镜像实际上是由一层一层的文件系统组成,这种层级的文件系统叫做UnionFS。

​ bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

​ rootfs(root file system),在bootfs之上,包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件.rootfs就是各种不同操作系统的发行版。

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

​ 对于一个精简的Ubuntu,rootfs(根文件)可以很小,只需包括最基本的命令、工具和程序库即可,因为底层直接使用Host(宿主机)的Kernel,自己只需提供rootfs。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

镜像分层的意义——共享资源

​ 内存中只需加载一份base镜像,就可以为所有容器服务,且镜像的每一层都可以被共享。

3.1.2 重点理解

Docker镜像每一层都是只读的,容器层是可写的。

​ 当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作”容器层“,”容器层之下的都叫做”镜像层“,所有对容器的改动(添加、删除、修改文件等)都只会发生在容器中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

3.2 镜像相关命令

3.2.1 列出本地主机上的镜像

docker images [OPTIONS]

在这里插入图片描述

​ 同一仓库源可以有多个TAG版本,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG来定义不同的镜像。 如果不指定一个镜像的版本标签,例如只使用Ubuntu,docker将默认使用ubuntu:latest镜像。

OPTIONS 说明

​ [-a] 列出本地所有的镜像(含历史映像层)

在这里插入图片描述

​ [-q] 只显示镜像ID

在这里插入图片描述

3.2.2 查询某镜像

docker search [OPTIONS] 镜像名
参数说明
NAME镜像名称
DESCRIPTION镜像说明
STARS点赞数量
OFFICIAL是否为官方产品
AUTOMATED是否为自动构建的

OPTIONS 说明

​ [–limit N] 只列出N个镜像(默认25个)

在这里插入图片描述

3.2.3 下载某镜像

docker pull 镜像名[:TAG]

------
	不写[:TAG]则默认最新版

在这里插入图片描述

在这里插入图片描述

3.2.4 查看镜像/容器/数据卷所占的空间

docker system df

在这里插入图片描述

参数说明
TYPE类型
TOTAL数量
ACTIVE状态
SIZE大小
RECLAIMABLE所占空间

3.2.5 删除某镜像

  1. 删除单个镜像

    docker rmi [-f] 镜像ID
    

    在这里插入图片描述

    在这里插入图片描述

  2. 删除多个镜像

    docker rmi [-f] 镜像名1:TAG 镜像名2:TAG。。。
    

    在这里插入图片描述

  3. 删除全部镜像

    docker rmi -f $(docker images -qa)
    
    	------
    	docker images -qa单独执行时显示的是容器内所有的镜像ID
    	docker rmi -f 表示删除指定镜像ID的镜像文件
    

    在这里插入图片描述

【扩】谈谈docker虚悬镜像是什么?

​ 仓库名标签都是 <none> 的镜像,俗称虚悬镜像 dangling image

4. Docker 容器

4.1 概述

4.2 容器命令

2.3.1 新建+启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS 说明

​ [–name=“NewName”] 为容器指定一个名称

​ [-d] 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)

​ [-i] 以交互模式运行容器,通常与[-t]同时使用,也即启动交互式容器(前台有伪终端,等待交互)

​ [-P] 随机端口映射(大写P)

​ [-p] 指定端口映射(小写p)

参数说明
-p hostPort:containerPort端口映射 -p 8080:80
-p ip:hostPort:containerPort端口监听地址 -p 10.0.0.100:8080:80
-p ip::containerPort随机分配端口 -p 10.0.0.100::80
-p hostPort:containerPort:udp指定协议 -p 8080:80:tcp
-p 81:80 -p 443:443指定多个

在这里插入图片描述

例:使用Ubuntu镜像以交互模式启动一个容器,在容器内执行/bin/bash命令

在这里插入图片描述

[-i] 交互式操作

[-t] 终端

2.3.2 列出当前所有正在运行的容器

docker ps [OPTIONS]
参数说明
CONTAINER ID对象ID
IMAGE镜像
COMMAND命令
CREATED创建时间
STATUS状态
PORTS端口
NAMES名字

OPTIONS 说明

​ [-a] 列出当前所有正在运行的和历史上运行过的容器

​ [-l] 显示最近创建的容器

​ [-n] 显示最近创建的n个容器

​ [-q] 静默模式,只显示容器编号

在这里插入图片描述

2.3.3 退出容器

  1. exit命令退出,容器停止

  2. Ctrl+p+q退出,容器不停止

    在这里插入图片描述

2.3.4 启动已停止的容器

docker start 容器ID或容器名

在这里插入图片描述

2.3.5 重启容器

docker restart 容器ID或容器名

在这里插入图片描述

2.3.6 停止容器

docker stop 容器ID或容器名

在这里插入图片描述

2.3.7 强制停止容器

docker kill 容器ID或容器名

在这里插入图片描述

2.3.8 删除已停止的容器

docker rm 容器ID

在这里插入图片描述

[-f] 强制删除

docker rm -f 容器ID

一次删除多个容器实例

  1. docker rm -f $(docker ps -a -q)
  2. docker ps -a -q | xargs docker rm

2.3.9 启动守护式容器

docker run -d 容器名

例:redis 前后台启动演示

在这里插入图片描述

docker run -it redis  前台运行

在这里插入图片描述

docker run -d redis 后台运行

在这里插入图片描述

2.3.10 查看容器日志

docker logs 容器ID

在这里插入图片描述

2.3.11 查看容器内运行的进程

docker top 容器ID

2.3.12 查看容器内部细节

docker inspect 容器ID

在这里插入图片描述

2.3.13 进入正在运行的容器并以命令行交互

docker exec -it 容器ID bashShell [COMMAND]

在这里插入图片描述

docker attach 容器ID

在这里插入图片描述

attach 直接进入容器启动命令的终端,不会启动新的进程,用exit退出会导致容器的停止。

exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器停止。

2.3.14 从容器内拷贝文件到主机上

docker cp 容器ID:容器内路径 目的主机路径

在这里插入图片描述

2.3.15 导入和导出容器

export 导出容器的内容留作为一个tar归档文件 [对应import命令]

import 从tar包中的内容创建一个新的文件系统再导入为镜像 [对应export]

docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

CASE:镜像打包导入导出

在这里插入图片描述

  1. 新建一个Ubuntu容器

    在这里插入图片描述

  1. 进入Ubuntu容器/usr目录下并新建wzh.txt文件

    在这里插入图片描述

  1. 使用Ctrl+P+Q退出但不关闭容器

    在这里插入图片描述

  1. 将容器封装为一个tar包并保存到本地

    在这里插入图片描述

  1. 关闭容器并删除Ubuntu镜像

    在这里插入图片描述

  2. 使用封装好的tar文件导入为镜像

    在这里插入图片描述

  3. 使用该镜像创建容器

    在这里插入图片描述

  4. 进入容器的/usr目录查看文件,此时wzh.txt文件依然存在,说明已使用tar文件将容器恢复

    在这里插入图片描述

2.4 单词指令速查

单词说明
attach当前shell下attach连接指定运行镜像
build通过Dockerfile定制镜像
commit提交当前容器为新的镜像
cp从容器中拷贝指定文件或者目录到宿主机中
create创建一个新的容器,但不启动(类似run)
diff查看docker容器变化
events从docker服务获取容器实时事件
exec在已存在的容器上运行命令
export导出容器的内容流作为一个tar归档文件【对应import】
history展示一个镜像形成历史
images列出系统当前镜像
import从tar包中创建一个新的文件系统映像【对应export】
info显示系统相关信息
inspect查看容器详细信息
kill指定docker容器
load从一个tar包中加载一个镜像【对用save】
login注册或登录一个docker源服务器
logout从当前Docker registry退出
logs输出当前容器日志信息
port查看映射端口对应的容器内部源端口
pause暂停容器
ps列出容器列表
pull从docker镜像源服务器拉取指定镜像或者库镜像
push推送指定镜像或者库镜像至docker源服务器
restart重启运行的容器
rm移除一个或多个容器
rmi移除一个或多个镜像(无容器使用该镜像时才可删除,否则需删除相关容器才可继续或使用 [ -f ]强制删除)
save保存一个镜像为一个tar包(对应load)
search在docker hub中搜索镜像
start启动容器
stop停止容器
tag给源中镜像打标签
top查看容器中运行的进程信息
unpause取消暂停容器
version查看docker版本号
wait截取容器停止时的退出状态值

5. 综合案例

5.1 commit操作案例

commit:提交容器副本使之成为一个新的镜像

docker commit 
docker commit -m"提交的描述信息"-a="作者" 容器ID 要创建的目标镜像名:[标签名]

案例演示:Ubuntu安装vim

apt-get update	# 先更新包管理工具
apt-get install vim # 安装vim
  1. 使用Ubuntu镜像创建容器

    在这里插入图片描述

  2. 在容器内安装好vim并尝试写入内容,使用Ctrl+P+Q退出但不关闭容器

    在这里插入图片描述

    在这里插入图片描述

  3. 使用commit提交容器副本使之成为一个新的镜像

    在这里插入图片描述

  1. 使用新的镜像创建容器,此时容器内可以直接使用vim命令

    在这里插入图片描述

5.2 将本地镜像推送到阿里云

5.2.1 推送流程

在这里插入图片描述

3.4.2 创建仓库镜像

阿里云开发者平台

https://promotion.aliyun.com/ntms/act/kubernetes.html

  1. 选择控制台进入容器镜像服务

    在这里插入图片描述

  2. 选择个人实例

    在这里插入图片描述

  3. 命名空间

    初次使用须先开通服务

    在这里插入图片描述

    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 仓库名称

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  2. 进入管理界面获得脚本

    在这里插入图片描述

    在这里插入图片描述

  3. 推送到阿里云

    在这里插入图片描述

    在这里插入图片描述

3.4.3 拉取已上传的镜像

在这里插入图片描述

在这里插入图片描述

3.4.5 私有库发布流程

Docker Registry

​ 官方提供的工具,可用于构建私有镜像仓库。

  1. 下载镜像Docker Registry

    在这里插入图片描述

  2. 运行私有库registry,相当于本地的Docker Hub

    docker run -d -p 5000:5000 -v /zzyyuse/myegistry/:/tmp/registry --privileged=true registry
    	仓库默认被创建在容器的var/lib/registry目录下,建议[-v]自行用容器卷映射,方便宿主机联调
    	[-v] 添加自定义容器卷
    	[--privileged=true] 扩大容器的权限,解决挂载目录没有权限的问题
    

    在这里插入图片描述

  3. 案例:Ubuntu安装ifconfig命令

    apt-get update
    apt-get install net-tools
    
  4. commit 提交新镜像

    docker commit -m"提交的描述信息"-a="作者" 容器ID 要创建的目标镜像名:[标签名]
    

    在这里插入图片描述

  5. 验证新镜像

    在这里插入图片描述

  6. curl验证私服库上有什么镜像

    在这里插入图片描述

    curl -XGET http://Host:Port/v2/_catalog		# 模拟发送一个GET请求
    

    在这里插入图片描述

  7. 将新镜像修改符合私服规范的Tag

    docker tag 镜像:Tag Host:Port/Repository:Tag
    

    在这里插入图片描述

  8. 修改配置文件使之支持http

    ​ docker默认不允许http方式推送镜像,通过配置选项来取消这个限制(修改完若不生效,建议重启docker)

    vim /etc/docker/daemon.json
    

    在deamon.json文件中添加

    {
    	"registry-mirrors":["https://aa25jugu.mirror.aliyuncs.com"],
    	"insecure-registries":["Host:Port"]
    }
    

    在这里插入图片描述

    在这里插入图片描述

  9. push推送到私服库

    docker push Host:Port/IMAGE:TAG
    

    在这里插入图片描述

  10. curl验证私服库上有什么镜像(此时私服库上出现刚刚上传的my_ubuntu镜像)

    curl -XGET http://Host:Port/v2/_catalog		# 模拟发送一个GET请求
    

    在这里插入图片描述
    pull到本地并运行

    docker pull Host:Port/IMAGE:TAG
    

    在这里插入图片描述

    测试ifconfig命令

    在这里插入图片描述

6. Docker 容器数据卷

–privileged=true

​ Docker挂载主机目录访问如果出现cannot open directory .: Permission denied

​ 解决办法:在挂载目录后多加一个–privileged=true参数即可

​ 如果是CentOS7安全模块会比以前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全行为。

​ 在SELinux里面挂载目录被禁止了,如果要开启,一般使用–privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,使用该参数时,container内的root拥有真正的root权限,否则container内的root只是外部的一个普通用户权限。

就是目录或文件,存在与一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性;

​ 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。【将docker容器内的数据保存进宿主机的磁盘中】

6.1 案例:运行一个带有容器数据卷存储功能的容器实例

特点

  1. 数据卷可在容器之间共享或重用数据。
  2. 卷中的更改可以直接实时生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止
  5. 可以将docker容器内的数据保存进宿主机的磁盘中
  1. 宿主机和容器之间映射添加容器卷

    docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
    

    案例:添加映射后可以将docker容器内的数据实时同步保存进宿主机的磁盘中

    1. 创建容器并添加映射

      在这里插入图片描述

      ***** 此时会生成相应的目录文件夹(docker_data 和 host_data)

    2. 在容器内/tmp/host_data目录下创建文件(模拟办公场景产生的数据文件)

      在这里插入图片描述

    3. 查看主机对应的/tmp/docker_data目录,此时已将容器内产生的数据文件映射同步到了宿主机内,实现了数据的共享

      在这里插入图片描述

      ​ ***** 同样的,在主机的/tmp/docker_data目录下做修改,即时容器被停止了,对应的数据也会同步映射到容器内

  2. 查看数据卷是否挂载成功

    docker inspect 容器ID		# 以json形式查看该容器的详细信息
    	* Mounts 挂载
    

    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北方有你.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值