Docker $ 第三篇 :Docker 容器的使用

一.Docker容器简介

1.镜像和容器的关系,就像面向对象的程序设计中的类和实例,镜像是静态的,容器是镜像运行后产生的,容器1可被创建,启动,停止,删除。
2.容器是一个独立的空间,就下宿主下的操作系统,有自己的文件系统,网络配置,进程,由于容器的隔离性,在容器下运行的应用比在宿主下更加安全。
3.容器和镜像一样都是分层存储,容器以镜像为基础运行,运行时创建一个当前容器的存储层,存储层的生命周期和容器一样,容器消亡,存储层也消亡,保存于存储层的信息随着容器消亡而消失,所以,文件的写入操作,应该使用数据卷(Volume),数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡,数据也不会丢失。

二.Docker容器命令

  • 运行容器 # docker run

功能

创建一个新的容器并运行一个命令

语法

# docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

参数

-d : 后台运行容器,返回容器id
-t : 让docker分配一个伪终端,绑定到容器标准输入上,通常与 -i 同时使用。
-it : -i:交互式操作,-t:终端,进入bash执行命令查看返回结果,需要交互式终端。
-i : 以交互模式运行容器,让容器的标准输入保持打开,通常与 -t 同时使用。
–rm : 容器退出后删除容器(避免浪费空间),可选,docker rm conName 删除容器。
–name : 命名
-p : 暴露给外部的端口,主机(宿主)端口:容器端口
bash : 镜像后的命令,shell交互模式。

实例

# docker run --rm -d -p 80:80 --name webserver nginx
# docker exec -it webserver bash 
  • 进入容器# docker attach

功能

连接到正在运行中的容器,进行命令操作。

语法

docker attach [OPTIONS] CONTAINER

参数

–sig-proxy=false :CTRL-C不会关闭容器

实例

# docker attach --sig-proxy=false b11
  • 进入容器# docker exec

功能

连接到正在运行中的容器,进行命令操作。

语法

docker exec -it [ID Or NANME] bash

参数

-i :以交互模式运行容器,让容器的标准输入保持打开,通常与 -t 同时使用。
-t :让docker分配一个伪终端,绑定到容器标准输入上,通常与 -i 同时使用。
-it :-i:交互式操作,-t:终端,进入bash执行命令查看返回结果,需要交互式终端。

实例

# docker run --rm -d -p 80:80 --name webserver nginx
# docker exec -it webserver bash 
  • 终止容器 # docker stop

语法

# docker stop [ID Or NANME]

  • 重启容器 # docker restart

语法

# docker restart [ID Or NANME]

  • 启动已终止容器 # docker start

语法

# docker start [ID Or NANME]

  • 删除容器 # docker rm

语法

1.删除单个停止的容器

# docker container rm [ID Or NANME]
# docker rm [ID Or NANME]

2.删除所有容器

# 停止并删除所有容器
# docker rm -f $(docker ps -aq)
# docker stop $(docker ps -q) & docker rm $(docker ps -aq)
# 删除所有运行的容器
# docker rm -f $(docker ps -q)
# 删除所有停止的容器
# docker container prune
  • 列出容器 # docker ps

功能

列出容器

语法

# docker ps [OPTIONS]

参数

-a :显示所有的容器,包括未运行的。
-l :显示最近创建的容器。
-f :根据条件过滤显示的内容。
-n :列出最近创建的n个容器。
-q :静默模式,只显示容器编号。

实例

# docker ps -a
  • 查看容器信息 # docker inspect

功能

获取容器和镜像的信息

语法

docker inspect [OPTIONS] NAME|ID [NAME|ID…]

参数

-f :指定返回值的模板文件。
-s :显示总的文件大小。
–type :为指定类型返回JSON。

实例

# docker inspect nginx
  • 查看容器进程信息 # docker top

功能

查看容器中运行的进程信息,支持 ps 命令参数

语法

docker top [OPTIONS] CONTAINER [ps OPTIONS]

  • 容器的日志 # docker logs

功能

获取容器的日志

语法

docker logs [OPTIONS] CONTAINER

参数

-f : 跟踪日志输出
–since :显示某个开始时间的所有日志
-t : 显示时间戳
–tail :仅列出最新N条容器日志

  • 容器端口映射 # docker port

功能

列出指定的容器的端口映射

语法

docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]

ABOUT

公众号:【星尘Pro】
github:https://github.com/huangliangyun

推荐阅读
史上最全,最完美的 JAVA 技术体系思维导图总结,没有之一!
全站导航 | 文章汇总!

