docker 一 基础用法

子曾经曰过,docker是个好东西,需要一个系列的文章来总结。因此,本系列将会由浅入深的将我所理解的docker写下来,但我不打算写成入门式的文章,会更偏重理论和工作中遇到的坑。

作为本系列的第一篇文章,让我们以几个例子来看看 docker 的用法。

第一个例子,把本地编译的二进制文件打包成一个镜像。

首先我们写一个hello docker程序。


// hello.go

package main

import "fmt"

func main() {

fmt.Println("hello docker")

}

对应的Dockerfile文件如下:


FROM alpine:latest

COPY hello /usr/local/bin

CMD ["/usr/local/bin/hello"]

在本地(mac 环境)编译,并打入镜像,两步命令如下:

第一步编译go程序:

env GOOS=linux GOARCH=386 go build hello.go

第二步打包成镜像:

➜ docker build -t hello:v1 .

经过上面两步就打包成一个可用的镜像了,用下面命令运行一下试试看:

➜ docker run hello:v1

hello docker

上面 Dockerfile 文件中,将本地编译的 hello 二进制拷贝到镜像中,并运行。我们用到了下面三个指令:

FROM 指令 这个指令是 Dockerfile 文件第一条必备指令,是指定基础镜像,在上面的例子中,我们从名为”alpine”的基础镜像开始制作镜像。

Alpine 操作系统是一个轻型 Linux 发行版。Alpine Docker 相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5MB 左右(对比 Ubuntu 系列镜像接近 200MB),且拥有非常友好的包管理机制。

COPY 指令 从源路径(本地)复制文件到目的路径(容器内)。

CMD 指令 用于指定默认的容器主进程的启动命令的。

打包镜像时,我们用到 docker build 命令,该命令的格式如下:


docker build [选项] <上下文路径/URL/->

运行时,用到了 docker run 命令,该命令的格式如下:


docker run [参数] [镜像名 | 镜像 id ] [ 命令 ]

在编译的时候,不能直接在本机(mac)go build hello.go 一把,需要交叉编译成镜像系统(Alpine)支持的架构,因此在编译的时候,加上了上面的环境变量,这样编译出来的程序才能正常的运行。但是,有时候不想这么麻烦,想在镜像中编译吼不吼?当然吼了,我们只需要更换基础镜像就可以了。


FROM golang:latest

RUN mkdir -p /home/docker

COPY hello.go /home/docker

WORKDIR /home/docker

RUN go build hello.go && rm -rf /home/docker/*.go

CMD ["/home/docker/hello"]

上面我们构建了一个镜像,但是什么是 Docker 镜像呢?其实它是一个只读模板,它包含了容器启动所需的所有信息,包括运行程序和配置数据。要运行一个容器,就需要用到一个指定的镜像,而容器就是负责应用程序的运行,包括操作系统、用户添加的文件以及元数据。

接下来,我们将讨论 docker 的演进历程,及背后的理论基础。


 上一篇
docker 二 演进历史 docker 二 演进历史
如果说我看得比别人更远些,那是因为我站在巨人的肩膀上。 —— 牛顿 历史docker 的兴起并不是靠单打独斗,而是背后有着行业内十几年甚至几十年的技术沉淀。它的出现解决了一个一直以来的争论——”软件究竟应该通过什么样的方式进行交互?”,
2019-08-22
下一篇 
参透“为何”,迎接“任何” 参透“为何”,迎接“任何”
参透‘为何’,才能迎接‘任何’。(He who has a 'why' to live for can bear almost any 'how') —— 尼采
2019-07-11
  目录