0

0

From Docker to Kubernetes(一)- Image And Container

雪夜

雪夜

发布时间:2025-07-23 11:30:26

|

878人浏览过

|

来源于php中文网

原创

一、docker概述

首先,Docker是一种容器技术的实现,那么什么是容器呢?

From Docker to Kubernetes(一)-  Image And Container

容器可以在许多主流操作系统上运行,一个操作系统上可以运行多个容器,这些容器共享同一个操作系统内核。容器之间相互隔离,对软件及其依赖进行标准化打包。容器与虚拟机有什么区别呢?

From Docker to Kubernetes(一)-  Image And Container

容器是在应用层面进行隔离,而虚拟机是在物理资源层面进行隔离。

二、下载和安装Docker

关于Docker Desktop的安装说明,请参考在Mac上安装Docker Desktop和在Windows上安装Docker Desktop。

三、Docker镜像

Docker镜像包括Ubuntu镜像、CentOS镜像和Debian镜像,这些都是基础镜像。

From Docker to Kubernetes(一)-  Image And Container

Docker镜像是文件和元数据的集合,镜像是分层的,每一层可以添加或删除文件,从而形成一个新的镜像。不同的镜像可以共享相同的层,镜像本身是只读的。安装完成后启动Docker。

sudo systemctl start docker

查看Docker版本:

docker version

查看镜像列表:

sudo docker image ls

获取镜像:

在获取镜像之前,先给用户授权,输入Docker命令前不需要再加sudo。

sudo groupadd docker
sudo gpasswd -a vagrant docker
# 重启Docker服务
sudo service restart docker.service
# 退出客户端
exit
# 重连客户端
vagrant ssh
# 查看Docker版本
docker version

从Docker Hub中拉取镜像,Docker Hub类似于GitHub,上面保存了各种构建后的镜像,可以通过docker pull命令直接拉取镜像。

docker pull ubuntu:14.04
docker pull bitnami/wordpress

构建一个Docker镜像:

从零构建一个镜像,首先拉取hello-world镜像并运行该镜像。

docker pull hello-world
docker run hello-world

hello-world镜像运行后会打印出hello world,然后自动退出。制作一个hello-world镜像,首先准备一个.c文件。

#include
int main(){
  printf("Hello,Docker;This is your first Image\n")
}

接着在Docker命令行中开始制作hello-world镜像。

mkdir hello-world
cd hello-world
# 创建一个C文件,内容见下一个代码块
vi hello.c
# 编译二进制文件
# 首先安装工具
sudo yum install gcc
sudo yum install glibc-static
gcc -static hello.c -o hello
# 执行程序
./hello
# 创建Dockerfile,内容见Dockerfile代码块
vim Dockerfile
# 构建镜像
docker build -t jingnan/hello-world .
# 查看镜像
docker images
# 查看镜像分层
docker history jingnan/hello-world
# 运行容器
docker run jingnan/hello-world

Dockerfile内容:

FROM scratch
ADD hell0 /
CMD ["/hello"]

四、Docker容器

Docker容器是通过Docker镜像创建的,在镜像层上建立一个可读写的容器层。镜像负责应用的存储和分发,而容器负责运行应用。两者的关系就像面向对象中的类和实例,一个镜像可以启动多个容器,但容器名称不能相同。容器命令:

# 列举正在运行的容器,也可以使用docker ps
docker container ls
# 列举出所有的容器,包含已经退出的容器
docker ps -a
docker container ls -a
# 运行容器,运行之后会立即退出
docker run centos
# 查看容器列表,不包含刚刚运行的centos
docker container ls
# 交互式运行容器,添加参数 -it 进入到容器中,可以在容器中进行操作
docker run -it centos
# 再次查看running的容器,包含了centos
docker container ls
# 删除容器,可以只写部分ID
docker container rm 
# 删除所有容器,-q参数表示只列举出ID
docker container rm $(docker ps -a -q)
# 列举已经退出的容器
docker container ls -f "status=exited" -q
# 删除已经退出的容器
docker rm $(docker container ls -f "status=exited" -q)
# 删除镜像
docker image rm 

容器操作:停止、删除、运行

exec:exec表示对容器执行一个命令,exec /bin/bash 表示进入容器中,查看运行状态。

--name: 创建容器时,给容器一个自定义的名字。

inspect:显示容器的详细信息。

logs: 查看容器产生的日志。

Heeyo
Heeyo

Heeyo:AI儿童启蒙陪伴师,风靡于硅谷的儿童AI导师和玩伴

下载
# 启动容器
docker start d7
# 执行 /bin/bash,进入交互界面
docker exec -it d7 /bin/bash
exit
# 执行python命令,进入python shell界面
docker exec -it d7 python
exit()
# 执行查看ip的命令
docker exec -it d7 ip a
docker stop d7
docker rm $(docker ps -a -a)
# 重新创建一个新的容器,并添加--name参数,给容器一个自定义的名字
docker run -d --name=demo jingnanjia/flash-hello-world
docker inspect
docker logs

