文章目录
第一章 Docker介绍
1.1 背景介绍
Docker是一个开源的应用容器引擎,基于LXC(Linux Container)内核虚拟化技术实现,提供一系列更强的功能,比如镜像、Dockerfile等。Docker理念是将应用及依赖包打包到一个可移植的容器,可发布到任意Linux发行版Docker引擎上。使用沙箱机制(对内容进行了独立包装)运行程序,程序之间互相隔离;Docker使用Go语言开发。
Docker采用C/S架构,Docker daemon作为服务端接受来自客户端请求,并处理这些请求,比如创建、运行容器等。客户端为用户提供了一系列的指令。
vmware虚拟机 + centos(ISO镜像) = 得到一个可以使用的Linux系统
传统的纯物理部署的缺点:

虚拟化技术:

虚拟化也有局限性,每一个虚拟机都是一个完整的操作系统,要分配系统资源,虚拟机多道一定程度时,操作系统本身资源也就消耗殆尽,或者说必须扩容。
虚拟化:云服务器,其实就是使用网上的虚拟机。
虚拟机工具巨头:
- vmware workstation (属于个人学习使用),主要是用于windows平台。创建虚拟机(安装系统)
- linux下的虚拟工具,kvm工具。(创建虚拟机+安装各种系统)
- 企业版虚拟化 vmware esxi虚拟化工具,高性能服务器结合。进行平台资源虚拟化。
云计算:将计算工作,放在云上去执行。例如:去阿里云购买RDS数据库服务,不需要自己搭建数据库,做数据库高可用等等。

1.2 虚拟化背景:
虚拟化(技术)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。
全虚拟化:VMware提出一种二进制翻译技术。VMware在虚拟机操作系统和宿主计算机(物理计算机+windows/mac操作系统)之间扮演一个桥梁的角色,将虚拟机中的要执行的指令“翻译”成恰当的指令在宿主物理计算机上执行,以此来模拟执行虚拟机中的程序。
半虚拟化(Xen内核定制修改),与全虚拟化相比避免了敏感指令(删除之类的)对本体系统的修改,降低操作风险。这项技术的代表是Xen,它最大的问题是需要修改操作系统源码,Linux开源倒是可以,windows是闭源的。
硬件辅助虚拟化(VT/AMD -v),CPU辅助虚拟化。
KVM-QEMU,KVM全称for Kernel -based Virtual Machine,意为基于内核的虚拟机。KVM作为一项虚拟化技术已经集成到Linux内核之中。也会安装出一个完整的操作系统,与VMware在这方面相同。
容器技术-LXC&Docker,前面的技术其虚拟化的目标都是一台完整的计算机,拥有底层的物理硬件、操作系统和应用程序执行的完整环境。为了让虚拟机中的程序实现像在真实物理机器上运行“近似”的效果,背后的HyperVisor做出了大量的工作(相当于装东西的盒子太过豪华,对于要装的内容来说其实没必要)。而docker 其实就满足了程序运行的环境需要(大小与外观适合的盒子,说装袜子就装袜子,想装衣服就重拿个盒子)。

1.3 容器技术
Docker 最初是DotCloud公司在法国期间发起的一个公司内部项目,后来以Apache2.0授权协议开源,其是由go语言开发的,基于Linux内核的Cgroups、NameSpace,以及Union FS(联合唯一文件系统)等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。
由于隔离的进程独立宿主机和其他隔离的进程(在本体主机上,运行两个端口相同的软件也不会冲突),也被称之为容器。
Docker被定义为开源的容器引擎,可以方便的对容器进行管理。如对镜像打包封装、引入Docker Registry对镜像统一管理。利用Docker可以实现开发、测试、生产环境的部署一致性,极大的减少运维成本。


1.4 容器和虚拟机的差异
1.4.1 传统虚拟机技术
虚拟机是虚拟出一套硬件,在其上运行一个完整的操作系统,例如我们使用KVM,指定系统镜像,然后装系统,最终可以使用,在该系统上再运行所需的应用程序
KVM创建虚拟机时,指定较少的CPU, 内存,硬盘等资源,虚拟机性能较低。

