关于docker的使用及报错处理

本文详细介绍了Docker的三要素:仓库、镜像和容器,并解释了Docker的Logo含义。在解决yum install报错问题时,提供了清理缓存、修改DNS和关闭本地源等方法。此外,还分享了在CentOS7上安装Docker时遇到的问题及解决方案,包括配置阿里云镜像加速器。文章深入探讨了Docker的运行原理、常用命令、镜像分层和数据卷的使用。最后,通过案例解析了DockerFile的编写和作用,以及如何在本地安装和推送镜像到阿里云。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

docker三要素

仓库,镜像,容器
仓库 – 存放镜像的地方
镜像 – 相当于类/模板
容器 – 镜像的实例,可以把容器看作一个简易的Linux环境

docker logo含义

蓝色的大海 – 宿主机系统 (centos7)
鲸鱼 – docker
鲸鱼背上的集装箱 – 容器实例

关于yum install 报错

yum install 报错[Errno 14] curl#37 - Couldn’t open file /mnt/repodata/repomd.xml
你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
1、然后按照网上的一些修改,先是执行:

yum clean all

然后 yum makecache,问题还是没解决,继续报错。

其实这两条命令就是清空缓存,然后再重新缓存的意思,有时候可能有效。

2、然后又尝试了方法,说是DNS的问题,上不了网。又去改了DNS(可以去尝试尝试,因为不同人遇到问题不一样)。

如果是绑定了静态地址,直接修改/etc/resolv.conf 这个文件下的DNS是没有用的,因为你执行命令service network restart 会恢复。所以要修改网卡的配置文件,先到对应的目录下:

cd /etc/sysconfig/network-scripts/

ll 查看网卡,因为有可能有几块网卡。

service network restart 重启网络,用cat /etc/resolv.conf 发现DNS改变了。

第二种情况是针对网络DNS出问题的时候的解决办法,如果之前本身就没有问题,说明这样是解决不了的。

3、因为yum 寻包的顺序应该先是本地源,再寻网络源。

所以需要修改配置文件,解决办法就是把本地源关闭:

#vi /etc/yum.repos.d/CentOS-Media.repo,将里面的enabled=1改成enabled=0,然后保存退出。

完了之后执行 yum makecache,如果能缓存,说明解决了,如果像我一样出现如下错误。说明yum源出了问题。
在这里插入图片描述
后来发现自己的文件夹少了CentOS-Base.repo这个源,可能是装系统的人备份成了CentOS-Base.repo.bb忘了改回来。

直接cp Centos-Base.repo.bak Centos-Base.repo

成功解决!!!

宿主机centos7关机再次启动运行docker images 时报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

解决方法

[root@es1 ~]# systemctl daemon-reload
[root@es1 ~]# sudo service docker restart
Redirecting to /bin/systemctl restart docker.service
[root@es1 ~]# sudo docker run hello-world

在centos7安装docker的时候,由于docker官方镜像一直安装失败

在这里插入图片描述这时由于在国内访问国外源官方镜像失败的缘故,修改为阿里云的源,然后下载镜像的速度就嗖嗖嗖。。。

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

然后在执行下载操作即可

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

基于centos7的docker安装

设置存储库
安装yum-utils软件包(提供yum-config-manager 实用程序)并设置稳定的存储库。

$ sudo yum install -y yum-utils

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

可选:启用每晚或测试存储库。

这些存储库包含在docker.repo上面的文件中,但默认情况下处于禁用状态。您可以在稳定存储库旁边启用它们。以下命令启用每晚存储库。

$ sudo yum-config-manager --enable docker-ce-nightly

要启用测试通道,请运行以下命令:

$ sudo yum-config-manager --enable docker-ce-test

您可以通过运行带有标志的命令来禁用夜间或测试存储库 。要重新启用它,请使用该标志。以下命令禁用夜间存储库。yum-config-manager–disable–enable

$ sudo yum-config-manager --disable docker-ce-nightly

安装DOCKER引擎
安装最新版本的Docker Engine和容器,或者转到下一步安装特定版本:

$ sudo yum install docker-ce docker-ce-cli containerd.io

启动Docker。

$ sudo systemctl start docker

通过运行hello-world 映像来验证是否正确安装了Docker Engine 。

$ sudo docker run hello-world

在这里插入图片描述

Docker_阿里云镜像加速器配置

