Docker基础知识的掌握,相关基本命令的用法

安装docker步骤:https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d

1.docker

Docker 是一种容器化平台,用于帮助开发者打包、发布和管理应用程序及其依赖关系。通过 Docker,开发者可以将应用程序及其所有依赖项打包到一个称为容器的可移植单元中。这些容器可以在几乎任何环境中快速、一致地运行,无论是开发、测试、还是生产环境。 Docker 的主要优势之一是它提供了轻量级、独立的运行环境,同时保证了应用程序在不同环境中的一致性和可移植性

2.镜像和容器

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。

镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub。

docker deamon守护进程会在后台运行和监听事假,当客户端发送命令,该命令会被守护进程监听并且解析,比如客户端的命令是启动mysql服务的话,守护进程解析完会去镜像仓库寻找应用镜像。第二次运行的时候就不需要再次下载。

总结:

  • Docker是做什么的? Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用
  • 什么是镜像? 将应用所需的函数库、依赖、配置等与应用一起打包得到的就是镜像
  • 什么是容器? 为每个镜像的应用进程创建的隔离运行环境就是容器
  • 什么是镜像仓库? 存储和管理镜像的服务就是镜像仓库, DockerHub是目前最大的镜像仓库,其中包含各种常见的应用镜像

3.docker命令

3.1  docker run 参数说明

参数说明:

docker run :创建并运行一个容器,-d 是让容器在后台运行

--name mysql :给容器起个名字,必须唯一

-p 3306:3306 :设置端口映射

-e KEY=VALUE :是设置环境变量

mysql :指定运行的镜像的名字

为什么需要端口映射?

在 Docker 中运行容器时进行端口映射是因为 Docker 容器本质上是在宿主机上运行的进程,每个容器都有自己的网络命名空间和 IP 地址。外部机器通过容器的ip地址访问容器是访问不到的,但是端口映射允许容器中运行的应用程序能够通过宿主机的 IP 地址和端口与外部通信。

-p 3306:3306 :设置端口映射,一般改的话,只会改宿主机的端口号,也就是第一个参数,可以通过不同的端口号,开启多个mysql服务。

3.2  镜像名字规范

镜像名称一般分两部分组成:[repository]:[tag]。

其中repository就是镜像名 tag是镜像的版本 在没有指定tag时,默认是latest,代表最新版本的镜像

如果镜像名字只是mysql的话,那么版本号默认最新版。

如果我想要mysql的5.7版本的话,就应该是这样 mysql:5.7

4.docker基础

常见命令:

Docker最常见的命令就是操作镜像、容器的命令,详见官方文档:https://docs.docker.com/

注意事项:

docker run 相当于一条龙服务,它会帮你需要的镜像从镜像仓库拉取到本地仓库,

并且创建和运行容器,需要注意的是,docker run一个镜像只需要进行一次,后续无论是虚拟机重

启,你也只需要启动或者停止相应的容器,因为容器本来就存在,不需要重复的创建。

容器有独立的网络,有独立的内存等等

案例实践:

查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器

需求:

  • 在DockerHub中搜索Nginx镜像,查看镜像的名称

  • 拉取Nginx镜像
docker pull nginx
  • 查看本地镜像列表
docker images
  • 保存镜像
#可以通过下面指令,看看需要什么参数
docker save --help 
#最后的指令(-o 是参数)
docker save -o nginx.tar nginx:latest
  • 删除镜像
docker rmi nginx:latest
  • 加载镜像(将上面的save的.tar压缩文件加载下来)
#先通过帮助文档看看需要什么参数
docker load --help
#最后的指令
docker load -i nginx.tar 
  • 创建并运行Nginx容器
docker run -d --name nignx -p 80:80 nginx
  • 删除Nginx容器
docker rm nginx
  • 查看容器
#查看正在运行的容器
docker ps
#查看所用的容器
docker ps -a
  • 停止容器
docker stop nginx
  • 再次启动容器
docker start nginx
  • 进入Nginx容器
