Docker-基础命令

63 阅读4分钟

学习视频

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镜像层都是只读的,容器层是可写的,当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

快捷键

  1. 退出容器并不停止容器:ctrl + P + Q
  2. 清屏:ctrl + L

帮助启动类命令

  1. 启动docker:systemctl start docker
  2. 停止docker:systemctl stop docker
  3. 重启docker:systemctl restart docker
  4. 查看docker状态:systemctl status docker
  5. 开机自启动:systemctl enable docker
  6. 查看docker概要信息:docker info
  7. 查看docker总体帮助文档:docker --help
  8. 查看docker具体命令帮助文档:docker 具体命令 --help
    例:docker run --help
  9. 查看docker版本:docker version

镜像命令

  1. docker images 列出本地主机上的镜像
    -a列出本地所有的镜像(含历史映像层)
    -q只显示镜像ID
  2. docker search [OPTIONS] 镜像名字 搜索镜像
    --limit 5只列出N个镜像,默认25个
    例:docker search --limit 5 redis
  3. docker pull 某个XXX镜像名字 下载镜像
    docker pull 镜像名字[:TAG]
    没有TAG就是最新版 等于 docker pull 镜像名字:latest
    例:docker pull 镜像名字:latest
  4. docker system df 查看镜像/容器/数据卷所占的空间
  5. docker rmi 某个XXX镜像名字ID 删除镜像
    docker rmi -f 镜像ID 删除单个
    docker rmi -f 镜像名1:TAG 镜像名2:TAG 删除多个,多个镜像名之间用空格分隔开
    docker rmi -f $(docker images -qa) 删除全部(危险危险)
  6. docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
    提交容器副本使之成为一个新的镜像
  7. docker build -t 新镜像名字:TAG . 根据Dockerfile构建新镜像
    注意,上面TAG后面有个空格,有个点。
  8. docker image ls -f dangling=true 查看虚悬镜像命令
    docker image prue 删除所有虚悬镜像
  9. docker push 镜像名称:tag 推送镜像到仓库
  10. docker tag 镜像:Tag Host:Port/Repository:Tag 修改镜像tag,使之符合私服规范的Tag

容器命令

  1. docker ps
# 列出当前所有正在运行的容器
`docker ps [OPTIONS]`
OPTIONS说明(常用):
`-a` 列出当前所有正在运行的容器+历史上运行过的
`-l` 显示最近创建的容器(**一个**)
`-n` 显示最近**n个**创建的容器
`-q` 静默模式,只显示容器编号(列出**正在运行**的所有容器id)
  1. 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
  1. 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`
  1. 退出容器:
    exit run进去容器,exit退出,容器停止(如果run 的时候是通过 -d 后台运行 用exit退出也不会导致容器停止)
    ctrl+p+q 快捷键退出,容器不会停止
  2. docker start 容器ID或者容器名 启动已停止运行的容器
  3. docker restart 容器ID或者容器名 重启容器
  4. docker stop 容器ID或者容器名 停止容器
  5. docker kill 容器ID或容器名 强制停止容器
  6. docker rm 容器ID 删除已停止的容器
    docker rm -f $(docker ps -a -q) 一次性删除多个容器实例(删除全部
    docker ps -a -q | xargs docker rm 一次性删除多个容器实例(删除全部
  7. docker logs 容器ID 查看容器日志(可以看到启动日志)
  8. docker top 容器ID 查看容器内运行的进程
  9. docker inspect 容器ID 查看容器内部细节(网络配置,容器创建时间等)
  10. docker cp 容器ID:容器内路径 目的主机路径 从容器内拷贝文件到主机上
  11. docker export 容器ID > 文件名.tar 导出容器
  12. cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 导入容器

小知识or疑难杂症

  1. 什么是虚悬镜像?
    仓库名、标签都是<none>的镜像,俗称虚悬镜像dangling image。
    docker image ls -f dangling=true 查看虚悬镜像命令
    docker image prue 删除所有虚悬镜像

  2. 访问官方镜像仓库很慢?
    设置stable镜像仓库:yum-config-manager --add-repo mirrors.aliyun.com/docker-ce/l…
    还可以使用免费的阿里云个人镜像加速器

  3. 使用docker import命令后,启动容器失败?
    ①出现报错docker: Error response from daemon: No command specified.
    image.png
    原因:被docker export出来的镜像在启动的时候需要指定command,可以通过docker ps -a --no-trunc查询到,查询到command后在docker run后添加参数即可。
    image.png image.png 解决办法参考链接:blog.csdn.net/u013189824/…
    ②启动还是失败,还有Read-only file system问题待解决 image.png

  4. Docker挂载主机目录访问如果出现cannot open directory .: Permission denied?
    解决办法:在挂载目录后多加一个--privileged=true参数即可