当前位置: 首页 > news >正文

docker-学习-4

docker学习第四天

  • docker学习第四天
    • 1. 回顾
      • 1.1. 容器的网络类型
      • 1.2. 容器的本质
      • 1.3. 数据的持久化
      • 1.4. 看有哪些卷
      • 1.5. 看卷的详细信息
    • 2. 如何做多台宿主机里的多个容器之间的数据共享
      • 2.1. 概念
      • 2.2. 搭NFS服务器+实现多个容器之间的数据共享的详细步骤
      • 2.3. 如果是多台机器,背后需要使用nfs、NAS、SAN、云存储等网络存储解决
        • 2.3.1. 数据一致性的解决方案↓
        • 2.3.2. nfs
        • 2.3.3 云存储
        • 2.3.4. nas
        • 2.3.5. san
    • 3. docker日常操作
    • 4. docker镜像的制作
      • 4.1. 镜像里到底有什么?
      • 4.2. Dockerfile
      • 4.3. 案例1
      • 4.4. 案例2
      • 4.5. 练习1:
      • 4.6. 练习2:制作镜像的练习
    • 5. 小知识点
      • 5.1. ip add没有看到ip地址

docker学习第四天

1. 回顾

1.1. 容器的网络类型

host

bridge

none

container

overlay

通过docker network ls 查看

Bridge 和 Overlay 在作用域上的主要区别在于它们的应用范围和使用环境。

Bridge 网络:Bridge 网络适用于单个主机上的容器之间的通信,它是 Docker 默认的网络模式。在这种模式下,运行在同一主机上的两个 Docker 容器可以互相通信。

Overlay 网络:Overlay 网络则用于在多个 Docker 主机上的容器之间进行通信,特别是在 Docker Swarm 集群环境中。不同主机上的 Docker 容器可以通过 Overlay 网络进行通信,就好像它们在同一主机上一样。

总结: 如果你只是在单台机器上运行 Docker,那么 Bridge 网络就足够了。但是,如果你在进行容器编排,或者在多台机器上运行 Docker Swarm,那么你可能需要使用 Overlay 网络。

1.2. 容器的本质

就是一个进程

[root@docker-1 ~] ps -xf|grep containerd-shim5121 pts/2    S+     0:00  |       \_ grep --color=auto containerd-shim3690 ?        Sl     0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id f930b469045f3e7c3c0fb8ec99aa6694ad24aa3e94d5f27bcd0358a9d3b04571 -address /run/containerd/containerd.sock4021 ?        Sl     0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 0560f3b35bffc921cd86b01e6878cb936ba2dfb6e373300a11d839d71e991963 -address /run/containerd/containerd.sock4197 ?        Sl     0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 952638341afc76bae529a94532fc0cc41c6cfcd368828521c9c806f90ac07dab -address /run/containerd/containerd.sock4669 ?        Sl     0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id b6d347477abe4b43f14e4428dc4613b6a8b39e2afb5bf0f264e648d669579fbd -address /run/containerd/containerd.sock4782 ?        Sl     0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 33efd6cf8022ab6dba350790342b94ae0a01e434311f47f5999284d866ce8ec2 -address /run/containerd/containerd.sock

1.3. 数据的持久化

用到的技术就是卷

volume ---->mount 挂载

实现了—>数据共享和数据备份

1.4. 看有哪些卷

[root@docker-1 ~] docker volume ls
DRIVER    VOLUME NAME
local     87e38c019186eff45190b0767c95ca6d8af255f88292d0254af03c696139ca34
local     293e693c1ba0264c31632ba2af120660e4abc0fb09246dbca3bab7973dca7090
local     953abcd2432ee62358527d5865c9ad8fe73b8fb3def82a39c8cee84a850ec3d1
local     a2b0573256268ba172932b7c861ac27cf0422a539ccc0bd8e705290321f8665a
local     ac5af551b963ac9242efde3db8cb2159b22875fbfb9a50a7bd71421974090619
local     d245e1f710c4ae8153fce2a630f5ef94cce3ac9ffa0e9a7d35a2072d1e50110e
local     myvol2
local     sanchaung
local     sanchuang
local     xie

1.5. 看卷的详细信息

[root@docker-1 ~] docker volume inspect sanchuang
[{"CreatedAt": "2024-01-31T17:46:38+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/sanchuang/_data","Name": "sanchuang","Options": null,"Scope": "local"}
]

2. 如何做多台宿主机里的多个容器之间的数据共享

2.1. 概念

e112758f6ee5d2deb12698d2428ffcf

这是一个在数据中心中设置的 Docker Swarm 结构框架图,其中包括以下部分:

  • 三个节点(node-1,node-2,node-3)
  • 每个节点都在运行一个服务副本(service-replica-1,service-replica-2,service-replica-3),这些服务副本都在 Docker 容器内部运行。
  • 所有三个节点都连接到共享文件存储,允许不同节点上的容器访问共享数据。

这种设置的目标在于确保一个服务在多个服务器之间的高可用性负载分布

