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

news2024/11/25 12:40:17

一、准备工作

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

命令说明:

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go语言深度解析:探索 crypto/md5 标准库的强大功能

Go语言深度解析&#xff1a;探索 crypto/md5 标准库的强大功能 引言Go语言和MD5的基础知识MD5算法简介Go语言概述Go中的MD5实现 crypto/md5 库的使用方法基本用法处理大型数据安全注意事项 实际案例分析示例1&#xff1a;文件的MD5校验示例2&#xff1a;网络数据的MD5哈希示例3…

第9章 安全漏洞、威胁和对策(9.11-9.16)

9.11 专用设备 专用设备王国疆域辽阔&#xff0c;而且仍在不断扩张。 专用设备是指为某一特定目的而设计&#xff0c;供某一特定类型机构使用或执行某一特定功能的任何设备。 它们可被看作DCS、物联网、智能设备、端点设备或边缘计算系统的一个类型。 医疗设备、智能汽车、…

154基于matlab的二维元胞自动机模拟森林火灾(生命游戏 )和模拟收费站交通流

基于matlab的二维元胞自动机模拟森林火灾&#xff08;生命游戏 &#xff09;和模拟收费站交通流。全国大学生美国建模竞赛&#xff0c;程序已调通&#xff0c;可直接运行。 154 元细胞自动机 森林起火 收费站交通 (xiaohongshu.com)

大人不华,君子务实|复旦大学-华盛顿大学EMBA C18班优秀学生代表周靖毕业典礼演讲

周靖      Ecarx集团首席财务官      亲爱的Mazzeo院长、殷院长、尊敬的各位老师们、家人们以及各位同学们和毕业生们&#xff1a;      今天&#xff0c;当我们站在开启人生新篇章的分岔路&#xff0c;真是五味杂陈&#xff0c;感慨万千。对我们而言&#xff0c;能…

Day 35 | 贪心 860.柠檬水找零 、 406.根据身高重建队列 、 452. 用最少数量的箭引爆气球

860.柠檬水找零 题目 文章讲解 视频讲解 思路&#xff1a;分别列出三种支付方式对应的找零情况 class Solution {public boolean lemonadeChange(int[] bills) {int five 0, ten 0, twenty 0;for (int i 0; i < bills.length; i) {if (bills[i] 5) {five;} else if…

undefined symbol: avio_protocol_get_class, version LIBAVFORMAT_58

rv1126上进行编译和在虚拟机里面进行交叉编译ffmpeg都不行 解决办法查看 查看安装的ffmpeg链接的文件 ldd ./ffmpeg rootEASY-EAI-NANO:/home/nano/ffmpeg-4.3.6# ldd ffmpeg linux-vdso.so.1 (0xaeebd000)libavdevice.so.58 > /lib/arm-linux-gnueabihf/libavde…

防火墙是什么?聊聊如何轻松缓解应用漏洞

数字经济时代&#xff0c;也是应用爆炸的时代。企业越来越多地使用分布式应用架构构建现代微服务&#xff0c;以适应日益增长的应用使用量并提供更高的性能。与此同时却出现许多热点**&#xff0c;如供应链安全、零日漏洞、数据泄露等。忽视安全防护的企业会面临丢失业务的风险…

npm install express -g报错或一直卡着,亲测可解决

问题描述&#xff1a; 最近学习vue3前端框架&#xff0c;安装Node.js之后&#xff0c;在测试是否可行时&#xff0c;cmd窗口执行了&#xff1a;npm install express -g&#xff0c;发现如下图所示一直卡着不动&#xff0c;最后还报错了&#xff0c;网上找了好久&#xff0c;各…

操作系统基础:文件系统基础【下】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 ⚔️1 文件的基本操作⚖️1.1 总览⚖️1.2 几种基本操作&#x1f52d;1.2.1 创建文件&#x1f52d;1.2.2 删除文件&#x1f52d;1.2.3 打开文件&#x1f52d;1.2.4 关闭文件…

python算法与数据结构---动态规划

动态规划 记不住过去的人&#xff0c;注定要重蹈覆辙。 定义 对于一个模型为n的问题&#xff0c;将其分解为k个规模较小的子问题&#xff08;阶段&#xff09;&#xff0c;按顺序求解子问题&#xff0c;前一子问题的解&#xff0c;为后一子问题提供有用的信息。在求解任一子…

Multisim14.0仿真(四十一)交通信号灯仿真设计

一、功能简介&#xff1a; 1&#xff09;、采用两片74LS192做减法计数器&#xff0c;实现倒计时功能。 2&#xff09;、采用DCD数码管显示时间。 3&#xff09;、采用4个TRAFFIC_LIGHT_SINGLE红绿灯 4&#xff09;、采用74LS160和74LS138实现对红绿灯的逻辑控制。 5&#xff09…

Python 潮流周刊#38:Django + Next.js 构建全栈项目

△△请给“Python猫”加星标 &#xff0c;以免错过文章推送 你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。本周刊开源&#xff0c;欢迎投稿[1]。另有电报频道[2]作为副刊&#xff0c;补充发布更加丰富的资讯&#xff0c;…

elementUI 表格中如何合并动态数据的单元格

elementUI 表格中如何合并动态数据的单元格 ui中提供的案例是固定写法无法满足 实际开发需求 下面进行改造如下 准备数据如下 //在表格中 设置单元格的方法 :span-method"spanMethodFun" <el-table :data"tableData" border :span-method"spa…

私有化部署一个吃豆人小游戏

目录 效果 安装步骤 1.安装并启动httpd 2.下载代码 3.启动httpd 使用 效果 安装步骤 1.安装并启动httpd yum -y install httpd 2.下载代码 进入目录 cd /var/www/html/ 下载 git clone https://gitee.com/WangZhe168_admin/pacman-canvas.git 3.启动httpd syste…

docker更换镜像源

添加的镜像源 {"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com", "https://reg-mirror.qiniu.com/", "https://docker.mirrors.ustc.edu.cn"] }docker更换镜像源之后一定要重启守卫 systemctl daemon-reloaddock…

网络原理TCP/IP(5)

文章目录 IP协议IP协议报头地址管理网段划分特殊的IP地址路由选择以太网认识MAC地址对比理解MAC地址和IP地址DNS&#xff08;域名服务器&#xff09; IP协议 IP协议主要完成的工作是两方面&#xff1a; 地址管理&#xff0c;使用一套地址体系&#xff0c;来描述互联网上每个设…

响应式开发如何设置断点,小屏幕界面该如何显示(有动图)

Hi&#xff0c;我是贝格前端工场&#xff0c;本期分享响应式开发&#xff0c;如何设置屏幕断点&#xff0c;pc页面布局到了移动端之后该如何布局的问题&#xff0c;微软也提供了设置屏幕断点的动图演示&#xff0c;非常直观。 一、什么是响应式开发&#xff0c;为何要设置屏幕断…

问题:0xc8前面加(byte) #人工智能#学习方法的原因是因为0xc8大于??????????? 。 #微信#其他#微信

问题&#xff1a;0xc8前面加&#xff08;byte&#xff09;的原因是因为0xc8大于??????????? 。 参考答案如图所示

【Linux】信号-下

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;信号递达&#xff0c;信号未决&#x…

【MySQL】DQL的总结和案例学习

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-VWRkWqFrRMi4uLRa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…