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-servicedocker  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: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hm-nethmall:build: context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hm-netdepends_on:- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/usr/share/nginx/html"depends_on:- hmallnetworks:- hm-net
networks:hm-net:name: hmall

然后可以通过

docker compose up

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

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

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

相关文章

『MySQL 实战 45 讲』22 - MySQL 有哪些“饮鸩止渴”提高性能的方法?

MySQL 有哪些“饮鸩止渴”提高性能的方法? 需求:业务高峰期,生产环境的 MySQL 压力太大,没法正常响应,需要短期内、临时性地提升一些性能 短连接风暴 短连接模式:执行很少的 SQL 语句就断开,…

uniapp加载打点点效果

uniapp加载打点点效果 背景实现思路代码实现尾巴 背景 为了增加系统的交互性,我们在加载数据时通常会增加一些loading动效,但是在某些场景下只需要一些简单文字提醒。比如说使用【加载中】或者【loading】等字段,但是写静态的字符又显得交互…

【若依前后端分离】前端vue页面查看服务器本地的PDF

后端实现: 使用FileSystemResource包装文件,以便Spring MVC可以处理该资源 创建HttpHeaders对象以设置响应头 设置Content-Disposition头,使得浏览器以内联方式显示PDF(即在浏览器中直接打开) 设置Content-Type为appli…

Thinger.io 支持多协议、插件化100%开源 IoT 企业级物联网平台

项目源码,文末联系小编 Thinger.io 是一个开源插件化物联网平台,提供了设备原型、扩展和设备连接管理所需的一切工具。我们的目标是使物联网的使用民主化,使其可供全世界使用,并简化大型物联网项目的开发。 01 Thinger.io 物联网平…

Python学习路线图:120天系统学习,你也能成大神!

学Python,切忌今天这学一点,明天那里学一点,零零散散没有系统的学习。这样不仅耽搁大家时间,久而久之也会消磨大家学习的兴致!这里给大家总结了一张系统的Python学习路线图!希望大家共勉! Pyth…

期末考试结束,成绩如何快速发布?

随着期末考试的落幕,老师们又迎来了一项繁琐的任务将成绩单私信给学生家长。这项工作耗时耗力,而且极易出错,期末老师的工作已经足够繁重还要私发成绩,简直是雪上加霜。 好消息是,现在有了易查分小程序,只需…

学会整理电脑,基于小白用户(无关硬件升级)

如果你不想进行硬件升级,就要学会进行整理维护电脑 基于小白用户,每一个操作点我都会在后续整理出流程,软件推荐会选择占用小且实用的软件 主要从三个角度去讨论【如果有新的内容我会随时修改,也希望有补充告诉我,我…

【Linux详解】进程地址空间

目录 研究背景 验证地址空间 实验一:父子进程变量地址一致性 实验二:变量值修改后父子进程的差异 分析与结论 实验三:进程地址空间验证 理解进程地址空间 区域与页表 写时拷贝机制 进程地址空间的意义 文章手稿: xmind…

基于语音识别的智能电子病历(二)苹果端的语音接入

是2011年参与的,俺负责Wav文件处理、FTP通讯和一些后端部分。iPhone/iPad/iPod Recorder 前2年还在APP Store上 说明 Step-by-Step Procedure to Install App and Use the FnetRecorder Download the App from Apple Store Launch Apple Store and key in “fnetr…

labview排错

源代码正常跑,应用程序报这个错,是因为源代码的可以找到项目路径内所有dll的路径,而应用程序只能找到data文件夹的dll文件 解决查看源代码中.net的程序集的路径,复制对应的dll到data文件夹下 在执行developinterface.dll出现labv…

Python+Pytest+Allure+Yaml+Jenkins+GitLab接口自动化测试框架详解

PythonPytestAllureYaml接口自动化测试框架详解 编撰人:CesareCheung 更新时间:2024.06.20 一、技术栈 PythonPytestAllureYamlJenkinsGitLab 版本要求:Python3.7.0,Pytest7.4.4,Allure2.18.1,PyYaml6.0 二、环境配置 安装python3.7&…

Python operator模块这么用,效率杠杠的!

目录 1、基础操作符应用 🐍 1.1 加载operator模块 1.2 使用itemgetter进行排序 1.3 attrgetter与方法调用 2、高级功能探索 🔍 2.1 methodcaller的妙用 2.2 操作符重载与定制 3、结合lambda表达式 ✨ 3.1 lambda与operator模块协同工作 3.2 实战案例分析 4、结合…

如何保护磁盘数据?电脑磁盘数据怎么保护?

电脑磁盘是存储数据的基础,可以将各种重要数据保存在其中。为了避免数据泄露,我们需要保护磁盘数据。那么,电脑磁盘数据怎么保护呢?下面我们就一起来了解一下吧。 文件夹加密超级大师 文件夹加密超级大师是一款优秀的电脑数据加密…

人工智能 (AI) 基本概念 入门篇【C#】版

1. 什么是人工智能? 人工智能(Artificial Intelligence, AI)是指计算机系统能够执行通常需要人类智能的任务,如视觉识别、语音识别、决策和语言翻译等。AI的核心是通过算法和数据进行学习和推理,以实现智能行为。 2.…

说说MQ在你项目中的应用(二)商品支付

看了不少关于MQ的文章,也对MQ的作用做了一些总结。通常来说MQ有三大功能:异步处理、系统解耦和流量削峰。但我觉得这些功能本质上都是围绕着异步这个核心来的,只是针对不同的业务场景做了些调整。 现在市面上常用的MQ中间件,如Ra…

【期末速成】计算机操作系统 EP04 | 学习笔记

文章目录 一、前言🚀🚀🚀二、正文:☀️☀️☀️2.1 考点七:进程通信2.2 考点八:线程的概念2.3 考点九:处理机调度的概念及原则2.4 考点十:调度方式与调度算法 一、前言🚀…

react+customize-cra使用less+less-loader时,可能遇到的问题及解决办法

目录 1、先附上各依赖版本和config-overrides.js配置代码,按这个版本和配置就没问题 2、问题(注意:问题顺序没有先后之分哦) 2.1、TypeError: Cannot read property tap of undefined 2.2、No module factory available for d…

阐述Python:except的用法和作用?

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

网络配置(IP、NETMASK、GATEWAY、DNS、DHCP) <持续更新中>

参考: 初学Linux之网络配置(IP、NETMASK、GATEWAY、DNS、DHCP)-CSDN博客【学习笔记】网关 & 路由_网关和路由-CSDN博客【学习笔记】计算机网络 IP地址与MAC地址_根据mac分配ip-CSDN博客【学习笔记】TCP 和 UDP 协议_tcp 发送 syn 应答没有syn ack-CSDN博客 一…

一次进程虚拟内存占用超过200G问题分析

在对智驾软件系统资源进行分析时,发现一个进程虚存占用过高,超过200G top查看内存占用 有一个node应用占用了200G的虚拟内存 pmap查看该进程内存情况 pmap -x -p 8496结果显示有两个异常点,刚好和虚存使用总量吻合 一个50G和一个170G的堆…