搭建步骤:

image-20240201115427739

1.先搭建好nfs服务器,设置好共享目录以及首页文件index.html

2.在docker宿主机上创建支持nfs文件系统的卷,连接到nfs服务器

3.在宿主机上创建nginx容器,使用支持nfs文件系统的卷

4.访问nginx的web网站,能否能访问到index.html首页文件不同的宿主机上启动的容器,看到的内容应该是一模一样的,因为访问到相同的nfs服务器共享的目录

2.2. 搭NFS服务器+实现多个容器之间的数据共享的详细步骤

==NFS服务器:==是一台可以共享文件的机器

network file system 网络文件系统:在网络上共享文件的

机器ip作用
docker1192.168.153.166测试节点
docker2192.168.153.160测试节点
NFS服务器192.168.153.167数据共享的
  1. 搭建好nfs服务器

    [root@nfs ~] yum install nfs-utils -y
    记得在nfs服务器上重启nfs服务
    service nfs restart
    

    建议docker集群内的所有的节点都安装nfs-utils软件,因为节点服务器里创建卷需要支持nfs网络文件系统

    防火墙和selinx必须关闭

  2. 在nfs服务器上新建共享目录和index.html网页

    [root@nfs ~] mkdir /sc/web -p
    [root@nfs ~] cd /sc/web/
    [root@nfs web] echo "welcome to sanchuang" >index.html
    [root@nfs web] ls
    index.html
    [root@nfs web] cat index.html 
    welcome to sanchuang
    
  3. 设置共享目录

    [root@nfs web] vim /etc/exports
    [root@nfs web] cat /etc/exports
    /sc/web 192.168.153.0/24(rw,no_root_squash,sync)
    [root@nfs web] chmod 777 /sc/web	'在linux系统里也给其他用户写的权限'
    [root@nfs web]# 
    

    在NFS中,除了no_root_squash,还有许多其他的选项可以用于配置你的NFS共享。以下是一些常见的选项:

    • rw:允许客户端对NFS共享进行读写操作。
    • ro:只允许客户端对NFS共享进行读操作。
    • sync:在回复客户端请求之前,将更改写入磁盘。
    • async:在回复客户端请求之前,不需要将更改写入磁盘。
    • insecure:允许客户端从大于1024的非特权端口连接。
    • secure:要求客户端从小于或等于1024的特权端口连接。
    • wdelay:将多个写请求组合在一起以提高性能。
    • no_wdelay:如果使用了sync,则禁用wdelay
    • root_squash:将root用户和用户组映射为匿名用户或用户组。
    • all_squash:将所有用户和用户组映射为匿名用户或用户组。
    • anonuidanongid:设置匿名用户或用户组的UID和GID。
  4. 共享出去

    [root@nfs web] exportfs -rv
    exporting 192.168.153.0/24:/sc/web
    [root@nfs web]# 
    '或者通过 service nfs restart 也可以'
    
  5. 设置nfs开机启动

    [root@nfs web] systemctl enable nfs
    Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
    [root@nfs web]# 
    
  6. 在docker集群里的任意一个节点服务器上测试能否挂载nfs服务器共享的目录

    在两台节点机器上都测试一下

    [root@docker-1 ~] mkdir /test
    [root@docker-1 ~] cd /test/
    [root@docker-1 test] mount 192.168.153.167:/sc/web  /test
    [root@docker-1 test] df -Th
    文件系统                类型      容量  已用  可用 已用% 挂载点
    192.168.153.167:/sc/web nfs4       50G  1.9G   49G    4% /test
    [root@docker-1 test]# 

这些命令在完成一些文件系统的操作:

  1. [root@docker-1 ~] mkdir /test:这条命令在根目录下创建了一个名为 test 的目录。

  2. [root@docker-1 ~] cd /test/:这条命令改变了当前工作目录到 test 目录。

  3. [root@docker-1 test] mount 192.168.153.167:/sc/web /test:这条命令将了一个远程网络文件系统(来自 IP 地址为 192.168.153.167 的服务器上的 /sc/web 目录)挂载到本地的 /test 目录。

  4. [root@docker-1 test] df -Th:这条命令显示了当前系统上所有文件系统的磁盘空间使用情况。-T 选项表示同时显示文件系统的类型,-h 的意思是以易读的方式(如 K, M, G)显示大小。

    你看到的输出显示,远程的 /sc/web 被挂载到了本地的 /test,它的文件系统类型是 nfs4 (网络文件系统版本 4),总容量为 50G,已经使用了 1.9G,还剩 49G 可用,用量百分比为 4%。

综上,这些命令在操作一些本地和远程的文件系统,并查看了文件系统的磁盘使用信息。

客户机测试:

[root@docker-1 test] echo "machi" >>index.html 
[root@docker-1 test] cat index.html 
welcome to sanchuang
123456
machi
[root@docker-1 test]# 
  1. 在2台docker 宿主机上创建支持nfs功能的卷 nfs-web-1

    –opt o=addr=192.168.153.167 指定nfs服务器的地址
    –opt device=:/sc/web 指定nfs服务器上共享的文件夹的路径

    [root@docker-1 test] docker volume create --driver local --opt type=nfs --opt  o=addr=192.168.153.167,nolock,soft,rw,sync  --opt  device=:/sc/web   nfs-web-1
    nfs-web-1
    [root@docker-1 test] docker volume ls
    DRIVER    VOLUME NAME
    local     nfs-web-1
    [root@docker-1 test]# 
    [root@docker-1 test] docker volume inspect nfs-web-1
    [{"CreatedAt": "2024-02-01T11:37:36+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/nfs-web-1/_data","Name": "nfs-web-1","Options": {"device": ":/sc/web","o": "addr=192.168.153.167,nolock,soft,rw,sync","type": "nfs"},"Scope": "local"}
    ]
    [root@docker-1 test]# 
    '记得两台机器都创建'
    

    这是一个 Docker 命令,用于创建一个名为 nfs-web-1 的 NFS 类型的卷。下面是这个命令各部分的详细解释:

    • docker volume create:这是 Docker 命令,用于创建一个新的卷。
    • --driver local:这是指定使用的卷驱动。在本例中,我们指定使用 local 驱动。
    • --opt type=nfs:这是选项,用于设置卷的类型,其中 type=nfs 表示这是一个 NFS 类型的卷。
    • --opt o=addr=192.168.153.167,nolock,soft,rw,sync:这是设置 NFS 卷的选项。其中 addr=192.168.153.167 则表示 NFS 服务器的地址。nolock 是 NFS 的一个选项,表示禁用锁定。soft 表示在处理一个请求时,如果 NFS 服务器没有响应,则客户端将在重试一定次数后放弃,并显示一个错误。rw 表示卷有读写权限。sync 表示所有的 I/O 操作必须在物理设备完成后才返回,这可以确保数据的一致性。
    • --opt device=:/sc/web:这是设置 NFS 卷的设备路径。其中 /sc/web 是 NFS 服务器上的目录。
    • nfs-web-1:这是你要创建的卷的名称。

    所以,这个命令的意思就是创建一个名为 “nfs-web-1” 的 NFS 类型的 Docker 卷,这个卷将挂载来自地址为 “192.168.153.167” 的 NFS 服务器上的 “/sc/web” 目录,卷有读写权限,并且所有的 I/O 操作都是同步的。

  2. 在2台docker宿主机上都可以启动容器,使用刚刚创建的nfs-web-1卷

    [root@docker-1 test] docker run -d --name lizx-web-1 -p 5588:80 -v nfs-web-1:/usr/share/nginx/html nginx
    3fe06b0f77662e4c0bf707ca7012dbf4de00d4642fc3109e869d671e17697cf2
    [root@docker-1 test]# 
    
  3. 访问创建的nginx web服务器,打开浏览器去访问

    image-20240201114624965

    image-20240201114636488

2.3. 如果是多台机器,背后需要使用nfs、NAS、SAN、云存储等网络存储解决

2.3.1. 数据一致性的解决方案↓
2.3.2. nfs

==优点:==搭建服务器非常方便,随便一台linux系统的机器都可以做,对硬件没有要求,配置起来方便

==缺点:==性能一般,依赖于传统的tcp/ip网络,如果网络宽带不大,影响数据的传输,有丢失数据的风险和卡顿的问题

2.3.3 云存储

优点:

  • 直接购买,不需要自己搭建–》99.9999%不丢失数据,保障不丢失数据
  • 可以保障存取的速度 ops
  • 各地的服务器都可以使用,在公网上可以使用

缺点:

  • 数据在阿里云里了,数据的安全性

云存储是基于云计算技术,提供了互联网上的数据存储服务。用户数据存放在远程数据中心,可以通过任何网络连接的设备进行访问和管理。云存储具有易于扩展、设备无关性以及按需付费等优点,非常适合需要远程访问数据以及希望减少本地存储硬件投入的用户或企业。

2.3.4. nas

NAS(Network Attached Storage) 网络附加存储:网络存储基于标准网络协议实现数据传输,为网络中的Windows / Linux / Mac OS 等各种不同操作系统的计算机提供文件共享和数据备份。

1.需要专业的存储设备 --》NAS—>NFS

2.使用传统的tcp/ip网络

3.其他的电脑/手机/pad等设备都可以使用

支持网络传输协议:NFS,ftp,ssh,http等

简单的来说 就是小白用户使用,进去之后有web界面,可以点点点,像百度网盘一样

