本地 Mac 环境,安装了 Docker Desktop 版本。

一开始想的是除了 80 端口以外,还要有 8080 端口。按照 【Docker】docker安装nginx及端口映射相关配置 教程里,这里将主要步骤摘录一下:

docker 安装 nginx

1. docker 拉取 nginx 镜像

docker pull nginx

默认的版本就是 nginx:latest

2. 创建映射目录

主要是 nginx 的配置文件和 www 根目录。

原文里是 linux 环境,Mac 下也是有这个 /usr/local 目录的,也可以改成自己想要的。

# 创建挂载目录
mkdir -p /usr/local/docker/nginx/conf
mkdir -p /usr/local/docker/nginx/log
mkdir -p /usr/local/docker/nginx/html

运行 nginx 容器,复制容器内的配置文件导本地

# 生成容器
docker run --name nginx -p 80:80 -d nginx
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /usr/local/docker/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /usr/local/docker/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /usr/local/docker/nginx/

复制完容器里对应的文件后,将容器删除重新生成

# 关闭该容器
docker stop nginx
# 删除该容器
docker rm nginx

# 或使用此命令,删除正在运行的nginx容器
docker rm -f nginx

3. 启动容器

docker run \
-p 80:80 \
--name nginx \
--restart=always \
-v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /usr/local/docker/nginx/log:/var/log/nginx \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html \
-d nginx:latest

容器端口映射

这里可以直接在启动容器的指令里增加 -p 8080:8080 \ 这样的端口映射。

原文还提到了另外一种能够直接修改容器配置文件达到修改端口映射的方法。但这种方法在 3 进入到容器目录这一步有些问题。Mac 下首先是找不到 /var/lib/docker/containers/containner_id 这样的文件路径。在网上搜索 Mac 中 Docker 容器配置文件的位置,找到 如何在mac上找到Docker镜像和容器的存放位置

方法一

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

目录到 /Data/vms/0 是存在的,但没有 tty 文件,执行报错找不到。

方法二

通过 docker 镜像访问 docker 虚拟机。看到这也是一脸懵逼,通过安装一个 debian 镜像来访问 docker 虚拟机,没见识过。

docker run -it --name docker-vm --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh

注意:修改配置文件前需要先关闭 nginx 容器,通过 docker ps -a 可以找到容器ID,cd 时通过 tab 可以完成全部目录名。

指令运行后会因为查找不到 debian 自动安装这个镜像,之后直接进入了。

/var/lib/docker/containers/containner_id 这样的 docker 目录在容器中确实找到了,包括对应的两个配置文件 hostconfig.jsonconfig.v2.json

编辑文件发现,当前的 debian 环境不支持 vim,但 vi 是可以的。进入后配置文件内是一行 JSON 字符串,然后 /PortBindings/ExposedPorts 查找对应的配置项,n 向下查找,enter 向上查找。

注意::/str 是 vim 查找指令,在 vi 下是 /str

"PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"80"}]}
添加 8080 端口
"PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"80"}],"8080/tcp":[{"HostIp":"","HostPort":"8080"}]}

"ExposedPorts":{"80/tcp":{}}
添加 8080 端口
"ExposedPorts":{"80/tcp":{},"8080/tcp":{}}

注意:添加多项时分隔符为英文逗号。

保存、退出、重启容器(linux)

# 重启docker服务
sudo systemctl restart docker.service 
# 启动容器
docker start nginx 

Mac 下直接选择应用菜单里的 restart 重启 docker 服务,等一会儿会自动重启完毕。