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-shim
5121 pts/2 S+ 0:00 | \_ grep --color=auto containerd-shim
3690 ? Sl 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id f930b469045f3e7c3c0fb8ec99aa6694ad24aa3e94d5f27bcd0358a9d3b04571 -address /run/containerd/containerd.sock
4021 ? Sl 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 0560f3b35bffc921cd86b01e6878cb936ba2dfb6e373300a11d839d71e991963 -address /run/containerd/containerd.sock
4197 ? Sl 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 952638341afc76bae529a94532fc0cc41c6cfcd368828521c9c806f90ac07dab -address /run/containerd/containerd.sock
4669 ? Sl 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id b6d347477abe4b43f14e4428dc4613b6a8b39e2afb5bf0f264e648d669579fbd -address /run/containerd/containerd.sock
4782 ? 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. 概念
这是一个在数据中心中设置的 Docker Swarm 结构框架图,其中包括以下部分:
- 三个节点(node-1,node-2,node-3)
- 每个节点都在运行一个服务副本(service-replica-1,service-replica-2,service-replica-3),这些服务副本都在 Docker 容器内部运行。
- 所有三个节点都连接到共享文件存储,允许不同节点上的容器访问共享数据。
这种设置的目标在于确保一个服务在多个服务器之间的高可用性和负载分布。
搭建步骤:
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 | 作用 |
---|---|---|
docker1 | 192.168.153.166 | 测试节点 |
docker2 | 192.168.153.160 | 测试节点 |
NFS服务器 | 192.168.153.167 | 数据共享的 |
-
搭建好nfs服务器
[root@nfs ~] yum install nfs-utils -y 记得在nfs服务器上重启nfs服务 service nfs restart
建议docker集群内的所有的节点都安装nfs-utils软件,因为节点服务器里创建卷需要支持nfs网络文件系统
防火墙和selinx必须关闭
-
在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
-
设置共享目录
[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
:将所有用户和用户组映射为匿名用户或用户组。anonuid
和anongid
:设置匿名用户或用户组的UID和GID。
-
共享出去
[root@nfs web] exportfs -rv exporting 192.168.153.0/24:/sc/web [root@nfs web]# '或者通过 service nfs restart 也可以'
-
设置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]#
-
在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]#
这些命令在完成一些文件系统的操作:
-
[root@docker-1 ~] mkdir /test
:这条命令在根目录下创建了一个名为test
的目录。 -
[root@docker-1 ~] cd /test/
:这条命令改变了当前工作目录到test
目录。 -
[root@docker-1 test] mount 192.168.153.167:/sc/web /test
:这条命令将了一个远程网络文件系统(来自 IP 地址为192.168.153.167
的服务器上的/sc/web
目录)挂载到本地的/test
目录。 -
[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]#
-
在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台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]#
-
访问创建的nginx web服务器,打开浏览器去访问
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(网络附加存储)的优点包括:
- 简易设置:NAS设备易于安装和设置,无需复杂的操作步骤,即可实现快速部署并建立起一个高效的存储环境。
- 高度可靠性:NAS采用冗余存储技术,如RAID(冗余磁盘阵列),可以在硬盘损坏时保持数据的完整性,提供更高的数据可靠性。
- 随时随地访问:无论你在哪里,只要有网络连接,你就可以访问NAS中的文件。
- 存储空间大:NAS提供了大量的存储空间,可以方便地备份和管理相册、视频、设计素材等。
- 套件丰富:NAS支持扩展更多可能性,例如,你甚至可以搭建一个自己专属的「爱奇艺」「微信读书」「QQ音乐」。
- 横向扩展功能:为NAS增加存储容量就和增加硬盘一样简单。您不必升级或更换现有的服务器,即可在不中断网络的情况下启用新的存储。
- 高性能:由于NAS专门用于提供文件服务,所以其他联网设备无需再提供文件服务。
- 运营维护成本低:NAS是一种采用直接与网络介质相连来实现数据存储的设备,其运营维护成本较传统存储服务器是非常低的。
成本:NAS设备的前期安装和设备成本可能比较高。
可扩展性:NAS的可扩展性可能受到设备大小的限制。
性能:NAS的存储性能有局限性,特别是在多台客户端访问NAS时,性能可能会大大下降。
数据安全:存储数据通过网络传输,因此可能容易产生数据泄漏等安全问题。
网络影响:存储数据通过网络传输,因此可能易受网络上其它流量的影响。
复杂的数据备份操作:NAS的数据备份操作可能比较复杂。
服务器瓶颈:服务器本身可能容易成为系统瓶颈。
服务器故障:如果服务器发生故障,数据可能无法访问。
设备管理:对于存在多个服务器的系统来说,设备可能分散,不便于管理。
这些缺点需要在选择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. 镜像里到底有什么?
- 操作系统
- 业务核心代码
- 系统工具
- 库
- 运行时的环境
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/bash
i=1
while true
do
echo "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语言核心代码
[root@docker-1 go] vim server.go
package main
import (
"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 "/"
把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]#
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" "-"
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]#
解决办法
[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]#
然后刷新页面
5. 小知识点
5.1. ip add没有看到ip地址
nmcli n off '关闭网卡'
nmcli n on '启动网卡'
再 ip add 查看一下