一.Docker容器命令
# 创建一个容器但不启动
docker create --name mynginx nginx
# 创建并启动一个容器(最常用)
docker run -d --name mynginx nginx
# 启动已存在的容器
docker start mynginx
# 停止正在运行的容器
docker stop mynginx
# 重启容器
docker restart mynginx
# 暂停容器的所有进程
docker pause mynginx
# 恢复被暂停的容器
docker unpause mynginx
# 删除一个或多个容器(必须先停止)
docker rm mynginx
# 强制删除正在运行的容器
docker rm -f mynginx
# 查看正在运行的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 查看容器日志(主进程输出信息)
docker logs mynginx
# 在运行中的容器内执行命令(如进入 shell)
docker exec -it mynginx bash
# 查看容器中运行的进程
docker exec mynginx ps aux
# 实时查看容器日志
docker logs -f mynginx
# 查看容器内部运行的进程
docker top mynginx
# 获取容器详细信息(JSON 格式)
docker inspect mynginx
# 获取容器资源使用情况(CPU、内存等)
docker stats mynginx
二.Docker 容器本质
Docker 容器本质上是一个隔离的进程环境,其生命周期依赖于它的主进程(PID 1)。
常用启动参数
含义:
-i
(interactive)保持标准输入打开;-t
(tty)分配一个伪终端。用途:用于交互式操作,如调试或测试容器内的命令行工具。
示例:
docker run -it --name t1 centos:7 bash
这个命令会启动一个 CentOS 容器,并进入一个交互式的 shell 环境。
含义:在
-it
的基础上加上-d
(detached),即后台运行模式。用途:适用于需要后台运行但偶尔需要手动干预的场景。
示例:
docker run -itd --name t1 centos:7 bash
这个命令会在后台启动一个 CentOS 容器,但不会立即进入容器的 shell 环境。
覆盖默认命令
每个 Docker 镜像都有其预设的入口点(ENTRYPOINT)和默认命令(CMD)。
当使用 docker run
启动容器时,可以通过指定新的命令来覆盖这些默认值。
示例
正常方式运行 Nginx
docker run -it --name web nginx
docker run -itd --name web nginx
覆盖默认命令为 tail -f /dev/null
docker run -d --name web nginx tail -f /dev/null
如何判断容器内是否运行了 Nginx?
使用以下命令检查容器中是否有 Nginx 进程:
docker exec -it web ps aux
三.Docker 端口映射
端口映射是 Docker 容器网络配置中的一个核心概念,它允许将宿主机的端口与容器内部的服务端口进行关联。
通过这种方式,外部网络可以通过访问宿主机的某个端口来间接访问运行在容器内的服务。
基本概念
端口映射:指的是将宿主机上的一个或多个端口转发到容器内的指定端口。
这种机制使得外部网络可以访问容器内部的服务,即使这些服务只监听了容器内部的特定端口。
使用场景
当需要让容器内的服务对外提供服务时,比如运行一个 Web 应用。
需要对不同的服务分配不同的宿主机端口以避免冲突。
命令语法
在使用 docker run 启动容器时,可以通过 -p 或 --publish 参数来进行端口映射。
docker run -d -p <宿主机端口>:<容器端口> [OPTIONS] IMAGE [COMMAND] [ARG...]
<宿主机端口>:宿主机上开放的端口。
<容器端口>:容器内服务监听的端口。
示例
基本端口映射
有一个 Nginx 容器,默认情况下 Nginx 监听的是 80 端口。可以这样启动容器并将其映射到宿主机的 8080 端口:
docker run -d --name mynginx -p 8080:80 nginx
现在,可以通过访问宿主机的 IP 地址和 8080 端口来访问 Nginx 服务:
http://<宿主机IP>:8080/
随机分配宿主机端口
如果不关心宿主机的具体端口号,可以让 Docker 自动为选择一个未被占用的端口:
docker run -d --name mynginx -p 80 nginx
在这种情况下,Docker 会随机分配一个宿主机端口,并将其映射到容器的 80 端口。可以通过以下命令查看具体的映射关系:
docker port mynginx
输出示例:
80/tcp -> 0.0.0.0:32768
这表示宿主机的 32768 端口已经被映射到了容器的 80 端口。
映射 UDP 端口
默认情况下,-p
参数映射的是 TCP 端口。如果想映射 UDP 端口,可以在端口号后面加上 /udp
:
docker run -d --name myapp -p 53:53/udp myimage
多个端口映射
如果需要映射多个端口,可以多次使用 -p
参数:
docker run -d --name myapp -p 80:80 -p 443:443 -p 8080:8080 myimage
查看端口映射情况
使用 docker ps
输出示例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4b2c9a5d3e2 nginx "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp mynginx
使用 docker port
docker port mynginx
输出示例:
80/tcp -> 0.0.0.0:8080
高级端口映射
指定绑定地址
如果想限制哪个网络接口可以访问该端口,可以指定绑定地址:
docker run -d --name mynginx -p 127.0.0.1:8080:80 nginx
这将只允许来自 localhost 的请求访问该端口。
映射到特定的 IP 地址
如果想将端口映射到宿主机的特定 IP 地址而不是所有接口,可以这样做:
docker run -d --name mynginx -p 192.168.1.100:8080:80 nginx
这将使宿主机的 192.168.1.100:8080 端口映射到容器的 80 端口。