1.4.2 容器技术
容器内的应用程序直接运行在宿主机的内核上,容器内没有自己的内核,也没有对硬件进行虚拟,因此容器比起虚拟机更为轻便。(容器内的程序,就好比直接运行在宿主机上,能够使用宿主机最大的硬件资源,但程序之间又是隔离的。)
1.4.3 容器对比KVM的好处
- 容器能够提供宿主机原生的性能,而KVM虚拟机是分配宿主机硬件资源,性能较弱。
- 同样配置的宿主机,最多可以启动10个虚拟机的话,可以启动100+的容器数量。
- 启动一个KVM虚拟机,得有一个完整的开机流程,花费时间较长,或许得20s,而启动一个容器只需要1s.
- KVM需要硬件CPU的虚拟化支持,而容器不需要。
- docker提供了除内核以外完整的运行时环境,确保了应用环境的一致性。
第二章 Docker 基础组件
运行镜像生成容器。

2.1 Docker Daemon
安装使用Docker, 得先运行Docker Daemon进程(服务),用于管理docker。
- 镜像 images,构建容器(我们将应用程序所需的环境,打包为镜像文件)。镜像仓库(dockerhub),用于保存镜像文件,提供上传、下载镜像,作用好比GitHub。
- 容器 containers
- 网络 network
- 数据卷 Data Volumes
2.2 Rest 接口
提供和Daemon交互的Api接口
2.3 Docker Client
客户端使用Rest Api和Docker Daemon进行访问。
2.4 Docker 平台组成

2.5 Images
镜像是一个只读模板,用于创建容器,也可以通过Dockerfile文本描述镜像的内容。镜像的概念类似于编程开发里面对象的类,从一个基类开始(基础镜像Base Image)。构建容器的过程,就是运行镜像,生成容器实例。
Docker镜像的描述文件是Dockerfile,包含了如下的指令。
- FROM定义基础镜像
- MAINTAINER 作者
- RUN 运行Linux命令
- ADD 添加文件/目录
- ENV 环境变量
- CMD 运行进程
Dockerfile,将你部署项目的操作,写成一个部署脚本,这就是dockerfile,且该脚本还能够构建出 镜像文件。
2.6 Container
容器是一个镜像的运行实例,镜像>容器。
创建容器的过程:
- 获取镜像,如
docker pull centos,从镜像仓库拉取。 - 使用镜像创建容器。
- 分配文件系统,挂载一个读写层,在读写层加载镜像。
- 分配网络/网桥接口,创建一个网络接口,让容器和宿主机通信。
- 容器获取IP地址。
- 执行容器命令,如/bin/bash
- 反馈容器启动结果。
第三章 安装docker
提前准备好一个宿主机(vmware 去创建一个linux机器,然后安装docker去使用),虚拟化+容器
基础配置:
wget -0 /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -0 /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all 清除缓存
yum makecache 新建缓存
yum install -y bash-completion vim lrzsz wget expect net-tools nc nmap tree dos2unix htop iftop iotop unzip telnet sl psmisc nethogs glances bc ntpdate openldap-devel

第二步操作要是遇到问题,可以按照如下方式进行:



配置docker加速器:用于加速镜像文件的下载。

启动docker

综上所述是在Linux虚拟机上进行docker安装,我学习过程中实际使用的是docker for windows的图形界面+cmd中的命令。
第四章 docker 用法
4.1 操作步骤:
4.1.1 获取镜像,获取是从配置好的镜像站中去拉取镜像
# 查询相关镜像是否存在
docker search [image name]
# 如果直接下载,不加tag标签,会自动下载最新版本
docker pull [image name]
# 查看本地镜像
docker image ls
# 删除某个镜像
docker rmi [镜像ID]
4.1.2 运行镜像,生成容器。
# 运行镜像
docker run 参数 镜像的名字/ID
# 例如对Nginx的操作。-d 后台运行容器;
# -p 80:80,端口映射,即宿主机端口:容器内端口,访问宿主机的相应端口,就能访问到容器内相应的程序。
# 该命令会返回一个容器的ID
docker run -d -p 80:80 nginx
# 查看镜像
docker images
# 查看容器是否在运行
docker ps
# 此时可以访问宿主机的80端口,查看到容器内的80端口的应用是什么(实际操作时的端口应该是宿主机)
# 查看宿主机被占用的端口
netstat -ano
# 可以看到实际80端口,是被docker-proxy占用,将宿主机的端口代理到容器
# 可以停止容器
docker stop 镜像ID
第五章 docker 生命周期

