为什么会有容器化技术
假设你们公司正在秘密研发下一个“今日头条”APP,我们姑且称为明日头条,程序员自己从头到尾搭建了一套环境开始写代码,写完代码后程序员要把代码交给测试同学测试,这时测试同学开始从头到尾搭建这套环境,测试过程中出现问题程序员也不用担心,大可以一脸无辜的撒娇,“明明在人家的环境上可以运行的”。
测试同学测完后终于可以上线了,这时运维同学又要重新从头到尾搭建这套环境,费了九牛二虎之力搭建好环境开始上线,糟糕,上线系统就崩溃了,这时心理素质好的程序员又可以施展演技了,“明明在人家的环境上可以运行的”。
从整个过程可以看到,不但我们重复搭建了三套环境还要迫使程序员转行演员浪费表演才华,典型的浪费时间和效率,聪明的程序员是永远不会满足现状的,因此又到了程序员改变世界的时候了,容器技术应运而生。
解决的问题
- 在合作开发时,本机可以跑,别人的电脑就跑不起来。
- docker 直接将程序打包成镜像,包括环境,直接在容器中运行
- 服务器自己的程序挂了,原因是别人的程序将内存吃掉,自己程序内存不够就挂了。
- Docker的 隔离性,别人的程序不会影响到自己。
- 部署效率的提高。
- 程序将程序打包为镜像,要多少台服务器,就可以跑多少容器,部署简单。
它成功的将工作重点转移到了程序开发上,而不是开发环境上,达到了一次打包,到处运行(linux上)。
特点
- 标准化:将应用打包为标准单元,哪都能用。
- 轻量级:容器包含了软件运行所需的所有环境,而且非常轻量级。
- 高可靠:容器化的应用程序,可以在任何linux上达到一致运行效果。
- 隔离性:容器化应用程序,各个团队可以共享同一 Linux 资源。
Docker VS 虚拟机
虚拟机虚拟化的是硬件, 并且携带操作系统,本身很小的应用程序,因为携带了操作系统而变得很大,很笨重
Docker虚拟化的是操作系统,依托于Linux,是不携带操作系统的,docker的应用非常轻巧。
Docker 基本概念
Docker的安装
以上命令执行完,查看是否安装成功 docker -v 可以显示出版本后即为安装成功
docker 命令
守护进程相关 systemctl 系统服务管理命令
- 启动docker 服务
systemctl start docker - 查看docker状态
systemctl status docker - 停止docker 服务
- 新版加入了 success 状态、输入docker 命令会被自动唤醒,真正关闭docker 需要 再关闭 docker.socket
systemctl stop docker systemctl stop docker docker.socket
- 重启docker服务
systemctl restart docker - 开机启动docker服务
systemctl enable docker - 查看docker概要信息 `docker info
镜像命令相关
- 查看镜像
docker images - 搜索镜像
docker search <镜像名称> - 拉取镜像
docker pull <镜像名称:版本号> - 删除镜像
docker rmi <镜像id> - 删除所有镜像
- 查看所有镜像id
docker images -q - 批量删除镜像 docker rmi
docker images -q
- 查看所有镜像id
拉取镜像如何获得版本号
借助 dockerhub 官网
容器相关命令
()标识可有可无 <>表示中文含义
- 查看容器
- 正在运行:
docker ps - 所有
docker ps -a - 最后一次
docker ps -l - 查看停止状态的容器
docker ps -f status=exited
- 正在运行:
- 创建与启动容器
- 命令
docker run <参数> 镜像名称:镜像标签 (/bin/bash) - 参数
- -i 表示运行容器,若不加 只是表示创建容器,而不启动
- -t 容器启动后进入命令行。加入 -it 后,容器启动进入伪终端,关闭伪终端,容器就会被关闭。
- -d 守护式运行。
- --name 容器命名
- -v 目录映射关系,挂载容器目录路径到本地目录,方便容器路径的访问。 -v 宿主机目录:映射到宿主机上的目录 容器id
- -p 端口映射 映射到宿主机上。 -p 宿主机端口:容器内端口 容器id
- 交互式
docker run -it --name=tomcat_9.0.75 tomcat:9.0.75-jdk8-corretto-al2 - 守护式
docker run -id --name=tomcat_9.0.75 tomcat:9.0.75-jdk8-corretto-al2
- 命令
- 启动容器
docker start <容器名称> - 停止容器
docker stop <容器名称> - 删除容器
docker rmi <容器id或者id前几位或者名称> - 进入容器目录
docker exex -it <容器名称/容器id> /bin/bash - 退出容器
exit - copy宿主机文件到容器
docker cp <需要拷贝的文件/目录> <容器名称/id:容器目录>- 例子 :
docker cp test.txt 968:/bin
- 例子 :
- 容器ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' <容器名称/id>
数据卷相关命令
宿主机的一个目录/文件,容器目录和数据卷目录绑定后,修改就会同步。
一个容器可以挂载多个数据卷,一个数据卷可以被多个容器挂载.
宿主机与容器间数据共享的桥梁
作用:
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间进行数据交换
注意事项
- 目录路径为绝对路径
- 宿主机目录不存在,会自动创建
- -v 可以使用多次
具体创建 上面容器启动参数有介绍。
docker 软件部署
MySQL示例
进入容器
docker exec -it 0a9 /bin/bash
端口映射到宿主机了 本地连接
宿主机IP地址:映射端口号即可连接
docker 制作镜像
- 容器保存为镜像
docker commit <正在运行的容器名称/id> <镜像名称:镜像标签> - 镜像备份
- 打包镜像 docker save -o <压缩包存放路径> <镜像名称/镜像id:镜像标签>
- 打包镜像 docker save -o <压缩包存放路径> <镜像名称/镜像id:镜像标签>
- 镜像恢复与迁移
docked load -i <备份的镜像文件>