NAS(网络附加存储)的优点包括:

  1. 简易设置:NAS设备易于安装和设置,无需复杂的操作步骤,即可实现快速部署并建立起一个高效的存储环境。
  2. 高度可靠性:NAS采用冗余存储技术,如RAID(冗余磁盘阵列),可以在硬盘损坏时保持数据的完整性,提供更高的数据可靠性。
  3. 随时随地访问:无论你在哪里,只要有网络连接,你就可以访问NAS中的文件。
  4. 存储空间大:NAS提供了大量的存储空间,可以方便地备份和管理相册、视频、设计素材等。
  5. 套件丰富:NAS支持扩展更多可能性,例如,你甚至可以搭建一个自己专属的「爱奇艺」「微信读书」「QQ音乐」。
  6. 横向扩展功能:为NAS增加存储容量就和增加硬盘一样简单。您不必升级或更换现有的服务器,即可在不中断网络的情况下启用新的存储。
  7. 高性能:由于NAS专门用于提供文件服务,所以其他联网设备无需再提供文件服务。
  8. 运营维护成本低:NAS是一种采用直接与网络介质相连来实现数据存储的设备,其运营维护成本较传统存储服务器是非常低的。
  1. 成本:NAS设备的前期安装和设备成本可能比较高。

  2. 可扩展性:NAS的可扩展性可能受到设备大小的限制。

  3. 性能:NAS的存储性能有局限性,特别是在多台客户端访问NAS时,性能可能会大大下降。

  4. 数据安全:存储数据通过网络传输,因此可能容易产生数据泄漏等安全问题。

  5. 网络影响:存储数据通过网络传输,因此可能易受网络上其它流量的影响。

  6. 复杂的数据备份操作:NAS的数据备份操作可能比较复杂。

  7. 服务器瓶颈:服务器本身可能容易成为系统瓶颈。

  8. 服务器故障:如果服务器发生故障,数据可能无法访问。

    设备管理:对于存在多个服务器的系统来说,设备可能分散,不便于管理。

这些缺点需要在选择NAS时考虑。希望这个信息对你有所帮助!

2.3.5. san

存储区域网络 (Storage Area Network, SAN) 是企业最常用的存储网络架构,要求高吞吐量和低延迟的业务关键型业务往往采用这类架构运行。如今,采用全闪存存储的 SAN 部署数量增速迅猛。与旋转磁盘相比,全闪存存储可提供更出色的性能、稳定一致的低延迟以及更低的总成本。SAN 将数据存储在集中式共享存储中,使企业能够运用一致的方法和工具来实施安全防护、数据保护和灾难恢复。

**1.专业的存储服务器 **

**2.专业的光纤交换机 **

3.HBA卡插到业务服务器上

SAN: 存储区域网络,是一种高性能的存储网络,主要用于企业级应用。它使用专业的存储服务器、光纤交换机和HBA卡,将数据存储在集中式的共享存储中。简单来说,SAN就像一个专门为服务器设计的高速网络,可以让服务器像访问本地硬盘一样访问网络上的存储设备。

优点: 存取速度快

缺点: 成本极高,必须在局域网里(距离比较近的数据集中存储和共享)

3. docker日常操作

1.安装

2.日常的命令

​ docker run/exec/rm/rmi/images/start/stop/kill/logs/inspect/stats/top/save/load/pull

3.网络类型和卷

4.dockerfill—>镜像的制作

4. docker镜像的制作

4.1. 镜像里到底有什么?

  1. 操作系统
  2. 业务核心代码
  3. 系统工具
  4. 运行时的环境

A Docker container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings.

Docker容器镜像是一个轻量级的、独立的、可执行的软件包,它包含了运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。

4.2. Dockerfile

Dockerfile是制作镜像的配置文件 ----》祖传秘方

4.3. 案例1

使用busybox作为基础镜像+自己编写一个脚本作为业务核心代码=完成一个自己的镜像

1.编写一个shell脚本

[root@docker-1 ~] mkdir /Dockerfile/
[root@docker-1 ~] cd /Dockerfile/
[root@docker-1 Dockerfile] vim while.sh
#!/bin/bashi=1
while true
doecho "hello,world,sanchuang$i"let i++sleep 1
done
[root@docker-1 Dockerfile]# 

2.编辑Dockerfile

[root@docker-1 Dockerfile] vim Dockerfile
#指定基础镜像
FROM busybox
#指定进入容器的时候,进入哪个文件夹
WORKDIR /
#复制宿主机当前目录下的所有文件和文件夹到容器里的/目录下 docker cp
COPY . /
#当我们制作镜像的时候需要执行的命令,这些文件会留在做好的镜像里
RUN touch sc.txt && mkdir sanchuang && sleep 10
#指定容器启动的时候需要执行的命令
#本质上等于 /bin/bash while.sh 前边是命令 后边是参数
ENTRYPOINT ["/bin/sh","/while.sh"]
[root@docker-1 Dockerfile]# 

3.开始构建,制作镜像