dockerfile – bulid – tag – images – push (docker hub公开仓库)

5.0 centos7系统
我们使用VMware虚拟机安装的系统是一个完整的系统文件,包括两个部分:
- linux 内核,作用是提供操作系统的基本功能,和机器硬件交互(读取磁盘数据,管理网络)。
- centos7发行版,作用是提供软件功能,例如yum安装包管理等。
是否能够灵活的替换发行版,让我们使用不同的【系统】?
docker images就是实现这个功能的技术手段。

5.1 docker 镜像原理
下载Redis镜像时,实际下载了多行信息,最终得到了一个完整的镜像文件。
C:\Users\Administrator>docker pull redis
Using default tag: latest
latest: Pulling from library/redis
ae13dd578326: Pull complete
e6f25d21ebb3: Pull complete
601cc6106ba1: Pull complete
5b8be2fd806e: Pull complete
950c3791111a: Pull complete
567b7ad78092: Pull complete
Digest: sha256:771c20f2507b0e6b59a857abc3be09bb6764bb024db35f379ada9fe62ad932c5
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
docker images搜索地址:hub.docker
docker 具体解决了什么问题:

docker image
-
一个完整的docker镜像可以创建出docker容器的运行,例如一个centos:7.8.2003 镜像文件,我们获取的是centos 这个发行版,这个镜像文件是不包含linux内核的。(完整的操作系统是Linux+发行版)
-
docker的架构,镜像就是一个【发行版】的作用,需要准备好一个linux内核,然后上层使用不同的【发行版】就好了,这样我们就能够自由使用各种版本系统,兼容多种环境。
-

docker image是一层一层的构建的,最后一层才是容器层。(这个层在下载镜像时,对应了出现的pull complete)
当通过一个image启动容器时,docker会在该image最顶层,添加一个读写文件系统作为容器,然后运行该容器。
docker镜像本质是基于UnionFS管理的分层文件系统。
docker镜像 为什么才几百兆?
因为docker镜像只有rootfs和其他镜像层,共用宿主机的linux内核(bootfs),因此很小。为什么下载一个docker镜像,需要133MB?nginx安装包不是才几兆吗?
因为docker的Nginx镜像是分层的,Nginx安装包的确就几兆,但是一个用于运行的Nginx的镜像文件,依赖于父镜像(上一层),和基础镜像(发行版),所以下载的Nginx镜像有一百多兆。
dockerfile作用,自定义docker镜像的每一层的作用。
docker镜像定义
docker镜像不包括linux内核,和宿主机共用。
docker exec -it 容器id bash:进入到正在运行的容器。

docker 为什么分层镜像:
镜像分享一大好处就是共享资源,例如有多个镜像都来自于同一个base镜像,那么在docker host只需要存储一份base镜像。
内存里也只需要加载一份base image,即可为多个容器服务。
即使多个容器共享一个base镜像,某个容器修改了base镜像的内容,例如修改/etc/下配置文件,其他容器的/etc/下内容是不会被修改的,修改动作只限制在单个容器内,这就是容器的写入时复制特性(Copy-on-write)。
可写的容器层:
当容器启动后,一个新的可写成被加载到镜像的顶部, 这一层通常被称为 容器层,容器层 下的都称为“镜像层”。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VNOyL8Dz-1658045266506)(attachment:9f895ce09d424cdf150e4c7b903c14ab)]
所有对容器的修改动作,都只会发生在容器层里,只有容器层是可写的,其余镜像层都只是可读的。
| 文件操作 | 说明 |
|---|---|
| 添加文件 | 在容器中创建文件时,新文件被添加到容器中。 |
| 读取文件 | 在容器中读取某个文件时,docker会从上往下依次在各镜像层中查找此文件,一旦找到,立即将其复制到容器层,然后打开并读入内存。 |
| 修改文件 | 在容器中修改已存在的文件时,docker会从上往下依次在镜像层中查找此文件,一旦找到,立即将其复制到容器层,然后修改。 |
| 删除文件 | 在容器中删除文件时,docker也是从上往下依次在镜像层中查找此文件,找到后,会在容器层中记录下此删除操作。(只是记录删除操作) |
只有当需要修改时才复制一份数据,这种特性被称作Copy-on-Write(写时复制)。可见,容器层保存的是镜像变化的那份,不会对镜像本身进行任何修改。
容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。
5.2 docker 镜像的内容
docker镜像层级管理的方式大大便捷了Docker镜像的分发和存储,Docker hub 是全世界的镜像仓库。
- docker 镜像代表一个容器的文件系统内容。
- 镜像层级技术属于
联合文件系统。 - 容器是一个动态的环境,每一层镜像里的 文件都属于静态内容。
dockerfile 里的env,volume,cmd等内容都会落实到环境容器里。
UnionFS:

