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搭建和管理企业级网站应用
相关文章
|
10天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
42 2
|
12天前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
10天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
10天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
10天前
|
安全 持续交付 Docker
微服务架构和 Docker 容器化部署的优点是什么?
微服务架构和 Docker 容器化部署的优点是什么?
|
12天前
|
Kubernetes Docker 容器
【赵渝强老师】Docker的Container网络模式
Docker容器在网络环境中彼此隔离,但可通过配置不同网络模式实现容器间通信。其中,container模式使容器共享同一网络命名空间,通过localhost或127.0.0.1互相访问,提高传输效率。本文介绍了container模式的特点及具体示例。
|
12天前
|
存储 Kubernetes 调度
深入理解Kubernetes中的Pod与Container
深入理解Kubernetes中的Pod与Container
22 0
|
1月前
|
Kubernetes 持续交付 Docker
利用 Docker 和 Kubernetes 实现微服务部署
【10月更文挑战第2天】利用 Docker 和 Kubernetes 实现微服务部署
|
3月前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
开发框架 Kubernetes 负载均衡
宝塔面板+Rancher+阿里云镜像仓库+Docker + Kubernete s,添加集群、部署 web 应用
前言: 本文使用 Centos 7.x 进行操作,Rancher 官方推荐使用 Ubuntu。 Docker 对内核要求 大于 3.10,你可以使用 uname -r 检测系统内容版本。 通过 Rancher,可以很方便地对多个主机进行管理,实现负载均匀、集群、分布式构架、故障转移、状态监控等。
3058 0
宝塔面板+Rancher+阿里云镜像仓库+Docker + Kubernete s,添加集群、部署 web 应用
下一篇
无影云桌面