最近,在一台新服务器上准备运行一个前端vue项目,服务器上安装了docker,想要尝试试通过docker安装nginx的并运行项目,以下是操作步骤
从docker仓库里拉取最新的镜像
docker pull nginx
需要先在宿主机创建Nginx外部挂载的配置文件( /usr/local/docker/nginx.conf)
(Nginx本身容器只存在/etc/nginx 目录 , 本身就不创建 nginx.conf 文件,当服务器和容器都不存在 nginx.conf 文件时, 执行启动命令的时候 docker会将nginx.conf 作为目录创建 , 这并不是我们想要的结果 。)
# 创建挂载目录
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
使用如下命令启动容器
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 80:80 | 将容器的 80(后面那个) 端口映射到主机的 80(前面那个) 端口 |
–name nginx | 容器的名字 |
–restart=always | 在Docker重启时,自动重启容器 |
-v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf | 挂载nginx.conf配置文件 |
-v /usr/local/docker/nginx/conf/conf.d:/etc/nginx/conf.d | 挂载nginx配置文件 |
-v /usr/local/docker/nginx/log:/var/log/nginx | 挂载nginx日志文件 |
-v /usr/local/docker/nginx/html:/usr/share/nginx/html | 挂载nginx内容 |
-d nginx:latest | 本地运行的版本 |
启动完之后,在浏览器输入ip进行访问,如下页面则意味着启动成功
在上述操作步骤中,我只将80端口与宿主机进行了映射,也就意味着只能使用80端口访问nginx,如果要使用nginx启动多个前端项目的时候,则需要将容器里的多个端口映射到宿主机。有两种方式可以实现。
docker run \
-p 80:80 \
-p 8080:8080 \
-p 8081:8081 \
-p 8082:8082 \
--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
此方式需要一开始就指定好要映射的端口,后面如有增减需要重新运行容器,重新指定,不够灵活
# 获取容器/镜像的元数据
docker inspect nginx
输出
[
{
"Id": "135254e3429d1e75aa68569137c753b789416256f2ced52b4c5a85ec3849db87", # hash_of_the_container
"Created": "2020-08-21T09:41:36.597993005Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
"State": {
...
docker stop nginx
cd /var/lib/docker/containers/135254e3429d1e75aa68569137c753b789416256f2ced52b4c5a85ec3849db87 # container id
vim hostconfig.json
找到端口绑定,添加端口
... # 略
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8080/tcp": [
{
"HostIp": "",
"HostPort": "8080"
}
],
"8189/tcp": [
{
"HostIp": "",
"HostPort": "8189"
}
]
},
... # 略
修改config.v2.json
同路径下打开config.v2.json,修改:ExposedPorts
"ExposedPorts": {
"80/tcp": {},
"8080/tcp": {},
"8189/tcp": {}
},
... # 略
很多文章中提到还要修改Ports,实际上是不需要的,只有在你没有stop容器时,Ports才会有值,如果关闭了容器,就是null。当然如果你修改了也无所谓,因为重启容器后,就会被刷新。
# 重启docker服务
sudo systemctl restart docker.service
# 启动容器
docker start nginx
至此,端口添加成功,可以配置端口进行访问啦!!!