VMware介绍
VMware是一个“虚拟pc”软件公司用来提供服务器,桌面虚拟化的解决方案。它的产品可以实现在一台计算机上同时运行两个或者更多Windows,DOS,LINUX系统。
Linux介绍
Linux是一种自由和开放源码的类UNIX操作系统。它能运行主要的Unix工具软件、应用程序和网络协议,支持32位 和64位硬件。该操作系统的内核由林纳斯·托瓦兹于1991年10月5日首次发布。
其特点是开放性,多用户,多任务,丰富的网络功能,可靠的系统安全,良好的可移植性,具有标准兼容性,良好的用户界面(命令界面,图形界面等),出色的速度性能。
Linux系统介绍
Linux目录结构如下
/下有bin,boot,dev,etc,home,lib,proc,usr,var等等
其中:bin 存放二进制可执行文件(ls,cat,mkdir等)
boot 存放用于系统引导时使用的各种文件
dev 用于存放设备文件
etc 存放系统配置文件
home 存放所有用户文件的根目录
lib 存放跟文件系统中的程序运行所需要的共享库及内核模块
mnt 系统管理员安装临时文件系统的安装点
opt 额外安装的可选应用程序包所放置的位置
usr 用于存放系统应用程序,比较重要的目录/usr/local本地管理员软件安装目录
开发人员关注目录
配置目录:软件安装后配置文件选择放入的地址。 /etc/
软件安装目录:cd /usr/local/
注意:Linux系统的文件系统是以斜杠“/”开始,不是windows中的盘符概念。
Linux常用命令
查看防火墙状态: systemctl status rewalld
关闭防火墙: systemctl stop rewalld
启动防火墙: systemctl start rewalld
查看ssh运行状态: service sshd status
重启虚拟机: init 6
查看目录名称 ls
查看详细信息 ll
创建目录 mkdir
创建目录以及子目录,多个目录同时创建 mkdir -p
切换目录 cd
返回上级目录cd ..
进入上一级目录的子目录 cd ../xxx
创建一个空白的普通文件 touch
把内容重定向到指定的文件中 ,有则打开,无则创建 echo
覆盖模式>: echo "ww">aa.txt
追加模式>>: echo "ww">>aa.txt
查看文件内容 cat
复制 cp
p -r 文件夹 /usr/local
-r 文件夹中有内容
覆盖原有的文件有提示信息可以加个\:
\cp 需要复制的文件 要复制的相对路径
mv :移动、重命名(剪切的文件 放在同一个目录中是重命名
rm :删除文件或者文件夹 -r :递归删除
rm -rf 直接彻底删除,没有提示
rm -ri 有提示,建议用这个
wc -l 文件名 --统计行数
查看当前绝对路径 pwd
显示主机名 hostname
修改主机名: vim /etc/hostname hostnamectl set-hostname 主机名
查看主机名: hostnamectl
重启网卡命令: systemctl restart network
重启网卡管理命令: systemctl restart NetworkManager 一般开启NetworkManager关闭network 关闭network和 NetworkManager后需要执行system restart NetworkManager重启一下这个命令
uname -a :显示完整的系统信息
top :显示当前耗时的进程信息 ,每3秒刷新一次 ctrl+c 中断
top确认cpu和内存的占用情况
ps : - aux 显示当前进程的快照
查看java进程:ps aux|grep java
查看mysql进程:ps aux|grep mysql
du :-sh 显示文件的大小信息
du -sh 文件名
ifcon g :查看或者配置网卡信息(ip addr)
kill pid :杀死进程
Kill -9 强制杀死
vim编辑器:
编辑完了想回到之前状态命令:u
复制命令:yy
粘贴命令:p
批量粘贴:数字+p
复制多行:数字+yy
删除一行:dd
批量删除:数字+dd
复制从当前光标位置开始到当前行最后一个位置:y+$
复制从当前光标位置开始到当前行最前一个位置:y+^
复制当前单词:yw
删除当前单词:dw 从哪个字母开始就从哪个字母开始往后删空格也会删掉如果要想删除全部单词就要去单词的 开头删
剪切操作:小写x
后退删除:shift+小写x 表示从光标后面的不会删除会删除前面内容
更改当前字母:选中字母然后按r键就可以修改了
更改一串字母:shift+r 就从当前光标开始的位置输入相关内容就自动替代
光标移动到行前:shift+6
光标移动到行尾:shift+4
光标跳到当前词尾:e
回到当前文档的开头:gg shift+h
到文档末尾:大写G
显示行号:输入命令set nu
去除行号:输入命令set nonu
查找某内容:/+搜索内容 跳转到下一个搜索内容按"n" 如果过了想往回找就按"N"
取消高亮:输入命令noh
替换:输入命令:s/需要修改的内容/需要修改的新内容 替换的内容是光标所在行的第一个被查找到的内容
替换:输入命令:s/需要修改的内容/需要修改的新内容/g 替换的内容是光标所在行的全部被查找到的内容
替换:输入命令:%s/需要修改的内容/需要修改的新内容 替换的内容是每一行所在行的第一个被查找到的内容
替换:输入命令:%s/需要修改的内容/需要修改的新内容/g 替换的内容是每一行所在行的全部被查找到的内容
用户
查看用户信息
cat /etc/passwd ---全部
tail -n 数字 /etc/passwd ---查看文件最后数字行信息
Head -n 数字 /etc/passwd ---查看文件开头数字行信息
user1:x:1001:1009::/home/user1:/bin/bash
1.用户名 (username): 用户在系统中的登录名。
2.密码占位符 (x):占位符。
3.用户ID (1000): 用户的唯一标识符,也称为用户ID(UID)。
4.组ID (1000): 用户的主要组的标识符,也称为组ID(GID)。
5.用户信息 (): 一些关于用户的额外信息,通常是用户的全名等。
6.家目录 (/home/username): 用户登录后所在的初始目录。
7.登录 shell (/bin/bash): 用户登录后启动的默认shell
新建用户
useradd 用户名
useradd -g 用户组 -c “注释” 用户名
参数:
-g --- 指定用户的用户组,该参数的值可以用户组的id,也可以是组名
-G --- 指定用户的用户附加组,该参数的值可以用户组的id,也可以是组名。在Linux 系统中,每个用户都有一个主要组和零个或多个附加组。主要组通常与用户的用户名 相同,而附加组允许用户在不更改主要组的情况下,访问其他组的资源。(了解)
-u --- uid用户id,系统默认会从500之后按照顺序分配uid,如果不想使用系统默认分 配的,可以通过-u自定义。在 Linux系统中,每个用户都有一个唯一的用户ID(User ID, 通常缩写为UID)。用户ID是一个整数,用于唯一标识系统中的每个用户。用户ID 通常与用户名关联,但实际上是与用户名无关的系统级标识符。
-c --- 给用户加注释
删除用户
userdel 用户名
参数:
-r --- 删除用户同时删除目录
修改用户
usermod -l 新用户名 旧用户名
usermod 参数 用户名
参数:
-g --- 指定用户的用户组,该参数的值可以用户组的id,也可以是组名
-G --- 指定用户的用户附加组,该参数的值可以用户组的id,也可以是组名
-u --- uid用户id,系统默认会从500之后按照顺序分配uid,如果不想使用系统默认分 配的,可以通过-u自定义
-l --- 修改的用户名
用户密码管理
passwd 用户名 ---> 设置时密码处于加密模式
注意:密码过于简单/不符合规范会有提示,输入两遍也可以设置成功,正规设置应该是8位及其以上,包含数 字,大小字母,特殊符号构成
查看用户密码
cat /etc/shadow
修改用户密码
passwd 用户名
用户切换
su 用户名 ---如果是root用户就不用写用户名
用户组
每一个用户都有所属用户组,linux可以对用户组中所有的用户进行集中管理,关键文件/etc/group里面 记录了linux中所有的用户组
添加用户组
groupadd 参数 用户组名
参数:
-g 自定义用户组id,如果不设置,用户组id默认从500开始往后依次递增
用户组修改
groupmod 参数 用户名
参数:
-g 自定义用户组id,如果不设置,用户组id默认从500开始往后依次递增
-n 定义新的用户组名称
用户组删除
groupdel 用户组名
注意:如果该用户组被用户使用了,此时就不允许删除
权限
chown 参数 用户:用户组 文件路径
参数:
-c 显示更改的部分信息
-f 强制执行
-v 显示详细的处理信息
-R 处理指定目录以及其子目录内容----->改变当前目录和目录下所有内容的所属用户和 组 **
-h 修复符号连接
chmod 权限 参数 路径
参数:
-R 处理指定目录以及其子目录内容----->改变当前目录和目录下所有内容的权限
在 Linux 中,文件和目录的权限用数字表示,通常是三位数字。每一位数字都代表一组权限,分别是文件所有者 (user)、文件所属组(group)、其他用户(others)的权限。 这三位数字是由 7 个权限位组成的,分别是读取(r)4、写入(w)2、执行(x)1\
rwx(读、写、执行):4 + 2 + 1 = 7
rw-(读、写、不执行):4 + 2 = 6
r--(只读、不写不执行):4
root用户拥有最高权限
在 -rwxr-xr-- 这个权限字符串中,开头的短横线 - 并不表示权限,而是文件类型的标识。文件类型标识有以下几种:
- 表示普通文件。
d 表示目录。
l 表示符号链接(软链接)。
b 表示块设备文件。
c 表示字符设备文件。
p 表示命名管道(FIFO)。
s 表示套接字(socket)。
查看权限
ls -l 文件名或目录路径
yum全程Yellow dog updater Modifi ed,是一个在Fedora和RedHat以及SUSE中的Shell前端软件管理器
shell编程
概念:shell脚本是由一些按照一定格式组合起来的shell命令,shell脚本不需要编译就可以 直接执行,因此是边解释边执行的 ----- 定义一个shell脚本其中命令就会一键执行, 可以用shell执行一些定义操作,就不用每次输入了
Linux系统提供了多种不同的Shell【解释器】供以选择,常用的有 Bourne Shell(简称sh),C-shell (简称csh),Korn Shell(简称ksh),Bourne Again Shell(简称 bash) 一般默认是bash
shell脚本格式
shell脚本都是以.sh结尾的文件,下列是演示的hello.sh写法,以及一些注意事项:
#第一行:必须是指定一个解释器,来解释脚本中的命令,如果需要使用其他解释器,对应修改
#!/bin/bash
#1:除了第一行的#之外,其他的#代表的都是注释所谓注释就是一段标记文字,这段文字不会被当作代码执行
#2: shell脚本文件会有权限问题需要使用chmod赋予"运行权限【x】"
#3:执行时只有写明这个shell脚本路径即可执行,例如 ./hello.sh 就可以执行它
#4:也可以执行时来定义解释器, 格式为: 解释器 shell脚本 ---> sh hello.sh 以sh解释器运行shell.脚本
#5. shell的文件后缀必须是.sh
echo 'helanlo shell'
sh hello.sh 运行脚本
./hello.sh -- 该方式直接运行会报错,需要给文件赋予执行权限
chmod +x hello.sh -- 给hello.sh赋予执行权限 +表示赋予权限 -表示去掉权限
变量
1、变量定义【创建】: 变量名=变量值 ---->注意等号两边不能有空格,例如 xingming=zhangsan
2、变量引用: $变量名 ----> 例如:$xingming
3、变量分类:
--- 普通用自定义变量,例如上面的xingming
--- 系统预定义好的环境变量 ,例如:PATH / SHELL,可以使用env【environment环境】 命令查看
命令行变量的含义
编辑
数组
array1=('1' '2' '3' '4' '5' '6') #数组定义: 数组名【自定义】=(元素 元素 元素 元素.....)
echo ${array1[2]} #获取某个元素:${数组名[下标]}
echo ${array1[*]} #echo ${数组名[*]}
array1[1]=999 #设置元素:数组名[下标]=值
echo ${array1[*]}
for循环
arr=(关羽 张飞 赵云 马超 黄忠)#依次输出数据包中数据,要求数据包的格式”值 值 值 值 值“--->数组
echo ${arr[*]} #会将数组内容全部输出
for names in ${arr[*]} #for 变量名 in 数据包【可以是数组】
do #开始循环定义
echo #"取出元素为:"$names 这里开始写要重复执行的代码
done #结束循环定义
for((i = 1 ; i <= 10 ; i ++)) #可以自定义循环次数 for((起始值;条件;步长))
do
echo "循环了$i次"
done
if分支
if [ 条件1 ] ; then 代码1 --- >如果条件1成立执行代码1
elif [ 条件2 ]; then 代码2 --- >反之如果条件2成立执行代码2
elif [ 条件3 ] ;then 代码3 --- >反之如果条件3成立执行代码3
.... ....
else 代码4 ----> 反之 执行代码4
fi --- if结束
条件分支是从上到下依次过滤,先满足先执行,如果都不满足就走else
条件是指 一个结果为真/假的运算,此处就要用到比较运算符, linux的比较运算符有特殊写法
-- -gt 大于
-- -eq 等于
-- -lt 小于
-- -ge 大于等于
-- -le 小于等于
例:if(($1 >= 0 && $2 <= 4)); then
echo "好"
elif(($1 <= 10 && $2 >=5)); then
echo "你好"
else
echo "大家好"
fi
case语句
#!/bin/bash
case $1 in
a) 比较值1)
echo "第一个选项" 等于比较值1时候执行的代码
;;
b)
echo "第二个选项" 同理
;;
c)
echo "第三个选项"
;;
esac
Docker容器化操作
docker
概念:Docker是基于Go语言实现的开源容器项目。
优点:轻量化和快捷部署,跨平台和可移植性,高效的资源利用,简化的管理和维护,可靠性和安全性
准备工作:
systemctl disable --now fi rewalld #关闭防火墙,并取消开机启动
systemctl disable --now dnsmasq #关闭dnsmasq,并取消开机启动
systemctl disable --now NetworkManager #关闭NetworkManager,并取消开机启动 --- 注意: 如果是centos8就不用关闭了,此处用centos7,需 要关闭
setenforce 0 #关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
安装Docker :
# yum( Yellow dog Updater, Modifi ed)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。
基于 RPM(Red Hat Package Manager)包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理
依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
# 1、yum 包更新到最新
yum update
# 2、安装需要的软件包, yum-util 提供yum-confi g-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按 y
yum install -y docker-ce -- 没有设置版本就是安装最新版本
-- ce社区版,ee企业版 ce是免费提供的社区版本,适用于个人和小型团队,而ee是付费提供的企业版本,提供更多
的功能和支持,适用于更大规模和商业环境的使用。
格式:yum install docker-ce-<VERSION_STRING>
案例:yum install docker-ce-20.10.6
# 5、 查看docker版本,验证是否安装成功
docker -v
注意:若无法正常运行,就依次输入下列代码进行换源
mkdir /opt
mv /etc/yum.repos.d/* /opt
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
阿里云镜像获取址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,
在/etc/docker/daemon.json,文件末尾增加如下内容:
{
"registry-mirrors": ["https://你的ID.mirror.aliyuncs.com"]
}
相关代码:
systemctl start docker #启动docker服务
systemctl stop docker #停止docker服务
systemctl restart docker #重启docker服务
systemctl status docker #查看docker服务状态
systemctl enable docker --一般是要设置开机启动 #设置开机自启动
镜像相关命令:
docker images # 查看所有镜像
docker images –q # 查看所有镜像的id
docker search #镜像名称
docker search redis #查找redis镜像
docker pull #镜像名称
docker pull redis #下载最新版本redis
docker pull redis:5.0 #下载5.0版本redis
docker rmi 镜像id # 删除指定本地镜像
docker rmi -f 镜像id # 强制删除指定本地镜像
docker images -q #查看所有的镜像列表
docker rmi `docker images -q` # 删除所有本地镜像
容器相关命令:
docker ps # 查看正在运行的容器
docker ps –a # 查看所有容器
docker run 参数 #创建并启动容器
参数说明:
-i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后 ,容器创建后自动 进入容器中 ,退出容器后 ,容 器自动关闭。
-t:为容器重新分配一个伪输入终端 ,通常与 -i 同时使用。
-d:以守护(后台)模式运行容器。创建一个容器在后台运行 ,需要使用docker exec 进入容器。退出后 ,容 器不会关闭。
-it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器 --name:为创建的容器命名
docker run -it --name=c1 centos:7 /bin/bash #创建交互式容器一般不用
docker run -id --name=c2 centos:7 #创建守护式容器一般使用这个
注意 :交互式容器 ,exit后容器自动关闭 ,守护式容器会在后台执行
docker exec -it c2 /bin/bash #进入容器
docker stop 容器名称 #停止容器
docker start 容器名称 #启动容器
docker rm 容器名称 #删除容器,需要停止
docker rm -f 容器名称 #强制删除容器,无须停止
docker inspect 容器名称 #查看信息
exit #退出容器
卸载Docker
-- 查看yum安装的docker文件包
yum list installed |grep docker
-- 查看docker相关的rpm源文件
rpm -qa |grep docker
-- 删除相关服务
yum -y remove xxx
MySQL部署
分析:
容器内的网络服务和外部机器不能直接通信
外部机器和宿主机可以直接通信
宿主机和容器可以直接通信
当容器中的网络服务需要被外部机器访问时 ,可以将容器中提供服务的端口映射到宿主机的端口上。 外部机器访问宿主机的端口 ,从而间接访问容器的服务。
这种操作称为:端口映射
1. 搜索mysql镜像
docker search mysql
2. 拉取mysql镜像
docker pull mysql:5.7
3. 创建容器 ,设置端口映射、 目录映射
docker run -d --name=c_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=dn mysql:5.7
-- 想存入中文还不想要乱码就按照以下内容创建容器
docker run -d --name=c_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e
MYSQL_DATABASE=hospital_manager mysql:5.7 --character-set-server=utf8mb4 --collation- server=utf8mb4_unicode_ci
-p 代表端口映射 ,格式为 宿主机映射端口:容器运行端口
-e MYSQL_ROOT_PASSWORD=123456 //表示设置root的密码为123456
-e MYSQL_DATABASE=dn //创建mysql数据库容器的同时初始化创建一个数据库 dn
4. 进入容器 ,操作mysql
//开启mysql容器
docker exec -it c_mysql /bin/bash -- 登录mysql
mysql -uroot -p
-- 修改数据库登录密码(如果一开始设置了那就不用改了)
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; -- 刷新权限
lush privileges; -- 创建数据库
CREATE DATABASE testdn CHARACTER SET utf8 COLLATE utf8_general_ci; -- 创建数据库表
create table table1( idint(4),
name varchar(20) );-- 设置显示字符编码 set names utf8;
数据卷
概念:数据卷是宿主机中的一个目录或文件当容器目录和数据卷目录绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷
作用:容器数据持久化,外部机器和容器间接通信,容器之间数据交换
#创建启动容器时,使用–v参数设置数据卷
docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
注意事项:
1. 容器目录必须是绝对路径
2. 如果目录不存在 ,会自动创建
3. 可以挂载多个数据卷
演示数据卷持久化
创建c_mysql添加数据卷
# 在/root目录下创建mysql目录用于存储mysql数据信息 # 每行指令后面"\"表示换行
mkdir ~/mysql
cd ~/mysql
docker run -id \ -p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.7
关闭容器 ,可以看到数据卷数据文件还在
docker stop c_mysql
宿主机目录还在
删除容器c_mysql
docker rm c_mysql
宿主机目录还在
重新恢复c_mysql
-- 再执行一遍创建容器命令发现以前的内容还在
docker run -id \
-p 3007:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
一个容器挂在多个数据卷
#以下指令演示挂载多个数据卷
docker run -id \ -p 33306:3306 \ --name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \ -v ~/conf1:/etc/mysql/conf2 \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.7
两个容器挂载同一个数据卷
在一个容器中修改文件 ,看到另一个容器也跟着
# 第一个容器
docker run -id \
-p 33306:3306 \
--name=c_mysql1 \
-v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
# 第二个容器
docker run -id \ -p 33307:3306 \
--name=c_mysql2 \ # 此处名称发生变化 -v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.7
多容器进行数据交换 ,多个容器挂载同一个数据卷容器 ,完成数据交互
拉取centos7镜像
docker pull centos:7
1. 创建启动c3数据卷容器 ,使用 –v参数 设置数据卷
docker run –it --name=c3 –v /volume centos:7 /bin/bash
2. 这里没有指定宿主机目录 ,默认生成一个宿主机目录
docker inspect c3 #查看c3
3. 创建启动 c1 c2 容器 ,使用 –-volumes-from 参数 设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
代码演示:
docker exec -it c3 /bin/bash
cd /volume/ mkdir aa
exit
docker exec -it c2 /bin/bash cd /volume/
ls exit
docker exec -it c1 /bin/bash cd /volume/
ls exit
Docker镜像原理
操作系统组成部分:
进程调度子系统,进程通信子系统,内存管理子系统,设备管理子系统,文件管理子系统,网络通信子系统,作业控制子系统
Linux文件系统由bootfs和rootfs两部分组成
bootfs(boot file system)主要包含bootloader和kernel
bootloader 主要是引导加载 kernel 。
bootfs:包含bootloader(引导加载程序)和 kernel(内核)
rootfs: root文件系统 ,包含的就是典型 Linux 系统中的/dev ,/proc ,/bin ,/etc等标准目录和文件
docker镜像原理
Docker镜像是由特殊的文件系统叠加而成
最底端是bootfs ,并使用宿主机的bootfs
第二层是 root文件系统rootfs,称为base image
然后再往上可以叠加其他的镜像文件
统一文件系统( Union File System)技术能够将不同的层整合成一个文件系统 ,为这些层提供了一个统一的视角 ,这样就隐藏了多层的存在,在用户的角度看来 ,只存在一个文件系统。
一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
镜像制作
容器转镜像
相关命令:
docker commit 容器id 镜像名称:版本号
docker save -o 压缩文件名称 镜像名称:版本号
docker load –i 压缩文件名称
操作命令:
# 创建tomcat容器
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
# 进入tomcat容器
docker exec -it c_tomcat /bin/bash
#创建a.txt b.txt 在webapps/test下面创建一个文件夹
cd ~
touch a.txt b.txt
#容器转镜像
docker commit 容器ID sj_tomcat:1.0
#压缩镜像
docker save -o sj_tomcat.tar sj_tomcat:1.0
#删除原来镜像
docker rmi sj_tomcat:1.0
#从压缩文件加载镜像
docker load -i sj_tomcat.tar
#创建容器
docker run -it --name=new_tomcat sj_tomcat:1.0 /bin/bash
#进入容器查看内容
docker exec -it new_tomcat /bin/bash
#可以看到a.txt b.txt存在 ,而webapps/test不存在
容器转镜像不能转数据卷文件
dockerfile
概念
Dockerfile 是一个文本文
包含了一条条的指令
每一条指令构建一层 ,基于基础镜像 ,最终构建出一个新的镜像
对于开发人员 :可以为开发团队提供一个完全一致的开发环境
对于测试人员 :可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
对于运维人员:在部署时 ,可以实现应用的无缝移植
参考Dochub网址:https://hub.docker.com ,比如centos和nginx镜像
关键字 作用 备注
FROM 指定父镜像 指定dockerfile基于那个image 构建
MAINTAINER 作者信息 用来标明这个dockerfile谁写的
LABEL 标签 用来标明dockerfile的标签 可 以使用Label代替Maintainer 最 终都是在docker image基本信 息中可以查看
RUN 执行命令 执行一段命令 默认是/bin/sh 格式: RUN command或者RUN ["command" , "param1","param2"]
CMD 容器启动命令 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD ["command" ,
"param1","param2"]
ENTRYPOINT 入口 一般在制作一些执行就关闭的 容器中会使用
COPY 复制文件 build的时候复制文件到image 中
ADD 添加文件 build的时候添加文件到image 中不仅仅局限于当前build上下 文可以来源于远程服务
ENV 环境变量 指定build时候的环境变量可 以在启动的容器的时候通过-e 覆盖格式ENV name=value
ARG 构建参数 构建参数只在构建的时候使用 的参数如果有ENV那么ENV的 相同名字的值始终覆盖arg的参 数
关键字 作用 备注
VOLUME 定义外部可 以挂载的数 据卷 指定build的image那些 目录可以启动的时候挂载到文件系统中 启 动容器的时候使用 -v绑定 格式 VOLUME ["目录"]
EXPOSE 暴露端口 定义容器运行的时候监听的端口启动容器 的使用-p来绑定暴露端口格 式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工作目录 指定容器内部的工作目录 如果没有创建则 自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路 径的相对路径
USER 指定执行用户 指定build或者启动的时候用户在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK 健康检查 指定监测当前容器的健康监测的命令基本 上没用因为很多时候应用本身有健康监测 机制
ONBUILD 触发器 当存在ONBUILD关键字的镜像作为基础 镜像的时候当执行FROM完成之后会执 行ONBUILD的命令但是不影响当前镜像 用处也不怎么大
STOPSIGNAL 发送信号量到宿主机 该STOPSIGNAL指令设置将发送到容器 的系统调用信号以退出。
SHELL 指定执行脚本的shell 指定RUN CMD ENTRYPOINT 执行命令 的时候使用的shell
案例一: 自定义centos7镜像。
要求:
1. 默认登录路径为/usr
2. 可以使用vim 实现步骤
定义父镜像: FROM centos:7
定义作者信息: MAINTAINER sj sj@sj.cn . 执行安装vim命令: RUN yum install -y vim . 定义默认的工作目录:WORKDIR /usr
定义容器启动执行的命令 :CMD /bin/bash
通过dockerfile构建镜像 :docker bu lid –f dockerfile文件路径 –t 镜像名称:版本 .
#具体指令
mkdir ~/docker-files
cd ~/docker-files
vim centos_dockerfile
dockerfile具体内容
FROM centos:7
MAINTAINER sj <sj@sj.cn> # 安装vim
RUN yum install -y vim # 设置默认文件夹/usr WORKDIR /usr
# 设置启动命令 CMD /bin/bash
build
语法格式:
docker build -f ./centos_dockerfile -t 自定义名称:1 .
docker build -f ./centos_dockerfile -t sj_centos:1 .
-f:镜像文件
-t:新镜像
寻址路径
docker run -it --name=c2 sj_centos:1
案例二:发布springboot项目
定义父镜像: FROM java:8
定义作者信息: MAINTAINER sjsj@163.com
将jar包添加到容器: ADD springboot.jar app.jar
定义容器启动执行的命令 :CMD ["java","-jar","app.jar"]
通过dockerfile构建镜像 :docker bu lid –f dockerfile文件路径 –t 镜像名称:版本 . springboot_dockerfile
FROM java:8
MAINTAINER sj <sj@163.com>
ADD springboot.jar app.jar # 此处要求有俩参数 此处app.jar中的app名字为自定义名称
CMD ["java","-jar","app.jar"]
build 创建新的镜像
docker build –f ./文件名 –t 文件中第二个参数 .
docker build –f ./springboot_dockerfile –t app .
在docker里面镜像打底 容器干活 创建启动容器
docker run -id -p 9000:8080 镜像名
docker run -id -p 9000:8080 app
案例三: Docker部署前端目
# 使用基础镜像
FROM nginx:latest
# 拷贝静态文件到 Nginx 默认的静态文件路径 COPY dist/ /usr/share/nginx/html
# 暴露容器的端口(默认为 80) EXPOSE 80
# 启动 Nginx 服务器
CMD ["nginx", "-g", "daemon of;"]
2. 构建 Docker 镜像: 在终端中进入 Dockerfile 所在的目录 ,执行以下命令构建 Docker 镜像:
docker build -t frontend-app
3. 运行 Docker 容器: 完成镜像构建后 ,可以使用以下命令运行 Docker 容器:
docker run -d -p 9282:80 frontend-app
Docker 中一个tomcat镜像为什么有600MB ,而一个tomcat安装包只有70多MB?
由于docker中镜像是分层的 ,tomcat虽然只有70多MB ,但他需要依赖于父镜像和基础镜像 ,所有整个对外 暴露的tomcat镜像大小600多MB
Docker服务编排
概念
服务编排可以一次性启动多个项目
微服务架构的应用系统中一般包含若干个微服务 ,每个微服务一般都会部署多个实例 ,如果每个微服务都要手动启 动停止 ,维护的工作量会很大。来看下我们日常工作:
要从Dockerfile build image 或者去dockerhub拉取image . 要创建多个container
要管理这些container(启动停止删除)
通过服务编排可以大量简化上面的工作服务编排:按照一定的业务规则批量管理容器
6.2 Docker Compose
Docker Compose是一个编排多容器分布式部署的工具 ,提供命令集中管理容器化应用的完整开发周期 ,包括服务构建 ,启动和停止。使用步骤:
1. 利用 Dockerfile 定义运行环境镜像
2. 使用 docker-compose.yml 定义组成应用的各服务
3. 运行 docker-compose up 启动应用
安装Docker Compose
# Compose目前已经完全支持Linux、 Mac OS和Windows ,在我们安装Compose之前 ,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。
curl -L https://git hub.com/docker/compose/releases/download/1.22.0/docker-compose- `uname -s `- `uname - m ` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
ch mod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
6.2.2 卸载Docker Compose
# 二进制包方式安装的 ,删除二进制文件即可
rm /usr/local/bin/docker-compose
6.3 编排nginx+springboot
需求:使用nginx反向代理到springboot应用
1. 创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
2. 编写 docker-compose.yml 文件
version: '3' services: nginx:
image: nginx ports:
- 80:80 links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d app:
image: app expose:
- "8080"
3. 创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
4. 在./nginx/conf.d/目录下编写app.conf文件
server {
listen 80;
access_log of;
location / {
proxy_pass http://app:8080/;
}
}
5. 在~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up -d # -d表示使用守护模式启动
docker-compose down # 停止容器
6. 测试访问
http://192.168.174.130/hello
Docker日志管理和网络通信
在Docker的整个生命周期过程中 ,超过70%的时间我们都是在做Docker的运维工作。查看Docker日志 ,是运维工 作中非常重要的一个环节。
Docker日志分为两种类型: Docker引擎的日志 ,应用的日志。
访问Docker引擎的日志
作用:
故障排除: Docker 引擎日志记录了 Docker 守护进程的活动和事件。当 Docker 容器、服务或网络出现问题时 ,查看 日志可以帮助您识别问题的根本原因。例如 ,您可以在日志中找到容器启动失败的错误消息或网络连接问题的警告。
性能监控: Docker 引擎日志还提供有关 Docker 守护进程和容器性能的信息。通过分析日志 ,您可以了解 Docker 容 器的资源使用情况、启动时间、运行时错误等。这对于优化容器的性能和稳定性非常有用。
安全审计 :监视 Docker 引擎日志可以帮助您进行安全审计 ,并检测可能存在的安全问题或攻击。通过查看日志 ,您可 以了解容器的访问模式、 网络活动以及与容器相关的任何异常行为。
监控和警报 :通过设置适当的日志监控和警报系统 ,您可以实时监视 Docker 引擎日志 ,并在出现关键事件或错误时立 即收到通知。这有助于及时发现和解决潜在的问题 ,提高系统的可靠性和稳定性。
-- 指令 moreLinux管道分页
journalctl -u docker.service | more
访问Docker应用的日志
Docker 将应用运行在容器中 ,应用输出日志也就输出到容器中了 ,访问 Docker 应用的日志也就变成了访问 Docker 容器的日志。要访问容器的日志,首先需要了解 Docker 的日志引擎。
日志引擎,说明
journald,Docker 默认的日志引攀。这种引擎把所有容器的回显日志输出到系统的journald 服务中
json-file,把每个容器的回显日志以 JSON 文件格式输出到每个容器的内部。如果在实际应用中某些应用 产生了大量的日志信息 ,则可能导致容器的 JSON 日志文件过大而占满宿主机的磁盘
syslog,把所有容器的回显日志输出到系统的 sysl0g 服务中
fuentd,把所有容器露的回显日志输出到系统的 fuentd 服务中
gelf,把所有容器的日志输出到支持GELF(Grayl0gExtended Log Format)格式的服务中 ,如 Logstash
none,关闭 Docker 容器的日志。使用这种方式 ,则意味着无法通过“docker logs”命令查看任何容器 输出的日志
作用:
故障排除:
Docker 应用日志记录了容器化应用程序的运行状态、错误信息、警告和调试信息。当应用程序出现问题时 , 日志可 以帮助您快速找到根本原因 ,并提供解决问题的线索。
监控应用健康状况:
通过查看应用日志 ,您可以监控应用程序的运行状态 ,识别潜在问题 ,并确保应用程序按预期运行。如果日志中出现 异常或错误消息 ,这可能是应用程序问题的早期警告。
性能分析:
应用日志提供了应用程序执行期间的性能数据。通过分析日志 ,您可以找出性能瓶颈、优化代码或调整资源分配。这 对于确保应用程序在 Docker 环境中高效运行非常重要。
安全审计和合规性:
查看应用日志可以帮助您识别安全风险和违规行为。通过日志监控 ,您可以发现未经授权的访问、异常活动或潜在的 攻击。 日志记录还可以帮助您遵守安全法规和合规要求。
审计和审查:
在某些情况下 ,组织可能需要保留应用日志以供审计或合规性检查。查看日志有助于确保所有操作都被正确记录 ,并 可以追溯到事件的来源。
调试和开发:
在开发和调试过程中 , 日志是重要的工具。通过查看应用日志 ,开发人员可以了解代码的执行情况 ,并识别问题所 在。这可以加速开发和调试流程。
1、查看日志引擎
docker info | grep Loddding
修改日志引擎
vim /etc/docker/daemon.json 2 {
重启服务
systemctl daemon-reload
systemctl restart docker
查看日志
-- --since="时间" 01b3cf4ea46a:容器id
docker logs -f -t --since="2024-04-27" --tail=5 01b3cf4ea46a 3 -- 查看30分钟以内的日志信息
docker logs -f -t --since 30m 01b3cf4ea46a