1.获得加速器地址连接
阿里云hub地址:https://dev.aliyun.com/search.html(可复用淘宝账号登录)
在这里插入图片描述
2.配置本机Docker运行镜像加速器

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,

执行以下命令修改相应的配置:

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

Docker_helloworld镜像

$ sudo docker run hello-world

run干了什么?
在这里插入图片描述

Docker_运行底层原理

Docker是一个c/s结构系统,Docker守护进程运行在主机上,通过socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器,容器是一个运行时环境,相当于集装箱
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611223632145.png
docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个 容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。

在这里插入图片描述

Docker常用命令

帮助命令

 docker version
 docker info
 docker help

镜像命令

#列出(本地主机)上的镜像
docker images
#参数
-a 列出本地主机上的所有的镜像(含中间镜像层)
-q 当前镜像的imageID

在这里插入图片描述REPOSITORY :镜像仓库源
TAG :镜像的版本标签
IMAGE ID :镜像ID
CREATED :镜像的创建时间
SIZE:镜像的大小

docker search tomcat
#查找某个镜像(从docker hub 上查找)
-s 获取点赞数多少以上的镜像
docker search -s 30 tomcat
docker pull tomcat
#从阿里云上拉去镜像
docker rmi -f xxx
#强制删除 镜像ID/镜像源(删除单个)
docker rmi -f xxx xxx
#强制删除(删除多个,中间空格隔开)
docker rmi -f $(docker images -qa)
#前置删除所有

容器命令
有镜像才能创建容器–根本前提

#新建并启动容器
-i 交互式
-t 伪终端
--name 别名
docker run -it --name mycentos centos
-a 所有正在运行的和历史上运行过的容器
-l 上一个容器
-n x 上x次运行过的
-q 只显示容器的编号
docker ps 
#退出容器
方法一:exit 容器停止退出
方法二:Ctrl+q+p 容器不停止退出
#启动容器
docker start 容器ID
#重启容器
docker restart 容器ID
#停止容器
docker stop 容器ID
#强制关闭
docker kill 容器ID
(区别于删除镜像rm后面是否有i)
#删除已停止的容器
docker rm 容器id
# 删除运行的容器
docker rm -f 容器id
#删除多个容器
docker rm -f $(docker ps -aq)
docker ps -a -q | xargs docker rm

重要
启动守护式进程

