Docker笔记-Docker Dockerfile
Docker笔记-Docker Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
这里讲解如何运行 Dockerfile 文件来定制一个镜像。
DockerFile构建过程解析:
1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2、 指令按照从上到下,顺序执行
3、#表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交
Docker执行Dockerfile的大致流程:
1、 docker 从基础镜像运行一个容器
2、执行一条指令并对容器作出修改
3、执行类似docker commit的操作提交,一个新的镜像层
4、docker再基于刚提交的镜像运行一个新容器
5、执行dockerfile中的 下一条指令直到所有指令都执行完成
1、使用Dockerfile定制镜像
1、下面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html
文件)
在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
2、FROM 和 RUN 指令的作用
FROM
:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像,后续的操作都是基于
nginx。
RUN
:用于执行后面跟着的命令行命令,有以下两种格式:
shell
格式:
RUN <命令行命令>
# <命令行命令>等同于在终端操作的shell命令
exec
格式:
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
注意:Dockerfile
的指令每执行一次都会在 docker 上新建一层,所以过多无意义的层,会造成镜像膨胀过大。
例如:
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
# 以上执行会创建3层镜像,可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
如上,以 &&
符号连接命令,这样执行后,只会创建 1 层镜像。
2、开始构建镜像
在 Dockerfile 文件的存放目录下,执行构建动作。
以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3
(镜像名称:镜像标签)。
注:最后的 . 代表本次执行的上下文路径,下一节会介绍。
$ docker build -t nginx:v3 .
以上显示,说明已经构建成功。
如果存在多个仓库下,或使用多个镜像标签,就可以使用多个-t
参数:
$ docker build -t nginx/v3:1.0.2 -t nginx/v3:latest .
3、上下文路径
上一节中,有提到指令最后一个 . 是上下文路径,那么什么是上下文路径呢?
$ docker build -t nginx:v3 .
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个
路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S,我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完
成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker
引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
4、指令详解
4.1 COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
格式:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
[--chown=<user>:<group>]
:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>
:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则
。
例如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目标路径>
:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
4.2 ADD
ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
-
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制
并解压到 <目标路径>。
-
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建
变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
4.3 CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在
docker run
时运行。 - RUN 是在
docker build
。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
格式:
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并
且默认可执行文件是 sh。
4.4 ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数
送给 ENTRYPOINT 指令指定的程序。
但是,如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 CMD 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会
提到。
示例:
假设已通过 Dockerfile 构建了 nginx:test 镜像:
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
1、不传参运行
$ docker run nginx:test
容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf
2、传参运行
$ docker run nginx:test -c /etc/nginx/new.conf
容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
nginx -c /etc/nginx/new.conf
4.5 ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
格式:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:
ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
4.6 ARG
构建参数,与 ENV 作用一至,不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有
docker build 的过程中有效,构建好的镜像内不存在此环境变量。
构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。
格式:
ARG <参数名>[=<默认值>]
4.7 VOLUME
定义匿名数据卷,在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
- 避免重要的数据,因容器重启而丢失,这是非常致命的。
- 避免容器不断变大。
格式:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
4.8 EXPOSE
仅仅只是声明端口。
作用:
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
格式:
EXPOSE <端口1> [<端口2>...]
4.9 WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,
必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存
在。
格式:
WORKDIR <工作目录路径>
4.10 USER
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
格式:
USER <用户名>[:<用户组>]
4.11 HEALTHCHECK
用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
格式:
HEALTHCHECK [选项] CMD <命令>: 设置检查容器健康状况的命令
HEALTHCHECK NONE: 如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令>: 这边CMD后面跟随的命令使用,可以参考CMD的用法
4.12 ONBUILD
用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不
会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜
像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
格式:
ONBUILD <其它指令>
4.13 LABEL
LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
比如我们可以添加镜像的作者:
LABEL org.opencontainers.image.authors="runoob"
5、Dockerfile指令总结
常用命令:
保留字指令:
FROM # 基础镜镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令。触发指令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
6、自己做一个centos
6.1 编写dockerfile文件(mydockerfile-centos)
FROM centos
MAINTAINER zsx<2420309401@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
6.2 构建镜像
$ docker build -f mydockerfile-centos -t mycentos:0.1 .
[root@zsx dockertemp2]# docker build -f mydockerfile-centos -t mycentos:0.1 .
Sending build context to Docker daemon 2.048kB
Step 1/8 : FROM centos
---> 5d0da3dc9764
Step 2/8 : MAINTAINER zsx<2420309401@qq.com>
---> Using cache
---> 1eb6e00507da
Step 3/8 : ENV MYPATH /usr/local
---> Using cache
---> 29c1f128f368
Step 4/8 : WORKDIR $MYPATH
---> Using cache
---> ead640e6d103
Step 5/8 : EXPOSE 80
---> Running in 51e8b541aee5
Removing intermediate container 51e8b541aee5
---> 17f13c31871a
Step 6/8 : CMD echo $MYPATH
---> Running in 482c3348104f
Removing intermediate container 482c3348104f
---> 70cd75d70ccf
Step 7/8 : CMD echo "----end----"
---> Running in 6dffe3fa9075
Removing intermediate container 6dffe3fa9075
---> c47c8c2d0808
Step 8/8 : CMD /bin/bash
---> Running in 71550c579b6a
Removing intermediate container 71550c579b6a
---> 6675973c511b
Successfully built 6675973c511b
Successfully tagged mycentos:0.1
6.3 查看镜像
$ docker images
6.4 运行
$ docker run -it mycentos:0.1
6.5 查看镜像构建过程
$ docker history 镜像名|镜像id
$ docker history 6675973c511b
6.6 CMD和ENTRYPOINT区别
CMD:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT:指定这个容器启动的时候要运行的命令,可以追加命令。
6.6.1 测试cmd
# 编写dockerfile文件
$ vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]
$ docker build -f dockerfile-cmd-test -t cmdtest .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : CMD ["ls","-a"]
---> Running in 63ad0a28dd54
Removing intermediate container 63ad0a28dd54
---> b1fd714bdfec
Successfully built b1fd714bdfec
Successfully tagged cmdtest:latest
[root@zsx dockertemp3]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cmdtest latest b1fd714bdfec 50 seconds ago 231MB
mycentos 0.1 6675973c511b 8 minutes ago 231MB
nginx v3 bf770dfb06b2 36 minutes ago 141MB
tomcat 1.0 78c6427cb92b 25 hours ago 680MB
runoob/centos 6.7 ceeb01d3ac58 28 hours ago 191MB
runoob/centos dev ceeb01d3ac58 28 hours ago 191MB
ubuntu v2 8ea6534ccd35 28 hours ago 137MB
test/ubuntu v3 2deea90c7f09 32 hours ago 72.8MB
<none> <none> a313f8f76e87 33 hours ago 0B
nginx latest 04661cdce581 6 days ago 141MB
tomcat latest b0e0b0a92cf9 3 weeks ago 680MB
ubuntu latest ba6acccedd29 4 weeks ago 72.8MB
hello-world latest feb5d9fea6a5 7 weeks ago 13.3kB
centos latest 5d0da3dc9764 2 months ago 231MB
centos 6.7 9f1de3c6ad53 2 years ago 191MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
zsx242030/ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
training/webapp latest 6fae60ef3446 6 years ago 349MB
# run运行,发现我们的ls -a命令生效
$ docker run b1fd714bdfec
[root@zsx dockertemp3]# docker run b1fd714bdfec
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 会报错,因为无法追加
[root@zsx dockertemp3]# $ docker run b1fd714bdfec -l
bash: $: command not found...
6.6.2 测试ENTRYPOINT
# 编写dockerfile文件
$ vim dockerfile-cmd-test
FROM centos
ENTRYPOINT ["ls","-a"]
$ docker build -f dockerfile-cmd-test -t cmdtest .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 796a9e5942eb
Removing intermediate container 796a9e5942eb
---> 86c0ba1b95ef
Successfully built 86c0ba1b95ef
Successfully tagged cmdtest:latest
[root@zsx dockertemp4]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cmdtest latest 86c0ba1b95ef 49 seconds ago 231MB
<none> <none> b1fd714bdfec 5 minutes ago 231MB
mycentos 0.1 6675973c511b 13 minutes ago 231MB
nginx v3 bf770dfb06b2 41 minutes ago 141MB
tomcat 1.0 78c6427cb92b 25 hours ago 680MB
runoob/centos 6.7 ceeb01d3ac58 28 hours ago 191MB
runoob/centos dev ceeb01d3ac58 28 hours ago 191MB
ubuntu v2 8ea6534ccd35 28 hours ago 137MB
test/ubuntu v3 2deea90c7f09 32 hours ago 72.8MB
<none> <none> a313f8f76e87 33 hours ago 0B
nginx latest 04661cdce581 6 days ago 141MB
tomcat latest b0e0b0a92cf9 3 weeks ago 680MB
ubuntu latest ba6acccedd29 4 weeks ago 72.8MB
hello-world latest feb5d9fea6a5 7 weeks ago 13.3kB
centos latest 5d0da3dc9764 2 months ago 231MB
centos 6.7 9f1de3c6ad53 2 years ago 191MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
zsx242030/ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
training/webapp latest 6fae60ef3446 6 years ago 349MB
# run运行,发现我们的ls -a命令生效
$ docker run 86c0ba1b95ef
[root@zsx dockertemp3]# docker run 86c0ba1b95ef
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@zsx dockertemp4]# docker run 86c0ba1b95ef -l
total 0
drwxr-xr-x. 1 root root 6 Nov 16 13:40 .
drwxr-xr-x. 1 root root 6 Nov 16 13:40 ..
-rwxr-xr-x. 1 root root 0 Nov 16 13:40 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Nov 16 13:40 dev
drwxr-xr-x. 1 root root 66 Nov 16 13:40 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 14:17 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 222 root root 0 Nov 16 13:40 proc
dr-xr-x---. 2 root root 162 Sep 15 14:17 root
drwxr-xr-x. 11 root root 163 Sep 15 14:17 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Nov 16 12:48 sys
drwxrwxrwt. 7 root root 171 Sep 15 14:17 tmp
drwxr-xr-x. 12 root root 144 Sep 15 14:17 usr
drwxr-xr-x. 20 root root 262 Sep 15 14:17 var
7、自己做一个tomcat
7.1 创建一个目录放入需要的文件
$ ls
apache-tomcat-9.0.22.tar.gz
jdk-8ull-linux-x64.tar.gz
$ touch readme.txt
7.2 编写Dockerfile文件
FROM centos
MAINTAINER zsx242030<2420309401@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u212-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-7.0.70.tar.gz /usr/local/
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_212
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.70
ENV CATALINA_BASH /usr/local/apache-tomcat-7.0.70
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-7.0.70/bin/startup.sh && tail -f /usr/local/apache-tomcat-7.0.70/logs/catalina.out
7.3 构建镜像
$ docker build -t diytomcat .
Sending build context to Docker daemon 203.9MB
Step 1/14 : FROM centos
---> 5d0da3dc9764
Step 2/14 : MAINTAINER zsx242030<2420309401@qq.com>
---> Using cache
---> f290511eb840
Step 3/14 : COPY readme.txt /usr/local/readme.txt
---> Using cache
---> 979de07baf19
Step 4/14 : ADD jdk-8u212-linux-x64.tar.gz /usr/local/
---> 35580a7632eb
Step 5/14 : ADD apache-tomcat-7.0.70.tar.gz /usr/local/
---> de6e4ab6c96b
Step 6/14 : ENV MYPATH /usr/local
---> Running in d8d36457d298
Removing intermediate container d8d36457d298
---> 694852909947
Step 7/14 : WORKDIR $MYPATH
---> Running in 7f791bb043a7
Removing intermediate container 7f791bb043a7
---> bf6f0e9f7666
Step 8/14 : ENV JAVA_HOME /usr/local/jdk1.8.0_212
---> Running in fc1e3405443b
Removing intermediate container fc1e3405443b
---> 9b20c57d4474
Step 9/14 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
---> Running in c0e5f6d309f4
Removing intermediate container c0e5f6d309f4
---> ab964b5e302a
Step 10/14 : ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.70
---> Running in 63627ba2a05f
Removing intermediate container 63627ba2a05f
---> 8d1b09eea83e
Step 11/14 : ENV CATALINA_BASH /usr/local/apache-tomcat-7.0.70
---> Running in 08e2321a88c6
Removing intermediate container 08e2321a88c6
---> a80645a52ad3
Step 12/14 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
---> Running in 488db85e0cd2
Removing intermediate container 488db85e0cd2
---> 1aba2bb3cd06
Step 13/14 : EXPOSE 8080
---> Running in 82018978b631
Removing intermediate container 82018978b631
---> 9d4c0011b55c
Step 14/14 : CMD /usr/local/apache-tomcat-7.0.70/bin/startup.sh && tail -f /usr/local/apache-tomcat-7.0.70/logs/catalina.out
---> Running in 91a0c969175b
Removing intermediate container 91a0c969175b
---> 3ca521cc579e
Successfully built 3ca521cc579e
Successfully tagged diytomcat:latest
7.4 启动
$ docker run -d -p 9090:8080 --name zsxtomcat -v /home/zhangshixing/work/temp/tomcat/test:/usr/local/apache-tomcat-7.0.70/webapps/test -v /home/zhangshixing/work/temp/tomcat/tomcatlogs:/usr/local/apache-tomcat-7.0.70/logs diytomcat
# 如果有错可以查看日志
$ docker logs 3ca521cc579e
7.5 访问测试
在test目录下编写一个index.html:
<html>
<head>
<title>HelloWorldJSP~</title>
</head>
<body>
<h1>
HelloWorld
</h1>
</body>
</html>
备注:Docker挂载主机目录Docker访问出现cannot open directory : Permission denied
解决办法:在挂
载目录后多加一个 --privileged=true
参数即可。
7.6 发布项目(发布镜像到DockerHub)
$ docker login -u zsx242030
# 输入密码
$ docker push diytomcat:latest
$ docker logout
也可以提交到阿里云服务上,阿里云的官网有说明。
【docker】 denied: requested access to the resource is denied
原因分析:在build自己的镜像的时候添加tag时必须在前面加上自己的dockerhub的username
7.7 将镜像推送到阿里云
制作镜像:
[root@zsx test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1.0 02f263acec53 24 hours ago 231MB
nginx latest ea335eea17ab 2 days ago 141MB
mysql 5.7 8b43c6af2ad0 2 days ago 448MB
centos latest 5d0da3dc9764 2 months ago 231MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
[root@zsx test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c14982e78f6 centos "/bin/bash" 12 seconds ago Exited (0) 7 seconds ago pensive_moore
$ docker commit -a="zsx242030" -m="mycentos" 6c14982e78f6 centos:2.0
[root@zsx test]# docker commit -a="zsx242030" -m="mycentos" 6c14982e78f6 centos:2.0
sha256:92bf8effc0b1e0123e16db7107d2593a874caaea7496c9fbef65137d672adc37
[root@zsx test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 2.0 92bf8effc0b1 18 seconds ago 231MB
centos 1.0 02f263acec53 24 hours ago 231MB
nginx latest ea335eea17ab 2 days ago 141MB
mysql 5.7 8b43c6af2ad0 2 days ago 448MB
centos latest 5d0da3dc9764 2 months ago 231MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
阿里云开发者平台:
选择本地仓库。
具体操作:
1、登录阿里云Docker Registry
$ docker login --username=15110820283 registry.cn-hangzhou.aliyuncs.com
[root@zsx test]# docker login --username=15110820283 registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2、将镜像推送到Registry
# docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/zsxnamespace/zsxcangku:[镜像版本号]
$ docker tag 92bf8effc0b1 registry.cn-hangzhou.aliyuncs.com/zsxnamespace/zsxcangku:2.0
# docker push registry.cn-hangzhou.aliyuncs.com/zsxnamespace/zsxcangku:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/zsxnamespace/zsxcangku:2.0
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
3、从Registry中拉取镜像
# docker pull registry.cn-hangzhou.aliyuncs.com/zsxnamespace/zsxcangku:[镜像版本号]
$ docker pull registry.cn-hangzhou.aliyuncs.com/zsxnamespace/zsxcangku:2.0
4、选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址,推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com
作为Registry的域名登
录。
5、示例
使用docker tag
命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker images
REPOSITORY registry.aliyuncs.com/acs/agent
TAG 0.7-dfb6816
IMAGE ID 37bb9c63c8b2
CREATED 7 days ago
VIRTUAL SIZE 37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用 “docker push” 命令将该镜像推送至远程。
$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816