[linux]docker基础

news/2024/11/8 17:57:09 标签: linux, docker, 运维

常见命令

Docker最常见的命令就是操作镜像、容器的命令,详见官方文档: Docker Docs

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

  1. 在DockerHub中搜索Nginx镜像

  1. 拉取Nginx镜像

  1. 查看本地镜像列表

  1. 把镜像保持到本地
  • 查看保持命令的提示
  • 把最新版本的nginx保存到本地, 格式是.tar名称是nginx

  1. 删除镜像

  1. 加载本地镜像

  1. 创建并运行Nginx容器
  • -d 让指令后台运行, 不占用命令行
  • --name 给容器起一个名字, 要唯一
  • -p 进行端口映射, 容器端口:宿主机端口
  • nginx 是镜像的名字

  1. 查看容器

  • 格式化: docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

  • 查看所有: docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" -a

  1. 停止容器

  1. 再次启动容器

  1. 进入Nginx容器
  • nginx是要进入的容器名称
  • bash是进入容器后使用的终端

  1. 退出容器

  1. 查看日志
  • 查看日志记录

  • 跟踪日志(调试时使用)(ctrl + c退出)

  1. 删除容器
  • 默认情况下无法删除运行中的容器, 要先停止
  • -f 是强制删除

命令别名

配置命令别名, 简化命令

  1. 编辑文件

  1. 配置命令

  1. 加载配置文件

  1. 使用命令别名

数据卷

1.挂载数据卷

需求

  1. 创建Nginx容器,修改nginx容器内的html目录下的index.html文件,查看变化
  2. 将静态资源部署到nginx的html目录
// 进入容器
docker exec -it nginx bash 

// 切换目录
cd /usr/share/nginx/html

// 查看文件
ls
bash: 50x.html index.html

// 编辑文件
vi index.html
bash: vi: command not found
  • 由于容器只提供了镜像最小运行的环境,所以看起来很简单的操作, 却是十分麻烦

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁, 方便我们操作容器内文件

挂载数据卷

  1. 在执行docker run命令时,使用 -v 数据卷:容器内目录 可以完成数据卷挂载
  2. 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
  3. 对于已经创建的容器, 是无法再进行数据卷的挂载

常用命令

示例

  1. 确保nginx镜像不存在

  1. 启动nginx镜像, 自动创建数据卷

docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
  • -v 命令完成数据卷的挂载
  • html是数据卷目录的名称, 可以自定义
  • /usr/share/nginx/html是容器内要挂载的目录, 一般去镜像官网文档找
  1. 确认镜像服务

  1. 查看数据库卷列表

  1. 查看数据卷的详细信息
  • Mountpoint就是数据卷在宿主机的位置

  1. 切换目录, 查看文件

  1. 使用vi修改文件

  1. 访问nginx首页内容就已经变化

2.本地目录挂载

需求

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

  1. 查看nginx挂载的信息

  • volume意为卷
  • Name是卷的名称
  • Source是卷位于宿主机的位置
  • Destination是卷位于容器内的位置
  1. 查看nginx的挂载信息

  • 创建mysql镜像时并没有指定数据卷, 但是默认存在, 称为匿名卷
  • 默认挂载到/var/lib/mysql目录下, 是mysql用于数据存储的目录
  • mysql会把数据存储目录挂载到宿主机, 这样实现了数据和数据库的解耦合, 不然随着数据积累, 容器的体积过大, 维护和升级起来就很困难
  • 默认的匿名卷名字太长, 使用起来很不方便, 所以我们可以自己去挂载

基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)

  1. 提前创建文件夹

  1. 把资料中的文件放到对应目录中
  • 挂载/root/mysql/data到容器内的/var/lib/mysql目录
  • 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录,携带课前资料准备的SQL脚本

  • 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录,携带课前资料准备的配置文件

  1. 确保mysql容器已经删除

  1. 运行命令, 启动mysql容器,并通过-v 指令把mysql的数据挂载到本地目录
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

  1. 删除mysql容器, 重新启动, 数据还会存在,这样数据库容器的迁移升级就会非常方便

自定义镜像

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

镜像分层

Dockerfile

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

  • 更新详细语法说明,请参考官网文档: Dockerfile reference | Docker Docs

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

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

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

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

