关于docker的使用及报错处理
- docker三要素
- docker logo含义
- 关于yum install 报错
- 宿主机centos7关机再次启动运行docker images 时报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
- 在centos7安装docker的时候,由于docker官方镜像一直安装失败
- 基于centos7的docker安装
- Docker_阿里云镜像加速器配置
- Docker_helloworld镜像
- Docker_运行底层原理
- Docker常用命令
- docker 镜像原理
- Docker_镜像commit
- 这里补充个遇到的问题
- Docker_容器数据卷介绍
- 数据卷容器
- DockerFile详解(上面已经简单写过)
- DockerFile 体系结构(保留字指令)
- 小案例
- docker常用安装(以tomcat为例)
- 本地镜像推送到阿里云
docker三要素
仓库,镜像,容器
仓库 – 存放镜像的地方
镜像 – 相当于类/模板
容器 – 镜像的实例,可以把容器看作一个简易的Linux环境
docker logo含义
蓝色的大海 – 宿主机系统 (centos7)
鲸鱼 – docker
鲸鱼背上的集装箱 – 容器实例
关于yum install 报错
yum install 报错[Errno 14] curl#37 - Couldn’t open file /mnt/repodata/repomd.xml
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连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器,容器是一个运行时环境,相当于集装箱
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:[镜像版本号]
--------------------------------------完结撒花-------------------------------------------