docker ps
命令显示的Net I/O
含义在docker ps
命令的输出中,Net I/O
表示容器的网络输入/输出。
例如:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES NET I/O 123456789 apache "httpd -DFOREGROUND" 5 minutes ago Up 5 minutes 80/tcp myapache 100kB/50kB
这里表示该容器从启动到现在,网络输入为 100 千字节,网络输出为 50 千字节。
AMD64 是一种 64 位的计算机处理器架构。它最初由 AMD 公司开发,现在也被广泛应用于英特尔等其他处理器厂商的产品中。
AMD64 架构具有以下特点:
除了 AMD64,还有其他一些常见的处理器架构:
不同的处理器架构适用于不同的应用场景,选择合适的架构取决于具体的需求和使用环境。
可以使用以下命令查看容器内运行的进程:
docker top <容器名称或 ID>
:该命令会列出容器内正在运行的进程信息,包括进程 ID、用户、命令等。例如:
docker top mycontainer UID PID PPID C STIME TTY TIME CMD root 1234 5678 0 Sep23 09:59 ? 00:00:00 /bin/bash
docker ps
命令:
docker ps
的输出中,有一列是 IMAGE
,它显示了容器所使用的镜像名称。CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 123456789 nginx "nginx -g 'daemon off'" 5 minutes ago Up 5 minutes 80/tcp mynginx
docker inspect
命令:
docker inspect <容器名称或 ID>
可以获取容器的详细信息,其中包括镜像的详细信息。[ { "Id": "123456789", "Image": "nginx:latest", "ImageID": "sha256:abcdefghijklmnopqrstuvwxyz", ... } ]
主要通过 docker inspect
命令来查看容器的元数据信息:
docker inspect <容器名称或 ID>
:该命令会返回一个 JSON 格式的详细信息,包括容器的创建时间、网络配置、存储配置、环境变量等各种元数据。例如:
[ { "Id": "123456789", "Created": "2024-09-23T09:30:00Z", "Path": "nginx", "Args": [ "-g", "daemon off" ], "State": { "Status": "running", "Running": true, "Paused": false, ... }, "NetworkSettings": { "Networks": { "bridge": { "IPAddress": "172.17.0.2", ... } } }, "Mounts": [], ... } ]
在 Docker 中,端口映射是将容器内运行的服务所使用的端口与宿主机的端口进行关联,使得外部可以通过访问宿主机的端口来访问容器内的服务。
-p
或 --publish
参数docker run -p <宿主机端口>:<容器端口> <镜像名称>
。
docker run -p 8080:80 nginx
,将宿主机的 8080 端口映射到容器内的 80 端口。<宿主机端口>
:外部可以通过访问宿主机的这个端口来访问容器内的服务。<容器端口>
:容器内服务实际使用的端口。docker-compose.yml
文件中,使用 ports
关键字进行端口映射配置。
yamlversion: '3'
services:
web:
image: nginx
ports:
- "8080:80"
-p
参数类似,将指定服务的容器内端口映射到宿主机的相应端口。-p
参数时可以指定 IP 地址,例如:docker run -p 192.168.1.100:8080:80 nginx
。docker run -p 8080:80/tcp nginx
。docker run -p 8080-8085:80 nginx
。-p
或 --publish
参数进行指定端口映射。
docker run -p <宿主机端口>:<容器端口> <镜像名称>
。docker run -p 8080:80 nginx
,将宿主机的 8080 端口映射到容器内的 80 端口。docker-compose.yml
文件中,使用 ports
关键字进行指定端口映射配置。yamlversion: '3'
services:
web:
image: nginx
ports:
- "8080:80"
web
服务的容器内的 80 端口。-P
参数进行随机端口映射。
docker run -P <镜像名称>
。docker run -P nginx
,Docker 会随机选择一个宿主机的端口,并将容器内暴露的端口映射到这个随机端口上。docker ps
命令或者其他方式查看实际映射的端口,以便外部能够正确访问容器内的服务。数据卷挂载是 Docker 中非常重要的功能,它可以实现容器与宿主机之间的数据共享和持久化存储。
将宿主机上的一个目录或文件挂载到容器中,使得容器可以访问宿主机上的文件系统,并且容器中的数据修改可以直接反映到宿主机上,反之亦然。
-v
或 --volume
参数进行数据卷挂载docker run -v <宿主机目录或文件>:<容器内目录或文件> <镜像名称>
。
docker run -v /host/data:/container/data nginx
,将宿主机上的 /host/data
目录挂载到容器内的 /container/data
目录。docker-compose.yml
文件中,使用 volumes
关键字进行数据卷挂载配置。
yamlversion: '3'
services:
web:
image: nginx
volumes:
- /host/data:/container/data
-v
参数类似,将宿主机上的目录或文件挂载到指定服务的容器中。在 Docker 中,可以通过环境变量向容器传递配置信息,使得容器在运行时能够根据不同的环境变量值进行相应的配置调整。
-e
或 --env
参数传递环境变量docker run -e <环境变量名>=<环境变量值> <镜像名称>
。
docker run -e APP_ENV=production nginx
,向容器传递了一个名为 APP_ENV
,值为 production
的环境变量。docker-compose.yml
文件中,使用 environment
关键字进行环境变量配置。
yamlversion: '3'
services:
web:
image: nginx
environment:
APP_ENV: production
DB_HOST: db.example.com
$ENV_VARIABLE_NAME
的方式获取环境变量值,在 Python 中可以使用 os.environ['ENV_VARIABLE_NAME']
的方式获取。在 Docker 中,可以设置容器在退出后自动重启,以确保容器的持续运行。
--restart
参数设置自动重启docker run --restart=<重启策略> <镜像名称>
。
docker run --restart=always nginx
,设置容器在退出后始终自动重启。no
:默认值,不自动重启容器。on-failure[:max-retries]
:仅在容器以非零退出码退出时自动重启。可以指定最大重试次数,例如 on-failure:5
表示在容器以非零退出码退出时最多自动重启 5 次。always
:无论容器以何种方式退出,都自动重启容器。docker-compose.yml
文件中,使用 restart
关键字进行自动重启配置。
yamlversion: '3'
services:
web:
image: nginx
restart: always
--restart
参数类似,设置指定服务的容器在退出后自动重启。容器的生命周期包括创建、运行、暂停、停止和删除等阶段。
docker run
命令或者 docker-compose up
命令创建容器。
docker ps
命令查看正在运行的容器。docker pause
命令可以暂停容器的运行。
docker unpause
命令恢复容器的运行。docker stop
命令可以停止容器的运行。
docker start
命令重新启动已停止的容器。docker rm
命令可以删除容器。
FROM ubuntu:latest
。FROM
指令应该放在最前面,然后是其他指令。#
进行注释,方便理解 Dockerfile 的内容。ENV
指令设置环境变量,这些变量可以在后续的指令中使用。例如:ENV MY_VAR value
。FROM
指令)FROM
指令指定的基础镜像,如果本地没有该镜像,Docker 会从镜像仓库中拉取。RUN
、COPY
、ADD
等指令,每执行一条指令都会创建一个新的镜像层。以下是一个简单的 Dockerfile 例子,用于构建一个包含 Nginx 的镜像:
dockerfile# 基础镜像为最新的 Ubuntu FROM ubuntu:latest # 安装 Nginx RUN apt-get update && apt-get install -y nginx # 将本地的 index.html 文件复制到镜像中的 Nginx 网页目录 COPY index.html /usr/share/nginx/html/ # 暴露 80 端口 EXPOSE 80 # 容器启动时运行 Nginx CMD ["nginx", "-g", "daemon off;"]
假设在与 Dockerfile 同一目录下有一个 index.html
文件,构建镜像的命令如下:
docker build -t mynginx:v1.
这个例子首先以 Ubuntu 镜像为基础,安装 Nginx,复制一个自定义的 index.html
文件到 Nginx 网页目录,暴露 80 端口,并指定容器启动时运行 Nginx。
FROM
FROM
是 Dockerfile 中最重要的指令之一,它用于指定构建镜像的基础镜像。
FROM <image>
或 FROM <image>:<tag>
ubuntu
、nginx
等,也可以是自己构建的镜像。dockerfileFROM ubuntu:latest
这个例子使用最新的 Ubuntu 官方镜像作为基础镜像。
dockerfileFROM nginx:1.21.6
这里指定使用 Nginx 版本为 1.21.6 的镜像作为基础镜像。
latest
标签,因为它可能会随着时间变化而指向不同的版本。MAINTAINER
MAINTAINER
指令在较旧版本的 Dockerfile 中用于指定镜像的维护者信息。
MAINTAINER <name>
dockerfileMAINTAINER John Doe <john.doe@example.com>
这个例子指定镜像的维护者为“John Doe”,联系邮箱为“john.doe@example.com”。
LABEL maintainer=<name>
来替代MAINTAINER
指令。这样可以更好地与其他元数据标签一起管理,并且更符合标签化的规范。RUN
和 CMD
RUN
指令RUN <command>
RUN
指令都会创建一个新的镜像层。这个例子在构建镜像时更新软件源并安装 Nginx。dockerfileRUN apt-get update && apt-get install -y nginx
创建一个名为dockerfileRUN mkdir /data
/data
的目录。&&
连接多个命令。CMD
指令CMD ["executable","param1","param2"]
(推荐形式,被执行的是可执行文件)CMD ["param1","param2"]
(设置了ENTRYPOINT
时,此形式为给ENTRYPOINT
传递参数)CMD command param1 param2
(在 shell 中执行命令,会被 shell 解释)CMD
指定的命令。容器启动时启动 Nginx 服务。dockerfileCMD ["nginx", "-g", "daemon off;"]
启动容器时运行dockerfileCMD ["/bin/bash", "/start.sh"]
start.sh
脚本。CMD
指令,如果有多个,只有最后一个会生效。CMD
和 RUN
指令的区别RUN
指令RUN
指令在构建镜像的过程中执行命令,用于安装软件包、配置环境等操作。每次执行RUN
指令都会创建一个新的镜像层。这个例子在构建镜像时更新软件源并安装 Nginx。dockerfileRUN apt-get update && apt-get install -y nginx
CMD
指令CMD
指令定义容器启动时默认执行的命令。如果在运行容器时指定了其他命令,将会覆盖CMD
指定的命令。容器启动时启动 Nginx 服务。dockerfileCMD ["nginx", "-g", "daemon off;"]
RUN
指令CMD
指令RUN
指令RUN <command>
,通常是一个 shell 命令或者一系列用&&
等连接的命令。CMD
指令CMD ["executable","param1","param2"]
(推荐形式,被执行的是可执行文件)。CMD ["param1","param2"]
(设置了ENTRYPOINT
时,此形式为给ENTRYPOINT
传递参数)。CMD command param1 param2
(在 shell 中执行命令,会被 shell 解释)。RUN
指令RUN
指令,每个RUN
指令都会创建一个新的镜像层。CMD
指令CMD
指令,如果有多个,只有最后一个会生效。EXPOSE
EXPOSE <port>
dockerfileEXPOSE 80
这个例子表示容器内的应用程序可能会在端口 80 上进行通信。
EXPOSE
只是一种声明,要使容器的端口能被外部访问,还需要在运行容器时使用 -p
或 -P
参数进行端口映射。例如:docker run -p 8080:80 <image_name>
将容器的 80 端口映射到主机的 8080 端口。COPY
和 ADD
COPY
COPY <src>... <dest>
这个例子将本地目录dockerfileCOPY app/ /app/
app
中的内容复制到镜像中的/app/
目录下。ADD
ADD <src>... <dest>
COPY
,但ADD
具有一些额外的功能:
.tar
, .tar.gz
等)。dockerfileADD config.txt /config/
dockerfileADD https://example.com/archive.tar.gz /app/
如果dockerfileADD archive.tar.gz /app/
archive.tar.gz
是一个归档文件,它将被自动解压到/app/
目录下。ADD
比COPY
功能更强大,但有时这种强大的功能可能会带来一些不确定性。如果只是简单地复制本地文件或目录,COPY
是更明确和可靠的选择。ADD
可以从 URL 下载文件,而COPY
不能。但在实际使用中,从 URL 下载文件可能会带来一些风险,比如下载的文件可能不可靠或者在构建过程中可能会因为网络问题导致构建失败。ADD
可以自动解压归档文件,而COPY
不能。同样,自动解压功能可能会在一些情况下带来意外的结果,比如不知道解压后的文件结构或者解压过程中出现错误。COPY
。只有在确实需要从 URL 下载文件或自动解压归档文件时,才考虑使用ADD
。VOLUME
和 WORKDIR
VOLUME
VOLUME ["/path/to/directory"]
这个例子创建了一个名为dockerfileVOLUME /data
/data
的卷,容器可以将数据存储在这个目录中。WORKDIR
WORKDIR /path
RUN
、COPY
等)如果没有指定绝对路径,将相对于这个工作目录执行。在这个例子中,dockerfileWORKDIR /app RUN pwd
RUN pwd
命令将输出/app
,因为工作目录被设置为/app
。VOLUME
主要用于数据持久化和共享,为容器提供一个可挂载的存储位置。WORKDIR
用于设置容器内的工作目录,决定后续指令的执行路径。VOLUME
影响数据存储和容器与外部的存储交互。WORKDIR
只在容器内部起作用,影响指令的执行路径和文件操作的相对路径。USER
和 ONBUILD
USER
USER <user>[:<group>]
或 USER <UID>[:<GID>]
这个例子指定容器内的进程以用户dockerfileUSER appuser
appuser
运行。ONBUILD
ONBUILD <instruction>
ONBUILD
指令在当前镜像被用作基础镜像构建新镜像时触发执行特定的指令。在这个例子中,当以这个镜像为基础镜像构建新镜像时,首先会将构建上下文(通常是当前目录)复制到新镜像的dockerfileONBUILD COPY. /app ONBUILD RUN npm install
/app
目录下,然后执行npm install
命令。USER
在容器启动时生效,决定容器内进程的运行用户。ONBUILD
在当前镜像被用作基础镜像构建新镜像时触发执行特定指令。USER
主要用于设置容器内进程的运行用户,以提高安全性或满足特定的权限需求。ONBUILD
用于在基础镜像中定义一些构建步骤,为基于该基础镜像构建新镜像提供一些预设的操作。LABEL
和 ARG
LABEL
LABEL <key>=<value>
dockerfileLABEL maintainer="John Doe" LABEL version="1.0" LABEL description="This is a sample image"
ARG
ARG <name>[=<default value>]
ARG
来定义软件的版本号,然后在构建时根据需要传递不同的版本值。在这个例子中,构建镜像时可以通过dockerfileARG version RUN echo "Building version $version"
--build-arg version=<value>
来传递一个版本号,然后在构建过程中使用这个版本号进行一些操作。LABEL
用于为镜像添加静态的元数据信息,这些信息在镜像构建完成后不会改变。ARG
用于定义在构建过程中可变的参数,允许根据不同的构建需求进行灵活配置。LABEL
在镜像构建过程中添加标签,并且这些标签在镜像的整个生命周期中都存在。ARG
在构建开始时定义参数,但这些参数只在构建过程中有效,一旦镜像构建完成,它们不会影响镜像的运行。LABEL
的值在 Dockerfile 中直接指定。ARG
的值可以在 Dockerfile 中指定一个默认值,但在构建时可以通过命令行参数进行覆盖。dfimage 是一个用于分析 Docker 镜像的工具。它可以提供关于镜像的详细信息,包括从镜像中提取近似的 Dockerfile。
通常可以通过以下方式安装 dfimage:
docker images
命令查看本地已有的镜像列表。myimage
,可以运行以下命令:
dfimage myimage
-v
或 --mount
参数来创建数据卷。docker run -v /host/path:/container/path image_name
。-v
参数指定主机路径和容器路径。docker run -v /host/path:/container/path image_name
。--tmpfs
参数指定容器路径。docker run --tmpfs /container/path image_name
。Docker 容器的数据管理是一个重要的话题,需要根据应用的需求选择合适的数据管理方式,并采取适当的安全措施和备份策略,以确保数据的持久性、可共享性和安全性。
在 Docker 中,数据卷可以被多个容器共享。这意味着一个数据卷可以同时被多个容器挂载,从而实现容器之间的数据共享。
docker volume create
命令创建一个数据卷:
docker volume create shared_volume
-v
或 --mount
参数将数据卷挂载到容器中:
docker run -v shared_volume:/container/path image_name
docker run -v shared_volume:/container1/path image_name1
docker run -v shared_volume:/container2/path image_name2
通过共享数据卷,Docker 容器可以方便地实现数据共享和持久性存储。在使用共享数据卷时,需要注意权限、数据一致性和备份等问题,以确保数据的安全和可靠性。
在使用 Docker 时,数据备份是非常重要的。它可以帮助我们在数据丢失或损坏的情况下快速恢复数据,确保业务的连续性。
docker volume ls
命令查看已有的数据卷。myvolume
的数据卷备份到主机上的 /backup
目录中:
docker run --rm -v myvolume:/volume -v /backup:/backup ubuntu tar cvf /backup/backup.tar /volume
myvolume
数据卷挂载到容器中的 /volume
目录,将主机上的 /backup
目录挂载到容器中的 /backup
目录,然后使用 tar
命令将 /volume
中的数据打包成 /backup/backup.tar
文件。docker volume create
命令创建。/backup/backup.tar
文件中的数据还原到名为 myvolume
的数据卷中:
docker run --rm -v myvolume:/volume -v /backup:/backup ubuntu tar xvf /backup/backup.tar -C /volume
myvolume
数据卷挂载到容器中的 /volume
目录,将主机上的 /backup
目录挂载到容器中的 /backup
目录,然后使用 tar
命令将 /backup/backup.tar
文件中的数据解压到 /volume
目录中。通过使用数据卷和容器,我们可以方便地进行 Docker 数据的备份和还原。在进行备份和还原操作时,需要注意权限和定期备份等问题,以确保数据的安全和可靠性。
在 NAT(bridge)模式下,Docker 为容器创建一个独立的网络栈,并通过网络地址转换(NAT)将容器的内部 IP 地址映射到主机的 IP 地址上。容器可以通过主机的 IP 地址和映射后的端口访问外部网络,外部网络也可以通过主机的 IP 地址和映射后的端口访问容器。
docker0
)。docker0
。172.17.0.0/16
)。docker0
转发到主机的网络接口上,然后通过主机的网络连接进行传输。在这个过程中,Docker 会进行网络地址转换,将容器的内部 IP 地址和端口映射到主机的 IP 地址和一个可用的端口上。在 None 模式下,Docker 不为容器创建任何网络栈。容器只有一个独立的进程空间,没有网络接口,也不能与外部网络或其他容器进行通信。
在 Host 模式下,容器将直接使用主机的网络栈,不会为容器创建独立的网络命名空间。容器将与主机共享网络接口,拥有与主机相同的 IP 地址和网络资源。
在联合网络(container)模式下,新创建的容器会复用另一个已经存在的容器的网络命名空间,从而实现两个或多个容器共享网络栈。
Swap 分区是一种在内存不足时,将部分内存中的数据交换到磁盘上的特殊分区,以提供额外的虚拟内存空间。
一、禁止 swap 分区的目的
在 Kubernetes(k8s)环境中禁止 swap 分区主要有以下几个原因:
二、禁止 swap 分区的方法
在上述文档中提到了临时和永久禁止 swap 分区的方法:
swapoff -a
:这个命令会立即关闭所有已激活的 swap 分区。但是当系统重新启动后,swap 分区可能会再次被激活。sed -ri 's/.*swap.*/#&/' /etc/fstab
:这个命令通过修改系统的 /etc/fstab
文件,将其中关于 swap 分区的配置行注释掉,从而在系统重启后也不会激活 swap 分区,实现了永久禁止 swap 分区的目的。SELinux(Security-Enhanced Linux)是一个 Linux 内核的安全模块,它提供了强制访问控制机制,增强了系统的安全性。然而,在 Kubernetes 环境中通常会关闭 SELinux,原因如下:
一、复杂性增加
二、兼容性问题
三、灵活性和可管理性
综上所述,为了简化 Kubernetes 集群的部署和管理,提高兼容性和灵活性,通常会选择关闭 SELinux。但在生产环境中,需要综合考虑安全需求和实际情况,权衡是否关闭 SELinux。如果决定开启 SELinux,需要进行更详细的配置和测试,以确保 Kubernetes 集群的正常运行。
本文作者:han
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!