Docker容器全流程深度指南:从零到生产环境实战,一篇搞定所有核心技能!

废话不多说(博主花费3周利用碎片化时间整理,求赞 嘿嘿)

1、什么是容器?

1.1、Docker跟原有的工具区别

1.2、Docker对服务器端开发/部署带来的变化:

1.3、docker容器的优势

1.3.1、交付物标准化

1.3.2、应用隔离

1.3.3、一次构建,多次交付

1.4、Docker的度量(资源限制):

1.4.1、隔离性

1.4.2、可度量性

1.4.3、移植性

1.4.4、安全性

1.5、Docker容器的各位文件系统对比

1.5.1、 AUFS(Advanced Multi-Layered Unification Filesystem)

1.5.2、 OverlayFS(Overlay File System)

1.5.3、 Btrfs(B-Tree File System)

1.5.4、 Device Mapper

1.5.5、 ZFS

2.1、本地安装

2.2、官方脚本安装

2.3、阿里云yum安装

3.1、配置阿里云镜像加速

3.2、其他镜像源配置(拉取github需)

3.3、docker国内镜像源下载

3.3.1、网易蜂巢镜像库

四、docker基本概念

4.1、docker系统

4.2、docker三大核心组件(重要)

4.3、容器的三大组成要素

4.4、docker仓库

4.4.1、docker 云服务商仓库

4.4.2、docker公共仓库

4.4.3、docker私有仓库

4.5、docker镜像

4.5.1、镜像由三部分组成:

4.5.2、镜像的分类方式

4.5.3、镜像ID

4.6、docker容器

4.7、docker镜像命名解析

4.8、docker镜像和容器的区别

4.9、命名空间(重要)

4.9.1、uts 命名空间

4.9.2、user 命名空间

4.9.3、pid命名空间

4.9.4、net 命名空间

4.9.5、ipc 命名空间   

4.9.5.1、面试题:

4.9.6、mnt命名空间

五、镜像管理命令

5.1、命令合集

5.2、搜索镜像

5.3、查看镜像

5.3.1、查看本地镜像

5.3.2、查看镜像详情

5.3.3、查看所有镜像ID

5.3.4、查看镜像制作过程(构建历史)

5.4、删除镜像

5.5、更改镜像名

6.1、创建容器

6.1.1、创建但不启动

6.1.2、创建并启动

6.1.3、创建并后台启动

6.1.4、创建容器、并启动容器,自定义容器名称

6.1.5、创建容器、并开启容器端口给宿主机

6.2、查看命令

6.2.1、查看运行容器的状态

6.2.2、查看所有容器状态

6.2.3、仅显示已停止容器

6.2.4、查看容器详细信息

6.2.5、查看容器消耗资源情况

6.2.6、查看容器ip

6.3、断开容器(退出)

6.3.1、断开容器并关闭容器

6.3.2、断开容器但不关闭容器

6.4、启动、暂停、重启容器

6.4.1、启动容器

6.4.2、关闭容器

6.4.3、强制关闭所有启动状态的容器

6.4.4、重启容器

6.5、删除容器

6.5.1、删除容器

6.5.2、强制删除容器

6.5.3、删除所有启动状态的容器

6.5.4、删除所有容器

6.6、暂停容器内的进程(暂停容器)

6.7、让容器在后台运行

6.8、恢复容器在前台运行

6.9、修改容器名称

6.10、连接容器

6.11、查看容器日志

6.12、查看容器进程信息

6.13、wait查看退出码

6.14、主机和容器直接互相COPY文件

6.14.1、容器里拷贝文件到主机

6.14.2、主机里拷贝文件到容器内

7.1、容器打包、恢复

7.1.1、容器文件系统打包成镜像包

7.1.2、语法一

7.1.3、语法二

7.1.4、镜像包导入恢复

7.2、通过容器创建本地镜像

7.2.1、语法一

7.3、镜像打包、导入

7.3.1、镜像打包

7.3.2、镜像包导入

7.4、通过Dockerfile创建镜像(实操)

7.4.1、docker build配置及说明

7.4.2、创建测试页面

7.4.3、docker build语法(构建镜像)

7.4.4、验证镜像

7.4.5、运行容器

7.4.6、效果验证

7.4.7、扩展----CMD与ENTRYPOINT区别

7.4.8、dockerfile优化


1、什么是容器?

容器其实是一种沙盒技术。沙盒就是能够像一个集装箱一样,把你的应用"装"起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。

容器的本质到底是什么?

容器的本质是被隔离和资源限制的进程集合(容器内的进程无法访问容器外的进程)。容器镜像就是自带完整运行库和虚拟化环境的.exe安装包.

  • docker介绍

官网:https://www.docker.com

docker.io  ---docker官方库也叫docker-hub 

容器内的进程无法访问容器外的进程Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

1.1、Docker跟原有的工具区别

传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行;

1、rd(开发)开发产品(需要配置开发环境)lamp结构

2、测试(需要配置测试环境)

3.op(运维)上线(需要线上环境)

开发 测试  运维

有docker容器之后:

Docker的部署模式是:复制->运行。

1. rd(开发)开发产品(需要在docker容器里配置开发环境)      

2. 把容器打包成镜像交给运维,运维上线

1.2、Docker对服务器端开发/部署带来的变化:

  1. 快速部署
  2. 对于部署来说可以极大的减少部署的时间成本和人力成本
  3. Docker支持将应用打包进一个可以移植的容器中,重新定义了应用开发,测试,部署上线的过程,核心理念是 Build once, Run anywhere(一次构建多次使用)
  4. 1)标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;
  5. 2)节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;
  6. 3)方便构建基于微服务架构的系统,通过服务编排,更好的松耦合(开发搞得)
  7. 4)节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;

1.3、docker容器的优势

1.3.1、交付物标准化

Docker的标准化交付物称为"镜像",它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。

1.3.2、应用隔离

Docker可以隔离不同应用程序之间的相互影响,但是比虚拟机开销更小。总之,容器技术部署速度快,开发、测试更敏捷;提高系统利用率,降低资源成本

1.3.3、一次构建,多次交付

类似于集装箱的"一次装箱,多次运输",Docker镜像可以做到"一次构建,多次交付"。

1.4、Docker的度量(资源限制):

Docker是利用容器来实现的一种轻量级的虚拟技术,从而在保证隔离性的同时达到节省资源的目的。Docker的可移植性可以让它一次建立,到处运行。Docker的度量可以从以下四个方面进行

