docker-基础

https://yeasy.gitbook.io/docker_practice/ 一、基本概念 镜像(Image) 容器(Container) 仓库(Repository) 理解以上三个概念,就能理解docker的生命周期 1.镜像 Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件,以及一些运行时所需的配置参数。镜像不包含任何动态数据,其内容在插件之后也不会被改变 分层存储,镜像采用了分层存储的架构,由一组文件系统组成的(多层文件系统联合组成)。在构建镜像时,会一层一层构建,后一层依赖于上一层,后一层上的任何改变都只会发生在本层,不会干涉到上一层。因此构建镜像的时候,需要对每层需要添加的东西尽量加最少最有必要的东西,减少额外的东西 分层存储的特征还使得镜像的复用,定制更为容易 2.容器 容器是镜像运行时的实体,可以被创建、启动、停止、删除暂停等 镜像(Image)和容器(container)的关系,就像是面向对象程序设计中的类 和实例 一样 容器的实质是进程,运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统,网络配置、进程空间等,运行在一个隔离的环境。这样的隔离特性,使得容器封装的应用比直接在宿主运行更加安全 容器也是分层存储,是以镜像为基础层,在其上创建一个当前容器的存储层,这个层是为容器运行时进行读写而准备的,称为容器存储层 容器存储层的生命周期跟容器一样,当容器消亡时,容器存储层也随之消亡,因此任何保存于容器存储层的信息都会随着容器的删除而丢失 Dokcer最佳实践的要求,容器不应该向其存储层写入任何数据,容器存储层保存无状态化,所有的文件写入操作,都应该使用数据卷、或者绑定宿主目录 数据卷独立于容器,使用容器卷,容器的删除或者重写运行之后,数据都不会丢失 3.仓库 Docker Register:提供一个集中的存储、分发镜像的服务 一个Docker Register可以包含多个**仓库(Repository);每个仓库可以包含多个标签(Tag),**每个标签对应一个镜像 可以通过<Repository Name>:<Tag Name> 的格式来指定具体的软件是那个版本的镜像 仓库名以两段路径形式出现,比如jwilder/nginx-proxy 前者是Docker Registry多用户环境下的用户名,后者是对应的软件名 Docker Registry 公开服务 Docker Registry公开服务是开放给用户使用、允许用户管理镜像的Registry服务。 最常见的是Docker Registry公开服务是官方的hub.docker.com,也是默认的Registry 也可以使用国内的镜像网站 私有Docker Registry 用户可以在本地搭建私有的Docker Registry。Docker提供了Docker Registry镜像,可以直接使用搭建私有Registry服务 二、镜像 1.获取镜像 从Docker镜像仓库获取镜像的命令是 docker pull docker pull [选项] [Docker Registry 地址[:端口号]/] 仓库名[:标签] 具体选项可以从docker pull --help 命令查看, Docker镜像仓库地址:地址格式一般为 <域名/IP>[:端口号]。默认地址是 Docker Hub 仓库名:仓库名是两段式,即<用户名>/<软件名>.对于Docker Hub,如果不给出用户名,默认为 library,也就是官方镜像 $ docker pull ubuntu:18.04 上面命令没有给出Docker镜像仓库地址,默认从Docker Hub获取镜像。而镜像名称是ubuntun:18.04,因此会获取官方镜像 library/ubuntun仓库中标签为18.04的镜像 ...

September 28, 2024 · 2 min · Chen-Hang

docker-部署

使用Docker 以及Docker Compose部署Go程序 为什么需要docker 使用docker的主要目标是其容器化。可以为应用程序提供一致的环境,而不依赖它运行的主机 部署示例 1.准备代码 package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", hello) server := &http.Server{ Addr: ":8888", } fmt.Println("server startup...") if err := server.ListenAndServe(); err != nil { fmt.Printf("server startup failed, err:%v\n", err) } } func hello(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("hello liwenzhou.com!")) } 这里是简单代码 2.创建Docker镜像 镜像(image)包含运行应用程序所需的所有东西——代码/二进制文件、运行时、依赖项以及所需的任何其它人间系统对象 简单讲,镜像是定义应用程序以及运行所需的一切 3.编写Dockerfile 要创建Docker镜像(image)必须在配置文件中的指定步骤,这个文件默认称为Dockerfile ...