构建私人Docker镜像:

首先认识两个命令:

# 基于容器,做了一些改变,如安装一些软件,再创建一个新的镜像
docker container commit
# 从Dockerfile build一个Image,从基础Image开始
docker container build

COMMIT实践:基于centos容器构建一个新的镜像。

docker image ls
# 运行centos,并进入centos交互界面
docker run -it centos
# 对centos容器做一些更改,安装vim,并退出
yum install vim
exit
# 将container构建成一个镜像,stupefied_hertz是容器的名字,stupefied_hertz是新镜像的名字
docker commit stupefied_hertz jingnan/centos-vim
# 查看镜像构建历史
docker history jingnan/centos-vim

Dockerfile实践:

mkdir docker-centos-vim
cd docker-centos-vim
vim Dockerfile
# 构建镜像,构建过程中会生成一个临时Container,在临时Container做了操作后再build
docker build -t jingnan/centos-vim-new .
# 查看镜像列表
docker images

Dockerfile内容:

FROM centos
RUN yum install -y vim

Dockerfile之FROM关键字的语法:

FROM是Dockerfile最开头的语法,FROM scratch表示从0开始构建一个镜像,FROM尽量使用官方的镜像。

Dockerfile之LABEL关键字的语法:

LABEL类似代码中的注释,如:

LABEL maintainer="stark@stark-industry.com"
LABEL version="mark-50"
LABEL description="This is description"

Dockerfile之RUN关键字语法:

RUN表示运行一些命令,每执行一次RUN,镜像都会增加一层,如果需要执行多条命令使用&&连接两条命令,命令过长使用\换行。

RUN yum update && yum install -y vim python-dev
RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'

Dockerfile之WORKDIR关键字语法:

WORKDIR作用是设定当前工作目录,要尽量使用绝对目录。

WORKDIR /root
WORKDIR /test # 如果没有则会自动创建

Dockerfile之ADD、COPY:

将本地文件添加到镜像文件里面,COPY由于ADD,ADD还可以解压。

ADD hello /
COPY hello test/

Dockerfile之ENV:

ENV命令用来设置常量。

ENV MYSQL_VERSION 8.0

ENTRYPOINT语法实践:

mkdir cmd_vs_entrypoint
cd cmd_vs_entrypoint
# dockerfile内容如下
vim Dockerfile
docker build -t jingnan/centos-entrypoint-shell .
docker images
# 运行镜像,打印出hello Docker
docker run jingnan/centos-entrypoint-shell
# 修改为EXEC格式
docker build -t jingnan/centos-entrypoint-exec .
docker images
# 打印出 hello $name
docker run jingnan/centos-entrypoint-exec
# 修改Dockerfile,再次build
vim Dockerfile
docker build -t jingnan/centos-entrypoint-exec-new .
docker run jingnan/centos-entrypoint-exec-new

Shell格式的Dockerfile:

FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"

EXEC格式的Dockerfile,exec格式无法识别$name:

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/echo", "hello $name"]

修改exec格式Dockerfile:

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]

五、Docker镜像发布

镜像发布实践:首先要有Docker Hub的用户名密码。

# 输入Docker Hub用户名密码
docker login
# push的镜像的命名一定包含Docker Hub用户名
docker push jingnanjia/hello-world
# 删除本地镜像,再从Docker Hub上拉取自己的镜像
docker rmi jingnanjia/hello-world
docker pull jingnanjia/hello-world

这样发布镜像没有镜像构建构成,镜像是否安全大家都不清楚。

推荐的发布方式:分享Dockerfile。

构建一个私有的Docker Hub,没有图形界面,可以通过REST API验证镜像是否上传成功。

docker run -d -p 5000:5000 -restart always --name registry registry:2
# 构建可以上传到私有仓库的镜像,镜像tag必须是ip:port/name
docker build -t 101.133.232.238:5000/hello-world .
# 信任私有仓库配置
sudo ls /etc/docker
# { "insecure-registries":["101.133.232.238:5000"] }
vim /etc/docker/daemon.json
# 添加一行 EnvironmentFile=-etc/docker/daemon.json
sudo vim /lib/systemd/system/docker.service
sudo service docker restart
docker push 101.133.232.238:5000/hello-world

成功推送到私有仓库。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1468

2023.10.24

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

50

2025.11.27

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

50

2025.11.27

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

601

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1104

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

792

2023.08.01

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.9万人学习

【李炎恢】ThinkPHP8.x 后端框架课程
【李炎恢】ThinkPHP8.x 后端框架课程

共50课时 | 4.5万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号