1.4.1、隔离性

 通过内核的命名空间来实现的,将容器的进程、网络、消息、文件系统和主机名进行隔离。

1.4.2、可度量性

 Docker主要通过cgroups控制组来控制资源的度量和分配。

1.4.3移植性

 Docker利用AUFS来实现对容器的快速更新。

 AUFS是一种支持将不同目录挂载到同一个虚拟文件系统下的文件系统,支持对每个目录的读写权限管理。AUFS具有层的概念,每一次修改都是在已有的只写层进行增量修改,修改的内容将形成新的文件层,不影响原有的层

1.4.4安全性

 安全性可以分为容器内部之间的安全性;容器与托管主机之间的安全性。

 容器内部之间的安全性主要是通过命名空间和cgroups来保证的。

 容器与托管主机之间的安全性主要是通过内核能力机制的控制,可以防止Docker非法入侵托管主机。

1.5、Docker容器的各位文件系统对比

1.5.1、 AUFS(Advanced Multi-Layered Unification Filesystem)

特点

最早的 Docker 默认存储驱动,基于联合挂载技术,支持多层镜像叠加。

启动速度快,适合开发环境。

优点

成熟稳定,社区支持广泛。

支持快速容器创建和销毁。

缺点

依赖 Linux 内核补丁,未被合并到主线内核,兼容性受限(仅适用于较旧内核版本)。

对并发写操作性能较差。

1.5.2、 OverlayFS(Overlay File System)

特点

当前 Docker 推荐的存储驱动,内核原生支持(Linux 4.0+)。

通过 lowerdir(只读层)和 upperdir(可写层)实现分层。

优点

性能优于 AUFS,尤其在大量小文件操作时。

内核原生支持,无需额外补丁,兼容性更好。

缺点:

在某些场景下(如频繁文件删除)可能导致 inode 耗尽问题。

对嵌套 OverlayFS 支持有限。

1.5.3、 Btrfs(B-Tree File System)

特点

基于 Btrfs 的子卷和快照功能实现镜像分层。

支持高级功能如数据去重、压缩和快照管理。

优点

存储效率高,适合大规模镜像管理。

快照功能便于备份和恢复。

缺点

稳定性相对较低,可能存在数据损坏风险。

配置复杂,对运维技能要求高。

1.5.4、 Device Mapper

特点

使用块设备映射技术,通过瘦供给(thin provisioning)管理存储。

默认用于 CentOS/RHEL 等发行版。

优点

支持块级存储,适合需要精细控制磁盘 I/O 的场景。

稳定性高,适合生产环境。

缺点:

存储效率较低,可能产生较大磁盘开销。

配置复杂,需预先分配存储池。

1.5.5、 ZFS

特点

基于 ZFS 文件系统的克隆和快照功能。

支持数据压缩、去重和高级存储管理。

优点

数据一致性和可靠性高。

存储优化能力强,适合大规模数据场景。

缺点

内存占用高,对硬件资源要求较高。

配置和维护复杂度高。

存储驱动

性能

稳定性

兼容性

适用场景

推荐指数

AUFS

开发测试、快速迭代

★★☆☆☆

OverlayFS

生产环境、通用需求

★★★★★

Btrfs

存储优化、企业级应用

★★★☆☆

Device Mapper

块存储需求、RHEL/CentOS 环境

★★★★☆

ZFS

高可靠性、数据中心

★★★☆☆

  • docker安装

2.1、本地安装

删除已经安装的docker环境

systemctl stop docker

docker rm -f $(docker ps -aq)   删除所有容器

docker rmi -f $(docker images -q) 删除所有镜像

yum remove docker \

               docker-client \

               docker-client-latest \

               docker-common \

               docker-latest \

               docker-latest-logrotate \

               docker-logrotate \

               docker-engine \

               docker-ce \

               docker-ce-cli \

               containerd.io

直接执行命令安装

[root@docker ~]# yum -y install epel*

[root@docker ~]# yum -y install docker

因为我的测试设备是centos9,所以yum安装的是podman-docker

正常启动方式:systemctl start docker

我的启动方式:systemctl start podman

注意甄别

验证安装

[root@docker ~]# docker version

Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.

Client:       Podman Engine

Version:      5.4.0

API Version:  5.4.0

Go Version:   go1.23.4 (Red Hat 1.23.4-1.el9)

Built:        Wed Feb 12 10:43:43 2025

OS/Arch:      linux/arm64

2.2、官方脚本安装

curl -fsSL https://get.docker.com -o install-docker.sh

sh install-docker.sh

2.3、阿里云yum安装

安装dockerYUM源

[root@docker ~]# yum config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@docker ~]# ls /etc/yum.repos.d/docker-ce.repo

/etc/yum.repos.d/docker-ce.repo

安装

 

[root@docker ~]#  yum -yinstall docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginn

查看版本

[root@docker ~]# docker version

Client: Docker Engine - Community

 Version:           28.0.0

 API version:       1.41 (downgraded from 1.48)

 Go version:        go1.23.6

 Git commit:        f9ced58

 Built:             Wed Feb 19 22:12:15 2025

 OS/Arch:           linux/arm64

 Context:           default



Server: linux/arm64/centos-9

 Podman Engine:

  Version:          5.4.0

  APIVersion:       5.4.0

  Arch:             arm64

  BuildTime:        2025-02-12T10:43:43-05:00

  Experimental:     false

  GitCommit:        

  GoVersion:        go1.23.4 (Red Hat 1.23.4-1.el9)

  KernelVersion:    5.14.0-503.el9.aarch64

  MinAPIVersion:    4.0.0

  Os:               linux

 Conmon:

  Version:          conmon version 2.1.12, commit: f174c390e4760883511ab6b5c146dcb244aeb647

  Package:          conmon-2.1.12-1.el9.aarch64

 OCI Runtime (crun):

  Version:          crun version 1.16.1

commit: afa829ca0122bd5e1d67f1f38e6cc348027e3c32

rundir: /run/crun

spec: 1.0.0

+SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +YAJL

  Package:          crun-1.16.1-1.el9.aarch64

 Engine:

  Version:          5.4.0

  API version:      1.41 (minimum version 1.24)

  Go version:       go1.23.4 (Red Hat 1.23.4-1.el9)

  Git commit:       

  Built:            Wed Feb 12 10:43:43 2025

  OS/Arch:          linux/arm64

  Experimental:     false
  • docker加速配置

使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此 DaoCloud 推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度。

Docker 加速器对 Docker 的版本有要求吗?    