[root@docker-1 Dockerfile]  docker build -t scbusybox:1.0 .
[+] Building 10.4s (8/8) FINISHED                                                                                                         docker:default=> [internal] load build definition from Dockerfile                                                                                                0.0s=> => transferring dockerfile: 532B                                                                                                                0.0s=> [internal] load metadata for docker.io/library/busybox:latest                                                                                   0.0s=> [internal] load .dockerignore                                                                                                                   0.0s=> => transferring context: 2B                                                                                                                     0.0s=> [internal] load build context                                                                                                                   0.0s=> => transferring context: 655B                                                                                                                   0.0s=> [1/4] FROM docker.io/library/busybox:latest                                                                                                     0.0s=> [2/4] COPY . /                                                                                                                                  0.0s=> [3/4] RUN touch sc.txt && mkdir sanchuang && sleep 10                                                                                          10.2s=> exporting to image                                                                                                                              0.0s=> => exporting layers                                                                                                                             0.0s=> => writing image sha256:ca1737d185a804ba705a8ea1cd10d37b2ec36b6f9cd8a52257c90b507a7d339e                                                        0.0s=> => naming to docker.io/library/scbusybox:1.0                                                                                                    0.0s
[root@docker-1 Dockerfile]# 

4.查看镜像有没有成功

[root@docker-1 Dockerfile] docker images|grep scbusybox
scbusybox    1.0       ca1737d185a8   About a minute ago   1.24MB
[root@docker-1 Dockerfile]# 

5.使用制作好的镜像

[root@docker-1 Dockerfile] docker run -it --rm --name scbusybox scbusybox:1.0
hello,world,sanchuang1
hello,world,sanchuang2
hello,world,sanchuang3

4.4. 案例2

使用go语言的编译好的代码制作镜像

[root@docker-1 Dockerfile] mkdir go
[root@docker-1 Dockerfile] cd go
[root@docker-1 go]# 

1.获得go语言核心代码

b9534c569e41dfa32fa6c81cdd84171

[root@docker-1 go] vim server.go
package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "hello, sanchuang 2024 nice",})})r.Run()
}[root@docker-1 go]# 

加个注释:

package main // 声明这个文件属于 main 包import ("net/http" // 导入 net/http 包,用于处理网络请求和响应"github.com/gin-gonic/gin" // 导入 gin 包,用于创建 web 框架和路由
)func main() { // 定义 main 函数,程序的入口点r := gin.Default() // 创建一个默认的 gin 引擎,它包含了一些中间件和日志功能r.GET("/sc", func(c *gin.Context) { // 为 /sc 路径注册一个 GET 方法的处理函数,c 是请求的上下文对象c.JSON(http.StatusOK, gin.H{ // 以 JSON 格式返回响应,状态码为 200,内容为一个键值对"message": "hello, sanchuang", // 键为 message,值为 hello, sanchuang})})r.Run() // 启动 web 服务器,监听默认的端口 8080
}

写好核心代码之后 要安装go环境

[root@docker-1 go] yum install epel-release -y
[root@docker-1 go] yum install golang -y

开始编译server.go成一个二进制文件(测试)

[root@docker-1 go]# go mod init web
go: creating new go.mod: module web
go: to add module requirements and sums:go mod tidy
[root@docker-1 go]# go env -w GOPROXY=https://goproxy.cn,direct
[root@docker-1 go]# 
[root@docker-1 go]# go mod tidy
[root@docker-1 go]# go run server.go 
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.- using env:	export GIN_MODE=release- using code:	gin.SetMode(gin.ReleaseMode)[GIN-debug] GET    /                         --> main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
[GIN] 2024/02/01 - 19:05:04 | 200 |     137.998µs |   192.168.153.1 | GET      "/"

image-20240201190515349

把server.go编译成二进制文件

huweb是编译好的二进制程序

[root@docker-1 go]# go build -o hnweb .
[root@docker-1 go]# ls
apiserver.tar.gz  go.mod  go.sum  hnweb  server.go
[root@docker-1 go]# 
[root@docker-1 go]# ./hnweb 
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.- using env:	export GIN_MODE=release- using code:	gin.SetMode(gin.ReleaseMode)[GIN-debug] GET    /                         --> main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
[GIN] 2024/02/01 - 19:12:55 | 200 |      97.402µs |   192.168.153.1 | GET      "/"

2.编辑Dockerfile

[root@docker-1 go] cat Dockerfile 
FROM centos:7
WORKDIR /go
COPY . /go
RUN ls /go && pwd
ENTYPOINT ["/go/hnweb"]
[root@docker-1 go]# 

3.制作镜像

[root@docker-1 go]# docker build -t hnweb:1.0 .
[+] Building 0.5s (9/9) FINISHED                                                                                                          docker:default=> [internal] load build definition from Dockerfile                                                                                                0.0s=> => transferring dockerfile: 118B                                                                                                                0.0s=> [internal] load metadata for docker.io/library/centos:7                                                                                         0.0s=> [internal] load .dockerignore                                                                                                                   0.0s=> => transferring context: 2B                                                                                                                     0.0s=> [1/4] FROM docker.io/library/centos:7                                                                                                           0.0s=> [internal] load build context                                                                                                                   0.1s=> => transferring context: 16.86MB                                                                                                                0.0s=> [2/4] WORKDIR /go                                                                                                                               0.0s=> [3/4] COPY . /go                                                                                                                                0.1s=> [4/4] RUN ls /go && pwd                                                                                                                         0.3s=> exporting to image                                                                                                                              0.0s=> => exporting layers                                                                                                                             0.0s=> => writing image sha256:5a97befba8149992b8fe282d4c1ddc3a4c0d3a1e39236df947ca3dcb87bb3e3a                                                        0.0s=> => naming to docker.io/library/hnweb:1.0                                                                                                        0.0s 
[root@docker-1 go]#                                             
[root@docker-1 go] docker images|grep hn
hnweb        1.0       5a97befba814   49 seconds ago      221MB
[root@docker-1 go]# 

