Docker——2. Docker基础

1. 常见命令

不用重复使用docker run命令,这是创建容器命令,启动容器应该是docker start;
docker ps 查看进程运行状态;
docker rmi 删除镜像、rm 删除容器;
docker logs 查看日志、docker exec 执行命令进入容器内部;

在这里插入图片描述

案例

在这里插入图片描述

# 第1步,去DockerHub查看nginx镜像仓库及相关信息# 第2步,拉取Nginx镜像
docker pull nginx# 第3步,查看镜像
docker images# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第6步,访问网页,地址:http://虚拟机地址# 第7步,停止容器
docker stop nginx# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第9步,再次启动nginx容器
docker start nginx# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第11步,查看容器详细信息
docker inspect nginx# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash
# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p# 第13步,删除容器
docker rm nginx
# 运行中的容器无法删除,可以先停止再删除
docker stop nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx

镜像常规命令

# 打包镜像
docker save -o nginx.tar nginx:latest
# 删除镜像
docker rmi nginx:latest
# 导入镜像
docker load -i nginx.tar

容器常规命令

# 创建容器
docker run -d --name nginx -p 80:80 nginx
# 查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 容器停止
docker stop nginx
# 容器启动
docker start nginx
# 查看所有的容器(未启动包括在内)
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" -a

查看日志

# 持续输出日志,ctrl c停止
docker logs -f nginx
1.1 命名别名

找到root目录下的bashrc的文件

vi ~/.bashrc
# 或者
vi /root/.bashrc

在这里插入图片描述

添加一个别名

alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'

保存:wq,执行以下命令使别名生效

source /root/.bashrc
# 或者
source ~/.bashrc

2. 数据卷

问题引入,容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。

  1. 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?
  2. MySQL、Nginx容器运行后,如果我要修改其中的某些配置该怎么办?
  3. 想要让Nginx代理我的静态资源怎么办

以上问题都说明,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦。

2.1 数据卷概念

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

Nginx有两个关键目录:

  1. html:存放一些静态资源
  2. conf:放置配置文件

但是这些文件均在容器内部,所以必须利用数据卷将两个目录与宿主机目录关联,方便操作

在这里插入图片描述

创建的数据卷conf、html和nginx容器中的两个目录关联;
数据卷分别指向宿主机/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录;
这样容器内的目录就和宿主机的目录关联起来了,成为挂载
此时操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。

在这里插入图片描述

在这里插入图片描述

在执行docker run命令时,使用 -v 数据卷名:容器内目录 可以完成数据卷挂载;
当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷;

# 1.首先创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx# 2.然后查看数据卷
docker volume ls# 3.查看数据卷详情
docker volume inspect html# 4.查看/var/lib/docker/volumes/html/_data目录
ll /var/lib/docker/volumes/html/_data
# 可以看到与nginx的html目录内容一样# 5.进入该目录,并随意修改index.html内容
cd /var/lib/docker/volumes/html/_data
vi index.html# 6.打开页面,查看效果# 7.进入容器内部,查看/usr/share/nginx/html目录内的文件是否变化
docker exec -it nginx bash
2.2 本地目录挂载

在这里插入图片描述

查看mysql容器是否有数据卷挂载

# 1.查看MySQL容器详细信息
docker inspect mysql
# 关注其中.Config.Volumes部分和.Mounts部分

发现容器是有数据卷,但是创建容器mysql时并没有使用-v参数,这是因为容器声明了一个本地目录,需要挂载数据卷,但是数据卷未定义,所以这是匿名卷;
当想对mysql容器进行版本升级,此时删除容器,再创建一个mysql最新版本的容器且不指定自定义数据卷,同样会生成一个非常长的名称的匿名卷,到时候做数据迁移不太方便,可以但是不方便,所以使用自定义卷而不是匿名卷;

在这里插入图片描述

基于宿主机目录实现mysql数据目录、配置文件、初始化脚本的挂载;
方法与之前创建数据卷的方式相似,执行docker run 命令时,使用-v 本地目录:容器目录 就可以完成本地目录挂载;
注意:本地目录或文件必须以 / 或 ./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。

-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录

先删除之前的mysql容器,先创建这三个目录;

docker rm -f mysql
# 创建mysql目录
mkdir mysql
cd mysql
# 创建3个目录
mkdir data
mkdir conf
mkdir init

将下载好的conf和init文件直接拖到root目录下(Xftp7软件)

在这里插入图片描述
在这里插入图片描述

运行本地目录挂载命令

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/conf:/etc/mysql/conf.d \-v /root/mysql/init:/docker-entrypoint-initdb.d \mysql

66d40c0a7e29fbba673b044.png)
在这里插入图片描述

