【Docker】入门到精通(常用命令解读)

一、准备工作

1.配置Docker的yum库

首先要安装一个yum工具

yum install -y yum-utils

安装成功后,执行命令,配置Docker的yum源:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

2.安装Docker

执行命令,安装Docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3.启动和校验

# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

4.配置镜像加速

4.1注册阿里云账号

首先访问阿里云网站: https://www.aliyun.com/ 注册一个账号。

4.2开通镜像服务

在首页的产品中,找到阿里云的容器镜像服务

在这里插入图片描述

点击后进入控制台:

在这里插入图片描述

首次可能需要选择立刻开通,然后进入控制台。

4.3.配置镜像加速

找到镜像工具下的镜像加速器

在这里插入图片描述
页面向下滚动,即可找到配置的文档说明:
在这里插入图片描述
具体命令如下:

# 创建目录
mkdir -p /etc/docker

# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF

# 重新加载配置
systemctl daemon-reload

# 重启Docker
systemctl restart docker

二、准备工作

1.常见的命令介绍

命令说明文档地址
docker pull拉取镜像docker pull
docker push推送镜像到DockerRegistrydocker push
docker images查看本地镜像docker images
docker rmi删除本地镜像docker rmi
docker run创建并运行容器(不能重复创建)docker run
docker stop停止指定容器docker stop
docker start启动指定容器docker start
docker restart重新启动容器docker restart
docker rm删除指定容器docs.docker.com
docker ps查看容器docker ps
docker logs查看容器运行日志docker logs
docker exec进入容器docker exec
docker save保存镜像到本地压缩文件docker save
docker load加载本地压缩文件到镜像docker load
docker inspect查看容器详细信息docker inspect

用一副图来表示这些命令的关系:
在这里插入图片描述
补充:

默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:

# Docker开机自启
systemctl enable docker

# Docker容器开机自启
docker update --restart=always [容器名/容器id]

2.演示

以Nginx为例给大家演示上述命令:DockerHub网址:https://hub-stage.docker.com/search

第1步,去DockerHub查看nginx镜像仓库及相关信息

在这里插入图片描述

第2步,拉取Nginx镜像
docker pull nginx

在这里插入图片描述

第3步,查看镜像
docker images

在这里插入图片描述

# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx

在这里插入图片描述

命令说明:

  • d : 表示容器后台运行
  • --name :容器名,可以任意,不可重复
  • -p :端口映射,前面80表示宿主机的端口,后面80表示容器的端口,容器是隔离环境,即容器内不做端口映射是无法访问到的,上述映射关系即所有请求到宿主机80端口的请求会转发到容器的80端口
    nginx : 前面加载的镜像名
第5步,查看运行中容器
docker ps

在这里插入图片描述

# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
第6步,停止容器
docker stop nginx
第7步,再次启动nginx容器
docker start nginx
第8步,查看容器详细信息
docker inspect nginx
第9步,进入容器,查看容器内目录
docker exec -it nginx bash

在这里插入图片描述

第10步,删除容器
docker rm nginx
发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx

3.命令别名

给常用Docker命令起别名,方便我们访问:

# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

然后,执行命令使别名生效

source /root/.bashrc

现在,就可以使用快捷命令查看镜像和容器了:
在这里插入图片描述

三、数据卷

数据卷(volume)是一个虚拟目录,是容器内目录宿主机****目录之间映射的桥梁。类似与宿主机与容器端口映射

以Nginx为例,我们知道Nginx中有两个关键的目录:

  • html:放置一些静态资源
  • conf:放置配置文件

如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。

但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:

在这里插入图片描述

在上图中:

  • 我们创建了两个数据卷:confhtml
  • Nginx容器内部的conf目录和html目录分别与两个数据卷关联。
  • 而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录

这样以来,容器内的confhtml目录就 与宿主机的confhtml目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。

3.1.数据卷命令

命令说明文档地址
docker volume create创建数据卷docker volume create
docker volume ls查看所有数据卷docs.docker.com
docker volume rm删除指定数据卷docs.docker.com
docker volume inspect查看某个数据卷的详情docs.docker.com
docker volume prune清除数据卷docker volume prune

注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建

演示环节:演示一下nginx的html目录挂载:

1.首先查看以下已有的数据集
docker volume ls

容器默认创建的数据卷:

在这里插入图片描述

2.然后创建一个自己的数据卷
docker volume create html
# 查看数据卷
docker volume ls

在这里插入图片描述

3.创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name qknginx -p 80:80 -v html:/usr/share/nginx/html nginx