需要 Docker 1.8 或更高版本才能使用。

Docker 加速器支持什么系统?    

Linux, MacOS 以及 Windows 平台。

公益镜像:https://1ms.run

3.1、配置阿里云镜像加速

阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单选中镜像加速器就可以看到

在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

tee /etc/docker/daemon.json <<-'EOF'

{

  "registry-mirrors": ["https://fwief3ik.mirror.aliyuncs.com"]

}

EOF

systemctl daemon-reload   //刷新配置

systemctl restart docker

验证:docker info 出现 Registry Mirrors:

  https://fwief3ik.mirror.aliyuncs.com/

则配置成功。

[root@docker ~]# docker info

...

 Registry Mirrors:

  https://fwief3ik.mirror.aliyuncs.com/

 Live Restore Enabled: false

3.2、其他镜像源配置(拉取github需)

镜像源汇总:https://www.coderjia.cn/archives/dba3f94c-a021-468a-8ac6-e840f85867ea

https://www.loridocker.com

尝试拉取nginx

[root@docker ~]# docker pull docker.1ms.run/nginx:latest

Using default tag: latest

latest: Pulling from library/nginx

d51c377d94da: Pull complete 

492c7b58b293: Pull complete 

587f328750b8: Pull complete 

60b452932acd: Pull complete 

c60ea76daae0: Pull complete 

fb23ee5f039b: Pull complete 

0b59f5cbcfb9: Pull complete 

Digest: sha256:9d6b58feebd2dbd3c56ab5853333d627cc6e281011cfd6050fa4bcf2072c9496

Status: Downloaded newer image for nginx:latest

docker.io/library/nginx:latest

查看本地镜像

[root@docker ~]# docker images

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE

nginx        latest    678546cdd20c   2 weeks ago   197MB

3.3、docker国内镜像源下载

3.3.1、网易蜂巢镜像库

镜像仓库_公开镜像仓库_私有镜像仓库_网易蜂巢-网易数帆

进入后注册即可

四、docker基本概念

4.1、docker系统

Docker系统有两个程序:docker服务端和docker客户端

docker服务端:是一个服务进程,管理着所有的容器。也叫docker engine(容器管理等

docker客户端:扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。(命令行工具等

大部分情况下,docker服务端和客户端运行在一台机器上

4.2、docker三大核心组件(重要)

Docker 镜像 - Docker  images 

Docker 仓库 - Docker  registeries

Docker 容器 - Docker  containers

4.3、容器的三大组成要素

命名空间 namespace:容器隔离(pid,net,mnt,user)

控制组 cgroups :资源(内存,cpu)

文件系统overlay2(UnionFS)

4.4、docker仓库

用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。

公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建

仓库(registry) -->Repository(仓库路径)-->镜像(按版本区分)

docker.io/centos:7

registry/repository:tag

4.4.1、docker 云服务商仓库

阿里云

网易蜂巢

daocloud

==

4.4.2、docker公共仓库

docker.io

docker官方库也叫docker-hub

类似于github一样,面向全球的一个docker镜像的公共仓库。如果在国内使用速度太慢。

4.4.3、docker私有仓库

个人或者公司部署的非公开库

4.5、docker镜像

Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。

 在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。由于 Docker 使用一个统一文件系统,由于镜像不可写,所以镜像是无状态的。

4.5.1、镜像由三部分组成:

镜像名称:仓库名称+镜像分类+tag名称(镜像版本)

1.存储对象:images

2.格式:库名/分类:tag

3.tag:表示镜像版本

4.5.2、镜像的分类方式

1.以操作系统名字    

centos的docker镜像:

centos5

centos6

centos7

2.以应用的名字

nginx的docker镜像

tomcat的docker镜像

mysql的docker镜像

3.完整镜像名称示例        

docker.io/library/nginx:v1

docker.io/library/nginx:latest

daocloud.io/library/nginx

4.5.3、镜像ID

所有镜像都是通过一个 64 位十六进制字符串来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的碰撞机率,所以服务器总是返回长ID。

镜像ID:64位的id号,一般我们看到的是12位的我们称之为短ID,只要我们每个ID号不冲突就可以了

镜像本身:是由一层一层的镜像合在一起的,最底层的镜像我们称为基础镜像,在这个基础镜像的基础上还可以在做镜像,在做的镜像称为子镜像,对于子镜像来讲在谁的基础之上做的就是父镜像。

基础镜像:一个没有任何父镜像的镜像,谓之基础镜像。

scratch (空镜像)

    |

centos:9(基础镜像)

    |

centos9+nginx (衍生镜像)

4.6、docker容器

Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。

4.7、docker镜像命名解析

首先要了解含义:Registry(镜像仓库地址)、Repository(仓库路径)、Tag(标签)

以下是格式:

[registry/][repository/]image_name[:tag]

[registry_host:port/][namespace/]repository:tag

实际用例:hub.c.163.com/public/nginx:1.2.1

4.8、docker镜像和容器的区别

区别大白话就是

镜像=网吧电脑(初始系统镜像)

容器=开机后的操作系统

等你重启后你在这个系统的操作就会被还原

维度

镜像

容器

用途

定义应用程序运行环境

运行应用程序实例

可修改性

只读

可读写(仅容器层)

存储方式

持久化(本地或仓库)

临时化(默认不保留修改)

创建方式

通过Dockerfile构建

通过镜像实例化(docker run)

资源占用

较大(包含完整依赖)

较小(共享镜像层,仅增加容器层)

典型操作

docker build, docker push

docker start, docker exec

4.9、命名空间(重要)

namespace  空间隔离

cgroup   资源限制

命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响

命名空间类型

隔离内容

典型应用场景

UTS

主机名、域名

容器自定义网络标识

User

用户和组ID映射

权限隔离与安全增强

PID

进程ID

容器内进程树独立性

Network

网络设备、IP、端口

虚拟网络环境构建

Mount

文件系统挂载点

容器文件系统隔离

IPC

进程间通信资源(消息队列等)

多容器间通信隔离

Cgroup

控制组层级视图

资源配额管理的逻辑隔离

4.9.1、uts 命名空间

UTS("UNIX Time-sharing System") 命名空间允许每个容器拥有独立的 hostname 和 domain name,才使其在网络上可以被视作一个独立的节点而非主机上的一个进程。隔离容器跟主机名,跟域名的空间)

4.9.2、user 命名空间

每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。(隔离主机名跟组名得空间)

4.9.3、pid命名空间

不同用户的进程就是通过 pid 命名空间隔离开的,且不同命名空间中可以有相同 pid。所有的 LXC 进程在 Docker中的父进程为Docker进程,每个 LXC 进程具有不同的命名空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。(隔离不同进程间的PID)

4.9.4、net 命名空间

有 了 pid 命名空间, 每个命名空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 命名空间实现的, 每个 net 命名空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。(做网络接口隔离的)

4.9.5、ipc 命名空间   

容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication - IPC),  包括信号量、消息队列和共享内存、socket、管道等。