3. 自定义镜像

制作自己的Java项目镜像

3.1 镜像结构

镜像中包含了程序运行需要的系统函数库、环境、配置、依赖;
所以自定义镜像也就需要配备项目的基础环境、依赖、配置等文件;

在这里插入图片描述

上述步骤中的每一次操作其实都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像就是一堆文件的集合;
镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer(层);
构建时如果某些层其他人制作过,可以直接拷贝使用这些层,无需重复制作,例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。在制作java镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像;

在这里插入图片描述

3.2 Dockerfile

docker提供自动打包镜像的功能,无需自己逐级处理和打包,只需提供每一层要做的事情,用固定语法写下来,交给docker执行即可;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 网络

实现容器之间的访问

在这里插入图片描述

但是,容器内的IP实质上是一个虚拟IP,并不固定,如果该容器停止,另一个容器启动,很可能IP就被其它容器占用,此时如果开发时写死了IP,那么连接就会失败;
所以引出docker的网络功能来解决这个问题;

在这里插入图片描述

# 1.首先通过命令创建一个网络
docker network create hmall# 2.然后查看网络
docker network ls
# 结果:
NETWORK ID     NAME      DRIVER    SCOPE
639bc44d0a87   bridge    bridge    local
403f16ec62a2   hmall     bridge    local
0dc0f72a0fbb   host      host      local
cd8d3e8df47b   none      null      local
# 其中,除了hmall以外,其它都是默认的网络# 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker network connect hmall mysql --alias db
# 3.2.db容器,也就是我们的java项目
docker network connect hmall dd
# 3.3.也可以在新建容器阶段就接入网络
docker run -d --name demo -p 8080:8080 --network hmall docker-demo
docker run -d --name nginx_demo -p 80:80 --network nxj nginx
# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it dd bash
# 4.2.用db别名访问
ping db
# 结果
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
# 4.3.用容器名访问
ping mysql
# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms

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

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

相关文章

19.(vue3.x+vite)v-if和v-for哪个优先级更高

前端技术社区总目录(订阅之前请先查看该博客) v-if和v-for哪个优先级更高 (1)实践中不应该把v-for和v-if放一起,可以包一层template (2)在vue2中,v-for的优先级是高于v-if (3)在vue3中,v-for的优先级是低于v-if 组件代码 <template><div><!--包一…

[Linformer]论文实现:Linformer: Self-Attention with Linear Complexity

文章目录 一、完整代码二、论文解读2.1 介绍2.2 Self-Attention is Low Rank2.3 模型架构2.4 结果 三、整体总结 论文&#xff1a;Linformer: Self-Attention with Linear Complexity 作者&#xff1a;Sinong Wang, Belinda Z. Li, Madian Khabsa, Han Fang, Hao Ma 时间&#…

浏览器输入URL再按下回车会经历哪些过程

目录 前言 一、解析URL 二、解析域名(DNS) 三、TCP三次握手建立连接 1.seq、syn、ack含义 2.三次握手 四、发送http/https请求 五、服务器响应请求 六、浏览器解析渲染页面 七、TCP四次挥手断开连接 总结 前言 看各种面经发现这个问题是一个高频出现的面试问题&#xff0c;但…

每日一题SQL

以下题目来源微信公众号【SQL数据库开发】 1、编写一个 SQL 查询来实现分数排名。如果两个分数相同&#xff0c;则两个分数排名&#xff08;Rank&#xff09;相同。请注意&#xff0c;平分后的下一个名次应该是下一个连续的整数值。换句话说&#xff0c;名次之间不应该有“间隔…

四十五、Redis主从

目录 1、数据同步原理 &#xff08;1&#xff09;全量同步 &#xff08;2&#xff09;增量同步 &#xff08;3&#xff09;优化Redis主从集群 &#xff08;4&#xff09;什么时候执行全量同步 &#xff08;5&#xff09;什么时候执行增量同步 2、流程 1、数据同步原理 &…

Salesforce“卷土重来”:对中国CRM市场影响在哪?

于本土CRM而言&#xff0c;Salesforce是一面镜子&#xff0c;也更是催化剂。 长期来看&#xff0c;Salesforce的加入&#xff0c;从某种程度上将会加速中国CRM赛道的合理价值曲线的走向&#xff0c;通过带动外界对于CRM整个赛道的关注和热度&#xff0c;进而加速本土CRM的成长…

在vue项目中,数据已经在页面渲染,但在后续操作时获取不到数据

如下图 产生这个问题的原因 异步问题 如何解决 方法一&#xff1a;可以将其存放在一个setTimeout里面&#xff08;利用一个极小的延迟来获取数据&#xff09;&#xff0c;如下图 效果 方法二&#xff1a;将操作放入axios里面&#xff0c;如下图

