[linux]docker基础
常见命令
Docker最常见的命令就是操作镜像、容器的命令,详见官方文档: Docker Docs
案例: 查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器
- 在DockerHub中搜索Nginx镜像
- 拉取Nginx镜像
- 查看本地镜像列表
- 把镜像保持到本地
- 查看保持命令的提示
- 把最新版本的nginx保存到本地, 格式是.tar名称是nginx
- 删除镜像
- 加载本地镜像
- 创建并运行Nginx容器
- -d 让指令后台运行, 不占用命令行
- --name 给容器起一个名字, 要唯一
- -p 进行端口映射, 容器端口:宿主机端口
- nginx 是镜像的名字
- 查看容器
- 格式化: 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
- 停止容器
- 再次启动容器
- 进入Nginx容器
- nginx是要进入的容器名称
- bash是进入容器后使用的终端
- 退出容器
- 查看日志
- 查看日志记录
- 跟踪日志(调试时使用)(ctrl + c退出)
- 删除容器
- 默认情况下无法删除运行中的容器, 要先停止
- -f 是强制删除
命令别名
配置命令别名, 简化命令
- 编辑文件
- 配置命令
- 加载配置文件
- 使用命令别名
数据卷
1.挂载数据卷
需求
- 创建Nginx容器,修改nginx容器内的html目录下的index.html文件,查看变化
- 将静态资源部署到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)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁, 方便我们操作容器内文件
挂载数据卷
- 在执行docker run命令时,使用 -v 数据卷:容器内目录 可以完成数据卷挂载
- 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
- 对于已经创建的容器, 是无法再进行数据卷的挂载
常用命令
示例
- 确保nginx镜像不存在
- 启动nginx镜像, 自动创建数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
- -v 命令完成数据卷的挂载
- html是数据卷目录的名称, 可以自定义
- /usr/share/nginx/html是容器内要挂载的目录, 一般去镜像官网文档找
- 确认镜像服务
- 查看数据库卷列表
- 查看数据卷的详细信息
- Mountpoint就是数据卷在宿主机的位置
- 切换目录, 查看文件
- 使用vi修改文件
- 访问nginx首页内容就已经变化
2.本地目录挂载
需求
查看mysql容器,判断是否有数据卷挂载
- 查看nginx挂载的信息
- volume意为卷
- Name是卷的名称
- Source是卷位于宿主机的位置
- Destination是卷位于容器内的位置
- 查看nginx的挂载信息
- 创建mysql镜像时并没有指定数据卷, 但是默认存在, 称为匿名卷
- 默认挂载到/var/lib/mysql目录下, 是mysql用于数据存储的目录
- mysql会把数据存储目录挂载到宿主机, 这样实现了数据和数据库的解耦合, 不然随着数据积累, 容器的体积过大, 维护和升级起来就很困难
- 默认的匿名卷名字太长, 使用起来很不方便, 所以我们可以自己去挂载
基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)
- 提前创建文件夹
- 把资料中的文件放到对应目录中
- 挂载/root/mysql/data到容器内的/var/lib/mysql目录
- 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录,携带课前资料准备的SQL脚本
- 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录,携带课前资料准备的配置文件
- 确保mysql容器已经删除
- 运行命令, 启动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
- 删除mysql容器, 重新启动, 数据还会存在,这样数据库容器的迁移升级就会非常方便
自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
镜像分层
Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:
- 更新详细语法说明,请参考官网文档: Dockerfile reference | Docker Docs
我们可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构, 也可以直接基于JDK为基础镜像,省略前面的步骤:
当编写好了Dockerfile,可以利用下面命令来构建镜像:
-t 是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest
. 是指定Dockerfile所在目录,如果就在当前目录, 则指定为 "."
实际操作
- root下新建demo文件夹, 把资料中的文件上传上来
- 把资料中的jdk包上传到root目录下
- 把jdk加载为docker容器
- 执行命令构建镜像
- -t是给镜像器起名字
- . 用来指定自定义镜像的位置, .表示镜像文件在当前目录, 且文件名是Dockerfile, 如果不是则需要修改
- 启动镜像服务
- 先启动镜像服务
- -d表示后台运行, --name给镜像起名字, 要唯一, -p 进行端口映射, docker-demo是要运行的镜像名
- 再查看镜像进程, 确定镜像的运行状态
- 再查看镜像运行日志
- 访问镜像服务
容器网络
容器独立的运行环境, 但是查看不同容器, 发现他们处于同一个网段内, 处于同一个网段内就可以相互访问
- Gateway就是容器的网关
- IPAddress是容器的ID地址
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:
- 当我们安装docker时, docker会创建一张虚拟网卡, 这张网卡的名字默认为docker0
- 这张网卡还会创建一个虚拟网桥, 这个网桥的地址是一个范围,
- 172.17.0.1/16就是IP地址的范围, 且前16位不变(就是前2段不变, 后面会变)
- 所有跟网桥连接的容器都会被分配一个ip地址
- 所以虽然docker容器是独立的环境, 但是通过网桥, 就可以实现相互连接
- 验证一下:
自定义网络
加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下
- 使用容器的ip地址虽然可以互通, 但是一旦机器或容器重启, 容器的ip地址可能变化
- 所以要使用自定义网络, 通过容器名, 来进行稳定的连接
- 查询所有网络, 并创建网络
- 让mysql连接自定义网络
- 让自定义镜像连接自定义网络
- 通过容器名进行容器互联