4.9.5.1、面试题:

linux系统里面ipc通信有几种方式

socket:网络进程间的通信

管道:本地进程间的通信:echo  hello  | grep e

信号:kill -9 PID   这种我们叫信号量级,也是本地进程间的通信

共享内存:每个操作系统里面共享内存多大,是物理内存的一半

消息队列:百度搜

4.9.6、mnt命名空间

mnt 命名空间允许不同名字空间的进程看到的文件结构不同,这样每个命名空间  中的进程所看到的文件目录就被隔离开了。(隔离容器的目录)

五、镜像管理命令

5.1、命令合集

启动docker systemctl start docker

设置docker自启动 systemctl enable docker

查看docker版本信息 docker -v

查看docker版本与状态 docker version

查看docker运行状态 docker info

查看docker容器 docker ps

搜索镜像 docker search 搜索范围

按星级搜索镜像 docker search 搜索范围 --filter=stars=星级

查看本机镜像 docker images(旧)

查看本机镜像 docker images list(新)

查看镜像详细信息 docker image inspect 镜像ID号

查看所以镜像ID docker images -q

删除镜像 docker rmi 镜像名(或ID):版本号

强制删除镜像 docker rmi 镜像名 -f

删除所有镜像 docker images $(docker images -q)

下载指定镜像仓库(不知版本号默认最新) docker pull 镜像仓库名:版本号

上传指定镜像仓库 docker push 镜像仓库名:版本号

更改镜像仓库名和版本号 docker tag 镜像仓库名:版本号 新的镜像仓库名:新的版本号

5.2、搜索镜像

[root@docker ~]# docker search docker.1ms.run/nginx

NAME                                     DESCRIPTION                                     STARS     OFFICIAL

nginx                                    Official build of Nginx.                        20719     [OK]

nginx/nginx-ingress                      NGINX and  NGINX Plus Ingress Controllers fo…   102       

nginx/nginx-prometheus-exporter          NGINX Prometheus Exporter for NGINX and NGIN…   49        

nginx/unit                               This repository is retired, use the Docker o…   65        

nginx/nginx-ingress-operator             NGINX Ingress Operator for NGINX and NGINX P…   2         

nginx/nginx-quic-qns                     NGINX QUIC interop                              1         

nginx/nginxaas-loadbalancer-kubernetes                                                   0         

nginx/unit-preview                       Unit preview features                           0         

bitnami/nginx                            Bitnami container image for NGINX               199       

ubuntu/nginx                             Nginx, a high-performance reverse proxy & we…   128       

bitnamicharts/nginx                      Bitnami Helm chart for NGINX Open Source        0         

rancher/nginx                                                                            2         

kasmweb/nginx                            An Nginx image based off nginx:alpine and in…   8         

linuxserver/nginx                        An Nginx container, brought to you by LinuxS…   229       

redash/nginx                             Pre-configured nginx to proxy linked contain…   3         

dtagdevsec/nginx                         T-Pot Nginx                                     0         

paketobuildpacks/nginx                                                                   0         

vmware/nginx                                                                             2         

chainguard/nginx                         Build, ship and run secure software with Cha…   4         

gluufederation/nginx                      A customized NGINX image containing a consu…   1         

droidwiki/nginx                                                                          0         

intel/nginx                                                                              0         

circleci/nginx                           This image is for internal use                  2         

corpusops/nginx                          https://github.com/corpusops/docker-images/     1         

antrea/nginx                             Nginx server used for Antrea e2e testing        0  

查找 star 数至少为 100 的镜像,默认不加 s 选项找出所有相关 nginx 镜像      

[root@docker ~]# docker search --filter=stars=200 docker.1ms.run/nginx

NAME                DESCRIPTION                                     STARS     OFFICIAL

nginx               Official build of Nginx.                        20719     [OK]

linuxserver/nginx   An Nginx container, brought to you by LinuxS…   229

5.3、查看镜像

5.3.1、查看本地镜像

[root@docker ~]# docker image list

REPOSITORY             TAG       IMAGE ID       CREATED       SIZE

docker.1ms.run/nginx   latest    678546cdd20c   2 weeks ago   197MB

nginx                  latest    678546cdd20c   2 weeks ago   197MB

[root@docker ~]# docker images

REPOSITORY             TAG       IMAGE ID       CREATED       SIZE

docker.1ms.run/nginx   latest    678546cdd20c   2 weeks ago   197MB

nginx                  latest    678546cdd20c   2 weeks ago   197MB

5.3.2、查看镜像详情

[root@docker ~]#  docker image inspect 678546cdd20c