在这里插入图片描述
命令说明:

  • -v : 表示数据卷挂载
  • html :之前创建的数据卷
  • /usr/share/nginx/html :qknginx这个容器内的映射路径,容器的所有数据卷映射路径都在宿主机的/var/lib/docker/volumes目录下
 cd /var/lib/docker/volumes/html/_data/

在这里插入图片描述

3.查看数据卷详情
docker volume inspect html

在这里插入图片描述

查看容器详情:

 docker inspect qknginx

可以看到数据卷挂载情况:

在这里插入图片描述

也可以进入到容器里相应的目录下查看:
在这里插入图片描述
可以看到宿主机目录下文件和容器内文件一模一样,可以宿主机内修改文件,查看页面情况。

3.2.挂载本地目录或文件

上述情况演示的是数据卷挂载的一种方式,我们也可以在创建运行容器的时候直接把本地路径与容器路径做映射:

演示,删除并重新创建mysql容器,并完成本地目录挂载:

  • 挂载/root/mysql/data到容器内的/var/lib/mysql目录

  • 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录(初始化的SQL脚本目录)

  • 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录(这个是MySQL配置文件目录)

    3.2.1 本地先创建3个目录
    mkdir -p /mysql/data
    mkdir -p /mysql/init
    mkdir -p /mysql/conf
    
    3.2.2 创建容器并挂载数据卷
    1.删除原来的MySQL容器
    docker rm -f mysql
    
    2.进入root目录
    cd ~
    
    3.创建并运行新mysql容器,挂载本地目录
    docker run -d \
      --name mysql \
      -p 3306:3306 \
      -e TZ=Asia/Shanghai \
      -e MYSQL_ROOT_PASSWORD=1234 \
      -v ./mysql/data:/var/lib/mysql \
      -v ./mysql/conf:/etc/mysql/conf.d \
      -v ./mysql/init:/docker-entrypoint-initdb.d \
      mysql
    
    4.查看root目录,可以发现~/mysql/data目录已经自动创建好了
    ll mysql
    
    结果:
    总用量 4
    drwxr-xr-x. 2 root    root   20 5月  19 15:11 conf
    drwxr-xr-x. 7 polkitd root 4096 5月  19 15:11 data
    drwxr-xr-x. 2 root    root   23 5月  19 15:11 init
    

    使用navicat连接工具查看:数据库初始化完成(备注:我在mysql/init和/mysql/config目录下放了自己的一些初始化数据,你也可以放一些自己初始化数据到相应的目录下)

在这里插入图片描述

四、镜像

前面我们一直在使用别人准备好的镜像,那如果我要部署一个Java项目,把它打包为一个镜像该怎么做呢?

举个例子,我们要从0部署一个Java应用,大概流程是这样:

  • 准备一个linux服务(CentOS或者Ubuntu均可)

  • 安装并配置JDK

  • 上传Jar包

  • 运行jar包
    那因此,我们打包镜像也是分成这么几步:

    • 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)

    • 安装并配置JDK

    • 拷贝jar包

    • 配置启动脚本

4.1.提前准备好一个基础镜像

在这里插入图片描述

4.2.加载镜像文件

docker load -i jdk.tar

在这里插入图片描述

4.3.制作DockerFile

在这里插入图片描述

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

4.4.构建镜像

docker build -t qkjdk:202424 .

命令说明:

  • docker build : 就是构建一个docker镜像
  • -t qkjdk:202424-t参数是指定镜像的名称(repositorytag
  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:
    • # 直接指定Dockerfile目录
      docker build -t qkjdk:202424 /home/qk
      

在这里插入图片描述

4.4.查看构建的镜像

docker images

在这里插入图片描述

4.5.然后尝试运行该镜像

docker run -d --name kk -p 8080:8080 qkjdk:202424

在这里插入图片描述

4.6.最后,导出镜像文件

docker export -o testjdk.tar kk

命令说明:

  • docker export: 就是导出docker镜像
  • -o testjdk.tar-o参数tar文件的名称
  • kk : 最后的kk就是容器名称

在这里插入图片描述

可以看出镜像文件已经被导出为testjdk.tar

4.7.重新加载运行导出的镜像

docker import testjdk.tar bsp-as-is:2024jdk

命令说明:

  • docker import: 就是导入docker镜像文件
  • testjdk.tar :镜像文件压缩包文件的名称
  • bsp-as-is:2024jdk : repositorytag
# 1.使用下面的命令创建并运行容器
docker run -itd --name qkjdk bsp-as-is:2024jdk /bin/bash
# 2.查看运行的容器
docker ps
# 结果
CONTAINER ID   IMAGE               COMMAND                  CREATED             STATUS             PORTS                                                  NAMES
ab55427e7d1e   bsp-as-is:2024jdk   "/bin/bash"              8 seconds ago       Up 7 seconds                                                              qkjdk
c60db535f84d   mysql               "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   qkmysql
b2b17b941c44   nginx               "/docker-entrypoint.…"   3 hours ago         Up 3 hours         0.0.0.0:80->80/tcp, :::80->80/tcp                      qknginx
# 3.进入容器
docker exec -it qkjdk bash

在这里插入图片描述

注意:Docker容器运行错误分析

当您在运行Docker容器时出现"docker: Error response from daemon: No command specified"错误时,这意味着您没有在命令中指定容器要运行的命令。每个容器都需要一个命令来执行,否则Docker将无法启动容器。

在这里插入图片描述

解决方法
要解决这个问题,您需要在运行容器时指定要在其中执行的命令。

以下是几个示例:1.运行一个交互式的容器
如果您希望在容器中运行交互式命令行会话,可以使用it选项来启动容器,并在命令中指定要运行的Shell:

docker run -itd --name qkjdk bsp-as-is:2024jdk /bin/bash

这将在容器中启动一个交互式的Bash会话。

五、网路

容器是隔离环境,在创建容器的时候,容器会创建一个默认的网桥:

 docker inspect qkjdk

在这里插入图片描述

同一网段的容器之间可以相互访问,但是不同网段的容器就无法访问,此时就需要自定义一个网桥,同一网桥下的容器之间可以相互访问

网络常见命令有:

命令说明文档地址
docker network create创建一个网络docker network create
docker network ls查看所有网络docs.docker.com
docker network rm删除指定网络docs.docker.com
docker network prune清除未使用的网络docs.docker.com
docker network connect使指定容器连接加入某网络docs.docker.com
docker network disconnect使指定容器连接离开某网络docker network disconnect
docker network inspect查看网络详细信息docker network inspect
5.1.当前宿主机下的所有网桥:

在这里插入图片描述

5.2.创建一个网桥
docker network create qqnet
5.3.为容器分配一个网桥
docker network connect qknet qkjdk

命令说明:

总结

  • 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
  • 在同一个自定义网络中的容器,可以通过别名互相访问

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/372171.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python创建pdf文件

目录 一&#xff1a;使用reportlab库 二&#xff1a;使用使pdf库 在Python中生成PDF文件可以使用多种库&#xff0c;其中最常用的是reportlab和fpdf。以下是使用这两个库生成PDF文件的示例代码&#xff1a; 一&#xff1a;使用reportlab库 1&#xff1a;写入文字信息 from r…

keil边框的背景色更改

网上有很多keil换背景色的帖子&#xff0c;效果如图&#xff1a; 可以看到&#xff0c;虽然代码区背景色设置为了黑色&#xff0c;但是上方、左侧边、下方的颜色并没有改变&#xff0c;看起来还是很不舒服。 机缘巧合&#xff0c;我想把Windows系统颜色设置为护眼的颜色&#x…

[Python图像处理] 使用OpenCV创建色调图

使用OpenCV创建色调图 色调映射和高动态范围成像应用色调映射相关链接 色调映射和高动态范围成像 高动态范围 (High Dynamic Range, HDR) 技术用于摄影成像&#xff0c;以再现比标准数字成像或摄影技术更大的动态范围的亮度。标准成像技术仅允许在一定范围内区分亮度&#xff…

yolov8使用旋转框自己做数据集检测

主要在数据集制作&#xff0c;训练的步骤和目标检测是一样的 1.数据集标注主要使用rolabelimg工具&#xff0c;这个工具不能在线安装 得下载源代码 然后运行 标注好数据保存会是一个xml文件 2.把xml文件转换成dota的xml文件&#xff0c;然后把dota的xml文件转换成dota的txt文件…

Java List的合并与切分

在Java开发中经常遇到list结构数据的处理&#xff0c;如List的合并或拆分&#xff0c;记录下来&#xff0c;方便备查。 一、List 合并 两个list数据的合并处理&#xff0c;可使用Java8 新特性的stream流&#xff0c;根据实际需要遍历取值。 1、定义 UserInfo 对象 订单bean…

【知识图谱--第一讲概论】

深度学习–连接主义 知识图谱–符号主义 表示 有属性图和RDF图两种 RDF由三元组表示&#xff1a;Subject - Predicate - Object 存储 图数据库 抽取 融合 推理 问答 图算法

基于SpringBoot+Vue的师生疫情健康信息管理登记平台,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Acwing---830. 单调栈

单调栈 1.题目2.基本思想3.代码实现 1.题目 给定一个长度为 N N N 的整数数列&#xff0c;输出每个数左边第一个比它小的数&#xff0c;如果不存在则输出 − 1 −1 −1。 输入格式 第一行包含整数 N N N&#xff0c;表示数列长度。 第二行包含 N N N 个整数&#xff0c…

vue2+html2pdf下载PDF,PDF分页切割

问题&#xff1a; PDF下载下来后&#xff0c;文档内容被暴力分割。 解决方案&#xff1a; HTML <!-- 打印按钮 --> <el-button type"primary" size"small" class"el-icon-download right_btn" click"downloadPDF">PDF&…

最短编辑距离问题与动态规划----LeetCode 72.编辑距离

动态规划&#xff08;Dynamic Programming, DP&#xff09;是解决复杂问题的一个强大工具&#xff0c;它将问题分解成更小的子问题&#xff0c;并使用这些子问题的解决方案来构建整体问题的解决方案。在深入探讨最短编辑距离问题之前&#xff0c;让我们先理解什么是动态规划&am…

CGAL的二维分段的Delaunay图

本章描述了CGAL的二维分段Delaunay图。我们从定义一节中的一些定义开始。2D段Delaunay图形包的软件设计在“软件设计”一节中进行了描述。在“几何特征”一节中&#xff0c;我们讨论了2D段Delaunay图包的几何特征&#xff0c;在“段Delaunay图层次结构”一节&#xff0c;简要描…

【Shell的运行原理以及Linux当中的权限问题】

Shell的运行原理以及Linux当中的权限问题 Shell的运行原理Linux当中的权限问题Linux权限的概念如何实现用户账号之间的切换如何仅提升当前指令的权限如何将普通用户添加到信任列表 Linux权限管理文件访问者的分类 (人)文件类型和访问权限 (事物属性)文件权限值的表示方法文件访…

MacOS系统电脑远程桌面控制windows系统电脑【内网穿透】

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. 测试本地局域网内远程控制1.1 Windows打开远程桌面1…

自动化测试的ROI

ROI模型树 提升ROI的基础出发点&#xff1a;增加运行次数 手段&#xff1a;测试左移、测试右移 测试左移&#xff08;测试阶段&#xff09; 原始测试流程&#xff1a; 软件生命周期&#xff1a;软件需求分析、软件设计、软件开发、单元测试、集成测试、系统测试开发阶段&…

ideaIU-2023.2.1安装教程

ideaIU-2023.2.1安装教程 一、ideaIU-2023.2.1安装1.1 下载IdeaIU-2023.2.1安装包1.2 安装ideaIU-2023.2.1 二、ideaIU-2023.2.1激活 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 一、ideaIU-2023.2.1安装 1.1 下载IdeaIU-2023.2.1安装包…

import blind_watermark ModuleNotFoundError: No module named ‘blind_watermark‘

Traceback (most recent call last): File "d:\python\PYTHON_VSCOD\demo.py", line 1, in <module> import blind_watermark ModuleNotFoundError: No module named blind_watermark 如何选择正确的解释器 在 Visual Studio Code (VS Code) 中更改 Python 解释…

5.0 HDFS 集群服务建立教程

HDFS 集群是建立在 Hadoop 集群之上的&#xff0c;由于 HDFS 是 Hadoop 最主要的守护进程&#xff0c;所以 HDFS 集群的配置过程是 Hadoop 集群配置过程的代表。 使用 Docker 可以更加方便地、高效地构建出一个集群环境。 每台计算机中的配置 Hadoop 如何配置集群、不同的计…

YOLOv5独家改进:上采样算子 | 超轻量高效动态上采样DySample,效果秒杀CAFFE,助力小目标检测

💡💡💡本文独家改进:一种超轻量高效动态上采样DySample, 具有更少的参数、FLOPs,效果秒杀CAFFE和YOLOv5网络中的nn.Upsample 💡💡💡在多个数据集下验证能够涨点,尤其在小目标检测领域涨点显著。 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/cate…

多线程生命周期与通信(二)通信

线程自启动时&#xff0c;就拥有了自己的栈空间。然后会一直运行直到结束。多线程的目的是多条线程执行不同的逻辑业务从而能够提升业务整体的响应速度&#xff0c;如果线程仅仅是孤零零的执行&#xff0c;不同的逻辑业务就不能最终汇聚成一个完整的业务那么多线程也就失去了意…

Windows10安装PCL1.14.0及点云配准

一、下载visual studio2022 下载网址&#xff1a;Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com) 安装的时候选择"使用C的桌面开发“&#xff0c;同时可以修改文件路径&#xff0c;可以放在D盘。修改文件路径的时候&#xff0c;共享组件、…