<think>好的,用户现在遇到了问题,运行`groups | grep docker`没有输出,我之前已经给过解决方案。现在用户按照我的建议执行了`getent group docker | grep $USER`,结果输出了`docker:x:1000:root,rizha`,这说明用户rizha确实已经在docker组里了。但用户可能还是无法使用docker命令,或者执行后续步骤时遇到问题,所以需要进一步指导。 首先,用户当前的会话可能没有加载新的组权限。在Linux系统中,当用户被添加到新组后,需要重新登录或者重启会话才能生效。用户可能已经执行了添加用户到组的命令,但没有重新登录,导致组权限没有更新。 接下来,我应该建议用户刷新会话权限。常用的方法是退出当前终端并重新登录,或者使用`newgrp docker`命令。不过我之前提到过要避免直接使用`newgrp`,因为它可能会切换主组,导致其他权限问题。所以更安全的方法是用`exec su - $USER`来重新加载用户环境,或者直接退出终端重新登录。 此外,用户可能需要检查Docker服务是否正在运行。如果Docker服务没有启动,即使权限正确,用户也无法执行docker命令。因此,建议用户检查Docker服务的状态,并确保其处于活动状态。 用户可能还遇到SELinux或AppArmor的问题,特别是如果系统启用了这些安全模块。需要指导用户检查SELinux的状态,并暂时禁用进行测试,以排除是否是安全策略导致的问题。 最后,验证步骤很重要,用户需要运行一个简单的docker命令,比如`docker run hello-world`,来确认权限是否正确应用。如果仍然失败,可能需要查看具体的错误信息,进一步诊断问题所在。 总结下来,用户的当前状态是已经正确添加到docker组,但权限未刷新或服务未启动。需要引导用户刷新会话,检查服务状态,并验证操作。同时,考虑其他可能的因素如安全模块的影响,确保所有步骤都被正确执行。</think>--- ### **问题分析与解决方案** 根据 `getent group docker | grep $USER` 的输出 `docker:x:1000:root,rizha`,说明用户 `rizha` **已成功加入 Docker 组**,但当前会话未加载新组权限。以下是具体操作步骤: --- ### **第一步:强制刷新用户组权限** #### **关键命令** ```bash # 重新加载用户组配置(直接生效,无需重启系统) exec su - $USER ``` - **原理**:通过 `exec su - $USER` 完全重新加载用户环境,包括所有用户组权限。 - **注意**:不要使用 `newgrp docker`(仅临时切换主组,可能导致权限混乱)。 --- ### **第二步:验证组权限是否生效** ```bash # 检查当前会话的组信息(应有 "docker") groups | grep docker # 或使用 id 命令验证 id -nG | grep docker ``` - **预期输出**:`rizha docker` 或类似包含 `docker` 的字段。 --- ### **第三步:检查 Docker 服务状态** #### **如果权限已生效但仍有问题** ```bash # 检查 Docker 服务是否运行 sudo systemctl status docker # 若服务未启动,启动并设置开机自启 sudo systemctl enable --now docker ``` - **关键输出**:确保显示 `Active: active (running)`。 --- ### **第四步:测试 Docker 权限** ```bash # 运行测试容器(应直接执行,无需 sudo) docker run --rm hello-world ``` - **成功标志**:输出 `Hello from Docker!` 及相关说明。 - **失败表现**:若提示 `permission denied`,需进一步排查。 --- ### **若仍失败:深度排查方向** #### **1. 检查用户组加载延迟** - **现象**:已加入组但权限未同步 - **解决方案**:彻底注销并重新登录(包括图形界面会话)。 #### **2. SELinux/AppArmor 干扰** ```bash # 临时禁用 SELinux 测试 sudo setenforce 0 # 临时禁用 AppArmor sudo systemctl stop apparmor ``` - **注意**:测试后需恢复安全策略: ```bash sudo setenforce 1 sudo systemctl start apparmor ``` #### **3. Docker 套接字权限问题** ```bash # 检查 Docker 套接字权限 ls -l /var/run/docker.sock ``` - **正常权限**:`srw-rw---- 1 root docker ... /var/run/docker.sock` - **修复命令**: ```bash sudo chown root:docker /var/run/docker.sock sudo chmod 660 /var/run/docker.sock ``` --- ### **操作流程图** ```mermaid graph TD A[已加入 Docker 组] --> B{刷新权限} B -->|exec su - $USER| C[验证 groups] C -->|成功| D[测试 Docker] C -->|失败| E[检查服务状态] E --> F[重启 Docker] F --> G[检查安全策略] G --> H[验证套接字权限] ``` --- ### **常见错误对照表** | 现象 | 诊断方法 | 解决方案 | |------|----------|----------| | `permission denied` | `ls -l /var/run/docker.sock` | 修复套接字权限 | | 容器无法启动 | `journalctl -u docker --since "5 minutes ago"` | 检查服务日志 | | 组加载延迟 | `sudo reboot` | 完全重启系统 | --- ### **关键注意事项** 1. **不要跳过权限刷新**:Linux 用户组权限仅在登录时加载,修改组后必须重新加载会话。 2. **避免混用 sudo**:`docker` 命令前加 `sudo` 会绕过组权限验证,掩盖真实问题。 3. **图形界面用户需注意**:GNOME/KDE 等桌面环境可能需要完全注销再登录(非仅重启终端)。 --- 执行完上述步骤后,如果问题仍未解决,请提供以下信息以便进一步分析: ```bash # 收集关键信息 groups $USER ls -l /var/run/docker.sock sudo systemctl status docker ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星尘Pro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值