Docker笔记--镜像&基于GO项目创建Docker镜像
核心概念
- Doker镜像--包含一个基本的操作系统运行环境和应用程序,镜像是创建Docker容器的基础。
- Docker容器--如果把镜像理解成对象,则容器就是对象的实例,他也包含基本的操作系统环境,并且可以启动、开始、停止、删除,每个容器之间是互相隔离的
- Docker仓库--存放Docker镜像的仓库,分为公有仓库和私有仓库
- 仓库注册服务器--存放仓库的地方,每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分
获取镜像
docker [image] pull NAME[:TAG]
--从DockerHub获取镜像,NAME是镜像仓库名称(用来区分镜像), TAG是镜像的标签(往往用来表示版本信息)。如果不显式指定TAG,则默认会选择latest标签,这会下载仓库中最新版本的镜像。docker images/docker image ls
--列出本机已有镜像信息docker tag ubuntu:18.04 myubuntu:18.04
--修改镜像标签
删除和清理镜像
docker rmi/docker image rm
--删除镜像- -f, -force:强制删除镜像,即使有容器依赖它;
- -no-prune:不要清理未带标签的父镜像。
docker image prune
--清理无用的临时镜像- -a, -all:删除所有无用镜像,不光是临时镜像;
- -f, -force:强制删除镜像,而不进行提示确认。
导出导入镜像
docker [image] save
--导出镜像到本地文件,可以使用-o参数指定文件名docker [image] load
--从本地文件导入镜像,可以使用-i参数指定文件名,或者使用<导入
创建镜像
- 基于已有镜像的容器创建--
docker commit [OPTIONS]
--类似于git的commit命令- -a, --author="":作者信息;
- -c, --change=[]:提交的时候执行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
- -m, --message="":提交消息;
- -p, --pause=true:提交时暂停容器运行。
- 基于本地模板导入--
docker import
- 基于Dockerfile创建--
docker [image] build NAME[:TAG]
--Dockerfile是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。
Dockerfile语法知识
# 指定基础镜像,必须为第一个命令
FROM <image name>
# 指定作者
格式:
MAINTAINER <name>
示例:
MAINTAINER Kingram
# 构建镜像时执行的shell或者exec命令,UN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
格式:
RUN <command>
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
# 将本地文件添加到容器中
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] # 用于支持包含空格的路径
示例:
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
# 指定容器启动时执行的命令,Dockerfile只允许使用一次CMD指令。 使用多个CMD会抵消之前所有的指令,只有最后一个指令生效。 CMD有三种形式:
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
注:
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
# 配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
# 指定RUN、CMD与ENTRYPOINT命令的工作目录。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
# 指定交互端口,EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
举个栗子:一个简单的GO程序创建为docker镜像
代码如下:
//hello.go
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, World!")
}
第一步编译:
go build -o hello
第二步编写Dockerfile
FROM golang
RUN mkdir $GOPATH/src/hello
COPY ./hello $GOPATH/src/hello
WORKDIR $GOPATH/src/hello
RUN chmod +x hello
第三步创建镜像
docker build -t hello:1.0 .
# 查看镜像
docker images
第四步创建并启动容器
docker run hello:1.0