From Docker to Kubernetes(一)- Image And Container

简介: From Docker to Kubernetes(一)- Image And Container

一、Docker Overview

Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

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

27f970d3f2734f69a4068e55aa5b56d2_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

  • 可与运行在很多主流操作系统之上,一个操作系统上可以运行多个容器
  • 共享同一个OS Kernel
  • 应用之间容器之间相互隔离
  • 对软件及其依赖的标准化打包

容器和虚拟机有什么区别?

9b5c50279906450e9f5126414f381b22_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

  • 容器是APP层面的隔离
  • 虚拟机是物理资源层面的隔离

二、Download and install Docker

For Docker Desktop installation instructions, see Install Docker Desktop on Mac and Install Docker Desktop on Windows.

三、Docker Image

Docker Image

Ubunts Image、Cent Os Image、 Debian Image都是Base Image

image.png

  • Docker Image文件和meta data的集合
  • Docker Image是分层的,每一层可以添加和删除文件,从而形成一个新的Image
  • 不同的Image可以共享相同的layer
  • Image本身是Read-Only的

安装完成后启动Docker

sudo systemctl start docker
复制代码

查看docker版本

docker version
复制代码

查看镜像列表

sudo docker image ls
复制代码

获取Image\

获取Image前先给用户授权,输入docker命令前不需要再加sudo

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

从docker hub中拉取image,DockerHub类似Github,上面保存了各种build之后的镜像,可以通过docker pull命令直接拉取镜像

docker pull ubuntu:14.04
docker pull bitnami/wordpress
复制代码

Build一个Docker Image

从0构建一个Image,首先pull也hello-word镜像并运行该镜像

docker pull hello-world
docker run hello-world
复制代码

hello-world镜像运行后会打印出hello world,然后就自动退出了。

制作一个hello-world镜像,首先准备一个.c文件

#include<stdio.h>
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
# build镜像
docker build -t jingnan/hello-world .
# 查看镜像
docker images
# 查看image分层
docker history jingnan/hello-world
# 运行容器
docker run jingnan/hello-world
复制代码

Dockerfile内容

FROM scratch
ADD hell0 /
CMD ["/hello"]
复制代码

四、Docker Container

Docker Container

  • 通过Docker Image创建出来
  • 在Image layer上建立一个Container layer(可读写) Image 负责app的存储和分发,而Container是负责运行App的,两者的关系就像面向对象中的类和实例,一个Image可以启动多个容器,但是容器名称不能相同

Container 命令

# 列举正在运行的容器,也可以使用docker ps
docker container ls
# 列举出所有的容器,包含已经退出的容器  docker ps -a
docker container ls -a
# 运行容器,运行之后会立即退出
docker run centos
# 查看container列表,不包含刚刚运行的centos
docker container ls
# 交互式运行容器,添加参数 -it 进入到容器中,可以在容器中进行操作
docker run -it centos
# 再次查看running的容器,包含了centos
docker container ls
# 删除容器,可以只写部分ID
docker container rm <ContainerID>
# 删除所有容器, -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 <imageID>
复制代码

容器操作:stop delete run

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

--name: 常见容器时,给容器一个自定义的名字

inspect:显示container的详细信息

logs: 查看容器产生的日志

# 启动容器
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容器构建一个新的Image

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 hisoty 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开始构建一个Image
  • FROM 尽量使用官方的Image

Dockerfile之LABEL关键字的语法

LABEL类似代码中的注释,如

LABEL maintainer="stark@stark-industry.com"
LABEL veresion="mark-50"
LABEL description="This is description"
复制代码

Dockerfile之RUN关键字语法

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

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

将本地文件添加到image文件里面,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 Image发布

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

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

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

推荐的发布方式:分享Dockerfile

构建一个私有的DockerHub,没有图形界面,可以通过restapi验证镜像是否上传成功

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
复制代码

成功推送到私有仓库


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
785 108
|
2月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1612 9
|
2月前
|
Kubernetes Devops Docker
Kubernetes 和 Docker Swarm:现代 DevOps 的理想容器编排工具
本指南深入解析 Kubernetes 与 Docker Swarm 两大主流容器编排工具,涵盖安装、架构、网络、监控等核心维度,助您根据团队能力与业务需求精准选型,把握云原生时代的技术主动权。
281 1
|
5月前
|
存储 Kubernetes 监控
Docker与Kubernetes集成挑战及方案
面对这些挑战,并不存在一键解决方案。如同搭建灌溉系统需要考虑多种因素,集成Docker与Kubernetes也需要深思熟虑的规划、相当的技术知识和不断的调试。只有这样,才能建立起一个稳定、健康、高效的Docker-Kubernetes生态,让你的应用像花园中的植物一样繁荣生长。
277 63
|
7月前
|
存储 Kubernetes 调度
Kubernetes、Docker和Containerd的关系解析
总的来说,Docker、Containerd和Kubernetes之间的关系可以用一个形象的比喻来描述:Docker就像是一辆装满货物的卡车,Containerd就像是卡车的引擎,而Kubernetes就像是调度中心,负责指挥卡车何时何地送货。
364 12
|
8月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
313 25
|
9月前
|
存储 运维 应用服务中间件
Docker Image即Docker镜像
Docker 镜像是 Docker 容器的基础,包含了运行应用程序所需的一切。通过 Dockerfile 可以方便地创建自定义镜像,并且利用 Docker 提供的命令可以轻松管理和使用这些镜像。掌握 Docker 镜像的创建、管理和使用,是进行容器化应用开发和部署的基础技能。希望本文能帮助读者更好地理解 Docker 镜像的概念和操作,提高开发和运维效率。
1283 13
|
11月前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
1259 19

热门文章

最新文章

下一篇
oss云网关配置