From Docker to Kubernetes(一)- Image And Container

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 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
复制代码

成功推送到私有仓库


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
4天前
|
JavaScript 持续交付 Docker
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
28 1
|
12天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
本文介绍了Docker和Kubernetes在构建高效微服务架构中的应用,涵盖基本概念、在微服务架构中的作用及其实现方法。通过具体实例,如用户服务、商品服务和订单服务,展示了如何利用Docker和Kubernetes实现服务的打包、部署、扩展及管理,确保微服务架构的稳定性和可靠性。
56 7
|
11天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
47 6
|
11天前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
21 3
|
15天前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
58 2
|
13天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
14天前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
1月前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
103 17
|
29天前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
323 1