实际操作

  1. root下新建demo文件夹, 把资料中的文件上传上来

  1. 把资料中的jdk包上传到root目录下

  1. 把jdk加载为docker容器

  1. 执行命令构建镜像

  • -t是给镜像器起名字
  • . 用来指定自定义镜像的位置, .表示镜像文件在当前目录, 且文件名是Dockerfile, 如果不是则需要修改
  1. 启动镜像服务

  • 先启动镜像服务
  • -d表示后台运行, --name给镜像起名字, 要唯一, -p 进行端口映射, docker-demo是要运行的镜像名
  • 再查看镜像进程, 确定镜像的运行状态
  • 再查看镜像运行日志
  1. 访问镜像服务

容器网络

容器独立的运行环境, 但是查看不同容器, 发现他们处于同一个网段内, 处于同一个网段内就可以相互访问

  • Gateway就是容器的网关
  • IPAddress是容器的ID地址

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

  1. 当我们安装docker时, docker会创建一张虚拟网卡, 这张网卡的名字默认为docker0
  2. 这张网卡还会创建一个虚拟网桥, 这个网桥的地址是一个范围,
  3. 172.17.0.1/16就是IP地址的范围, 且前16位不变(就是前2段不变, 后面会变)
  4. 所有跟网桥连接的容器都会被分配一个ip地址
  5. 所以虽然docker容器是独立的环境, 但是通过网桥, 就可以实现相互连接
  6. 验证一下:

自定义网络

加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下

  1. 使用容器的ip地址虽然可以互通, 但是一旦机器或容器重启, 容器的ip地址可能变化
  2. 所以要使用自定义网络, 通过容器名, 来进行稳定的连接
  3. 查询所有网络, 并创建网络

  1. 让mysql连接自定义网络

  1. 让自定义镜像连接自定义网络

  1. 通过容器名进行容器互联


http://www.niftyadmin.cn/n/5744249.html

相关文章

Docker如何以配置文件方式安装nginx

目录 1 准备挂载目录 2 拉去nginx镜像 3 启动命令 1 准备挂载目录 mkdir -p /temp/nginx/html #创建nginx的html挂载目录 mkdir -p /temp/nginx/conf #创建nginx的配置文件挂载目录 自定义nginx配置文件 放在conf目录下 #user nobody; worker_processes 1;#error_log l…

Java智慧养老养老护理帮忙代办陪诊陪护平台系统小程序源码

🌟 智慧养老新时代:养老护理、帮忙代办、陪诊陪护平台系统全解析 🏡 👵 引言:智慧养老,让爱无距离 随着科技的飞速发展,智慧养老已成为新时代老年人的新选择。通过养老护理、帮忙代办、陪诊陪护…

数据结构——线性表与链表

看了一下其他链接,真正的循序表应该支持随机索引的,也就是new的时候就将内存分配好。 这里是像链表一样申请了,当做链表看吧 参考链接:数据结构与算法——顺序表和链表的优缺点(区别、特点)详解_顺序表和…

qt QHttpMultiPart详解

1. 概述 QHttpMultiPart是Qt框架中用于处理HTTP多部分请求的类。它类似于RFC 2046中描述的MIME multipart消息,允许在单个HTTP请求中包含多个数据部分,如文件、文本等。这种多部分请求在上传文件或发送带有附件的邮件等场景中非常有用。QHttpMultiPart类…

机器学习中的两种主要思路:数据驱动与模型驱动

在机器学习的研究和应用中,如何从数据中提取有价值的信息并做出准确预测,是推动该领域发展的核心问题之一。在这个过程中,机器学习方法主要依赖于两种主要的思路:数据驱动与模型驱动。这两种思路在不同的应用场景中发挥着至关重要…

边缘计算的基本概念与实践

在物联网(IoT)领域,边缘计算正逐渐成为一种重要的技术趋势。随着设备数量的激增和数据量的不断增加,传统的集中式云计算模式已经难以满足实时性、数据安全性和带宽效率的需求。边缘计算通过将计算资源下沉到网络边缘,靠…

雷士护眼大路灯好不好?书客、月影、雷士测评深度解析!

雷士护眼大路灯好不好?一款护眼灯能够提供柔和舒适均匀的光线,能有效减轻在不良环境下长时间用眼的疲劳干涩感,但是现在市面上的护眼大路灯五花八门的,质量也是参差不齐,根本不知道怎么挑,并且有一部分人使…

如何对接低价折扣相对稳定电影票渠道?

对接低价折扣电影票渠道需要经过一系列步骤,以确保能够为用户提供优惠且可靠的购票体验。以下是一个基本的对接流程: 1.市场调研: 调研市场上的电影票销售渠道,了解主要的电影票批发商和分销商。分析竞争对手的折扣电影票服务&a…