[

    {

        "Id": "sha256:678546cdd20cd5baaea6f534dbb7482fc9f2f8d24c1f3c53c0e747b699b849da",

        "RepoTags": [

            "docker.1ms.run/nginx:latest",

            "nginx:latest"

        ],

        "RepoDigests": [

            "docker.1ms.run/nginx@sha256:9d6b58feebd2dbd3c56ab5853333d627cc6e281011cfd6050fa4bcf2072c9496",

            "nginx@sha256:9d6b58feebd2dbd3c56ab5853333d627cc6e281011cfd6050fa4bcf2072c9496"

        ],

        "Parent": "",

        "Comment": "buildkit.dockerfile.v0",

        "Created": "2025-02-05T21:27:16Z",

        "DockerVersion": "",

        "Author": "",

        "Config": {

            "Hostname": "",

            "Domainname": "",

            "User": "",

            "AttachStdin": false,

            "AttachStdout": false,

            "AttachStderr": false,

            "ExposedPorts": {

                "80/tcp": {}

            },

            "Tty": false,

            "OpenStdin": false,

            "StdinOnce": false,

            "Env": [

                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",

                "NGINX_VERSION=1.27.4",

                "NJS_VERSION=0.8.9",

                "NJS_RELEASE=1~bookworm",

                "PKG_RELEASE=1~bookworm",

                "DYNPKG_RELEASE=1~bookworm"

            ],

            "Cmd": [

                "nginx",

                "-g",

                "daemon off;"

            ],

            "Image": "",

            "Volumes": null,

            "WorkingDir": "",

            "Entrypoint": [

                "/docker-entrypoint.sh"

            ],

            "OnBuild": null,

            "Labels": {

                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"

            },

            "StopSignal": "SIGQUIT"

        },

        "Architecture": "arm64",

        "Variant": "v8",

        "Os": "linux",

        "Size": 197285467,

        "GraphDriver": {

            "Data": {

                "LowerDir": "/var/lib/docker/overlay2/b17fbc16f2f0ba2d006659476f61fb49896849fef7a9f836a1b331a7a58e9ad2/diff:/var/lib/docker/overlay2/bdeab177c8eb40fe3517e9b19dcab605921e1c33f1ada31bb677a732ad845d1c/diff:/var/lib/docker/overlay2/2f587f1a1cc3ae5603895e102f4da82b7a10efc5f1901347ac4d9c00ac883195/diff:/var/lib/docker/overlay2/5e69e3b3faf3481f73fa293d2d7db70eea40c2cbcfc25c9108b242d0ebaa9875/diff:/var/lib/docker/overlay2/38d3817f912fc3b8efd8c1012a5dfc674e7289824584db99729931b897ea0746/diff:/var/lib/docker/overlay2/65d8a837f1b0535e89053d9aa97791811d2ef18046ae9e953e8b0a8ecd2fe647/diff",

                "MergedDir": "/var/lib/docker/overlay2/58d9687b12f36832b3dae2ac7a58a6b5a093123f0c5d2079050cd09354a58180/merged",

                "UpperDir": "/var/lib/docker/overlay2/58d9687b12f36832b3dae2ac7a58a6b5a093123f0c5d2079050cd09354a58180/diff",

                "WorkDir": "/var/lib/docker/overlay2/58d9687b12f36832b3dae2ac7a58a6b5a093123f0c5d2079050cd09354a58180/work"

            },

            "Name": "overlay2"

        },

        "RootFS": {

            "Type": "layers",

            "Layers": [

                "sha256:52d51720ba2d06cecaed7505a36dbdf74d33d70a2e064ed714f88fe08fd403de",

                "sha256:a0e17087bc6aa85a1e53141ba3aefd65390c0cf23bcf8e9e256be62dd1dbc431",

                "sha256:55c80bdf194c972540214cd32a19f9d7639e722259f68370c85a2a8af9cd1831",

                "sha256:de84c2fb18e8c98aaeec14e72f1fdbac796ae547bf60ca55599ce257e28673f3",

                "sha256:6280cdec38c173efdc07e7e90f239c3ba18ddec07a0f50a20db0bcecb5728614",

                "sha256:14916ed5c7892b043b565ce1a6865b5c8f251d2ffe4c8db556f302c78baccbde",

                "sha256:e22d4b0b4d6e90068bcacbf5f67f39d49a90e84237138e8d7cdf0673db134aeb"

            ]

        },

        "Metadata": {

            "LastTagTime": "0001-01-01T00:00:00Z"

        }

    }

]

5.3.3、查看所有镜像ID

[root@docker ~]# docker images -q

678546cdd20c

678546cdd20c

5.3.4、查看镜像制作过程(构建历史)

[root@docker ~]# docker history 678546cdd20c

IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT

678546cdd20c   2 weeks ago   CMD ["nginx" "-g" "daemon off;"]                0B        buildkit.dockerfile.v0

<missing>      2 weeks ago   STOPSIGNAL SIGQUIT                              0B        buildkit.dockerfile.v0

<missing>      2 weeks ago   EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0

<missing>      2 weeks ago   ENTRYPOINT ["/docker-entrypoint.sh"]            0B        buildkit.dockerfile.v0

<missing>      2 weeks ago   COPY 30-tune-worker-processes.sh /docker-ent…   4.62kB    buildkit.dockerfile.v0

<missing>      2 weeks ago   COPY 20-envsubst-on-templates.sh /docker-ent…   3.02kB    buildkit.dockerfile.v0

<missing>      2 weeks ago   COPY 15-local-resolvers.envsh /docker-entryp…   389B      buildkit.dockerfile.v0

<missing>      2 weeks ago   COPY 10-listen-on-ipv6-by-default.sh /docker…   2.12kB    buildkit.dockerfile.v0

<missing>      2 weeks ago   COPY docker-entrypoint.sh / # buildkit          1.62kB    buildkit.dockerfile.v0

<missing>      2 weeks ago   RUN /bin/sh -c set -x     && groupadd --syst…   100MB     buildkit.dockerfile.v0

<missing>      2 weeks ago   ENV DYNPKG_RELEASE=1~bookworm                   0B        buildkit.dockerfile.v0

<missing>      2 weeks ago   ENV PKG_RELEASE=1~bookworm                      0B        buildkit.dockerfile.v0

<missing>      2 weeks ago   ENV NJS_RELEASE=1~bookworm                      0B        buildkit.dockerfile.v0

<missing>      2 weeks ago   ENV NJS_VERSION=0.8.9                           0B        buildkit.dockerfile.v0

<missing>      2 weeks ago   ENV NGINX_VERSION=1.27.4                        0B        buildkit.dockerfile.v0

<missing>      2 weeks ago   LABEL maintainer=NGINX Docker Maintainers <d…   0B        buildkit.dockerfile.v0

<missing>      2 weeks ago   # debian.sh --arch 'arm64' out/ 'bookworm' '…   97.1MB    debuerreotype 0.15

5.4、删除镜像

注意!删除镜像如果报错,或者删的不彻底的话,就要看看镜像是否有加载成容器,如果有加载成容器的话,就要先把容器暂停,然后把镜像加载的那个容器删除掉,这样才能彻底删除镜像.!!!!!!

删除一个或多个,多个之间用空格隔开,可以使用镜像名称或id

docker rmi 镜像名或ID

[root@docker ~]# docker rmi 678546cdd20c

Error response from daemon: conflict: unable to delete 678546cdd20c (must be forced) - image is referenced in multiple repositories

上述报错是一个镜像ID被多个仓库引用,那么我们就通过名称删除

[root@docker ~]# docker rmi nginx

Untagged: nginx:latest

Untagged: nginx@sha256:9d6b58feebd2dbd3c56ab5853333d627cc6e281011cfd6050fa4bcf2072c9496

5.5、更改镜像名

docker tag docker.1ms.run/nginx:latest  nginx:latest

