• Docker学习笔记


    尚硅谷2022版Docker实战教程(docker教程天花板)
    跟着周阳老师学的

    Docker简介

    Docker是基于Go语言实现的云开源项目。
    Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。

    Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

    解决了运行环境和配置问题的软件容器,
    方便做持续集成并有助于整体发布的容器虚拟化技术。

    Docker常用命令

    镜像命令

    1.docker images

    列出本地主机上的镜像

    各个选项说明:

    • REPOSITORY:表示镜像的仓库源
    • TAG:镜像的标签版本号
    • IMAGE ID:镜像ID
    • CREATED:镜像创建时间
    • SIZE:镜像大小

    同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
    如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像

    OPTIONS说明:

    • -a :列出本地所有的镜像(含历史映像层)
    • -q :只显示镜像ID。

    在这里插入图片描述

    2. docker search [OPTIONS] 镜像名字

    OPTIONS说明:

    • –limit : 只列出N个镜像,默认25个
    • docker search --limit 5 redis
      在这里插入图片描述在这里插入图片描述

    3. docker pull 镜像名字[:TAG]

    没有TAG就是最新版,等价于 docker pull 镜像名字:latest
    示例:docker pull redis
    在这里插入图片描述

    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)
      在这里插入图片描述

    容器命令

    1.docker run [OPTIONS] IMAGE [COMMAND] [ARG…] (新建+启动容器)

    OPTIONS说明(常用):有些是一个减号,有些是两个减号

    • –name=容器新名字 : 为容器指定一个名称;

    • -d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行);

    • -i:以交互模式运行容器,通常与 -t 同时使用;

    • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
      也即启动交互式容器(前台有伪终端,等待交互);

    • -P:随机端口映射,大写P

    • -p:指定端口映射,小写p

    1.进入新建名为myub1的ubuntu容器
    在这里插入图片描述
    2.查看正在运行的容器,发现ubuntu正在运行
    在这里插入图片描述

    2.docker ps [OPTIONS]: 列出容器

    没加OPTIONS只显示正在运行的容器

    OPTIONS说明:

    • -a :显示所有的容器,包括未运行的。

    • -l :显示最近创建的容器。

    • -n :列出最近创建的n个容器。

    3.退出容器

    • exit:run进去容器,exit退出,容器停止
    • run进去容器,ctrl+p+q退出,容器不停止

    4.启动已停止运行的容器:docker start 容器ID或者容器名

    5.重启容器:docker restart 容器ID或者容器名

    6.停止容器:docker stop 容器ID或者容器名

    7.强制停止容器:docker kill 容器ID或容器名

    8.删除已停止的容器:docker rm 容器ID

    9.启动守护式容器(后台服务器)

    在大部分的场景下,我们希望 docker 的服务是在后台运行的,
    我们可以过 -d 指定容器的后台运行模式。

    • 前台交互式启动: docker run -it redis
    • 后台守护式启动:docker run -d redis
      在这里插入图片描述

    10.查看容器日志:docker logs 容器ID

    在这里插入图片描述

    11.查看容器内运行的进程:docker top 容器ID

    在这里插入图片描述

    12.进入正在运行的容器并以命令行交互

    docker exec -it 容器ID/名字 bash
    docker exec -it 容器ID/名字 sh
    有的用sh才能进去,奇怪
    在这里插入图片描述
    退出容器输入exit即可
    推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。

    13.导入导出容器

    docker export 容器id > 导出名.tar 会导出在当前目录下
    cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号,下面例子,发现已成功导入并运行了一个实例
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    Docker镜像

    所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。分层时有文件更新直接替换,基础镜像一样时直接拿过来复用。

    如redis下载不同版本时,第一层相同,直接复用,其他几层分层下载。

    afb6ec6fdc1c: Already exists 
    608641ee4c3f: Pull complete 
    668ab9e1f4bc: Pull complete 
    78a12698914e: Pull complete 
    d056855f4300: Pull complete 
    618fdf7d0dec: Pull complete 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    参考:彻底搞懂Docker镜像分层

    Docker镜像commit操作案例

    docker commit提交容器副本使之成为一个新的镜像

    docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
    
    • 1

    原始的默认Ubuntu镜像是不带着vim命令的
    在这里插入图片描述
    在这里插入图片描述
    docker容器内执行上述两条命令:
    apt-get update
    apt-get -y install vim
    安装完成后,commit我们自己的新镜像,下面可以看出最后成功的生成新的镜像,并且有vim

    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                       NAMES
    3e3b091c6c42   ubuntu                   "bash"                   10 minutes ago   Up 10 minutes                                               awesome_robinson
    fefe8083cf9f   ubuntu                   "bash"                   17 minutes ago   Up 17 minutes                                               dazzling_feynman
    2e4c5b210b52   whyour/qinglong:2.11.3   "./docker/docker-ent…"   8 weeks ago      Up 23 minutes   0.0.0.0:8353->5700/tcp, :::8353->5700/tcp   qinglong
    58e523263901   whyour/qinglong:2.11.3   "./docker/docker-ent…"   2 months ago     Up 23 minutes   0.0.0.0:8354->5700/tcp, :::8354->5700/tcp   qinglong2
    [root@localhost ~]# docker commit -m="带vim的ununtu" -a="yhy" 3e3b091c6c42 vimubuntu:1.0
    sha256:fe04d9dec70896d18a94108bcf0effeb75dde1fdbe3c8d8d4f10d2df55ba32a1
    [root@localhost ~]# docker images
    REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
    vimubuntu         1.0       fe04d9dec708   15 seconds ago   179MB
    aero/ubuntu       1.0       6df7a1bdc1ee   22 hours ago     72.9MB
    whyour/qinglong   2.11.3    124540254df2   6 months ago     497MB
    redis             latest    7614ae9453d1   8 months ago     113MB
    ubuntu            latest    26b77e58432b   17 months ago    72.9MB
    [root@localhost ~]# docker run -it vimubuntu bash
    Unable to find image 'vimubuntu:latest' locally
    ^Z
    [1]+  已停止               docker run -it vimubuntu bash
    [root@localhost ~]# docker run -it fe04d9dec708 bash
    root@f81980747e05:/# vim a
    root@f81980747e05:/# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    Docker容器数据卷

    什么是容器数据卷

    卷的本质是文件或者目录,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统。卷的概念不仅解决了数据持久化的问题,还解决了容器间共享数据的问题。

    为何使用容器卷

    1. 数据的持久化,当容器重启后保证数据不丢失,例如我们可以使用卷将 MySQL 的目录持久化,实现容器重启数据库数据将不会丢失。防止手贱删掉了容器,数据不见了。

    2. 如果将数据存储于镜像中,主机上的其他进程不方便访问这些数据。

    容器卷有哪些特点

    1. 数据卷可在容器之间共享或重用数据

    2. 数据卷中的更改不会包含在镜像的更新中

    3. 卷中的更改可以直接生效

    4. 数据卷的生命周期一直持续到没有容器使用它为止

    宿主vs容器之间映射添加容器卷

    Docker的数据管理(volume/bind mount/tmpfs)
    docker存储有哪几种方式

    • Volumes方式下: 容器内的数据被存放到宿主机(linux)一个特定的目录下(/var/lib/docker/volumes/)。这个目录只有Docker可以管理,其他进程不能修改。如果想持久保存容器的应用数据,Volumes是Docker推荐的挂载方式。
    • Bind mounts方式下:容器内的数据被存放到宿主机文件系统的任意位置,甚至存放到一些重要的系统目录或文件中。除了Docker之外的进程也可以任意对他们进行修改;
    • tmpfs方式下: 容器的数据只会存放到宿主机的内存中,不会被写到宿主机的文件系统中,因此不能持久保存容器的应用数据。

    命令:

     docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录      镜像名
    
    • 1

    案例:
    新建一个容器并指定映射关系,如果容器需要别名加上--name =“别名”

    docker run -it --privileged=true -v /tmp/myHostData:/tmp/myDockerData myub1 /bash
    
    • 1

    在这里插入图片描述
    –privileged=true 作用:

    Docker挂载主机目录访问如果出现cannot open directory .: Permission denied
    解决办法:在挂载目录后多加一个--privileged=true参数即可
     
     
    如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,
    在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即
    使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    docker inspect 容器id\名 查看是否映射成功
    在这里插入图片描述
    经过实验可以看出,确实是共享的
    在这里插入图片描述

    卷的继承和共享

    在这里插入图片描述

    docker run -it  --privileged=true --volumes-from 父类  --name u2 ubuntu
    
    • 1

    继承我们上面刚创建的容器,可以看出,确实是继承了
    在这里插入图片描述

  • 相关阅读:
    pytorch初学笔记(四):常见的Transforms之ToTensor和Normalize的使用
    数据结构栈和队列
    JDK安装与配置(以windows的jdk17为例)
    Linux系统Redis安装教程-附带后台启动
    项目架构:eslint 代码检测、提交代码审查
    CTF竞赛题解之stm32逆向入门
    ping telnet 简单解释
    化云为雨,华为云为什么要深入经济的“毛细血管”?
    PowerShell-----常用命令(Windows)
    Perforce P4 error: Unable to determine client host name
  • 原文地址:https://blog.csdn.net/Fire_Sky_Ho/article/details/126572822