当前位置: 首页 > article >正文

[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.kler.cn/a/384864.html

相关文章:

  • DICOM标准:深入详解DICOM医学影像中的传输语法
  • 在OceanBase 中,实现自增列的4种方法
  • 用示例来看C2Rust工具的使用和功能介绍
  • [mysql]DDL,DML综合案例,
  • 少儿编程教育的多维度对比:软件类、硬件类与软硬件结合课程的选择
  • Backend - Python 爬取网页数据并保存在Excel文件中
  • uniapp 下拉选择器picker
  • 从配置anaconda到配置pycharm
  • C#笔记 —— 事件
  • 第3章 CentOS系统管理
  • ssm063基于SSM框架的德云社票务系统的设计与实现+vue(论文+源码)_kaic
  • vue3 element-plus el-scrollbar 自动滚动
  • Webserver(5.5)解析HTTP请求报文
  • 在PHP中使用UTF-8编码防止乱码需要注意以下几点‌:
  • vue种ref跟reactive的区别?
  • VisionPro —— CogIPOneImgeTool工具详解
  • 【论文速读】| RePD:通过基于检索的提示分解过程防御越狱攻击
  • 10.Node.js连接MongoDb
  • vue3 ts 实现一个下载数据功能(基本功能组件)
  • python下载pdf
  • 【大数据学习 | kafka高级部分】kafka的kraft集群
  • nginx平滑重启和php-fpm平滑重启
  • qt QListWidgetItem详解
  • 计算机网络:网络层 —— 软件定义网络 SDN
  • HarmonyOS Next(鸿蒙星河版)侧载应用
  • VB中如何处理性能优化问题,如减少内存泄漏、提高执行效率等