#通过命令行的方式进入容器
docker exec -it nginx sh
#这样可以直接进去mysql命令行
docker exec -it mysql sh
mysql -uroot -p123

  • 查看nginx日志
#正常
docker logs nginx
#如何想要看到实况
docker logs -f nginx

5.数据卷

5.1  数据卷的定义

数据卷的存在解决了容器文件不能通过vi 来修改文件的信息。

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。两者会进行双向绑定,也就是如果你修改宿主机的数据卷关联的文件,容器对应的文件也会被同步,反过来也一样,这就完成了绑定的效果。

5.2  数据卷的相关命令

5.3  数据卷的创建

在执行docker run命令时,使用 -v 数据卷:容器内目录

可以完成数据卷挂载当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷

案例1-利用Nginx容器部署静态资源

需求: 创建Nginx容器,修改nginx容器内的html目录下的index.html文件,查看变化将静态资源部署到nginx的html目录。

首先需要去官方文档看一下nginx的html的目录在哪个位置。

我在宿主机放了一张图片,可以通过网络访问

可以看到nginx容器的html的目录已经通过实现了数据的同步

案例2-mysql容器的数据挂载

需求: 查看mysql容器,判断是否有数据卷挂载 基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)

  • 挂载/root/mysql/data到容器内的/var/lib/mysql目录
  • 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录,携带课前资料准备的SQL脚本
  • 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录,携带课前资料准备的配置文件

docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql

执行  docker  inspect  mysql  查看mysql容器详情

可以看到数据同步过来了

可以看到mysql会有自动挂载的数据卷,名字是系统给的,该数据卷称为“匿名数据卷”。

如果mysql容器被删除,重新下载其他版本的mysql,会生成另外一个匿名数据卷,这就导致之前的数据卷的mysql数据,二进制文件等丢失,但是如果你参考镜像mysql的存储位置(data,init,conf),自己实现目录挂载,下次就不会存在上述问题。

注意事项:

在执行docker run命令时,使用 -v 本地目录 : 容器内目录 可以完成本地目录挂载

本地目录必须以“/”或 "./" 开头,如果直接以名称开头,会被识别为数据卷而非本地目录

-v mysql : /var/lib/mysql 会被识别为一个数据卷叫mysql

-v ./mysql : /var/lib/mysql 会被识别为当前目录下的mysql目录

5.4  数据卷挂载有两种方式

  • 数据卷名:容器目录
  • 本地目录:容器目录

6.自定义镜像

6.1  镜像的结构

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

6.2  Dockerfile

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:

因此有了Dockerfile,我们只需要告诉docker镜像包含的一些列东西,然后它会帮我们执行相关的操作。

更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder

基于Ubuntu基础镜像,利用Dockerfile描述镜像结构

我们可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构,也可以直接基于JDK为基础镜像,省略前面的步骤:

当编写好了Dockerfile,可以利用下面命令来构建镜像

-t :是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest

.  :是指定Dockerfile所在目录,如果就在当前目录,则指定为"."

而且可以访问,说明自定义的镜像已经部署完成

6.3  总结

镜像的结构是怎样的?

  • 镜像中包含了应用程序所需要的运行环境、函数库、配置、以及应用本身等各种文件,这些文件分层打包而成。

Dockerfile是做什么的?

  • Dockerfile就是利用固定的指令来描述镜像的结构和构建过程,这样Docker才可以依次来构建镜像

构建镜像的命令是什么?

  • docker build -t 镜像名 Dockerfile目录

7.网络

默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:

只有在同一个网桥上的容器才能相互访问,如果在不同网桥上的容器,你发现会ping不通

如何让不同网桥实现互通呢?

解决方案:

加入自定义网络(实质就是创建自定义的网桥,让容器加入进来)的容器可以实现容器名互相访问,Docker网络命令如下:

执行

docker inspect mysql

执行

docker inspect nginx

两者处于同一个网桥,可以ping成功

如果两个网桥不同步,可以这样

