我们会遇到一个问题:当我们的docker容器启动一个端口为8080,提供Nginx服务。他的IP为127的本地IP,如何才能通过外部网络正常访问呢?

docker给出的解决方案是:使用-p参数,将Nginx容器的80端口映射到宿主机的8080,然后通过宿主机的8080端口对外提供服务。这就好比是在宿主机上启动了一个8080端口提供Nginx服务是一个意思。

我们来实验一下。

首先我们宿主机的IP为:192.168.209.130,默认8080为关闭状态

1,我们需要先登录阿里云的账号,下载一个官方提供的Nginx容器

docker login --username=一梦浮生1987 registry.cn-hangzhou.aliyuncs.com

[root@localhost data01]# docker login --username=一梦浮生1987 registry.cn-hangzhou.aliyuncs.com
Password:
Login Succeeded
[root@localhost data01]# docker pull nginx
Using default tag: latest
Trying to pull repository docker.io/library/nginx ...
latest: Pulling from docker.io/library/nginx
69692152171a: Pull complete
30afc0b18f67: Pull complete
596b1d696923: Pull complete
febe5bd23e98: Pull complete
8283eee92e2f: Pull complete
351ad75a6cfa: Pull complete
Digest: sha256:6d75c99af15565a301e48297fa2d121e15d80ad526f8369c526324f0f7ccb750
Status: Downloaded newer image for docker.io/nginx:latest
给下载的镜像改个名字方便使用

[root@localhost data01]# docker tag docker.io/nginx:latest nginx:v1
[root@localhost data01]# docker images
REPOSITORY                                           TAG                 IMAGE ID            CREATED             SIZE
c
nginx                                                v1                  d1a364dc548d        2 days ago          133 MB

2,使用这个Nginx镜像,创建一个Nginx容器。

docker run -itd --name Nginx1 -v /data01:/data01 nginx:v1 /bin/bash

[root@localhost data01]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b087a6082a72        nginx:v1            "/docker-entrypoin..."   11 seconds ago      Up 10 seconds       80/tcp              Nginx1
进入容器看下

docker exec -it Nginx1 /bin/bash

接下来我们找到Nginx的安装目录

root@b087a6082a72:~# find / -name nginx
/etc/default/nginx
/etc/init.d/nginx
/etc/logrotate.d/nginx
/etc/nginx  #主文件目录
/usr/lib/nginx  #
/usr/sbin/nginx #启动命令
/usr/share/doc/nginx
/usr/share/nginx
/var/cache/nginx
/var/log/nginx  #日志目录

然后我们会发现ps、netstat、vi等等命令都不能用。

找到nginx.conf,发现他调用了

