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相关
-
连接上网络
-
yum -y install gcc
-
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 步骤
-
注册一个阿里云账户(可复用淘宝账户)
-
选择容器镜像服务
-
获取加速器地址
-
依照文档执行命令
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 帮助启动类命令
-
启动docker
systemctl start docker
-
停止docker
systemctl stop docker
-
重启docker
systemctl restart docker
-
查看docker状态
systemctl status docker
-
开机启动docker
systemctl enable docker
-
查看docker概要信息
docker info
-
查看docker总体帮助文档
docker --help
-
查看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 删除某镜像
-
删除单个镜像
docker rmi [-f] 镜像ID
-
删除多个镜像
docker rmi [-f] 镜像名1:TAG 镜像名2:TAG。。。
-
删除全部镜像
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 退出容器
-
exit命令退出,容器停止
-
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
一次删除多个容器实例
docker rm -f $(docker ps -a -q)
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:镜像打包导入导出
新建一个Ubuntu容器
进入Ubuntu容器/usr目录下并新建wzh.txt文件
使用Ctrl+P+Q退出但不关闭容器
将容器封装为一个tar包并保存到本地
关闭容器并删除Ubuntu镜像
使用封装好的tar文件导入为镜像
使用该镜像创建容器
进入容器的/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
使用Ubuntu镜像创建容器
在容器内安装好vim并尝试写入内容,使用Ctrl+P+Q退出但不关闭容器
使用commit提交容器副本使之成为一个新的镜像
使用新的镜像创建容器,此时容器内可以直接使用vim命令
5.2 将本地镜像推送到阿里云
5.2.1 推送流程
3.4.2 创建仓库镜像
阿里云开发者平台
https://promotion.aliyun.com/ntms/act/kubernetes.html
-
选择控制台进入容器镜像服务
-
选择个人实例
-
命名空间
初次使用须先开通服务
-
仓库名称
-
进入管理界面获得脚本
-
推送到阿里云
3.4.3 拉取已上传的镜像
3.4.5 私有库发布流程
Docker Registry
官方提供的工具,可用于构建私有镜像仓库。
-
下载镜像Docker Registry
-
运行私有库registry,相当于本地的Docker Hub
docker run -d -p 5000:5000 -v /zzyyuse/myegistry/:/tmp/registry --privileged=true registry 仓库默认被创建在容器的var/lib/registry目录下,建议[-v]自行用容器卷映射,方便宿主机联调 [-v] 添加自定义容器卷 [--privileged=true] 扩大容器的权限,解决挂载目录没有权限的问题
-
案例:Ubuntu安装ifconfig命令
apt-get update apt-get install net-tools
-
commit 提交新镜像
docker commit -m"提交的描述信息"-a="作者" 容器ID 要创建的目标镜像名:[标签名]
-
验证新镜像
-
curl验证私服库上有什么镜像
curl -XGET http://Host:Port/v2/_catalog # 模拟发送一个GET请求
-
将新镜像修改符合私服规范的Tag
docker tag 镜像:Tag Host:Port/Repository:Tag
-
修改配置文件使之支持http
docker默认不允许http方式推送镜像,通过配置选项来取消这个限制(修改完若不生效,建议重启docker)
vim /etc/docker/daemon.json
在deamon.json文件中添加
{ "registry-mirrors":["https://aa25jugu.mirror.aliyuncs.com"], "insecure-registries":["Host:Port"] }
-
push推送到私服库
docker push Host:Port/IMAGE:TAG
-
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 案例:运行一个带有容器数据卷存储功能的容器实例
特点
- 数据卷可在容器之间共享或重用数据。
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
- 可以将docker容器内的数据保存进宿主机的磁盘中
-
宿主机和容器之间映射添加容器卷
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
案例:添加映射后可以将docker容器内的数据实时同步保存进宿主机的磁盘中
-
创建容器并添加映射
***** 此时会生成相应的目录文件夹(docker_data 和 host_data)
-
在容器内/tmp/host_data目录下创建文件(模拟办公场景产生的数据文件)
-
查看主机对应的/tmp/docker_data目录,此时已将容器内产生的数据文件映射同步到了宿主机内,实现了数据的共享
***** 同样的,在主机的/tmp/docker_data目录下做修改,即时容器被停止了,对应的数据也会同步映射到容器内
-
-
查看数据卷是否挂载成功
docker inspect 容器ID # 以json形式查看该容器的详细信息 * Mounts 挂载