Linux,docker知识补充
1.创建多个用户(newusers)
首先。创建一个test.txt 文件,在里面写如创建信息,格式如下:
username1:password1:UID1:GID1:User Full Name1:/home/username1:/bin/bash
username2:password2:UID2:GID2:User Full Name2:/home/username2:/bin/bash
字段说明:username:用户名
password:加密后的密码(可以用 openssl passwd -6 "密码" 生成)
UID:用户ID(可选,留空则自动分配)
GID:组ID(可选,留空则自动分配)
User Full Name:用户全名(可选)
/home/username:家目录
/bin/bash:默认 shell(可选)
然后,newusers test.txt
最后,getent passwd 验证是否创建成功
2.at 命令
at 13:45 2025:8:12
atq 展示任务列表
3.sleep
sleep 5m //休眠5分钟,也可以换成s,m,h,d
date;sleep 1m;date //现实时间,休眠1分钟后,再次显示时间
当休眠时想退出。ctrl+c
4.给用户分配sudo权限
1.使用 visudo 编辑配置文件:
sudo visudo
2.添加以下行(给单个用户 sudo 权限):
用户名 ALL=(ALL:ALL) ALL用户名:要授权的用户
ALL=(ALL:ALL) ALL:
- 第一个 ALL:允许在任何主机上使用 sudo
- (ALL:ALL):可以以任何用户和组的身份执行命令
- 最后一个 ALL:可以执行所有命令
如果希望用户免密码使用 sudo(适用于自动化脚本,但安全性较低):
用户名 ALL=(ALL) NOPASSWD:ALL
保存并退出(visudo 会自动检查语法)。
5.vim编辑器显示和关闭行号
在命令模式下
:set nu 显示行号
:set nonu 关闭行号
6.vim编辑器查找
在命令模式下
:/查找内容
7.vim跳到指定行
:42<Enter> 跳转到第 42 行
42G 跳转到第 42 行
8.crontab命令
查看当前用户的 crontab 文件:
crontab -l编辑当前用户的 crontab 文件:
crontab -e删除当前用户的 crontab 文件:
crontab -r列出某个用户的 crontab 文件(需要有相应的权限):
crontab -u username -l编辑某个用户的 crontab 文件(需要有相应的权限):
crontab -u username -e
进入文件中。按照f1 f2 f3 f4 f5 program格式编写文件。
如:40 15 * * * touch /home/abc.txt //每天的15:40在/home/路径下创建abc.txt文件
9.su、su-、sudo的区别
命令 | 密码要求 | 环境变量 | 适用场景 | 安全性 |
---|---|---|---|---|
su | 目标用户密码 | 保留原环境 | 临时切换用户 | 低 |
su - | 目标用户密码 | 加载目标环境 | 完全切换到目标用户环境 | 中 |
sudo | 当前用户密码 | 保留原环境 | 临时提权执行命令 | 高 |
补充说明
su
:直接切换用户但保留原环境变量,可能导致权限混淆。su -
:模拟目标用户完整登录环境,包括HOME和PATH变量。sudo
:通过配置文件(/etc/sudoers
)限制权限,避免直接暴露root密码。
安全性对比
su
需共享目标用户密码,风险最高。sudo
仅需当前用户密码,且支持审计日志,安全性最佳。
10.容器的重启策略
Docker 容器的重启策略用于控制容器在退出或系统重启时的自动恢复行为,是保障服务高可用的重要机制。以下是 Docker 支持的几种重启策略及其适用场景:
以下是整理后的 Docker 容器重启策略对比表格:
1.重启策略
策略 | 触发条件 | 典型应用场景 | 备注 |
---|---|---|---|
no | 容器退出时不自动重启 | 测试环境、临时任务 | 默认策略 |
always | 无论退出状态如何都重启(包括手动停止后 Docker 服务重启) | 关键服务(如数据库、Web 服务器) | 可能因手动停止后意外恢复 |
on-failure | 仅当容器异常退出(非0状态码)时重启 | 需要故障恢复但避免无限重启的服务 | 可设最大重试次数(如 on-failure:3 ) |
unless-stopped | 类似 always ,但排除手动停止的容器 | 生产环境长期运行服务 | Docker 服务重启后不会恢复手动停止的容器 |
2. 配置方法
(1)启动容器时指定
docker run -d --restart=always nginx # 始终重启
docker run -d --restart=on-failure:5 redis # 异常时最多重启5次:cite[6]:cite[10]
(2)修改运行中的容器
docker update --restart=unless-stopped <容器名或ID>:cite[5]:cite[8]
(3)Docker Compose 配置yaml文件中
services:
web:
image: nginx
restart: unless-stopped
db:
image: postgres
deploy:
restart_policy:
condition: on-failure
max_attempts: 3:cite[1]:cite[9]
3.注意:
- 避免与 --rm 同时使用:--restart 和 --rm(退出后删除容器)冲突。
- 资源监控:频繁重启可能占用资源,建议为 on-failure 设置重试限制。
- 日志排查:自动重启的容器需结合日志分析根本原因(如 docker logs)。
- 存储持久化:数据库类服务需挂载卷,避免重启后数据丢失。
11.服务名访问网络
使用 Docker Compose 或 自定义 Docker 网络 时,容器间可通过服务名通信。
同一网络内的容器 无需知道 IP,直接使用 服务名 作为主机名访问。
# 创建自定义网络
docker network create mynet# 启动两个容器并加入同一网络
docker run -d --name web --network mynet nginx
docker run -d --name db --network mynet postgres# 在 web 容器内 ping db
docker exec -it web ping db # 成功解析
12.docker compose查看日志
docker-compose logs
注:
确认你位于正确的目录,如果文件在其他目录,切换到包含 compose 文件的目录
13.一个容器需依赖另一个容器启动
1. Docker Compose 的 depends_on + 健康检查(推荐)
在 docker-compose.yml 中定义依赖关系,并结合健康检查确保依赖服务真正可用:
version: '3.8'
services:db:image: postgreshealthcheck:test: ["CMD-SHELL", "pg_isready -U postgres"]interval: 5stimeout: 5sretries: 10environment:POSTGRES_PASSWORD: exampleapp:image: my-appdepends_on:db:condition: service_healthy # 等待 db 健康状态为 truerestart: on-failure
关键点:
- depends_on 仅控制启动顺序,不保证依赖服务已准备好(需配合健康检查)。
- condition: service_healthy 确保依赖服务通过健康检查后才启动 app。
生产环境:优先使用 健康检查 + depends_on(如数据库的 pg_isready 或 Redis 的 redis-cli ping)。
开发环境:用 wait-for-it.sh 快速验证。
复杂依赖:结合应用层重试(如微服务调用)。
14.compose启动失败怎么办
1. 检查错误日志
首先查看详细的错误信息,以确定具体原因:
docker-compose logs [服务名] # 查看某个服务的日志
docker-compose up --force-recreate # 强制重建容器并显示实时日志
2. 常见问题及解决方法
(1) 配置文件语法错误
问题:docker-compose.yml 文件格式不正确(如缩进错误、字段拼写错误)。
解决:
使用 YAML 校验工具检查语法(如 YAML Lint)。
确保 version 和 services 字段正确2。
(2) 端口冲突
问题:容器端口与宿主机端口冲突(如 Bind for 0.0.0.0:80 failed: port is already allocated)。
解决:
docker ps -a # 查看已占用的端口
netstat -tuln | grep 80 # 检查宿主机端口占用
修改 docker-compose.yml 中的端口映射(如 "8080:80" 改为 "8081:80")67。
(3) 镜像拉取失败
问题:镜像不存在或网络问题导致拉取失败。
解决:
docker pull 镜像名:标签 # 手动拉取镜像
docker-compose build # 重新构建镜像(如果使用本地 Dockerfile)
检查 Docker Hub 或私有仓库的镜像名称是否正确2。
(4) 容器启动后立即退出
问题:容器无前台进程(如 Exited (0))。
解决:
添加 tty: true 或 stdin_open: true 保持容器运行:
services:
alpine:
image: alpine
tty: true # 保持终端开启:cite[4]:cite[5]。
指定长期运行的命令(如 command: tail -f /dev/null)。
(5) 依赖服务未就绪
问题:服务依赖的数据库或其他服务未启动完成。
解决:
使用 depends_on + 健康检查:
services:
app:
depends_on:
db:
condition: service_healthy
db:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
或使用 wait-for-it.sh 脚本等待端口可用7。
(6) 权限问题
问题:Couldn't connect to Docker daemon。
解决:
sudo usermod -aG docker $USER # 将当前用户加入 docker 组
newgrp docker # 刷新用户组
sudo systemctl restart docker # 重启 Docker 服务:cite[8]。