docker核心操作
- 1、docker安装
- 2、docker镜像
- 3、运行docker镜像
- 4、docker容器的生命周期
- 5.1、进入容器内部
- 5.2、怎么解决Error: exec failed: container_linux.go:380: starting container process caused: exec: "/bin/bash": stat /bin/bash: no such file or directory: OCI runtime attempted to invoke a command that was not found
- 5.3、查看正在运行的 Docker 容器使用的基础镜像
- 5.4、进入容器后怎么查看打包的软件在哪
- 6、容器排查
- 7.1、将文件打包成 Docker 镜像
- 7.2、将文件打包成 Docker 镜像例子
1、docker安装
在一些 Linux 发行版中,特别是新版本的发行版,由于一些原因,它们可能将 Docker 替换为 Podman 作为默认的容器运行时工具。这可能是因为安全性、兼容性或社区支持等方面的考虑。
Podman 是一个与 Docker 类似的容器工具,但有一些不同之处,例如它不需要一个守护进程来运行容器,它使用不同的体系结构和架构。因此,一些 Linux 发行版可能选择将 Podman 作为默认的容器工具,而不是 Docker。
如果你确实想使用 Docker 而不是 Podman,你需要手动安装 Docker 软件包,并在系统上配置 Docker 服务。要做到这一点,你可以按照 Docker 官方文档提供的步骤进行操作,这将确保你安装的是 Docker 而不是 Podman。
请注意,在不同的 Linux 发行版中,操作步骤可能会有所不同,所以确保按照相应发行版的文档进行操作。
yum install docker
- 查看运行中的容器,-a查看所有容器
docker ps
(1)可选参数:
- -a : 显示所有的容器,包括未运行的。
- -f : 根据条件过滤显示的内容。
- -s : 显示总的文件大小。
- –format : 指定返回值的模板文件。
- -l : 显示最近创建的容器。
- -n : 列出最近创建的n个容器。
- –no-trunc : 不截断输出。
- -q : 静默模式,只显示容器编号。
(2)输出参数解释:
- CONTAINER:容器
- ID:id编号
- IMAGE:镜像
- COMMAND:命令
- CREATED:创建了多久
- STATUS:状态
- PORTS:端口
- NAMES:名字
2、docker镜像
docker images
- REPOSITORY:库
- TAG:标签
- IMAGE:镜像
- ID:id标识
- CREATED:创建
- SIZE:大小
(1)拉取镜像:https://www.docker.com/
为啥推荐网页呢?
应为你用docker命令去查就会是下面这种情况:
docker search nginx
- 获取到镜像后再次查看:
- 此时就显示出已有的镜像了,我这里是装了两个nginx的镜像,一个最新版,一个稳定版。
那现在说说有了镜像后该怎么运行:
3、运行docker镜像
根据上面的镜像信息,这边演示下怎么运行已有的稳定版nginx镜像,按照以下步骤来运行 nginx
镜像:
(1) 运行容器:
-
使用
docker run
命令来运行基于nginx
镜像创建的容器。命令的基本格式为:docker run [选项] <镜像名称>:<标签>
-
在这里的情况下,镜像名称是
docker.io/library/nginx
,标签是
stable-alpine3.17-slim
。你可以根据需要为容器指定各种选项,例如端口映射、卷挂载等。 -
示例: 假设你想要将容器的端口 80 映射到主机的端口 8080,可以运行以下命令:
docker run -d -p 8080:80 --name nginx-container docker.io/library/nginx:stable-alpine3.17-slim
-
问题来了为啥敢映射别人的80端口呢??
-
原因是因为前面拉取镜像的Dockerfile里
EXPOSE
了应用的80端口,所以同理你要映射什么端口不是你说了算的,你得去放行你想要的映射端口。 -
注意定义不同端口映射的容器,他们是隔离开的,不是同一个容器
-
那么现在运行完后这会在后台运行一个名为
nginx-container
的容器,将容器内部的端口 80 映射到主机的端口 8080。
-
运行完后会生成一个完整的容器ID,所以说docker ps 显示的ID是其完整ID的前12个字符。
-
STATUS状态显示UP则表示启动成功。
-
访问 Nginx: 在运行容器后,你可以通过浏览器或命令行工具访问 Nginx 服务。在浏览器中访问
http://localhost:8080
或使用命令行工具如curl
:curl http://localhost:8080
-
停止和删除容器: 当你不再需要该容器时,使用
docker stop
命令停止容器,然后使用docker rm
命令删除容器。docker stop nginx-container docker rm nginx-container docker rm -f nginx-container
这样就可以使用刚刚拉取的 nginx
镜像在容器中运行 Nginx 服务了。记得根据你的需求进行适当的调整。
(2) 挂载硬盘:
docker run -d -p 8080:80 --name nginx-container -v /path/to/host/directory:/path/to/container/directory docker.io/library/nginx:stable-alpine3.17-slim
/path/to/host/directory
是你想要挂载的宿主机目录的路径。/path/to/container/directory
是你想要将宿主机目录挂载到容器中的路径。-v /path/to/host/directory:/path/to/container/directory
表示将宿主机目录与容器内的目录进行关联和挂载。- 通过执行补充的命令,Docker容器将会以后台模式运行,并且宿主机的目录将会挂载到容器指定的路径上。这样,容器内的应用程序可以访问挂载的目录,并且对该目录的更改也会反映在宿主机上。
- 替换 /path/to/host/directory 和 /path/to/container/directory为你自己希望使用的实际路径。
4、docker容器的生命周期
- docker start : 启动一个或多个已经被停止的容器。
docker ps -a
docker start gee1
- 这里先查看没启动的docker容器,再通过其名字启动它
-
docker stop : 停止一个运行中的容器。
-
docker restart : 重启容器。
-
kill杀掉一个运行中的容器。可选参数:
-s : 发送什么信号到容器,默认 KILL
# 根据容器名字杀掉容器
docker kill tomcat7
# 根据容器ID杀掉容器
docker kill 65d4a94f7a39
- create创建一个新的容器但不启动它。
# 使用docker镜像nginx:latest创建一个容器,并将容器命名为mynginx
docker create --name mynginx nginx:latest
5.1、进入容器内部
docker exec
命令用于在正在运行的 Docker 容器内部执行指定的命令。这在你需要进入容器并在其内部执行命令而不必完全登录到容器的情况下非常有用。以下是 docker exec
命令的基本用法:
docker exec [选项] <容器名称或ID> <要执行的命令>
其中,选项可以包括 -i
(标准输入)、-t
(终端)、--user
(指定执行命令的用户)、--workdir
(指定工作目录)等。容器名称或ID是你希望在其中执行命令的容器的标识符。
示例用法:
-
在容器中执行交互式命令: 如果你希望在容器内部执行交互式命令,可以使用
-it
选项。docker exec -it <容器名称或ID> /bin/bash
以上命令将进入容器内部的交互式 Bash shell。
-
在容器中执行单条命令: 你也可以直接在容器内部执行单条命令,而无需进入交互式模式。
docker exec <容器名称或ID> ls -l /app
以上命令将在容器内部执行
ls -l /app
命令,列出容器内/app
目录的内容。 -
指定用户和工作目录: 你可以使用
--user
和--workdir
选项来指定在容器内部执行命令的用户和工作目录。docker exec -it --user myuser --workdir /app <容器名称或ID> /bin/bash
以上命令将以
myuser
用户身份,并将工作目录切换到/app
,进入容器的交互式 Bash shell。
请根据你的实际需求选择合适的选项和命令来使用 docker exec
。如果你想要退出交互式模式,只需在容器内部按下 Ctrl + D
或输入 exit
命令。
5.2、怎么解决Error: exec failed: container_linux.go:380: starting container process caused: exec: “/bin/bash”: stat /bin/bash: no such file or directory: OCI runtime attempted to invoke a command that was not found
错误信息提示了容器无法找到 /bin/bash
命令。这通常是因为容器内没有安装 Bash Shell,或者容器基础镜像不包含 Bash。在某些基础镜像中,可能使用其他 Shell,例如 /bin/sh
。
如果你想要在容器内部执行交互式 Shell,可以尝试以下方法:
-
使用默认 Shell: 有些容器内部默认的 Shell 可能不是
/bin/bash
,而是其他路径。尝试使用容器内部默认的 Shell。docker exec -it <容器名称或ID> /bin/sh
-
查看可用 Shell: 使用以下命令查看容器内部有哪些可用的 Shell。
docker exec -it <容器名称或ID> ls /bin/
根据输出列表中的可用 Shell 进行选择。
-
使用不同的容器: 如果你确实需要使用 Bash,可能需要更换使用包含 Bash 的镜像。例如,使用 Ubuntu 或其他基于 Debian 的镜像,它们通常默认包含 Bash。
docker exec -it <容器名称或ID> /bin/bash
请根据容器内部所支持的 Shell 和镜像的特性进行适当的调整。
5.3、查看正在运行的 Docker 容器使用的基础镜像
要查看正在运行的 Docker 容器使用的基础镜像,你可以通过以下方法之一来确定:
-
使用
docker ps
命令: 运行以下命令来查看正在运行的容器以及它们使用的镜像信息。docker ps
这将列出当前正在运行的容器,包括容器名称、ID、使用的镜像、端口映射等信息。在 “IMAGE” 列中,你可以看到正在运行容器所使用的镜像名称。
-
使用
docker inspect
命令: 运行以下命令,将容器名称或 ID 替换为你要检查的容器的名称或 ID。docker inspect --format '{{.Config.Image}}' <容器名称或ID>
这将输出容器使用的镜像名称。如果你得到的是完整的镜像名称(例如
ubuntu:latest
),那么容器使用的是 Ubuntu 镜像。 -
进入容器内部查看: 如果你能进入容器的交互式终端,你可以查看容器内部的操作系统信息。
cat /etc/os-release
这会显示容器内部操作系统的详细信息,包括基础镜像的名称和版本。
通过这些方法,你可以确定正在运行的 Docker 容器使用的是哪个基础镜像。注意,容器可以使用不同的基础镜像,具体取决于容器的配置和构建。
5.4、进入容器后怎么查看打包的软件在哪
which nginx
容器没有vi、vim和touch命令咋办
echo 6666 > test1.txt
6、容器排查
docker inspect
命令用于获取 Docker 容器、镜像、卷等对象的详细信息。它提供了关于这些对象的元数据,包括配置、网络设置、挂载点等。以下是 docker inspect
命令的基本用法:
docker inspect [选项] <对象名称或ID>
其中,选项可以包括 -f
(格式化输出)、--format
(指定输出格式)等。对象名称或 ID 是你要获取信息的容器、镜像、卷等对象的标识符。
示例用法:
-
获取容器详细信息: 若要获取容器的详细信息,可以运行以下命令:
docker inspect <容器名称或ID>
这将输出包含容器所有信息的 JSON 格式数据。
-
格式化输出: 使用
-f
或--format
选项可以指定输出的格式。例如,以下命令会输出容器的 IP 地址:docker inspect -f '{{.NetworkSettings.IPAddress}}' <容器名称或ID>
在这里,{{.NetworkSettings.IPAddress}}
是一个模板,用于从容器的详细信息中提取 IP 地址字段。
-
获取镜像信息: 若要获取镜像的详细信息,可以运行以下命令:
docker inspect <镜像名称或ID>
这将输出包含镜像所有信息的 JSON 格式数据。
-
获取卷信息: 若要获取卷的详细信息,可以运行以下命令:
docker inspect <卷名称或ID>
这将输出包含卷所有信息的 JSON 格式数据。
通过适当的选项和模板,你可以自定义输出的格式和内容,以满足你的需求。注意,输出是以 JSON 格式呈现的,因此你可能需要使用适当的工具来解析和处理这些数据。
7.1、将文件打包成 Docker 镜像
要将文件打包成 Docker 镜像,你需要创建一个 Dockerfile 并在其中定义镜像的构建过程。下面是一个示例的步骤:
-
在
/root/imagespath
路径下创建一个名为Dockerfile
的文件,内容类似于下面的示例:# 使用基础镜像 FROM ubuntu:latest # 复制文件到容器 COPY Dockerfile /app/Dockerfile COPY test.txt /app/test.txt
这个示例的 Dockerfile 使用了基础的 Ubuntu 镜像,然后将
Dockerfile
和test.txt
文件复制到镜像的/app
目录下。 -
在终端中,进入到包含
Dockerfile
和test.txt
文件的目录:cd /root/imagespath
-
使用以下命令来构建 Docker 镜像,其中
my-image
是你给镜像起的名称,:latest
是标签,表示版本号。docker build -t my-image:latest .
注意,命令末尾的
.
表示使用当前目录作为构建上下文。Docker 会根据 Dockerfile 中的指令和当前目录中的文件构建镜像。 -
完成构建后,你可以使用以下命令运行新创建的镜像的容器:
docker run -it my-image:latest
这会在新的容器中运行你的镜像,并进入交互式终端。
请根据你的实际需求和文件内容进行相应的调整。这只是一个简单的示例,你可以根据自己的需求进行更复杂的构建过程。
7.2、将文件打包成 Docker 镜像例子
docker build
命令用于构建 Docker 镜像,它会根据 Dockerfile 中的指令和上下文构建一个新的镜像。下面是 docker build
命令的基本用法:
docker build [选项] <上下文路径>
其中,选项可以包括 -t
(为镜像指定标签)、-f
(指定 Dockerfile 文件路径)等。上下文路径是用于构建镜像的上下文环境,通常包含 Dockerfile 以及构建过程中所需的文件。
以下是一个简单的示例用法:
docker build -t my-image:latest /path/to/dockerfile-directory
在这个示例中:
-
-t my-image:latest
:这个选项用于为构建的镜像指定标签。my-image
是镜像的名称,:latest
是标签,表示镜像的版本。你可以根据需要自定义镜像名称和标签。 -
/path/to/dockerfile-directory
:这是包含 Dockerfile 的目录路径,也是构建的上下文路径。Docker 会将该目录下的所有文件复制到构建上下文中,供 Dockerfile 使用。
请注意,Dockerfile 是一个文本文件,包含一系列指令,用于指导 Docker 如何构建镜像。在使用 docker build
命令时,Docker 会根据 Dockerfile 中的指令逐步执行构建过程。你可以在 Dockerfile 中定义基础镜像、添加文件、运行命令等。
示例 Dockerfile 内容:
# 使用基础镜像
FROM ubuntu:latest
# 设置工作目录
WORKDIR /app
# 复制文件到容器
COPY . .
# 运行命令
RUN apt-get update && apt-get install -y python3
# 暴露端口
EXPOSE 80
# 定义启动命令
CMD ["python3", "app.py"]
通过这个 Dockerfile,你可以构建一个基于 Ubuntu 的镜像,复制当前目录中的文件到镜像中,安装 Python 等。使用 docker build
命令来构建这个镜像,然后运行它。
请根据你的具体需求和 Dockerfile 的内容进行构建镜像。