心理学效应

条柠檬心理马太效应飞轮效应酸葡萄效应凡勃伦效应登门槛效应糖果效应南风效应野马效应聚光灯效应毛毛虫效应曝光效应

【Matlab】如何使用MATLAB可视化二重积分(附完整MATLAB代码)

可视化二重积分 前言正文完整代码代码实现可视化结果 前言 二重积分是指在二维空间中对函数进行积分。二重积分的公式如下&#xff1a; ∫ a b ∫ c d f ( x , y ) d x d y ∫_a^b ∫_c^d f(x, y) dx dy ∫ab​∫cd​f(x,y)dxdy 其中&#xff0c; a a a 和 b b b 是 x x x…

Docker-consule 服务发现与注册

consul服务更新和服务发现 什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&…

7-8 报销

年底&#xff0c;报销都挤在一堆&#xff0c;财务忙得不可开交。每个报销表包括姓名&#xff0c;各项费用的金额。对于每个报销单&#xff0c;这里规定按如下要求处理&#xff1a; 金额高的优先处理&#xff1b;若金额相等时&#xff0c;则姓名字典序小的优先处理&#xff1b;…

Linux出击之网络环境设置

Linux中如果想要设置静态IP&#xff0c;这就需要我们进行自己去设置。 首先想知道是否有网络&#xff0c;我们就可以查看我们的网卡信息呀&#xff0c;ping 外网地址试试。 比如&#xff0c; ping www.baidu.com ip addr show, 这两个命令都可以让我们对网络有一个了解。 …

豪腾四海×实在RPA丨最懂财务的数字员工,为企业节省人天2000+

企业数字化转型&#xff0c;财务是一个重要的切入点。随着豪腾四海数字化业务不断展开&#xff0c;新的系统、流程和数据源被不断引入&#xff0c;财务部门面临的是不断暴增的对账、数电票处理、审计等日常工作。 “如此大的工作量&#xff0c;即使是经验丰富的资深财务&#…

设置一个vue文件的全局模板

VsCode在新建一个.vue文件的时候是空白的&#xff0c;需要我们自己输入片段&#xff0c;可这些在每次新建.vue文件都需要自己手敲&#xff0c;所以创建一个模板方便使用 设置vue模板 导入 {"生成 vue 模板": {"prefix": "vue","body"…

柯桥西班牙语里最“好用”的脏话:一些关于cojones的表达

Creo que una de las palabras con ms contextos donde se puede utilizar y que adems pronto es conocida por los estudiantes de espaol es esta que est en el ttulo. 相信标题中的这个单词“cojones”&#xff0c;使用时总是包含很多含义&#xff0c;同时也是西语学习者最…

Power BI - 5分钟学习增加索引列

每天5分钟&#xff0c;今天介绍Power BI增加索引列。 什么是增加索引列&#xff1f; 增加索引列就是向表中添加一个具有显式位置值的新列&#xff0c;一般从0或者从1开始。 举例&#xff1a; 首先&#xff0c;导入一张【Sales】样例表(Excel数据源导入请参考每天5分钟第一天)…

SuperMap iManager 11i(2023) SP1新特性汇总

作者&#xff1a;ls 【目录】 &#xff08;一&#xff09;GIS云套件支持发布聚合服务&#xff08;二&#xff09;GIS云套件支持自定义/修改服务接口信息&#xff08;三&#xff09;GIS云套件管理界面支持批量修改镜像&#xff08;四&#xff09;GIS云套件管理界面可调整服务节点…

【ChatGLM3】第三代大语言模型多GPU部署指南

关于ChatGLM3 ChatGLM3是智谱AI与清华大学KEG实验室联合发布的新一代对话预训练模型。在第二代ChatGLM的基础之上&#xff0c; 更强大的基础模型&#xff1a; ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、…

三年没回家过年,你的羽绒服准备好了吗?

2023进入尾声&#xff0c;这一年&#xff0c;我们在“阳康”之后重新出发&#xff0c;找回了烟火气&#xff0c;和错过几年的山水重逢&#xff0c;向往远方的同时也更爱眼前的点滴&#xff0c;逐渐重建起对美好生活的期待。 把生活态度投射到社媒上&#xff0c;出圈的热点话题…

Notepad++插件:格式化JSON

一、问题描述 最近有这么一串json字符串&#xff1a; 你想看吗&#xff1f; 是不是觉得密密匝匝滴&#xff0c;很不想看呢&#xff1f; 下面是经过处理的json字符串&#xff1a; 你喜欢哪种格式的json字符串展示呢&#xff1f; 反正我喜欢已经格式化的&#xff0c;也就是第二…