学习视频
B站:尚硅谷2022版Docker实战教程(docker教程天花板)
以下笔记均整理自视频配套脑图
Docker是什么?
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。
为什么Docker会比VM虚拟机快?
(1)docker有着比虚拟机更少的抽象层
由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
(2)docker利用的是宿主机的内核,而不需要加载操作系统OS内核
当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。
Docker的基本组成
镜像:Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统叫UnionFS(联合文件系统),Union 文件系统是 Docker 镜像的基础。
容器:容器是用镜像创建的运行实例。
仓库:仓库(Repository)是集中存放镜像文件的场所,仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
重点理解:Docker镜像层都是只读的,容器层是可写的,当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
快捷键
- 退出容器并不停止容器:
ctrl + P + Q
- 清屏:
ctrl + L
帮助启动类命令
- 启动docker:
systemctl start docker
- 停止docker:
systemctl stop docker
- 重启docker:
systemctl restart docker
- 查看docker状态:
systemctl status docker
- 开机自启动:
systemctl enable docker
- 查看docker概要信息:
docker info
- 查看docker总体帮助文档:
docker --help
- 查看docker具体命令帮助文档:
docker 具体命令 --help
例:docker run --help - 查看docker版本:
docker version
镜像命令
docker images
列出本地主机上的镜像
-a
列出本地所有的镜像(含历史映像层)
-q
只显示镜像IDdocker search [OPTIONS] 镜像名字
搜索镜像
--limit 5
只列出N个镜像,默认25个
例:docker search --limit 5 redisdocker pull 某个XXX镜像名字
下载镜像
docker pull 镜像名字[:TAG]
没有TAG就是最新版 等于 docker pull 镜像名字:latest
例:docker pull 镜像名字:latestdocker system df
查看镜像/容器/数据卷所占的空间docker rmi 某个XXX镜像名字ID
删除镜像
docker rmi -f 镜像ID
删除单个
docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除多个,多个镜像名之间用空格分隔开
docker rmi -f $(docker images -qa)
删除全部(危险危险)docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
提交容器副本使之成为一个新的镜像docker build -t 新镜像名字:TAG .
根据Dockerfile构建新镜像
注意,上面TAG后面有个空格,有个点。docker image ls -f dangling=true
查看虚悬镜像命令
docker image prue
删除所有虚悬镜像docker push 镜像名称:tag
推送镜像到仓库docker tag 镜像:Tag Host:Port/Repository:Tag
修改镜像tag,使之符合私服规范的Tag
容器命令
- docker ps
# 列出当前所有正在运行的容器
`docker ps [OPTIONS]`
OPTIONS说明(常用):
`-a` 列出当前所有正在运行的容器+历史上运行过的
`-l` 显示最近创建的容器(**一个**)
`-n` 显示最近**n个**创建的容器
`-q` 静默模式,只显示容器编号(列出**正在运行**的所有容器id)
- docker run
# 新建+启动容器(本地镜像不存在时,会自动拉取远程镜像)
`docker run [OPTIONS] IMAGE [COMMAND] [ARG...]`
OPTIONS说明(常用):有些是一个减号,有些是两个减号
`--name="容器新名字"` 为容器指定一个名称
`-d` 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
`-i` 以交互模式运行容器,通常与 -t 同时使用
`-t` 为容器重新分配一个伪输入终端,通常与 -i 同时使用
也即启动交互式容器(前台有伪终端,等待交互)
例:docker run -it centos /bin/bash
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
`-P` 随机端口映射,大写P
`-p` 指定端口映射,小写p
例:-p 8080:80
指定宿主机端口8080映射容器内端口80
`--restart=always` docker重启时,容器自动重启
`-v` 容器卷映射
例:docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
说明:`:ro` 代表只读,默认不填为读写`:rw`
`--privileged=true` 使用该参数,container内的root拥有真正的root权限,
否则,container内的root只是外部的一个普通用户权限。
`--volumes-from` 容器2继承容器1的卷规则
例:docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
- docker exec
# 进入正在运行的容器并以命令行交互
(1)`docker exec -it 容器ID bashShell`
例:docker exec -it 373f51a6c962 bash
bash:也可以是 /bin/bash,也可能是其他shell命令
例:docker exec -it 容器ID redis-cli*(直接打开redis命令行工具)
(2)`docker attach 容器ID` 进入正在运行的容器并以命令行交互
说明:attach 直接进入容器启动命令的终端,不会启动新的进程用exit退出,会导致容器的停止。
exec 是在容器中打开新的终端,并且可以启动新的进程用exit退出,不会导致容器的停止。
一般用-d后台启动的程序,再用exec进入对应容器实例
注意:使用`-d`后台运行的容器,无法使用attach进入。
快捷键:退出容器并不停止容器:`ctrl + P + Q`
- 退出容器:
exit
run进去容器,exit退出,容器停止(如果run 的时候是通过 -d 后台运行 用exit退出也不会导致容器停止)
ctrl+p+q
快捷键退出,容器不会停止 docker start 容器ID或者容器名
启动已停止运行的容器docker restart 容器ID或者容器名
重启容器docker stop 容器ID或者容器名
停止容器docker kill 容器ID或容器名
强制停止容器docker rm 容器ID
删除已停止的容器
docker rm -f $(docker ps -a -q)
一次性删除多个容器实例(删除全部)
docker ps -a -q | xargs docker rm
一次性删除多个容器实例(删除全部)docker logs 容器ID
查看容器日志(可以看到启动日志)docker top 容器ID
查看容器内运行的进程docker inspect 容器ID
查看容器内部细节(网络配置,容器创建时间等)docker cp 容器ID:容器内路径 目的主机路径
从容器内拷贝文件到主机上docker export 容器ID > 文件名.tar
导出容器cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
导入容器
小知识or疑难杂症
-
什么是虚悬镜像?
仓库名、标签都是<none>的镜像,俗称虚悬镜像dangling image。
docker image ls -f dangling=true
查看虚悬镜像命令
docker image prue
删除所有虚悬镜像 -
访问官方镜像仓库很慢?
设置stable镜像仓库:yum-config-manager --add-repo mirrors.aliyun.com/docker-ce/l…
还可以使用免费的阿里云个人镜像加速器 -
使用docker import命令后,启动容器失败?
①出现报错docker: Error response from daemon: No command specified.
原因:被docker export出来的镜像在启动的时候需要指定command,可以通过docker ps -a --no-trunc
查询到,查询到command后在docker run后添加参数即可。
解决办法参考链接:blog.csdn.net/u013189824/…
②启动还是失败,还有Read-only file system问题待解决 -
Docker挂载主机目录访问如果出现cannot open directory .: Permission denied?
解决办法:在挂载目录后多加一个--privileged=true参数即可