include /etc/nginx/conf.d/*.conf;

cat /etc/nginx/conf.d/default.conf

发现他指定了端口为80,可我们也不能改端口啊,怎么查看Nginx启动状态呢?试了试,还好有个curl工具

root@b087a6082a72:~# curl 127.0.0.1:80
curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
发现无法连接,说明Nginx没有启动,让我们直接启动nginx

root@b087a6082a72:~# nginx

再看:

这次有了。

但问题也出来了,我们只能在docker容器里面看nginx进程,怎么对外部提供服务呢?

docker提供了-p参数,我们使用这个参数新建一个容器为nginx2,将宿主机的8080和容器的80端口映射,看是否能在本地打开

[root@localhost ~]# docker run -itd  -p 8080:80 --name Nginx2 -v /data01:/data01 nginx:v1 /bin/bash
c6c7ecb6b515f56db942d8ca8aeaa008e299b1dc54aa984322b06c968548c91d
[root@localhost ~]#
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
c6c7ecb6b515        nginx:v1            "/docker-entrypoin..."   4 seconds ago       Up 3 seconds        0.0.0.0:8080->80/tcp   Nginx2

查看宿主机,发现宿主机的8080端口开放了

[root@localhost ~]# netstat -ano | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      off (0.00/0/0)
我们试试用192.168.209.130:8080访问

成了!实验证明,端口映射起作用了。

实验虽然成功了,但是nginx容器使用起来却不是那么完美,首先我们无法在容器内更改nginx的配置文件,也就无法对nginx进行配置,不过没关系,我们在启动容器的时候,指定了一个共享目录为/data01,我们可以将nginx的配置文件写好后,放在/data01里面,直接替换这个nginx.conf即可。

同样,也可以使用nginx -C 配置文件的绝对路径来自己定义nginx启动所需要的文件。

当然,我们也可以把以上文件编排好之后,使用dockerfile来重新启动一个容器提供服务。

需要注意:

docker端口映射有-P和-p之分

  • -P :是容器内部端口随机映射到主机的高端口。
  • -p : 是容器内部端口绑定到指定的主机端口。

如果使用-P随机映射的话,启动容器后,使用

docker ps -a即可查看映射关系。docker port 也可以查看。

[root@localhost ~]# docker port Nginx2
80/tcp -> 0.0.0.0:8080

docker容器端口映射相关推荐

  1. linux修改容器内的mysql端口映射_修改docker容器端口映射的方法

    大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改.通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射. 有没有办法不保存镜像而直接修改 ...

  2. docker 添加端口映射_Docker容器修改端口映射

    对于已经建立的docker容器,需要新增容器对主机的端口映射,主要分为三种: 一:通过修改配置文件修改docker容器端口映射 1.使用docker ps -a命令找到要修改容器的CONTAINER ...

  3. Docker 网络-端口映射、容器链接、Networking

    在使用Docker容器时,我们需要访问容器的内部网络,或需要在容器间相互访问.Docker 容器默认不会开放任何端口,因此需要将容器与宿主机进行端口映射,使容器可外部访问.而容器间互相访问,除了可以基 ...

  4. docker如何查看宿主机到容器端口映射

    docker/Docker如何查看宿主机到容器端口映射关系 背景 前些天的时候, 在定位问题时发现docker emqx 连接websocket (8083)端口出现异常. 经过很长时间定位, 才发现 ...

  5. docker镜像、容器 常用命令,容器端口映射

    文章目录 前言 一.docker基础命令 二.docker镜像命令 1.docker images:列出本地主机的镜像 2. docker search :查看镜像 3.docker pull:拉取镜 ...

  6. Centos7.6部署docker容器虚拟化平台(Container 容器端口映射)

    Docker的概述: 实验环境: Centos 7.6版本 Dcoker 概述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器 中,然后发布到任何流行的 ...

  7. 在Linux中进行docker网络端口映射

    在Linux中有两种安装docker的方法,一种是使用官方安装脚本自动安装docker,另一种是手动安装docker. 容器中可以运行一些应用,要让外部也可以访问这些应用,可以通过"-P或- ...

  8. docker的端口映射顺序

    docker的端口映射顺序 docker run -d -p 5433:5432 postgres -p 宿主机端口5433 : 容器端口5432

  9. Docker 修改运行中的容器端口映射

    如果用docker run启动容器的时候发现自己忘记指定 -p 进行端口映射了,可以采取如下三种方式来增加端口映射: 1.第一种是最无脑的方式,直接删除当前容器,然后用原镜像重新跑一个新的容器.简单暴 ...

  10. docker 添加端口映射_Docker三大核心概念之容器

    ​容器 1.新建容器 docker create命令创建一个容器,例如: docker create -it hello-world 使用docker create命令新建的容器处于停止状态.可以使用 ...

最新文章

  1. Hibernate【XXXX.hbm.xml】总结
  2. 基于wifi的单片机无线通信研究_SKYLAB:智能家居无线协议WiFi/BLE/Zigbee介绍与对比...
  3. [简单题]Counting Duplicates( Python 实现)
  4. Java final、static final 讲解
  5. 计算机组成原理(哈工大刘宏伟)135讲(三)
  6. 阿里云发布勒索病毒专杀工具:一键修复 彻底查杀
  7. DCD DSR DTR RTS CTS表示什么意思
  8. 如何构建一个分布式爬虫:理论篇
  9. Oracle 11G 安装详解
  10. [ruby on rails] 跟我学之(7)创建数据
  11. 大数据_MapperReduce_Hbase相关面试题_补充说明---Hbase工作笔记0030
  12. html显示作者信息,HTML基础 meta name author 添加网页作者的信息
  13. linux salt命令 -e,Linux记录-salt命令
  14. Ubuntu下添加打印机---之寻找设备lpinfo
  15. 频率对电感值和电感尺寸的影响 // 《精通开关电源设计》P50:频率对电感值和电感尺寸的影响
  16. Linux驱动模块Makefile编写
  17. windows 文件后缀名
  18. Windows10 Hero默认壁纸(11色)
  19. CDN 是什么 、CDN 引入
  20. 基于颜色的R2V软件快速矢量化

热门文章

  1. Windows 10 修改文件夹图标
  2. 详解低延时高音质:声音的美化与空间音效篇
  3. C语言 一元二次方程求解
  4. Openwrt 安全模式failsafe分析
  5. HTML+CSS静态网页制作:电影网站设计——漫威电影(2页)
  6. 带你区分超键,候选键,主键
  7. 国内国外很火爆的代码生成器
  8. 硕泰克SL-67fv1支持PIII800EB吗?
  9. u盘坏了在计算机不显示,U盘在电脑上不能显示怎么办
  10. 页眉---header