[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帮我们构建镜像。常见指令如下:

我们可以基于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. 通过容器名进行容器互联
相关推荐
辉的技术笔记1 小时前
Dify 自部署为什么跑不动?6 层瓶颈诊断法教你定位
docker
orion5716 小时前
Missing Semester Class1:course overview and introduction of shell
linux
SkyWalking中文站21 小时前
认识 Horizon UI · 6/17:Trace 探索器
运维·监控·自动化运维
程序员老赵1 天前
Docker 部署 Redmine:老牌开源项目管理部署实测记录
docker·开源·团队管理
用户120487221611 天前
Linux驱动编译与加载
linux·嵌入式
程序员老赵1 天前
服务器文件不想 SFTP 上传?Docker 跑个 File Browser,浏览器就能管理
服务器·docker·开源
火车叼位1 天前
写给初级开发者:SSL、SSH、HTTPS 与证书体系全解析
运维
用户805533698031 天前
Input 子系统架构:Core、Handler、Driver 三层是怎么协作的
linux·嵌入式
用户805533698031 天前
RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设
linux·github·嵌入式
小猿姐1 天前
唯品会大规模数据库云原生实践:基于 KubeBlocks 管理数千实例的统一运维之路
运维·elasticsearch·云原生