linux常用指令:
ls [-a -l -h] [Linux路径]:列出路径下所有文件
-a:显示隐藏内容
-l: 以列表(竖向排列)展示内容,显示更多信息
-h:以易于阅读的形式(必须与l一起使用,会显示文件大小单位KB之类的)
pwd:查看当前工作目录
mkdir [-p] 路径:创建文件夹
-p可加可不加,表示自动创建不存在的父亲目录
touch 路径:创建文件
cat 路径:输出文件内容
more 路径:以分页方式输出文件内容
cp [-r] 参数1 参数2:复制文件
-r可选,用于复制文件夹(包括内部文件) 参数1被复制文件 参数2复制去的路径
mv 参数1 参数2:移动文件
参数1被移动的文件或文件夹 参数2移动去的路径
rm [-r -f] 参数1 参数2 ..... 参数N:移除文件
-r 用于删除文件夹 - -f 表示force,强制删除(不会弹出提示确认信息) 参数1 参数2 ..... 参数N 表示要删除的文件或文件夹路径,空格隔开
grep [-n] 关键字 文件路径:搜索关键字
-m表示显示第几行的内容
wc [-c -m -l -w] 文件路径:统计文件的行数、单词数量
-c,统计bytes数量 -m,统计字符数量 -l,统计行数 -w,统计单词数量
tail [-f -num] 路径:输出文件尾部信息
-f 持续跟踪 -num行数,默认10行
vi/vim 路径:编辑器
进入后摁i表示当前位置编辑 结束编辑Esc,用:wq是保存并退出,q!是强制退出不保存。
su - 用户名:切换用户
sudo [指令]:以管理员权限运行指令
chmod [-R] 权限 路径
-R表示对文件夹内所有内容进行同样权限更改操作
chown [-R] [用户] [:] [用户组] 路径:修改所属用户与用户组
-R表示对文件夹内所有文件操作 用:区分是用户还是用户组,不更改部分可省略
yum [-y] [install | remove | search] 软件名称
-y表示过程中全部自动确认
systemctl start|stop|status|enable|disable 服务:控制服务
start:启动 stop:暂停 status:查看状态 enable:开机自启动 disable:关闭开机自启动
ln -s 参数1 参数2:软连接
相当于创建快捷方式
date [-d] [+格式化字符串]:查看系统时间
-d按照给定字符串显示日期 %Y 年 %y 年后两位 %m 月份 %d 日 %H 小时 %M 分钟 %S 秒 %s 时间戳
date -d "+1 year" +%Y-%m-%d %H:%M:%S 显示的是当前时间+1年
ping [-c num] ip或主机名:检测联通
-c次数限制 num次数
wget [-b] url:文件行内下载网络文件
-b后台下载
curl [-o] url:可用于下载与获取信息
-o若url为下载连接可保留文件
ps [-e -f]:进程管理
-e显示全部进程 -f显示全部信息
kill [-9] PID:关闭进程
-9强制关闭
top:主机状态控制
df [-h]:磁盘信息监控
-h人性化显示
rz、sz:与本地上传或下载文件
tar [-c -v -x -f -z -C] 参数1 参数2 ...:压缩包操作
-c创建压缩包 -v显示过程 -x解压 -f要创建的或解压的文件 -zgzip模式 -C解压目的地
netstat [-anp | -tulnp]:查询端口占用情况
-tulnp:TCP -t、UDP -u与监听端口 -l 并显示进程信息-p -anp:所有端口
nohup java -jar 路径:后台运行jar文件
即使xshell等连接断开也可以继续运行。
docker安装:
先卸载旧docker
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate\ docker-logrotate \ docker-engine
安装yum-utils
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
配置docker的yum源(阿里云源)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo sudo yum makecache fast //更新yum,建立缓存
安装Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动与校验
# 启动Docker systemctl start docker # 停止Docker systemctl stop docker # 重启 systemctl restart docker # 设置开机自启 systemctl enable docker # 执行docker ps命令,如果不报错,说明安装启动成功 docker ps
配置镜像加速
# 创建目录 mkdir -p /etc/docker # 复制内容 tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "http://hub-mirror.c.163.com", "https://mirrors.tuna.tsinghua.edu.cn", "http://mirrors.sohu.com", "https://ustc-edu-cn.mirror.aliyuncs.com", "https://ccr.ccs.tencentyun.com", "https://docker.m.daocloud.io", "https://docker.awsl9527.cn" ] } EOF # 重新加载配置 systemctl daemon-reload # 重启Docker systemctl restart docker
docker相关命令:
docker常用命令:
docker images:查看docker所有容器
docker rmi:移除镜像
docker pull:从远端拉取镜像
docker build:构建镜像并存入到本地
docker save:保存文件
docker load:加载镜像文件
docker load -i jdk.tar 加载jdk压缩包内容并生成对应镜像。
docker push:将本地镜像推到镜像仓库
docker run:构建一个容器并运行镜像实例
-i:交互式操作 -t:终端
docker run -it centos /bin/bash
docker stop:暂停某容器的镜像实例
docker kill:强制停止容器
docker start:运行某容器内的镜像实例
docker rm:移除容器
docker ps:判断镜像实例运行状态
可将输出格式规范化: docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
docker logs:查看docker运行日志
docker logs 容器id,可以根据容器id去查找容器运行日志,包含报错警告什么的
docker exec:进入容器内部,以进行修改
docker exec -it nginx bash 这行指令可以进入名为nginx的容器内部,-it表示可交互界面,bash是界面种类,进入后相当于进入小型的虚拟机,可执行对应操作。 其进入是启动新的进程,即便用exit退出后,也不会出现无前台服务导致容器自杀的情况。
docker attach则是直接进入容器,不会启动新进程。
docker inspect :查看容器详情
docker inspect mysql 其中Mounts与挂载相关
docker cp:复制容器文件到主机
可以用docker cp 容器id:容器内路径 目的主机路径
docker top ID:查看容器内进程
可以根据docker ps的CONTAINER ID作为top参数去查看容器内运行的进程
docker export:导出容器的内容留作为一个tar文件
docker export id > abcd.tar docker export 容器id > 文件名.tar
docker import:从tar包中的内容创建一个新的文件系统再导入为镜像
cat abcd.tar | docker import - atguigu/ubuntu:3.7 cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号(我猜这里可以就只写镜像名,镜像用户只是标识规范)
配合export使用可以当成数据备份
docker commit:提交容器副本使之成为新的镜像
从docker的镜像分层角度,在已有的容器上去添加新的根据,使得整个容器具有新的功能,再将其镜像化时,将新增的功能作为新的镜像层,堆叠在原先的基础上,去生成新的镜像。
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
给容器linux系统安装vim具体过程: 1.运行一个linux容器 2.在容器中下载vim,与linux环境操作类型,如centos的yum 3.提交容器 docker commit -m="add vim cmd" -a="zzyy" 5fa45c3697b7 atguigu/myubuntu:1.1 4.成功产生新的镜像
镜像发布阿里云与阿里云下载等
数据卷:
若docker容器内的相关文件内容需要修改,则可以用数据卷对其容器内的文件夹进行双向映射,在数据卷内的修改会映射到容器内,实现同步修改。
有些在容器创建时自动创建的数据卷成为 匿名卷 ,如mysql的数据存储目录,其内部类似于navicat连接数据库的样子,便于以后数据库迁移。 数据卷不会在移除容器后消失。
docker volume --help:查看数据卷相关操作
数据卷挂载
在docker run命令执行时使用 -v 数据卷 : 容器内目录 可以 完成数据卷挂载 创建容器后不可挂载数据卷 创建容器时,如果挂载了数据卷但数据卷不存在,则自动创建数据卷 挂载默认是可读可写的,也就是-v /root/nginx/html:/usr/share/nginx/html nginx rw的 可以将容器设置为只读数据卷,把rw改为ro
以nginx为例: docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx -v 后的html为数据卷名,:后为容器内对应文件夹,实现映射 也可以用 docker run -d --name nginx -p 80:80 -v /root/nginx/html:/usr/share/nginx/html nginx 实现宿主机目录与容器目录的直接挂载。
mysql数据库配置文件等挂载: docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123456 -v /root/mysql/data:/var/lib/mysql -v /root/mysql/init:/docker-entrypoint-initdb.d -v /root/mysql/data:/etc/mysql/conf.d mysql -privileged=true(用于确定容器权限)
容器继承数据卷
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu u1挂载的数据卷会同样被u2挂载,他们的数据卷连接的是同一个,读写权限也相同(应该) 而u1和u2之间是独立的,u1被删除了,u2不会受到影响。u1恢复后也能获得其不在期间的所有文件操作
docker volume ls:查看数据卷
docker volume inspect html:查看名为html的数据卷相关信息
其中Mountpiont显示的是数据卷在宿主机对应映射的位置
Docker 制作镜像
用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。 具体流程为:编写Dockerfile文件 —> docker build命令构建镜像 —>docker run 依镜像运行容器实例 常用保留字:
FROM:基础镜像,将已存在的镜像作为一个模板去搭建一个新的镜像 MAINTAINER:镜像维护者的姓名与邮箱 RUN:容器构建时需要运行的命令 EXPOSE:当前容器对外暴露出的端口 WORKDIR:指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点 USER:指定该镜像以什么样的用户去执行,若不指定,则默认root ENV:用来在构建镜像过程中设置环境变量 ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包 COPY:类似ADD,拷贝文件和目录到镜像中。从构建上下文目录中<源路径>的目录复制到新的一层镜像内的<目标路径> VOLUME:容器数据卷,用于数据保存和持久化工作 CMD:指定容器启动后干什么(若后面还有CMD则会被替代,也会被RUN替代) ENTRYPOINT:类似CMD,但是不会被docker run后面的命令覆盖
每条Dockerfile指令都会创建一个新的镜像层并对镜像进行提交
编写Dockerfile
新建一个文件,叫Dockerfile,D要大写,然后在Dockerfile里编写以下内容
# 指定基础镜像 FROM ubuntu:16.04 # 声明作者与邮箱 MAINTAINER hl<3534943021@qq.com> # 配置环境变量,JDK的安装目录、容器内时区 ENV JAVA_DIR=/usr/local ENV TZ=Asia/Shanghai # 设置登录位置 WORKDIR $MYPATH # 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo.jar /tmp/app.jar # 设定时区 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 安装JDK RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz \ && mv ./jdk1.8.0_144 ./java8 # 此处也可以在COPY时转用ADD,其余不变,那么就会自动解压 ADD ./jdk8.tar.gz $JAVA_DIR/ # 配置环境变量 ENV JAVA_HOME=$JAVA_DIR/java8 ENV PATH=$PATH:$JAVA_HOME/bin # 指定项目监听的端口 EXPOSE 8080 # 入口,java项目的启动命令 ENTRYPOINT ["java", "-jar", "/app.jar"]
以上是对于一个jar包需要包装成一个镜像的全部步骤,而虚拟机也可以和java合并在一块,简化为以下
# 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["java", "-jar", "/app.jar"]
此处openjdk:11.0-jre-buster是配置好了java的虚拟机环境,我们要做的就是更改时间以及加入jar包。 用到的文件需要和Dockerfile处于同一目录下
根据Dockerfile构建镜像
docker build -t myImage:1.0 . 此处是读取当前工作目录的Dockerfile生成对应的镜像并加载到docker中,这样就生成了一个jar包的镜像。
虚悬镜像
镜像名和版本号都为<none>的镜像,这类镜像功能未知,失去存在价值,建议删除 docker build . 该语句执行了Dockerfile后产生的就是虚悬镜像。
docker image ls -f dangling=true 该语句可以显示处docker中所有的虚悬镜像。
docker image prune 该语句可以删除所有虚悬镜像。
Docker网络
网络模式:
载入Docker后会默认创建三大网络模式:
NAME DRIVER SCOPE bridge bridge local host host local none null local
其中前两个是常用的网络模式。
bridge
为每一个容器分配、设置IP等,并将容器连接到一个docker0 虚拟网桥,默认为该模式。 使用--network bridge指定,默认使用docker0
docker服务默认会创建一个docker0网桥(其上有一个docker0内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
上图中,最上面那三个是docker容器,每个容器与网桥相连,容器要与容器通讯或者与外界通讯都要经过网桥,这就是网桥的意义。
1 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址, 称为Container-lP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-lP直接通信。 2 docker run的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己 create的network(后面讲)eth0,eth1,eth2…代表网卡一,网卡二,网卡三…,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址 3网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。 3.1整个宿主机的网桥模式都是docke0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼 此联通(这样一对接口叫veth pair); 3.2每个容器实例内部也有一块网卡,每个接口叫eth0; 3.3 docker(0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。 通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的,此时两个容器的网络是 互通的。
例子:
host
容器将不会获得一个独立的Network Namespace而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。 使用--network host指定。
直接使用宿主机IP地址与外界进行通讯,不再需要额外进行NAT转换。
docker启动时指定-network=host或-net=host,如果还指定了-p映射端口,那这个时候就会有此警告, 并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。
也就是说要如果启动了该服务,相当于直接在宿主机上直接启动了服务,其服务占用的8080那就是8080端口,则外界要访问的话就是宿主机ip+服务开放端口。如果重复则会向后寻找。
none
容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等。 使用--network none指定 在none模式下,并不为Docker容器进行任何网络配置。 也就是说,这个Docker?容器没有网卡、P、路由等信息,只有一个Io 需要我们自己为Docker容器添加网卡、配置IP
container
新建的容器和己经存在的一个容器共享一个网络配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的1P,而是和一个指定的 容器共享P、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的 使用--container:NAME或者容器ID指定。
相当于新的容器与旧容器共用旧容器内的虚拟机的网络,可以认为他们的ip一样,所以如果服务开放端口一样会导致服务冲突。 如果依赖的旧容器被杀死了,那么新容器的网络也就没了。
作用:
在同一个Docker网络的容器间可以互联和通信以及端口映射 容器IP变动时可以通过服务名直接网络通讯而不受到影响
操作:
Docker network ls:查看docker网络详细
Docker network connect:Docker连接网络
Docker network create:创建Docker网络
Docker network create aa_network 创建的是默认的bridge网络
Docker network disconnect:断开连接某网络
Docker network inspect:查看网络详情
Docker network inspect bridge 查看名为bridge网络的详情,如哪些容器连接等。
其中的Driver显示的就是网络模式。
Docker network prune:删除所有无效不占用的网络
Docker network rm:删除Docker网络
自定义网络
当使用bridge默认网桥时,无法通过容器名去直接通讯,因此就需要自己自定义一个网络,实现网络内根据容器名通讯。
Docker-Compose
Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Compose是Docker公司推出的一个工具软件,可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件 docker--compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器
例子: 假设有一个订单服务,它的运行需要Redis与Mysql等其他服务,这里就涉及到服务的启动顺序等。 也可以实现对一个服务的一键启动/一键关闭。
服务(service):一个个应用容器实例,比如订单微服务、库存微服务、mysql2容器、nginx容器或者redis?容器 工程(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
Docker-Compose安装
执行对应语句即可
1.curl -SL https://github.com/docker/compose/releases/download/v2.36.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose 2.chmod +x /usr/local/bin/docker-compose 3.docker-compose --version (可选,查看docker-compose是否安装完成)
搭建步骤:
1.编写Dockerfile定义各个微服务应用并构建出对应的镜像文件 2.使用docker-compose.yml定义一个完整业务单元,安排好整体应用中的各个容器服务。 3.最后,执行docker-compose up命来启动并运行整个应用程序,完成一键部署上线
以上效果等价与依次执行run
Docker-compose常用命令
docker-compose-h #查看帮助 docker-compose up #启动所有docker-compose服务 docker-compose up -d #启动所有docker-compose服务并后台运行 docker-compose down #停止并删除容器、网络、卷、镜像。 docker-compose exec yml里面的服务id #进入容器实例内部docker-compose exec docker-compose.yml文件中写的服务id /bin/bash docker-compose ps #展示当前docker-compose编排过的运行的所有容器 docker-compose top #展示当前docker-compose编排过的容器进程 docker--compose logs yml里面的服务id #查看容器输出日志 dokcer-compose config #检查配置 dokcer-compose config -q #检查配置,有问题才有输出 docker-compose restart #重启服务 docker-compose start #启动服务 docker-compose stop #停止服务
Docker-compose使用
不使用Docker-Compose:
缺点:
先后顺序要求固定,先mysql+-redis才能微服务访问成功 多个run命令 容器间的启停或宕机,有可能导致P地址对应的容器实例变化,映射出错,要么生产P写死(可以但是不推荐),要么通过服务调用
使用Docker-Compose
在导入所有镜像后编写docker-compose.yml文件
version:"3" services: microService: image: zzyy_docker:1.6 container_name: ms01 #服务容器名称 ports: - "6001:6001" volumes: - /app/microService:/data networks: - atguigu_net depends_on: - redis - mysql redis: image: redis:6.0.8 ports: - "6379:6379" volumes: - /app/redis/redis.conf:/etc/redis/redis.conf - /app/redis/data:/data networks: - atguigu_net command: redis-server /etc/redis/redis.conf mysql: image: mysql:5.7 environment: MYSQL ROOT PASSWORD: '123456' MYSQL ALLOW EMPTY PASSWORD: 'no' MYSQL DATABASE: 'db2021' MYSQL USER: 'zzyy MYSQL_PASSWORD: 'zzyy123' ports: - "3306:3306" volumes: - /app/mysql/db:/var/lib/mysql - /app/mysql/conf/my.cnf:/etc/my.cnf - /app/mysql/init:/docker-entrypoint-initdb.d networks: - atguigu_net command: --default-authentication-plugin=mysql_native_password #解决外部无法访问 networks: atguigu_net:
然后输入docker-compose up -d执行程序并在后台运行。
其执行后会自主创建对应的网络,网络名为执行的文件夹+networks名。 容器名不指定的话则是文件夹名+镜像名+编号(从1开始递增)
创建完成后在对应的数据库进行建表等操作......
如果要停止这一系列服务,则是执行docker-compose stop
Docker各中间件部署
Mysql
docker run -d \ --name mysql \ -p 3306:3306 \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=www.Xe0n.com \ mysql
这里最后一行的mysql是表示获取mysql服务,可跟:5.7表示docker版本号,不写的话则是默认为最新版本。
-d表示后台运行 -p是端口映射,左为宿主机端口,右为容器端口,容器端口应为当前运行文件的默认端口。 -e是环境变量
MySQL主从复制Docker版:
41_mysql主从复制docker版哔哩哔哩bilibili
Redis
集群配置 45_3主3从redis集群配置上集哔哩哔哩bilibili
RabbitMQ
docker run \ -e RABBITMQ_DEFAULT_USER=root \ -e RABBITMQ_DEFAULT_PASS=123456 \ -v mq-plugins:/plugins \ --hostname rabbitMQ \ --name rabbitMQ \ -p 15672:15672 \ -p 5672:5672\ --network my_network \ -d \ rabbitmq:3.8-management
Portainer
Portainer是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。其本身也有Docker镜像。
官网地址:Kubernetes and Docker Container Management Software
Docker容器部署:
docker run -d -p 8000:8000 -p 9000:9000 --name portainer \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest
CIG
重量级的Docker监测工具 CAdvisor+InfluxDB+Granfana