-d 后台运行
docker run -d centos
docker ps -l 发现上面容器已经退出(docker 容器后台运行就必须有一个前台进程

查看容器日志

-f 查看最新的
-t 时间戳
--tail 数字 显示多少行
docker logs -f -t --tail 5 容器ID
docker run -d centos /bin/sh -c 'while true;do echo;hello zxl;sleep 2;done'

查看容器内运行的进程

docker top 容器id

查看容器内部细节

docker inspect 容器id(返回json串)

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

#方法一:
docker attach 容器id
ls -l tmp/
方法二:
docker exec -t 容器id ls -l tmp/
方法三:
docker exec -t 容器id /bin/bash/
ls -l tmp/  #等同于方法一

上述二者的区别
attach 直接进入容器启动命令终端,不会启动新的进程
exec 是在容器中打开新的终端,并且可以启动新的进程

从容器中拷贝文件到宿主机

docker cp 容器id:/tmp/xxx /root

docker 镜像原理

镜像 like 千层饼 unionfs(联合文件系统)对文件的修改做一次提交来一层层的叠加

docker加载原理

bootfs 包括bootloader kernel(linux内核)
rootfs 各种不同的操作系统发行版(例如Ubuntu,centos)

平时安装进虚拟机的centos好几个G,为什么docker里才200M

rootfs可以很小,只包括最基本的命令,工具和程序库,底层直接用 Host(宿主机)的kernel,自己只需要提供rootfs就行。由此可见不同的Linux发行版,bootfs基本一致,rootfs会有区别,因此不同的发行版可共用bootfs

分层镜像(以tomcat举例)
在这里插入图片描述为什么docker镜像要采用分层结构?

共享资源
特点:
	1、docker镜像只读
	2、当容器启动时,一个新的可写层被加载到镜像的 顶部,这一层通常被称作“容器层”,“容器层”下的都叫“镜像层”

Docker_镜像commit

-p 指定端口号
-P 随机端口号
docker run -it -p 8888:8080 tomcat (给主机分配一个端口8888访问容器端口8080)
docker exec -it 容器id /bin/bash
将tomcat的一个文档文件删除
docker commit -a='作者' -m='描述' 容器id zxl/tomcat:1.2

这里补充个遇到的问题

Docker方式启动tomcat,访问首页出现404错误
解决方法:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

Docker_容器数据卷介绍

能干什么:
1、容器的持久化
2、容器间继承+共享数据
特点:
1、数据可在容器间共享或重用数据
2、卷中的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止
数据卷-容器内添加

1、直接命令添加
docker run -it -v /宿主机绝对路径目录:/容器目录 镜像名
例如
docker run -it -v /myDataVolume:/dataVolumeContainer centos

查看数据是否加载成功

docker inspect 容器id

在这里插入图片描述在这里插入图片描述容器和宿主间数据共享

1、在宿主机创建文件
touch host.txt
2、对宿主机文件进行编辑
vim host.txt
host update
3、查看容器内是否存在host.txt,及是否内容与宿主机一直
经查看与宿主机内容一直,在容器内对host.txt进行编辑
vi host.txt
containet update
4、查看宿主机内容与容器一直

容器停止退出后,主机修改后数据是否同步

1、容器先停止退出
exit
2、主机修改host.txt
3、容器重启进入
docker start 容器id
docker attach 容器id
4、查看主机修改过的host.txt
结论:内容同步

命令(带权限)

只读权限
docker run -it -v /宿主机绝对路径目录:/容器目录 镜像名
例如
docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
只能在主机内修改文件,容器内没有权限修改

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

2、DockerFile添加

根目录下新建mydocker 文件夹并进入

mkdir /mydocker
cd /mydocker

可在DockerFile中使用VOLUME命令来给镜像添加一个或多个数据卷
file构建

vim Dockerfile


FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finish,......success"
CMD /bin/bash

build后生成镜像—获得一个新镜像zxl/centos

docker build -f /mydocker/Dockerfile -t zxl/centos .

run容器

docker run -it zxl/centos

通过上述步骤容器内的卷目录地址,已经知道

对应的主机目的地址在哪?
docker inspect 容器id

通过下方截图可以看到宿主机的默认目的地址
在这里插入图片描述

数据卷容器

数据卷:容器持久化

数据卷容器:命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器称之为数据卷容器
举个例子:多个活动的硬盘挂载在同一个主机上,然后可以直接操作各个活动硬盘之间的数据

容器间传递共享
1、先启动一个父容器dc01

docker run -it --name dc01 zxl/centos
cd dataVolumeContainer2
touch dc01.txt

2、dc02/dc03 继承dc01

docker run -it --name dc02 --volumes-from dc01 zxl/centos
cd dataVolumeContainer2
touch dc02.txt
docker run -it --name dc03 --volumes-from dc01 zxl/centos
cd dataVolumeContainer2
touch dc03.txt

分别查看3个容器内dataVolumeContainer2内容,均为下图内容,可以看到各容器添加的都能共享
在这里插入图片描述3、删除dc01,dc02修改后,dc03可否访问?

4、新建dc04继承dc03后再修改dc03,dc04可否访问?

结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

DockerFile详解(上面已经简单写过)

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本

构建三步骤
1、手动编写一个Dockerfile文件,当然,必须符合file规范
2、有这个文件后,直接docker build 命令执行,获得一个自定义的镜像
3、docker run

长什么样?以centos的DockerFile为例

在这里插入图片描述

DockerFIle构建过程解析

DockerFile基础知识
1、每条保留字指令都必须为大写字母,且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、#表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交
docker执行DockerFile的大致流程额
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器做出修改
3、执行类似docker commit的操作提交一个新的镜像层
4、docker基于刚提交的镜像运行一个新容器
5、执行DockerFile中的下一条指令,直到所有的指令都执行完成
从应用软件的角度来看,DockerFIle、Docker 镜像与Docker容器分别代表软件的三个不同阶段
DockerFile 软件原材料
Docker镜像 软件交付品
Docker容器 可以认为是软件的运行态

DockerFile面向开发,Docker镜像称为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石

在这里插入图片描述

DockerFile 体系结构(保留字指令)

保留字指令含义
FROM基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER镜像维护者的姓名和邮箱地址
RUN容器构建时需要运行的命令
EXPOSE当前容器对外暴露出的端口
WORKDIR指定再创建容器后,终端默认登陆进来的工作目录,一个落脚点
ENV用来再构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL和解压tar压缩包
COPY类似ADD,拷贝文件和目录到镜像中,但是不会解压tar包,将从构建上下文目录中,<源路径>的文件/目录复制到新的一层的镜像为<目标路径>位置
VOLUME容器数据卷,用于数据保存和持久化工作
CMD指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是指定容器启动程序和参数
ONBUILD当构建一个被继承的DockerFile时,运行命令父镜像在被子镜像继承后,父镜像的ONBUILD被触发

在这里插入图片描述

小案例

DockerFile编写centos实现之前无法使用vim和ifconfig的功能

1、DockerFile 软件原材料(编写)

# 基础镜像,当前新镜像是基于哪个镜像的
FROM centos

# 作者的名字加邮箱
MAINTAINER zxl<1944965948@qq.com>

# 用来再构建镜像过程中设置环境变量
ENV MYPATH /usr/local

# 指定再创建容器后,终端默认登陆进来的工作目录,一个落脚点
WORKDIR $MYPATH

# 容器构建时需要运行的命令
RUN yum -y install vim
RUN yum -y install net-tools

# 当前容器对外暴露出的端口
EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash 

2、Docker镜像 软件交付品(构建)

docker build -f /mydocker/Dockerfile2 -t mycentos:1.3 .

3、Docker容器 可以认为是软件的运行态(运行)

docker run -it mycentos:1.3

运行结果见下图
在这里插入图片描述列出镜像的变更历史

docker history mycentos:1.3

在这里插入图片描述

CMD/ENTRYPOINT镜像案例

CMD会覆盖之前的命令,而ENTRYPOINT在之前的命令上追加
CMD

/mydocker/Dockerfile3
# CMD
FROM centos
RUN yum install -y curl
CMD {"curl","-s","http:www.baidu.com"}
docker build  -f /mydocker/Dockerfile3 -t myip .
docker run myip

在这里插入图片描述

docker run myip -i
相当于Dockerfile里面追加了CMD -i
FROM centos
RUN yum install -y curl
CMD {"curl","-s","http:www.baidu.com"}
CMD -i

#会出现下图报错

在这里插入图片描述ENTRYPOINT

/mydocker/Dockerfile4
# CMD
FROM centos
RUN yum install -y curl
ENTRYPOINT {"curl","-s","http:www.baidu.com"}
docker build  -f /mydocker/Dockerfile4 -t myip2 .
docker run myip2 
docker run myip2 -i (有请求头)
# 使用ENTRYPOINT 在命令追加没有出现CMD追加的报错

在这里插入图片描述

ONBUILD

FROM centos
RUN yum install -y curl
ENTRYPOINT {"curl","-s","http://www.baidu.com"}
ONBUILD RUN echo "father image onbuild................"

在这里插入图片描述

在这里插入图片描述
Dockerfile小总结

在这里插入图片描述

docker常用安装(以tomcat为例)

搜索镜像:docker search tomcat
拉取镜像:docker pull tomcat
查看镜像:docker images tomcat
启动镜像:docker run -it -p 9999:8080 tomcat
停止容器: docker stop 容器ID(强制关闭:docker kill 容器ID)
移除容器:docker rm -f 容器ID

Docker_安装mysql

docker search mysql
docker pull mysql:5.6
docker images
#后台启动
docker run -p 3306:3306 --name mysql -v /zxl/mysql/conf:/etc/mysql/conf.d -v /zxl/mysql/logs:/logs -v /zxl/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.6
#与MySQL交互运行
docker exec -it 68cb9cf6db03 /bin/bash
mysql -uroot -proot
#数据备份
docker exec 68cb9cf6db03 sh -c 'exec mysqldump --all-databases -uroot -proot' > /zxl/all-databases.sql

在这里插入图片描述

Docker_安装redis

docker pull redis:3.2
docker run -p 6379:6379--name redis-v /zxl/myredis/data:/data -v /zxl/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes

本地镜像推送到阿里云

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

将镜像推送到Registry

$ sudo docker login --username=15732689496 registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/zxl520hxs/mycentos:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/zxl520hxs/mycentos:[镜像版本号]

在这里插入图片描述
--------------------------------------完结撒花-------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值