[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. 通过容器名进行容器互联
相关推荐
_.Switch9 分钟前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
2401_8504108310 分钟前
文件系统和日志管理
linux·运维·服务器
JokerSZ.14 分钟前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
XMYX-043 分钟前
使用 SSH 蜜罐提升安全性和记录攻击活动
linux·ssh
芯盾时代1 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
心灵彼岸-诗和远方2 小时前
DevOps业务价值流:架构设计最佳实践
运维·产品经理·devops
一只哒布刘2 小时前
NFS服务器
运维·服务器
南猿北者3 小时前
docker容器
docker·容器
苹果醋33 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx