4.4docker基础详细版--在容器中部署静态网站

本文详细介绍如何利用Docker技术,在容器中部署Nginx并运行静态网站,包括端口映射、配置epel源、安装nginx和vim、创建静态页面、修改配置文件等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用docker技术在容器中使用nginx部署一个静态网站。


容器的端口映射


在使用run的时候指定-p或-P来进行端口映射:

-P:将为容器暴露的所有端口进行映射
    eg:docker run -P -it centos /bin/bash

-p:指定映射哪些容器的端口
    eg:1、只指定容器端口(宿主机端口随机映射)
        docker run -p 80 -it centos /bin/bash

        2、同时指定宿主机端口和容器端口
        docker run -p 8080:80 -it centos /bin/bash

        3、指定ip和容器的端口
        docker run -p 0.0.0.0:80 -it centos /bin/bash

        4、指定ip:宿主机端口:容器端口
        docker run -p 0.0.0.0:8080:80 -it centos /bin/bash

部署服务


步骤

  1. 创建映射80端口的交互式容器
  2. 安装nginx
  3. 安装vim
  4. 创建静态页面
  5. 修改配置文件
  6. 运行nginx
  7. 验证访问

搭建

创建一个映射80端口的交互式容器:

docker run -p 80 --name web -it centos /bin/bash

配置epel源:

[root@4168ac0dfa0f /]# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -P /etc/yum.repos.d

[root@4168ac0dfa0f /]# rpm -ivh /etc/yum.repos.d/epel-release-latest-7.noarch.rpm

[root@4168ac0dfa0f /]# yum clean all

安装nginx,vim

[root@4168ac0dfa0f /]# yum install -y nginx vim

建立存放页面的目录和页面:

[root@4168ac0dfa0f /]# mkdir -p /var/www/html

[root@4168ac0dfa0f /]# cd /var/www/html/

[root@4168ac0dfa0f /]# vim index.html
    <html>
    <head>
        <title>Test docker-ng</title>
    </head>
    <body>
        <h1>IF you see this, you success run a nginx in docker!</h1>
    </body>
    </html>

编辑nginx配置文件:

[root@4168ac0dfa0f html]# vim /etc/nginx/nginx.conf
    修改root  /var/www/html;

运行nginx:

[root@4168ac0dfa0f html]# nginx

[root@4168ac0dfa0f html]# ps -ef | grep nginx

使用CTRL+P CTRL+Q让容器运行在后台

在物理机中查看容器:

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
4168ac0dfa0f        centos              "/bin/bash"         12 minutes ago      Up 12 minutes       0.0.0.0:32768->80/tcp   web

[root@docker ~]# docker port web
80/tcp -> 0.0.0.0:32768

可以看到,容器的80端口映射到主机的32768端口上

验证网站是否可访问:

命令行中访问:
[root@docker ~]# curl 127.0.0.1:32768

这里写图片描述

也可以在浏览器中访问:
这里写图片描述

使用容器的IP地址访问

使用inspect参数查看docker容器的ip:

[root@docker ~]# docker inspect 4168ac0dfa0f

这里写图片描述

用curl访问:

[root@docker ~]# curl 172.17.0.2

这里写图片描述

关闭、重启服务

现在web容器一直后台运行:

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
4168ac0dfa0f        centos              "/bin/bash"         35 minutes ago      Up 35 minutes       0.0.0.0:32768->80/tcp   web

然后关闭容器后重新运行容器:

[root@docker ~]# docker stop web
web

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

[root@docker ~]# docker start -i web

[root@4168ac0dfa0f /]# ps -ef 
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 12:29 ?        00:00:00 /bin/bash
root         15      1  0 12:29 ?        00:00:00 ps -ef

发现nginx并没有在重启容器后自动运行

用docker的exec参数在容器外启动nginx:

[root@docker ~]# docker exec web nginx

[root@docker ~]# docker top web
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4986                4973                0                   20:29               pts/1               00:00:00            /bin/bash
root                5044                1                   0                   20:31               ?                   00:00:00            nginx: master process nginx
polkitd             5045                5044                0                   20:31               ?                   00:00:00            nginx: worker process

可以看到nginx已经启动了

现在重新访问,又正常了:

[root@docker ~]# curl 127.0.0.1:32769
<html>
<head>
    <title>Test docker-ng</title>
</head>
<body>
    <h1>IF you see this, you success run a nginx in docker!</h1>
</body>
</html>

注意,容器停止后重新运行,映射的端口和IP地址可能会发生变化!

 本文转自这里

<think>根据用户的问题,用户在使用Docker部署时指定了一个网络`zxyy_docker-bridage`,但系统报错提示该网络不存在。用户需要解决如何正确使用已存在的Docker网络或创建缺失的网络。结合引用[1]中的信息,华为OpenEuler系统重启后Docker自定义网络丢失的问题,以及引用[2]中关于Docker默认网络的说明,我们可以推断用户可能遇到了类似的问题:自定义网络在宿主机重启后丢失,导致Docker容器启动时无法找到指定的网络。解决方案如下: ###步骤1:检查网络是否存在首先,用户应该检查Docker中是否存在`zxyy_docker-bridage`网络。可以使用以下命令: ```bashdocker networkls``` 如果网络不存在,需要创建它。 ###步骤2:创建网络(如果不存在) 如果网络不存在,使用以下命令创建网络: ```bashdocker networkcreate --driver bridgezxyy_docker-bridage```这里假设用户需要创建一个桥接网络。如果需要指定子网、网关等参数,可以添加相应的选项,例如: ```bashdocker networkcreate --driver bridge--subnet=172.18.0.0/16 --gateway=172.18.0.1zxyy_docker-bridage```###步骤3:解决网络持久化问题(针对华为OpenEuler系统)根据引用[1],华为OpenEuler22.03LTS系统重启后Docker自定义网络丢失,这可能是因为Docker服务在重启时没有正确恢复网络配置。可以尝试以下方法:1.**编辑Docker配置文件**修改Docker的配置文件`/etc/docker/daemon.json`,添加以下内容:```json{"experimental": false,"iptables":true,"ipv6":false,"userland-proxy":false,"dns": ["8.8.8.8","8.8.4.4"],"storage-driver": "overlay2","bip":"172.17.0.1/16","default-address-pools": [{"base":"172.18.0.0/16", "size":24}]}```这里`bip`指定了默认桥接网络docker0的配置,而`default-address-pools`则定义了创建新网络时的默认地址池。注意,这些配置需要根据实际网络环境调整。2.**重启Docker服务**修改配置后,重启Docker服务使配置生效:```bashsudosystemctlrestart docker``` 3. **重新创建网络**重启后,重新创建自定义网络`zxyy_docker-bridage`(如步骤2所示)。4.**设置Docker服务开机自动创建网络**(可选)如果重启后网络仍然丢失,可以创建一个systemd服务单元,在每次Docker启动后自动创建网络。创建服务文件`/etc/systemd/system/docker-custom-network.service`:```ini[Unit]Description=Create customDocker networkAfter=docker.serviceRequires=docker.service[Service]Type=oneshotExecStart=/usr/bin/dockernetwork create--driverbridge zxyy_docker-bridage[Install]WantedBy=multi-user.target```启用并启动该服务:```bashsudosystemctldaemon-reloadsudo systemctl enabledocker-custom-networksudosystemctlstart docker-custom-network```###步骤4:在部署脚本中使用网络在部署脚本中,确保在启动容器时指定正确的网络名称。例如,在之前的部署脚本中,启动容器时使用:```bashdockerrun -d \--name"$service" \--network "zxyy_docker-bridage" \...其他参数... ```###验证启动容器后,使用以下命令检查容器是否连接到正确的网络: ```bashdocker inspect容器名| grep-A5Networks``` ###注意事项1.如果网络名称拼写错误,也会导致网络不存在。请仔细检查网络名称(例如,用户提到的`zxyy_docker-bridage`,注意`bridage`可能是`bridge`的拼写错误?)。2.如果使用docker-compose,在`docker-compose.yml`文件中需要定义网络,并确保与启动命令中指定的网络一致。###引用说明-针对华为OpenEuler系统Docker网络丢失的问题,参考了引用[1]的解决方案[^1]。 -Docker网络的基础知识参考了引用[2][^2]。 如果用户按照以上步骤操作,应该能够解决网络不存在的问题,并确保网络在宿主机重启后仍然存在。§§相关问题§§1.如何查看Docker容器的网络配置? 2.如何配置Docker容器的静态IP地址?3.Docker网络驱动类型有哪些?各自适用什么场景?4.如何解决Docker容器之间的网络连通性问题? 5.Docker Swarm集群中如何管理网络?</think>### 解决 Docker 网络 `zxyy_docker-bridage` 不存在的问题 #### 原因分析: 1. **网络未创建**:Docker 网络 `zxyy_docker-bridage` 从未被创建过 2. **重启丢失**(华为 OpenEuler 系统特有):引用[1]指出华为 OpenEuler 22.03LTS 重启后 Docker 自定义网络会丢失[^1] 3. **拼写错误**:网络名可能存在拼写错误(如 `bridage` vs `bridge`) --- ### 解决方案: #### 1. 检查网络是否存在 ```bash docker network ls | grep zxyy_docker-bridage ``` 若没有输出,说明网络不存在。 #### 2. 创建网络(首次使用) ```bash # 创建桥接网络(推荐) docker network create --driver bridge zxyy_docker-bridage # 指定子网(可选) docker network create --driver bridge --subnet=172.19.0.0/16 zxyy_docker-bridage ``` #### 3. 解决华为 OpenEuler 重启丢失问题(引用[1]方案) ```bash # 编辑 Docker 配置文件 sudo vi /etc/docker/daemon.json # 添加以下内容(防止网络丢失) { "experimental": false, "iptables": true, "ipv6": false, "userland-proxy": false, "dns": ["8.8.8.8", "8.8.4.4"], "storage-driver": "overlay2" } # 重启 Docker sudo systemctl restart docker ``` #### 4.部署脚本中自动创建网络 修改您的部署脚本,添加网络检查逻辑: ```bash # 在启动服务函数中添加 if ! docker network inspect zxyy_docker-bridage &>/dev/null; then echo "🛠️ 创建缺失网络: zxyy_docker-bridage" docker network create --driver bridge zxyy_docker-bridage fi # 启动容器时指定网络 docker run -d \ --network zxyy_docker-bridage \ ...其他参数... ``` #### 5. 验证网络状态 ```bash # 查看网络详情 docker network inspect zxyy_docker-bridage # 输出应包含: # "Name": "zxyy_docker-bridage", # "Driver": "bridge", # "Containers": { ... } ``` --- ### 永久性解决方案建议: 1. **网络名称标准化**: ```bash # 更规范的命名(避免拼写错误) docker network create app_network ``` 2. **使用 Docker Compose 管理网络**: ```yaml # docker-compose.yml networks: app-net: driver: bridge name: zxyy_docker-bridage services: myapp: networks: - app-net ``` 3. **添加重启守护脚本**(针对华为系统): ```bash # /etc/systemd/system/docker-network-restore.service [Unit] Description=Restore Docker Networks After=docker.service [Service] Type=oneshot ExecStart=/usr/bin/docker network create --driver bridge zxyy_docker-bridage [Install] WantedBy=multi-user.target ``` --- ### 关键要点: 1. Docker 默认使用 `bridge` 驱动创建网络(引用[2])[^2] 2. 华为 OpenEuler 需特殊配置防止网络丢失[^1] 3. 建议使用脚本自动化网络创建流程 4. 检查网络名称拼写(`bridge` 而非 `bridage`) > **注**:如果网络名称确实是 `zxyy_docker-bridage`(含拼写差异),请确保所有使用场景中保持完全一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值