4.使用制作好的镜像

[root@docker-1 go]# docker run -d  --name hnweb-1 -p 7788:8080  hnweb:1.0
1814d1caa3cf257f9a37311ee97539e0ad1a0af4117e128620535172a6fbf0bc
[root@docker-1 go]# docker ps
CONTAINER ID   IMAGE       COMMAND       CREATED         STATUS         PORTS                                       NAMES
1814d1caa3cf   hnweb:1.0   "/go/hnweb"   3 seconds ago   Up 3 seconds   0.0.0.0:7788->8080/tcp, :::7788->8080/tcp   hnweb-1
[root@docker-1 go]# 

image-20240201192250886

4.5. 练习1:

1、以nginx为基础镜像编写dockerfile。并构建为一个名为nginxtest的镜像,要求镜像内安装一个tcpdump工具,下载或从本地拉取一个tar包并解压。构建镜像后运行容器,并暴露端口访问。(要求熟悉dockerfile常用指令,容器运行常见参数,以及如何进入容器内部)

[root@docker-1 Dockerfile] mkdir nginx
[root@docker-1 Dockerfile] cd nginx/
[root@docker-1 nginx]# 
[root@docker-1 nginx] vim Dockerfile
# 使用官方的 Nginx 镜像作为基础镜像
FROM nginx# 更新系统和已安装的包,然后安装 tcpdump 工具
RUN apt-get update && apt-get install -y tcpdump# 使用 curl 工具下载 nginx 源码包,并解压
RUN curl -O https://nginx.org/download/nginx-1.25.1.tar.gz && tar xf nginx-1.25.1.tar.gz# 对外开放 80 端口
EXPOSE 80# 运行 Nginx 服务
CMD ["nginx","-g","daemon off;"]
[root@docker-1 nginx]# docker build -t nginxtest .
[+] Building 161.1s (7/7) FINISHED                                                                                                        docker:default=> [internal] load build definition from Dockerfile                                                                                                0.0s=> => transferring dockerfile: 231B                                                                                                                0.0s=> [internal] load metadata for docker.io/library/nginx:latest                                                                                     0.0s=> [internal] load .dockerignore                                                                                                                   0.0s=> => transferring context: 2B                                                                                                                     0.0s=> [1/3] FROM docker.io/library/nginx:latest                                                                                                       0.0s=> [2/3] RUN apt-get update && apt-get install -y tcpdump                                                                                        158.4s=> [3/3] RUN curl -O https://nginx.org/download/nginx-1.25.1.tar.gz && tar xf nginx-1.25.1.tar.gz                                                  2.6s => exporting to image                                                                                                                              0.0s => => exporting layers                                                                                                                             0.0s => => writing image sha256:83ccc55ecdabbcb9bd37c9dfe4856adec84f1fc80c24e3472d2f69ba923c45f6                                                        0.0s => => naming to docker.io/library/nginxtest                                                                                                        0.0s [root@docker-1 nginx]# docker images|grep nginxtest
nginxtest    latest    83ccc55ecdab   37 seconds ago   172MB
[root@docker-1 nginx]# 
[root@docker-1 nginx]# docker run -it --name mynginx -p 80:80 nginxtest
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/02/01 12:14:34 [notice] 1#1: using the "epoll" event method
2024/02/01 12:14:34 [notice] 1#1: nginx/1.21.5
2024/02/01 12:14:34 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
2024/02/01 12:14:34 [notice] 1#1: OS: Linux 3.10.0-1160.el7.x86_64
2024/02/01 12:14:34 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/02/01 12:14:34 [notice] 1#1: start worker processes
2024/02/01 12:14:34 [notice] 1#1: start worker process 32
2024/02/01 12:14:34 [notice] 1#1: start worker process 33
2024/02/01 12:14:34 [notice] 1#1: start worker process 34
2024/02/01 12:14:34 [notice] 1#1: start worker process 35
192.168.153.1 - - [01/Feb/2024:12:15:03 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0" "-"
2024/02/01 12:15:04 [error] 32#32: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.153.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.153.166", referrer: "http://192.168.153.166/"
192.168.153.1 - - [01/Feb/2024:12:15:04 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.153.166/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0" "-"

image-20240201201521957

4.6. 练习2:制作镜像的练习

​ 1.以centos7作为基础镜像
​ 2.在里面安装好ip,vim,ping命令
​ 3.安装好nginx
​ 4.启动容器的时候,就启动nginx

[root@docker-1 Dockerfile]# mkdir centos
[root@docker-1 Dockerfile]# cd centos/
[root@docker-1 centos]# 
[root@docker-1 centos]# vim Dockerfile
FROM centos:7
RUN yum install -y iproute iputils vim
RUN yum install -y epel-release
RUN yum install -y nginx
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
[root@docker-1 centos]# 
[root@docker-1 centos]# docker build -t my_nginx .
[+] Building 145.8s (8/8) FINISHED                                                                                                        docker:default=> [internal] load build definition from Dockerfile                                                                                                0.0s=> => transferring dockerfile: 192B                                                                                                                0.0s=> [internal] load metadata for docker.io/library/centos:7                                                                                         0.0s=> [internal] load .dockerignore                                                                                                                   0.0s=> => transferring context: 2B                                                                                                                     0.0s=> [1/4] FROM docker.io/library/centos:7                                                                                                           0.0s=> CACHED [2/4] RUN yum install -y iproute iputils vim                                                                                             0.0s=> [3/4] RUN yum install -y epel-release                                                                                                           1.0s=> [4/4] RUN yum install -y nginx                                                                                                                144.3s => exporting to image                                                                                                                              0.5s => => exporting layers                                                                                                                             0.5s => => writing image sha256:79fef96935d1a5431f92fc1c80ba5148499f2efc6720d778f2e746aa58a91221                                                        0.0s => => naming to docker.io/library/my_nginx                                                                                                         0.0s 
[root@docker-1 centos]# docker images|grep my_nginx                                                                                                      
my_nginx     latest    79fef96935d1   21 seconds ago      991MB
[root@docker-1 centos]# 
[root@docker-1 centos]# docker run -d --name my_nginx-1 -p 88:80 my_nginx
2dce1f298ee435fe7d999ed8cf2db4bc8071ccf9464e2a5b2ad47d1d48085125
[root@docker-1 centos]# docker ps
CONTAINER ID   IMAGE       COMMAND                   CREATED             STATUS             PORTS                                       NAMES
2dce1f298ee4   my_nginx    "nginx -g 'daemon of…"   3 seconds ago       Up 2 seconds       0.0.0.0:88->80/tcp, :::88->80/tcp           my_nginx-1
[root@docker-1 centos]# 

image-20240201203700930

解决办法

[root@docker-1 centos]# echo "Halou Gh" >index.html
[root@docker-1 centos]# ls
Dockerfile  index.html
[root@docker-1 centos]# docker cp index.html my_nginx-1:/usr/share/nginx/html
Successfully copied 2.05kB to my_nginx-1:/usr/share/nginx/html
[root@docker-1 centos]# 

然后刷新页面

image-20240201203748032

5. 小知识点

5.1. ip add没有看到ip地址

nmcli n off '关闭网卡'
nmcli n on	'启动网卡'ip add 查看一下

相关文章:

docker-学习-4

docker学习第四天 docker学习第四天1. 回顾1.1. 容器的网络类型1.2. 容器的本质1.3. 数据的持久化1.4. 看有哪些卷1.5. 看卷的详细信息 2. 如何做多台宿主机里的多个容器之间的数据共享2.1. 概念2.2. 搭NFS服务器实现多个容器之间的数据共享的详细步骤2.3. 如果是多台机器&…...

el-upload子组件上传多张图片(上传为files或base64url)

场景: 在表单页,有图片需要上传,表单的操作行按钮中有上传按钮,点击上传按钮。 弹出el-dialog进行图片的上传,可以上传多张图片。 由于多个表单页都有上传多张图片的操作,因此将上传多图的el-upload定义…...

2024美赛数学建模C题思路源码——网球选手的动量

这题挺有意思,没具体看比赛情况,打过比赛的人应该都知道险胜局(第二局、第五局逆转局)最影响心态的,导致第3、5局输了 模型结果需要证明这样的现象 赛题目的 赛题目的:分析网球球员的表现 问题一.球员在比赛特定时间表现力 问题分析 excel数据:每个时间段有16场比赛,…...

金三银四_程序员怎么写简历_写简历网站

你们在制作简历时,是不是基本只关注两件事:简历模板,还有基本信息的填写。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“看起来最好看的模板”,填写基本信息,却没有深入思考如何使简历更具吸引力。这其实是一个普遍现象:许多求职者仍停留在传统简历…...

echarts条形图添加滚动条

效果展示: 测试数据: taskList:[{majorDeptName:测试,finishCount:54,notFinishCount:21}, {majorDeptName:测试,finishCount:54,notFinishCount:21}, {majorDeptName:测试,finishCount:54,notFinishCount:21}, {majorDeptName:测试,finishCount:54,notFinishCount:21}, {maj…...

Java 使用Soap方式调用WebService接口

pom文件依赖 <dependencies><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.0</version></dependency><!-- https://mvnrepository.com/artif…...

2024美赛数学建模所有题目思路分析

美赛思路已更新&#xff0c;关注后可以获取更多思路。并且领取资料 C题思路 首先&#xff0c;我们要理解势头是什么。简单来说&#xff0c;势头是一方在比赛中因一系列事件而获得的动力或优势。在网球中&#xff0c;这可能意味着连续赢得几个球&#xff0c;或是在比赛的某个关…...

Docker容器引擎(5)

目录 一.docker-compose docker-compose的三大概念&#xff1a; yaml文件格式&#xff1a; json文件格式&#xff1a; docker-compose 配置模板文件常用的字段&#xff1a; 二.Docker Compose 环境安装&#xff1a; 查看版本&#xff1a; 准备好nginx 的dockerfile的文…...

百分点科技:《数据科学技术: 文本分析和知识图谱》

科技进步带来的便利已经渗透到工作生活的方方面面&#xff0c;ChatGPT的出现更是掀起了新一波的智能化浪潮&#xff0c;推动更多智能应用的涌现。这背后离不开一个朴素的逻辑&#xff0c;即对数据的收集、治理、建模、分析和应用&#xff0c;这便是数据科学所重点研究的对象——…...

LabVIEW传感器通用实验平台

LabVIEW传感器通用实验平台 介绍了基于LabVIEW的传感器实验平台的开发。该平台利用LabVIEW图形化编程语言和多参量数据采集卡&#xff0c;提供了一个交互性好、可扩充性强、使用灵活方便的传感器技术实验环境。 系统由硬件和软件两部分组成。硬件部分主要包括多通道数据采集卡…...

向日葵企业“云策略”升级 支持Android 被控策略设置

此前&#xff0c;贝锐向日葵推出了适配PC企业客户端的云策略功能&#xff0c;这一功能支持管理平台统一修改设备设置&#xff0c;上万设备实时下发实时生效&#xff0c;很好的解决了当远程控制方案部署后&#xff0c;想要灵活调整配置需要逐台手工操作的痛点&#xff0c;大幅提…...

51单片机通过级联74HC595实现倒计时秒表Protues仿真设计

一、设计背景 近年来随着科技的飞速发展&#xff0c;单片机的应用正在不断的走向深入。本文阐述了51单片机通过级联74HC595实现倒计时秒表设计&#xff0c;倒计时精度达0.05s&#xff0c;解决了传统的由于倒计时精度不够造成的误差和不公平性&#xff0c;是各种体育竞赛的必备设…...

深信服技术认证“SCCA-C”划重点:深信服云计算关键技术

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识。 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08…...

Redis stream特性了解

在发布订阅中我们了解到发布订阅模式存在的无法持久化保存消息和对于离线重连的客户端不能读取历史消息的缺陷&#xff0c;以下就来了解一下stream是如何解决这个问题的 steam是类似于仅添加log的数据结构&#xff0c;提供了以下基本命令 XADD: 添加新条目到stream # 语法xadd…...

苍穹外卖项目可以写的简历和如何优化简历

文章目录 重点写中规写添加自己个性的项目面试会问道的问题 我是一名双非大二计算机本科生&#xff0c;希望我的分享对你有帮助&#xff0c;点赞关注不迷路。 简历编写一直是很多人求职人的心病&#xff0c;我自己上学期有一门课程是去校内企业面试&#xff0c;当时我就感受出…...

C++:智能指针

C在用引用取缔掉指针的同时&#xff0c;模板的引入带给了指针新的发挥空间 智能指针简单的来说就是带有不同特性和内存管理的指针模板 unique_ptr 1.不能有多个对象指向一块内存 2.对象释放时内部指针指向地址也随之释放 3.对象内数据只能通过接口更改绑定 4.对象只能接收右值…...

用户界面(UI)、用户体验(UE)和用户体验(UX)的差异

对一个应用程序而言&#xff0c;UX/UE (user experience) 设计和 UI (user interface) 设计非常重要。UX设计包括可视化布局、信息结构、可用性、图形、互动等多个方面。UI设计也属于UX范畴。正是因为三者在一定程度上具有重叠的工作内容&#xff0c;很多从业多年的设计师都分不…...

react 之 UseReducer

UseReducer作用: 让 React 管理多个相对关联的状态数据 import { useReducer } from react// 1. 定义reducer函数&#xff0c;根据不同的action返回不同的新状态 function reducer(state, action) {switch (action.type) {case INC:return state 1case DEC:return state - 1de…...

C++:this隐藏参数

你是否有一个问题&#xff1a;C中成员函数中究竟是如何访问成员变量的&#xff1f; 其实了解后回答起来这个问题很简单&#xff0c;通过一个不受限的隐藏参数this&#xff0c;this是类的指针&#xff0c;通过它可以访问到类内的各种成员。 明白了这个问题就很好理解&#xff…...

MySQL事务原理-相关日志

文章目录 前言一、什么是事务&#xff1f;1.1 事务概念1.2 事务的四大特性1.3 事务的隔离级别 二、实现原理2.1 TODO2.2 TODO 前言 事务是由MySQL的引擎来实现的&#xff0c;通过show engines命令查看MySQL存储引擎类别&#xff0c;观察只有InnoDB存储引擎支持事务。 一、什么…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...

五、jmeter脚本参数化

目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...