我们会发现它不是原基础修改,而是新增一个id一致的别名用于引用。如果要在原镜像修改,需要加-f(慎重)

[root@docker ~]# docker images 

REPOSITORY             TAG       IMAGE ID       CREATED       SIZE

docker.1ms.run/nginx   latest    678546cdd20c   2 weeks ago   197MB

[root@docker ~]# docker tag docker.1ms.run/nginx:latest  nginx:latest 

[root@docker ~]# docker images 

REPOSITORY             TAG       IMAGE ID       CREATED       SIZE

docker.1ms.run/nginx   latest    678546cdd20c   2 weeks ago   197MB

nginx                  latest    678546cdd20c   2 weeks ago   197MB
  • 容器管理命令

6.1、创建容器

6.1.1、创建但不启动

[root@docker ~]# docker create -it docker.1ms.run/nginx:latest  /bin/bssh

47a16d927c1766fd73216ea504d0436a80459a15ade74a9ec6e2a26da621d0ec

6.1.2、创建并启动

[root@docker ~]# docker create -it --restart=always docker.1ms.run/nginx:latest /bin/bash

f632952710d3c6db9ea8aaa94c9e1b74abdca0be0036b0c73f2848d04871be27

创建并启动(建议使用)

[root@docker ~]# docker run -it --restart=always -d docker.1ms.run/nginx:latest  /bin/bash

6.1.3、创建并后台启动

[root@docker ~]# docker run -itd --restart=always docker.1ms.run/nginx:latest /bin/bash

8a10bdd16755b8fb4cdf3b383ca23054302dcb85c4cc0a308c5d3b6d76e4dea8

-i :标准输入输出

-t:分配一个终端或控制台

--restart=always:   #当docker启动时容器也会随之启动 (docker启动时,容器是默认关闭的)    

也适用于create选项

-d 后台运行容器,并返回容器ID;

6.1.4、创建容器、并启动容器,自定义容器名称

docker run -it --restart=always --name 自定义容器的名称  镜像名称:镜像版本/bin/bash

[root@docker ~]# docker run -it --restart=always --name nginx docker.1ms.run/nginx:latest /bin/bash

root@04ec01d5b87d:/# 

如果你在执行docker run时没有指定--name,那么自动生成一个随机字符串UUID。这个UUID标识是由Docker deamon生成的。

6.1.5、创建容器、并开启容器端口给宿主机

docker run -it  -p 宿主机端口:容器端口  镜像ID或者镜像名:版本号

docker run -it --name jenkins1 -p 8081:8080 jenkins:v1 

#启动刚刚编辑好的容器,-it运行,容器取名jenkins1 -p 8081:8080 将访问宿主机的8081端口映射到容器的8080端口,jenkins:v1 使用jenkns镜像的v1版本

如果一开始没有映射端口,那么如何访问容器的端口呢?

第一种就是在宿主机查询出容器的ip,宿主机通过容器ip+端口访问。(临时)

第二种就是重新创建容器并映射端口

6.2、查看命令

6.2.1、查看运行容器的状态

docker ps

[root@docker ~]# docker ps

CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS          PORTS     NAMES

04ec01d5b87d   docker.1ms.run/nginx:latest   "/docker-entrypoint.…"   6 minutes ago    Up 1 second     80/tcp    nginx

8a10bdd16755   docker.1ms.run/nginx:latest   "/docker-entrypoint.…"   9 minutes ago    Up 9 minutes    80/tcp    priceless_heyrovsky

7b9896cad565   docker.1ms.run/nginx:latest   "/docker-entrypoint.…"   21 minutes ago   Up 12 minutes   80/tcp    beautiful_khorana

6.2.2、查看所有容器状态

docker ps -a

[root@docker ~]# docker ps -a

CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS              PORTS     NAMES

04ec01d5b87d   docker.1ms.run/nginx:latest   "/docker-entrypoint.…"   7 minutes ago    Up About a minute   80/tcp    nginx

8a10bdd16755   docker.1ms.run/nginx:latest   "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes       80/tcp    priceless_heyrovsky

7b9896cad565   docker.1ms.run/nginx:latest   "/docker-entrypoint.…"   22 minutes ago   Up 14 minutes       80/tcp    beautiful_khorana

f632952710d3   docker.1ms.run/nginx:latest   "/docker-entrypoint.…"   25 minutes ago   Created                       gifted_borg

47a16d927c17   docker.1ms.run/nginx:latest   "/docker-entrypoint.…"   26 minutes ago   Created                       funny_driscoll

6.2.3、仅显示已停止容器

[root@docker ~]# docker ps -f "status=exited"

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

6.2.4、查看容器详细信息

inspect  :用于查看容器的配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等。

目标:查找某一个运行中容器的id,然后使用docker inspect命令查看容器的信息。

提示:可以使用容器id的前面部分,不需要完整的id。

docker inspect 容器名或容器ID   #机器上运行的一个容器ID或者容器名称

[root@docker ~]# docker inspect nginx

6.2.5、查看容器消耗资源情况

前提是容器得启动,才能查看容器消耗资源的情况

docker stats

CONTAINER ID   NAME                  CPU %     MEM USAGE / LIMIT   MEM %     NET I/O         BLOCK I/O   PIDS 

04ec01d5b87d   nginx                 0.00%     772KiB / 1.6GiB     0.05%     3.27kB / 126B   0B / 0B     1 

8a10bdd16755   priceless_heyrovsky   0.00%     772KiB / 1.6GiB     0.05%     3.97kB / 126B   0B / 0B     1 

7b9896cad565   beautiful_khorana     0.00%     768KiB / 1.6GiB     0.05%     4.36kB / 126B   0B / 0B     1 

6.2.6、查看容器ip

docker inspect my-web 

my-web 是容器名

6.3、断开容器(退出)

6.3.1、断开容器并关闭容器

exit

6.3.2、断开容器但不关闭容器

ctrl +p +q  建议关闭终端会话即可(我的mac无法如此)

6.4、启动、暂停、重启容器

6.4.1、启动容器

# docker start  容器名称或ID 

[root@docker ~]# docker start nginx

nginx

6.4.2关闭容器

docker stop 容器名或容器ID  #关闭容器

[root@docker ~]# docker stop nginx

nginx

docker  kill  容器名称或容器ID  #强制关闭容器

[root@docker ~]# docker  kill nginx

nginx

stop和kill的区别:

​    docker stop命令给容器中的进程发送SIGTERM信号,默认行为是会导致容器退出,当然,容器内程序可以捕获该信号并自行处理,例如可以选择忽略。而docker kill则是给容器的进程发送SIGKILL信号,该信号将会使容器必然退出。