docker network create xiaolin

然后让mysql容器加进来(其他容器加进来,实现同一个网桥,可以实现互通)

docker network connect xiaolin mysql

发现多了一个

如果想要避免默认分配容器ip,也可以这样

docker run -d --name demo -p 8080:8080 --network xiaolin docker-demo

8.部署Java应用

首先把相应的java父项目打包,打包完会生成对应的jar包

然后再进行dockerfile文件的编写

然后把这两个放在同一个目录下

执行

docker  build  -t   hm-service  .

docker  run  -d  --name  hm  -p  8080:8080  hm-service

docker  logs  -f  hm

这样就完成部署和启动项目了

9.部署前端代码

需求:创建一个新的nginx容器,将课前资料提供的nginx.conf、html目录与容器挂载

docker run -d \
--name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network xiaolin \
nginx

然后可以进行前后端联调

10.DockerCompose

10.1  DockerCompose定义

Docker Compose通过一个单独的docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。

其实DockerCompose就是可以进行多个容器同时进行docker run ,只不过是它有自己的语法,

如果我们把前端、后端以及mysql的相关信息写到DockerCompose就可以实现一键开启,一键结束,这样避免我们一个一个容器开启的过程中遇到的错误。

10.2  相关命令

docker compose [OPTIONS] [COMMAND]

10.3  DockerCompose内容

写一个yml文件

version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - hm-net
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmall
    networks:
      - hm-net
networks:
  hm-net:
    name: hmall

然后可以通过

docker compose up

启动文件配置的所有容器,这个行为都是自动化的,你只需要执行相关指令

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

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

相关文章

亿发微商城:从社交流量到生意增量,拓客+变现双收益

亿发微商城提供私域经营必备的系统 、服务和技术支持等全套解决方案。省去开发成本,还原品牌调性,打通社交渠道,经营私域会员,带来传统电商和线下门店之外的生意增量。

43.SO_BACKLOG