September 28, 2024 · 3 min · Chen-Hang

dockerfile-学习

学习自 一篇文章带你吃透 Dockerfile - 掘金 (juejin.cn) Dockerfile reference 全网最详细的Docker-Compose详细教程 - 掘金 (juejin.cn) docker compose 配置文件 .yml 全面指南 - 知乎 (zhihu.com) compose-spec/spec.md at master · compose-spec/compose-spec · GitHub 前言 学习Dockers前期,通过Docker的官方镜像仓库拉取里面的镜像,根据这些镜像创建出容器并运行 实际上,Docker官方镜像也是通过一定的方式构建出来的,只要弄清其中的逻辑,我们也可以仿照官方镜像的构建过程,构建出自己的镜像 Dockerfile就是这样一个用于描述Docker镜像构建过程的文本文件,dockerfile可以包含多条构建指令,以及相关的描述 1.什么是容器 容器是计算机上的沙盒进程,与主机上的其它进程隔离,这种隔离利用了内核命名空间和cgroups。简而言之容器是: 是image的可运行实例 可以在本地计算机、虚拟机上运行或部署到云中 是可移植的 与其它容器隔离,并运行自己的软件,二进制文件和配置 2.什么是容器映射 当容器运行时,它使用了隔离的文件系统。这个自定义的文件系统由容器映像container image提供。因为image包含了容器的问价系统,使用image必须包含所有的运行应用程序所必须的所有东西——依赖项、配置、脚本、二进制文件等等。 沙盒进程是指在计算机系统中,为了保障安全和隔离性而采用的一种技术,将应用程序运行在一个受限制的环境中,限制它们能访问的资源和操作范围,从而避免恶意程序和授权程序对系统的破坏 3.容器是怎么运行的 当一个容器运行时,它为其文件系统使用来image的各个层。每个容器都有自己的命名空间来创建/更新/删除文件。在另一个容器中不会看到任何更改,即使它们使用相同的image 4.容器卷[container volumes] 每个容器启动时都是从容器的定义开始的。在容器中可以创建、更新和删除文件,但当容器被删除时,这些改变将回丢失,所有更变都被隔离在各个容器中 卷:提供了将容器的特定文件系统路径链路到主机的能力。如果在主机上的某个文件被挂载,那么当容器中该文件路径下的文件发送更改时,我们在主机上同样也可以看到更改。同样的,启动另一个挂载了同一个文件目录的容器,它也可以访问到相同的文件 镜像构建原理 1.Docker架构模式 docker使用了client/server的架构模式。构建镜像时,用户在dockers client输入构建命令。docker引擎以 REST API的形式,像 docker daemon发送构建请求,如何dockers daemon就根据构建请求的内容,开始镜像构建的工作,并向Client持续放回构建过程的信息。 2.镜像分层模型 docker镜像是用于创建容器的只读模板,是通过 Dockerfile中定义的指令构建而成的,构建结束后,会在原有的镜像层上生成一个新的镜像层,如下所示 在 tomcat 镜像创建一个容器后,会在tomcat镜像之上新创建一个可写的容器层,在容器中写文件时,会保存到这个容器层中 3.基础镜像与父级镜像 用于构建基础镜像的 Dockerfile 不指定父级镜像,Docker约定使用如下形式基础镜像 FROM scratch 这里的 scratch是一个空镜像,可以从零开始构建镜像,常用来构建最小镜像,如busybox,debian,alpine等镜像,省去很多linux命令,因此很小。一般,不需要自己去构建基础镜像。 ...

September 28, 2024 · 4 min · Chen-Hang