6.4.3、强制关闭所有启动状态的容器

docker kill $(docker ps  -q)

[root@docker ~]#  docker kill $(docker ps  -q)

8a10bdd16755

7b9896cad565

6.4.4、重启容器

docker restart 容器名或容器ID

[root@docker ~]# docker restart nginx

nginx

6.5、删除容器

6.5.1、删除容器

注意:删除容器的话要先stop容器才能删除,不然会报错

docker rm 容器id或容器名称

[root@docker ~]# docker rm nginx

nginx

6.5.2强制删除容器

docker rm 容器id或容器名称 -f  

[root@docker ~]# docker rm nginx -f

nginx

6.5.3删除所有启动状态的容器

docker rm -f $(docker ps  -q)

6.5.4、删除所有容器

注意:删除容器的话要先stop容器才能删除,不然会报错

docker rm $(docker ps -qf status=exited)

6.6、暂停容器内的进程(暂停容器)

暂停容器内所有的进程,但是不暂停容器

[root@docker ~]# docker pause nginx 

nginx

恢复容器内的进程

[root@docker ~]# docker unpause nginx

nginx

6.7、让容器在后台运行

# docker run -itd 镜像ID /bin/bash

 如果在docker run后面追加-d=true或者-d,那么容器将会运行在后台模式。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为容器不再监听你执行docker run的这个终端命令行窗口。但你可以通过执行

6.8、恢复容器在前台运行

docker attach 容器ID/容器名字

6.9、修改容器名称

docker rename 旧的名称   新的名称  

[root@docker ~]# docker rename nginx nginx_new 

6.10、连接容器

前提是容器得启动,才能连接的到

docker exec -it  容器id  /bin/bash

[root@docker ~]# docker exec -it nginx_new /bin/bash

root@80afafece35f:/# 

6.11、查看容器日志

docker logs -f nginx_new(nginx_new为容器名称)

6.12、查看容器进程信息

docker top nginx_new(nginx_new为容器名称)

[root@docker ~]# docker top nginx_new

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD

root                16005               15983               0                   Feb26               pts/0               00:00:00            nginx: master process nginx -g daemon off;

101                 16035               16005               0                   Feb26               pts/0               00:00:00            nginx: worker process

101                 16036               16005               0                   Feb26               pts/0               00:00:00            nginx: worker process

6.13、wait查看退出码

wait:捕捉容器停止时的退出码

docker awit nginx_new

状态码:0表示正常退出  非0为异常  125是docker守护进程本身的错误

6.14、主机和容器直接互相COPY文件

6.14.1、容器里拷贝文件到主机

docker cp 容器名:拷贝文件路径 拷贝文件放主机路径

docker cp nginx_new:/tmp/abc.sh /root


[root@docker ~]# docker start nginx_new

nginx_new

[root@docker ~]# docker exec -it nginx_new /bin/bash

root@80afafece35f:/# cd /tmp/

root@80afafece35f:/tmp# touch abc.sh

root@80afafece35f:/tmp# exit

exit

[root@docker ~]# docker cp nginx_new:/tmp/abc.sh /root

Successfully copied 1.54kB to /root
[root@docker ~]# ls

1ms-helper.bin  abc.sh           Desktop    Downloads          linux.sh  Pictures  Templates

200             anaconda-ks.cfg  Documents  install-docker.sh  Music     Public    Videos

6.14.2、主机里拷贝文件到容器内

docker cp 主机文件路径 容器名:/拷贝文件放置路径

docker cp /root/bbb.sh nginx_new:/tmp

[root@docker ~]# docker cp /root/bbb.sh nginx_new:/tmp

Successfully copied 1.54kB to nginx_new:/tmp

  • 容器、镜像、打包、制作、迁移

7.1、容器打包、恢复

7.1.1、容器文件系统打包成镜像包

将容器的文件系统打包成tar文件,也就是把正在运行的容器直接导出为tar包的镜像文件

类似一个静态文件目录打包,不包含镜像的元数据(如历史层、启动命令、环境变量等)

就是将更改后的容器导出成镜像包,跟虚拟机的快照一个意思,只不过这个镜像包是可以用在其他机器上。

7.1.2、语法一

docker export -o 自定义导出包的名称.tar 容器ID

[root@docker ~]# docker export -o ngingx_jx.tar 80afafece35f

7.1.3、语法二

docker export 容器名称 > 镜像.tar

[root@docker ~]# docker export nginx_new>ngingx_jx2.tar

7.1.4、镜像包导入恢复

就是将打包好的镜像包导入到本地的docker镜像库里

docker import 镜像包 自定义镜像名称:自定义版本

[root@docker ~]# docker import ngingx_jx.tar nginx:1.1

sha256:9659d81a794e1d572e32451a9d3c60cec6b80eb7a74560dce70e4f1ef46c826e

如果需要将镜像包发送到其他机器的话就直接scp将镜像包拷贝过去即可

7.2、通过容器创建本地镜像

容器运行起来后,又在里面做了一些操作,并且要把操作结果保存到镜像里

方案:

使用 docker commit 指令,把一个正在运行的容器,直接提交为一个镜像。

  commit 是提交的意思,类似告诉svn服务器我要生成一个新的版本。

就是给容器拍摄一个快照,只不过拍的快照变成镜像而已

7.2.1、语法一

docker commit 容器ID 自定义镜像名:自定义版本

[root@docker ~]# docker commit  b5acd4169785  nginx1.2

sha256:0ed04697b77b0ed17048a33f14c657bb0c6df52dc1aad4828d98e16d269eadd9

[root@docker ~]# docker images

REPOSITORY             TAG       IMAGE ID       CREATED          SIZE

nginx1.2               latest    0ed04697b77b   24 seconds ago   196MB

nginx                  1.1       9659d81a794e   26 minutes ago   196MB

docker.1ms.run/nginx   latest    678546cdd20c   3 weeks ago      197MB

nginx                  latest    678546cdd20c   3 weeks ago      197MB

注释

docker commit -m "my images version1" -a "soso" 108a85b1ed99 daocloud.io/ubuntu:v2

-m                           添加注释

-a                           作者

108a85b1ed99                 容器环境id

daocloud.io/ubuntu:v2      镜像名称:hub的名称/镜像名称:tag 

-p,–pause=true              提交时暂停容器运行

7.3、镜像打包、导入

7.3.1、镜像打包