属于ServerSocketChannel参数 SO_BACKLOG 设置的过小,高峰期有很多连接来了,就会被拒绝,报拒绝连接错误。 控制全连接队列的大小,可以容下适量连接。所以SO_BACKLOG设置的要大一些。 serverBootstrap.option(ChannelOption.SO_B…

面试-javaIO机制

1.BIO BIO:是传统的javaIO以及部分java.net下部分接口和类。例如,socket,http等,因为网络通信同样是IO行为。传统IO基于字节流和字符流进行操作。提供了我们最熟悉的IO功能,譬如基于字节流的InputStream 和OutputStream.基于字符流…

Vue--》从零开始打造交互体验一流的电商平台(四)完结篇

今天开始使用 vue3 + ts 搭建一个电商项目平台,因为文章会将项目的每处代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏,学习更多…

Webpack: 底层配置逻辑

概述 Webpack 5 提供了非常强大、灵活的模块打包功能,配合其成熟生态下数量庞大的插件、Loader 资源,已经能够满足大多数前端项目的工程化需求,但代价则是日益复杂、晦涩的使用方法,开发者通常需要根据项目环境、资源类型、编译目…

在运行中遇到扫描包问题

问题描述:当我们看到这个上面一行代码时就代表我们有个包没有被当前的Spring容器给扫描到,关于这个问题我们有两个:第一把整个包导进来,第二用哪个导哪个

人脑网络的多层建模与分析

摘要 了解人类大脑的结构及其与功能的关系,对于各种应用至关重要,包括但不限于预防、处理和治疗脑部疾病(如阿尔茨海默病或帕金森病),以及精神疾病(如精神分裂症)的新方法。结构和功能神经影像学方面的最新进展,以及计算机科学等…

Qt开发笔记:Qt3D三维开发笔记(一):Qt3D三维开发基础概念介绍

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/140059315 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、O…

AI绘画:P图如此丝滑,OpenAI上线ChatGPT图像编辑功能,DallE-3绘画如此简单

大家好我是极客菌,用ChatGPT的DallE-3进行AI绘画对很多人来说是一个门槛很低的选择,现在OpenAI又重磅上线了图像编辑器功能(DallE editor),可以很方便的对图片的局部进行修改,而且支持中文,主打一个功能强大且好用&…

Django —— 用户名和密码配置

创建项目ProjectA: django-admin startproject ProjectA cd进入ProjectA文件夹运行项目: python manage.py runserver 0.0.0.0:8000 Starting development server at http://0.0.0.0:8000/Quit the server with CTRL-BREAK. 访问http://localhost:80…

SET加密:电子商务安全的基石

随着电子商务的飞速发展,如何确保在线交易的安全性和可信度已成为消费者、商家和金融机构共同关注的焦点。SET协议(Secure Electronic Transaction)作为一种安全电子交易的国际标准,凭借其卓越的安全性能和广泛的行业认可&#xf…

c语言中extern定义和引用其他文件的变量,(sublime text)单独一个文件编译不会成功

关键字extern的作用 这个很常见的都知道是定义一个外部变量或函数,但并不是简单的建立两个文件,然后在用extern 定义在另一个非最初定义变量的文件里 区分文件和编译运行的文件 例如,一个文件夹里有文件a.c和文件b.c,在sublime text中直接…

重庆高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

随着科技的飞速发展,智能制造已成为推动产业升级和经济社会发展的重要力量。在这一背景下,重庆高校大学智能制造实验室积极推进数字孪生可视化系统平台建设项目,旨在通过先进的数字化技术,实现实验室资源的优化配置和高效利用。 …

java虚拟机栈帧操作

虚拟机栈(Virtual Machine Stack)是虚拟机(如JVM、Python VM等)用来管理方法调用和执行的栈结构。它主要用于存储方法调用的相关信息,包括局部变量、操作数栈、动态链接和方法返回地址等。 java虚拟机栈操作的基本元素就是栈帧,栈帧主要包含了局部变量表、操作数栈、动态…

数字签名解析

1. 概述 数字签名不是手写签名的数字图像; 数字签名是一种可以提供认证的加密形式,是转向完全无纸环境的一个途径; 数字签名机制用以解决伪造、抵赖、冒充和篡改、完整性保护等安全问题。 2. 公钥密码与数字签名的关系 要实现数字签名&#…

【04】从0到1构建AI生成思维导图应用 -- 创建 AI 工作流

【04】从0到1构建AI生成思维导图应用 – 创建 AI 工作流 大家好!最近自己做了一个完全免费的AI生成思维导图的网站,支持下载,编辑和对接微信公众号,可以在这里体验:https://lt2mind.zeabur.app/ 上一章:h…

mybatis核心配置介绍

mybatis核心配置 【mybatis全局配置介绍】 ​ mybatis-config.xml,是MyBatis的全局配置文件,包含全局配置信息,如数据库连接参数、插件等。整个框架中只需要一个即可。 1、mybatis全局配置文件是mybatis框架的核心配置,整个框架…

2024高考录取分数线一览表(含一本线、二本线、专科线)

2024年全国各地的高考录取分数线已经全部公布,查大学网(www.chadaxue.com)为大家整理全国31个省市高考录取分数线汇总,包括本科批(一本分数线线和二本分数线)、专科批和特殊类招生控制分数线汇总&#xff0…

2.ROS串口安装和调试

首先安装串口依赖 sudo apt-get install ros-melodic-serial 其次安装串口调试助手 sudo apt-get install minicom 再赋予串口权限 sudo chmod 777 /dev/ttyTHS1 打开调试助手 sudo cutecom 硬件引脚图:

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验10 IPv4地址 — 构造超网(无分类编址)

一、实验目的 1.加深对构造超网的理解; 二、实验要求 1.使用Cisco Packet Tracer仿真平台; 2.观看B站湖科大教书匠仿真实验视频,完成对应实验。 三、实验内容 1.构建网络拓扑; 2.根据各网络所指定的地址块完成以下工作&#…