更新镜像
基于已有的基础镜像运行的容器实例,对其进行修改,然后commit成新的镜像
docker commit -a "hardy9sap@163.com # Author" -m "Comment message" 容器名称orID itany/nginx:v1.0
说明:
-a -m 都是可选的
itany/nginx:v1.0 中的itany/ 可选,表示命名空间;:v1.0 可选,表示版本tag
整体itany/nginx:v1.0 都是可选的,那么默认镜像名字以及标签都为<none>
构建镜像
基于Dockerfile,对已有镜像进行修改,然后build成新的镜像
Dockerfile是一个包含创建镜像所需的所有指令的文本文件
docker build -f Dockerfile -t itany/nginx:v2.0 .
说明:
-f 指定Dockerfile路径,默认就是当前路径下的Dockerfile
-t 指定新镜像名称和版本
. 表示上下文,一般就是.表示当前路径
Docker镜像为什么那么大?
因为镜像是包含了所有了运行该软件的所有环境,
所以那么大。
每一层镜像只会在本地保留一份。
再拉取一个镜像的时候,如果所需的镜像层已经在本地有了,
就不需要再拉取一遍。
Dockfile指令
规则:
1. 全部指令以大写字母书写
2. 以FROM指令开头
3. 从上往下执行
4. # 表示注释
5. 每执行一条命令,就增加一层镜像层
常用指令:
FROM 指定基础镜像
FROM itany/nginx:v2.0
ENV 定义环境变量
ENV MYPATH /usr/local
RUN 运行一条指令
RUN yum install -y vim
使用 && 来执行多条
RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.xz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all
CMD 在镜像生成容器时指定的命令(也就是run命令)
CMD ["/bin/bash"] # CMD指令虽然可以有多个,但是以最后一个CMD指令为准
CMD ["/bin/ls", "/"] # 可以为主命令指定参数
# CMD指令会被run时指定的命令覆盖掉
VOLUME 指定挂载目录,(实现资源共享,数据持久化)
只能指定镜像中的目录,
无法指定宿主机的目录,宿主机的目录是自动生成的,可通过容器元信息获得
VOLUMN ["/data1", "/data2"]
WORKDIR 指定当登录容器后,进入的工作目录,
不指定,默认为/目录
WORKDIR $MYPATH
MAINTAINER 维护者(作者)
MAINTAINER hardy9sap@163.com
ENTRYPOINT 与CMD类似,
# ENTRYPOINT指令也可以有多个,也是以最后一个指令为准
# 可以为主命令指定参数
# ENTRYPOINT指令不会覆盖run时指定的命令,而是会当作ENTRYPOINT指令的参数,组成新的指令
# 就理解为拼接在了一起
关于执行指令:
如果最后一条指令不是/bin/bash的话
指定你指定的命令后,容器退出,
之后再怎么重启容器都不会生效。
只能删除,再次启动并且指定/bin/bash(当然ENTRYPOINT会把它当做参数,所以要留意一点)
EXPOSE # 暴露端口
# EXPOSE命令只是声明了容器应该打开的端口并没有实际上将它打开!
# 如果你不用-p或者-P(随机选主机的一个端口进行映射)中指定要映射的端口,你的容器是不会映射端口出去的,
EXPOSE 8080 8090
COPY # 拷贝主机文件到镜像中,(不能拷贝目录,如果指定目录则是把目录中的所有内容拷贝过去)
COPY <src> <dst>
COPY file.txt /usr/local
COPY和ADD所拷贝的文件必须跟Dockerfile保持在同一目录下
(因为build时,默认指定的上下文就是当前目录,也就是我们写的那个.)
(当然你可以改变上下文,例如:/etc/local)
可以使用通配符* 和 ?
ADD # 拷贝主机文件到镜像中,(不能拷贝目录,如果指定目录则是把目录中的所有内容拷贝过去)
# 如果是压缩文件直接解压
ADD <src> <dst>
ADD nginx.tar.gz /usr/local/nginx
发布镜像到阿里云开发者平台
五、发布镜像到阿里云开发者平台
Step1: https://homenew.console.aliyun.com/
Step2: 创建命名空间
Step3: 创建镜像仓库
摘要:仓库的摘要
描述:镜像的描述
Step4: 管理 --> 操作指南
将镜像推送到Registry
# 登录阿里云Docker Registry
docker login --username=空灵飘渺之旅sap registry.cn-shenzhen.aliyuncs.com
--password=密码(太复杂的密码不适用)
-u
-p
# 创建指定镜像的tag,归入某个仓库
docker tag [ImageID] registry.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos:[镜像版本号]
# 推送
docker push registry.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos:[镜像版本号]
选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。
推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-shenzhen.aliyuncs.com 作为Registry的域名登录,并作为镜像命名空间前缀。
公网地址
registry.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos
专有网络
registry-vpc.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos
经典网络
registry-internal.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos
#从Registry拉取镜像
docker pull registry.cn-shenzhen.aliyuncs.com/hardy9sap/studyrepos:[镜像版本号]
# 退出登录
docker logout [registry.cn-shenzhen.aliyuncs.com/] # 不指定默认登出DockerHub