第六章 镜像
6.1 获取镜像
-
本地镜像导出、导入
-
私有仓库获取
-
从dockerhub获取镜像
docker默认的仓库是 dockerhub,不仅可以下载镜像还可以提交自己的镜像。
docker search 镜像名:tag (tag是具体的标签版本)
# 下载镜像
docker pull centos:t标签 (标签不写有默认)
# 查询docker的信息,可以对docker进行错误调试
docker info
# 查款docker镜像的存储路径
docker info |grep Root
>Docker Root Dir: /var/lib/docker (举例)
#在docker存储路径中,文件夹有buildkit\containers\image\network\overlay2\runtimes\swarm\tmp\trust\volumes
# 镜像存放目录如下图6.1所示

6.1参考图
生成容器
# -it 开启一个交互式的终端
# --rm 容器退出时,删除该容器
# centos 镜像名
docker run -it --rm centos bash
docker 镜像是分层存储的,两个及以上镜像存在相同的层次内容就会进行复用。如参考6.1图中的centos不同版本的镜像有两个,但是实际占用磁盘并不是412MB。
查看镜像
# 查看全部镜像
docker images
# 查看某个名称的镜像,附上镜像名
docker images centos
# 查看具体某一个镜像,附上tag
docker images centos:7.8.2003
# 只列出镜像的id
# -q 等于 --quit
docker images -q
# 格式化显示镜像
# format具体填写内容是以模板语言的形式录入
docker images --format "{{.ID}}--{{.Repository}}"
# 以表格形式显示,美化
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
# 搜索dockerhub 的镜像
docker search 镜像名
# 查看镜像详细信息
docker image inspect 镜像id
删除镜像:
# 删除镜像前需要删除依赖镜像的容器
# 根据名字
docker rmi centos
# id,指定id的前三位即可,完整id也行
docker rmi d11
# 批量删除镜像,最好别用
docker rmi `docker images -aq`
# 查看镜像
# -a 查看全部;-q 查看镜像id列表; -aq组合命令
# 列出所有id
docker images -aq
查看容器:
# 查看所有状态的容器,包括已经停运的
docker ps -a
导出导入镜像
# 默认运行的centos镜像,不提供vim功能,运行该容器后,在容器内安装vim
# 然后提交该镜像,在导出该镜像为压缩文件可以发给其他人用
#提交镜像
docker commit
# 导出镜像
# 保存镜像
docker image save centos:7.8.2003>/opt/centos7.8.2003.tgz
#导入镜像
docker image load -i /opt/centos7.8.2003.tgz
删除容器
docker rm 容器标识
# 批量删除容器
docker rm `docker ps -a`
第七章 docker 容器管理
docker run 镜像名:创建+启动。如果镜像不存在本地,则会在线下载该镜像。运行多个空的容器,并瞬间挂掉。
**容器内的进程必须处于前台运行状态,否则容器就会直接退出。**自己部署一个容器运行,命令不得后台运行,前台运行即可。
如果容器内什么也没错,容器也会挂掉。容器内必须有一个进程在前台内运行。
docker run -it 镜像名 bash:运行容器,并进入容器内
docker run 镜像名 命令:开启一个容器,让它执行一个命令。这里属于前台运行会卡主一个终端。
docker run -d 镜像名 :运行一个活着的容器。-d 参数让容器在后台跑(针对宿主机而言)
# 运行容器后,如果容器挂了就自动删除容器。
# -d 后台运行
# -rm 删除容器(容器挂掉后自动被删除)
# --name 为容器起名
docker run -d --rm --name pythonav centos:7.8.2003 命令
# 查看容器日志(查看的是容器的所有日志)
docker logs 容器id
# 查看容器日志
# -f 刷新日志
docker logs -f 容器id
# 查看容器中最新的5条日志
docker logs 容器id | tail -5
# 进入容器空间内
# -it交互操作;exec 进入正在运行的空间内。
docker exec -it 容器id bash
# 查看容器的详细信息
docker container inspect 容器id
# 容器的提交
docker commit 容器id 新的镜像名
# 容器的端口映射
# -p 宿主机端口:容器内暴露的端口
# 后台运行nginx容器,起个名字,端口映射宿主机的85端口,访问到容器内的80端口
docker run -d --name yang_nginx_85 -p 85:80 nginx
# 查看容器端口转发情况
docker port 容器id
# 随机端口映射
# -P 随机访问一个宿主机的空闲端口,映射到容器内打开的端口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dipqCdZz-1658045266511)(file://D:\temp1\utools.notes\508caf8a007e3317c73b659a57b48004.png)]
第八章 dockerfile
镜像是多层存储,每一层在前一层的基础上进行修改。
容器也是多层存储,以镜像为基础层,在其基础上加一层作为容器运行时的存储层。
8.1 dockerFile 镜像定制
定制docker镜像的方式:
手动修改容器内容,docker commit 提交容器为新的镜像。
基于Dockerflie自行编写指令,基于指令流程创建镜像。
dockerfile官方示例,https://github.com/CentOS/CentOS.Dockerfiles
dockerfile主要组成部分:
- 基础镜像信息 FROM centos:6.8
- 制作镜像操作指令 RUN yum insatll openssh-server -y
- 容器启动时执行指令 CMD[“/bin/bash”]
dockerfile指令
FROM 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER 告诉别人,谁负责养他?(指定维护者的信息,可以没有)
RUN 你想让他干啥(在命令前面加上RUN即可)
ADD 给它点创业资金,添加宿主机的文件到容器内,并自动解压
COPY 作用和ADD是一样的,都是拷贝宿主机的文件到容器内。COPY就是仅仅拷贝。
WORKDIR 我是cd, 今天刚化了妆 (设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置存储卷,挂载主机目录,数据目录映射)
EXPOSE 它要打开的门是啥(指定对外的端口)在容器内暴露一个窗口,端口EXPORT 80
CMD 奔跑吧,兄弟!(指定容器启动后要干的事情)
COPY
copy 指令从宿主机复制文件到容器内,形成新的一层镜像层。
如: copy chaoge.py /home/ (copy 宿主机文件 容器内的位置)
# 支持多个文件,以及通配符形式复制,语法要满足Golang的filepath.Match
copy chaoge* /tmp/cc?.txt. /home/ (copy 宿主机1类文件 1类文件 容器内的位置)
# COPY 指令能够保留源文件的元数据,如权限、访问时间等等!!!
ADD
特性和COPY基本一致
1. 源文件是一个URL,此时docker引擎会下载该连接,放入目标路径,且权限自动设为600,若这不是期望结果,还得增加一层RUN指令进行调整。
2.源文件是一个URL,且是一个压缩包,不会自动解压,也得单独用RUN指令解压。
3.源文件是一个压缩文件,且是gzip,bzip2,xz,tar情况,ADD指令会自动解压缩该文件到目标路径。
Dockerfile官方更为推荐使用COPY,ADD包含了更多复杂的功能,且ADD会使构建缓存失败,导致镜像构建缓慢。
CMD
用法,注意是 双引号
CMD ["参数1","参数2"]
在指定了entrypoint指令后,用CMD指定具体的参数。
docker 不是虚拟机,容器就是一个进程,既然是进程,那么程序在启动的时候需要指定运行参数,这就是CMD指令作用。
例如 centos 镜像默认的CMD是/bin/bash,直接docker run -it centos会直接进入bash解释器
也可以启动容器时候,指定参数,docker run -it centos cat /etc/os-releasea
CMD 运行shell 命令,也会被转化为shell形式
例如 CMD echo $PATH
会被转化为 CMD ["sh","-c","echo $PATH"]
容器内运行程序
需要注意,docker不是完整虚拟机的概念,虚拟机里的程序运行,基本上都是在后台运行,利用systemctl 运行,但是容器内没有后台进程的概念,必须要在前台运行。
容器就是为了主进程而存在的,主进程如果退出了,容器也就失去意义,自动退出。
CMD systemctl start nginx
这样的写法是错误的,容器会立即退出。
因为systemctl start nginx 是希望以守护进程形式启动nginx,且CMD命令会转化为
CMD ["sh", "-c","systemctl start nginx"]
这样的命令主进程是sh解释器,执行完毕后立即结束了,因此容器也就退出了。
因此正确的做法应该是CMD ["nginx","-g","daemon off;"] 前台运行
ENTRYPOINT
和RUN指令一样,分为两种格式。
- exec
- shell
作用和CMD一样,都是在指定容器启动程序以及参数。当指定了ENTRYPOINT 之后,CMD指令的语义就有了变化,将CMD的内容当做参数传递给ENTRYPOINT指令。
ARG和ENV指令
设置环境变量。举例如下图所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vA5L47CF-1658045266512)(file://D:\temp1\utools.notes\0550e4787e3c37ec6339bbd09412e0aa.png)]
# 预先设置环境变量
ENV NAME="xiaohong"
ENV AGE="18"
ENV MYSQL_VERSION=5.6
# 使用环境变量时,通过$加上变量名即可。便于维护Dockerfile脚本。
run yum install mysql-$(MYSQL_VERSION)
ENV 设置的环境变量,无论是在镜像构建时,还是容器运行时,该变量都可以使用。
ARG 设置的环境变量,只是用于构建镜像需要设置的变量,容器运行时就消失了。
VOLUME
镜像是分层存储的,镜像的可写成就是容器。容器在运行时,应该保证在存储层不写入任何数据,运行在容器内产生的数据,我们挂载写入到宿主机上,进行维护。
# 将容器内的data文件夹,在容器运行时,该目录自动挂载为匿名卷,任何向该目录中写入数据的操作,
# 都不会被容器记录,保证容器存储层无状态理念。
# 支持写入多个挂载的路径
VOLUME /路径
#eg
FORM centos
MAINTAINER melodyce
VOLUME ["/data1","/data2"]
# 该容器运行时,这昂个目录自动和宿主机的目录做好映射关系。
# 构建该镜像
docker build .
# 运行该镜像
docker run 镜像id
# 查看容器信息;查看mounts.截图中所示高亮的位置是容器在宿主机中的目录
docker inspect 容器id

容器数据挂载的方式:
1.通过Dockerfile,指定VOLUME目录。
2.通过docker run -v参数,直接设置需要映射挂载的目录。
EXPOSE
指定容器运行时对外提供的端口服务。
-
帮助使用该镜像的人,快速理解该容器的一个端口业务。
-
docker port 容器 docker run -p 宿主机端口:容器端口 docker run -P # 随机宿主机端口:容器端口,无需指定
WORKDIR
用于在dockerfile中,目录的切换,更改工作目录。
WORKDIR /opt # 目录切换
USER
用于改变环境,用于切换用户。
USER root
USER melodyce
dockerfile 实践
需求:通过dockerfile,构建nginx镜像,且运行容器后,生成页面。
# 1.创建Dockerfile,注意文件名必须是Dockerfile
FORM nginx
RUN echo '<meta charset=utf8>欢迎来到程序世界!' >
/user/share/nginx/html/index.html 将字符串重定向覆盖写入nginx首页
# 步骤1如图8.1所示
# 2. 构建dockerfile,进入Dockerfile文件所在目录,进行构建。
docker build .
# 3.修改新建镜像的名字
docker tag 新镜像的id 新镜像的名字
# 4.运行该镜像。正确运行会产生一个容器id
docker run -d -p 80:80 my-nginx
# 5.查看宿主机的80端口

图8.1
本文详细介绍了Docker的基础知识,包括Docker的背景、虚拟化技术的对比、容器与虚拟机的区别,以及Docker的基础组件如Docker Daemon、客户端和镜像。文章还探讨了Docker容器的生命周期,解释了Docker镜像的分层原理,强调了Docker在资源管理和效率方面的优势。最后,文章涵盖了Dockerfile的使用和Docker容器的管理。


1888

被折叠的 条评论
为什么被折叠?