完整镜像(包含所有层、元数据、标签等信息)

本地将镜像打包成镜像.tar包

语法:

docker save -o 镜像包名.tar 镜像名

[root@docker ~]# docker save -o nginx_jx1.jar nginx1.2:latest 

7.3.2、镜像包导入

docker load < 镜像包名.tar

[root@docker ~]# docker load < nginx_jx1.jar 

Loaded image: nginx1.2:latest

7.4、通过Dockerfile创建镜像实操

Docker 提供了一种更便捷的方式,叫作 Dockerfile

docker build命令用于根据给定的Dockerfile构建Docker镜像。(步骤可追溯)

Dockerfile就是你不用创建容器,运行Dockerfile文件后,文件里的配置会帮你自动配置好你想要的镜像,前提是你得在镜像里写配置的信息

编写 Dockerfile → 执行 docker build → 运行容器

7.4.1、docker build配置及说明

创建目录

[root@docker ~]# mkdir build_test

创建docker build文件

[root@docker ~]# cd build_test/

[root@docker build_test]#  touch Dockerfile

编写docker bulid文件

# Dockerfile Comment

FROM nginx:1.1

COPY ./index.html /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

语法

说明

FROM

指定基础镜像(如 FROM ubuntu:22.04)

WORKDIR

设置容器内的工作目录(类似 cd)

COPY

复制宿主机文件到镜像中(如 COPY ./app /app)

ADD

类似 COPY,但支持自动解压或拉取远程 URL(慎用)

RUN

在镜像内执行命令(如安装依赖:RUN apt-get update && apt-get install -y nginx)

ENV

设置环境变量(如 ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk)

EXPOSE

声明容器运行时监听的端口(如 EXPOSE 80)

CMD

指定容器启动时的默认命令(只能有一个 CMD)

ENTRYPOINT

类似 CMD,但参数不会被覆盖(通常与 CMD 结合使用)

7.4.2、创建测试页面

[root@docker build_test]# echo "<h1>Hello 这是测试页面</h1>" > index.html

7.4.3、docker build语法构建镜像

docker  build  选项  生成镜像名:自定义版本  .   #注意后面还有个点

. 表示的意思是当前目录下的所有文件

-t 表示指定镜像名称和标签

[root@docker build_test]# docker build -t my-nginx_test:1.0 .

2025/02/27 12:27:23 in: []string{}

2025/02/27 12:27:23 Parsed entitlements: []

[+] Building 0.2s (7/7) FINISHED                                                                                            docker:default

 => [internal] load build definition from Dockerfile                                                                                  0.0s

 => => transferring dockerfile: 218B                                                                                                  0.0s

 => [internal] load metadata for docker.io/library/nginx:1.1                                                                          0.0s

 => [internal] load .dockerignore                                                                                                     0.0s

 => => transferring context: 2B                                                                                                       0.0s

 => [internal] load build context                                                                                                     0.0s

 => => transferring context: 131B                                                                                                     0.0s

 => [1/2] FROM docker.io/library/nginx:1.1                                                                                            0.0s

 => [2/2] COPY ./index.html /usr/share/nginx/html                                                                                     0.0s

 => exporting to image                                                                                                                0.0s

 => => exporting layers                                                                                                               0.0s

 => => writing image sha256:a7abceb34399e7314ad53905040229c4c81db6bf9980714b47214ee7d1eb2924                                          0.0s

 => => naming to docker.io/library/my-nginx_test:1.0                                                                                  0.0s

7.4.4、验证镜像

[root@docker build_test]# docker images 

REPOSITORY             TAG       IMAGE ID       CREATED             SIZE

my-nginx_test          1.0       a7abceb34399   40 seconds ago      196MB

nginx1.2               latest    0ed04697b77b   49 minutes ago      196MB

nginx                  1.1       9659d81a794e   About an hour ago   196MB

docker.1ms.run/nginx   latest    678546cdd20c   3 weeks ago         197MB

nginx                  latest    678546cdd20c   3 weeks ago         197MB

7.4.5、运行容器

[root@docker build_test]# docker run -d -p 8080:80 --name my-web my-nginx_test:1.0

669762f7ce67a478333495dad889de5a35c75429ca6bf03839f139dfa714ccaf

7.4.6、效果验证

[root@docker build_test]# docker inspect my-web | grep IPAddress

            "SecondaryIPAddresses": null,

            "IPAddress": "172.17.0.4",

                    "IPAddress": "172.17.0.4",

[root@docker build_test]# curl 172.17.0.4

<h1>Hello 这是测试页面</h1>

7.4.7、扩展----CMD与ENTRYPOINT区别

一、dockerfile中的 CMD

1、每个dockerfile中只能有一个CMD如果有多个那么只执行最后一个。

2、CMD 相当于启动docker时候后面添加的参数看,举个简单例子:

# docker run -itd --name test image(镜像) /bin/bash -c

a、镜像名称后面跟了一个/bin/bash -c ,其实等价于在dockerfile中的CMD ["/bin/bash","-c"]。

b、如果dockerfile中的CMD中有了CMD["/bin/bash","-c"],那么就不用在执行的时候再添加了,如果添加了参数的话那么就相当于要执行你添加的参数,默认的CMD中的参数就无效了。

二、dockerfile中的ENTRYPOINT

1、一个dockerfile中ENTRYPOINT也只能存在一个,若存在多个那么只执行最后一个,你可以理解为开机启动的意思,和CMD有点像,不过还是有区别。

2、举个简单例子:

a、dockerfile中有ENTRYPOINT ["tail","-f","/var/log/nginx/access.log"],那么启动的时候镜像就执行了这个里面的内容,如果你像上面带参数的话就相当于在这个执行的内容后面再加入参数。

案例:

如果我们的dockerfile中有a中的这句话然后我们启动我们的docker:

#docker run -itd --name test image(镜像名) /bin/bash -c

此时就相当于我们启动docker的时候执行了:tail -f /var/log/nginx/access.log /bin/bash -c

这个命令明显就不对.

7.4.8、dockerfile优化

编译一个简单的nginx成功以后发现好几百M。

1、分离编译环境和运行环境,剔除无用依赖,大幅减小生产镜像体积。

2、每次进行依赖安装后,记得yum clean all【centos】 

#yum clean all 清除缓存中的rpm头文件和包文件

3、选择比较小的基础镜像。alpine

4、合并 RUN 指令

5、配置写好后用ai工具让他给你再检查下是否还能再优化,善于利用AI工具

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全镇人的希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值