1. 前言
1.1 虚拟机技术
虚拟机(virtual machine),对于我们来说并不陌生,我们通常会在windows系统中,利用VMvare软件,安装其他我们需要的系统环境如Linux,它是带环境安装的一种解决方案。
在一种操作系统里面运行另一种操作系统,应用程序对此毫无感知,因为虚拟机看上去与真实系统一样。而对于本机的底层系统来说,虚拟机就是一个普通文件,若不需要可直接删除,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序、操作系统和硬件三者之间的逻辑不变。
由于一个虚拟机中运行着一套系统,导致占用资源多,且启动较慢,创建一个VM冗余步骤比较多。因此,Linux 发展出了另一种虚拟化技术即Linux 容器(Linux Containers,缩写为 LXC)。
1.2 容器虚拟化技术
Linux 容器(LXC)并不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。
容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件在工作时所需的库资源和相关设置。
相较于传统虚拟机技术,容器有非常明显的优势:
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
基于Linux容器技术,Docker应运而生。
2. Docker初识
2.1 概念
2.1.1 背景
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置,开发与运维之间需要相互协作,尤其是各种版本的迭代之后,不同版本环境的兼容,对运维人员也是较大的考验。
环境配置很麻烦,更换机器时又要重复进行。基于此,软件可以带环境安装的方案就出现了,即安装的时候可以将原始环境同时复制。
Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。开发人员利用 Docker 可以消除协作编码时,更换机器但应用无法正常工作的问题。Docker镜像的设计,使得Docker得以打破过去「程序即应用」的观念,通过镜像(images)将运作应用程式所需要的系统环境(作业系统核心除外),由下而上打包,达到应用程式跨平台间的无缝接轨运作。
2.1.2 作用
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等)及其运行环境能够做到“一次封装,到处运行”。
将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,更换机器就可以一键部署完毕,大大简化了操作。
2.2 架构
Docker使用C/S架构,Client通过接口与Server进程通信实现容器的构建、运行和发布。
Docker客户端(Client):Docker命令行工具,用户通过Docker Client与Docker Daemon进行通信并返回结果给用户。也可使用其他工具通过Docker Api与Docker Daemon通信。
Docker宿主机(Host):安装了Docker程序,并运行着Docker Daemon的主机。
Docker守护进程(Daemon):运行在宿主机上的进程,用户通过Docker Client使用Docker命令与Docker Daemon交互。
Docker 镜像(Image)
:是一个只读的模板,镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
Docker 容器(Container)
:是用镜像创建的运行实例,可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序,它可以被启动、开始、停止、删除。每个容器都是相互隔离、保证安全的平台。容器的定义和镜像几乎一模一样,唯一区别在于容器的最上层是可读可写的。
仓库(Repository)
:是集中存放镜像文件的场所。仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
2.3 底层原理
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是Docker的运行组件,它是一个运行时环境。
Docker是Linux容器技术的体现,它有着比VM更少的抽象层,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,这就使Docker在CPU、内存利用率上有明显优势;再者,Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker省去了重新加载操作系统内核的过程,
3. Docker安装
3.1 CentOS7安装Docker
3.1.1 安装
CentOS安装Docker前,首先查看系统版本信息,确认是否支持Docker,并选择相应安装步骤。
cat /etc/redhat-release
查看已安装的CentOS版本;uname -r
命令确定系统内核版本号;
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上,由以上查看的系统信息,确定本机符合Docker安装条件。
CentOS7安装Docker步骤,建议参考官网安装步骤:https://docs.docker.com/engine/install/centos/
。
安装完成,docker -v
可查看本机已安装Docker版本。
3.1.2 配置镜像加速
阿里云容器镜像服务网址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
。利用淘宝、支付宝或钉钉账号扫码授权登录即可。
配置镜像加速器后,选择CentOS操作文档,输入下方给出的命令,即在/etc/docker/daemon.json文件中写入镜像加速器地址,然后重新加载daemon配置,再重启docker服务即可。
也可配置网易镜像加速器:{“registry-mirrors”: [“http://hub-mirror.c.163.com”] }
3.2 MacOS安装Docker
3.2.1 安装
MacOS安装Docker步骤,参考菜鸟教程:https://www.runoob.com/docker/macos-docker-install.html
。我这里通过Homebrew安装Docker,建议安装一下Homebrew,通过Homebrew可便捷的安装很多软件。
安装完成,docker -v
可查看本机已安装Docker版本。
3.2.2 配置镜像加速
以上通过Homebrew安装的Docker app,点击运行后,可发现docker状态为running。
点击Preferences选项,进行镜像加速的配置,镜像加速器地址的json串写入后,点击Apply & Restart按钮,应用并重启。
通过命令docker info
,查看本机安装docker详细信息,可查看到镜像加速器配置成功。
4. Docker常用命令
4.1 帮助命令
- 查看指令用法
docker --help
- 查看已安装docker信息
docker -v
docker version
docker info
4.1 镜像命令
- 查找镜像
docker search [OPTIONS] 关键词
# 搜索docker hub网站镜像的详细信息。OPTIONS说明如下,可以选择性给定:
# --no-trunc 显示完整的镜像描述
# -s 指定数值 列出收藏数不小于指定值(如500)的镜像
# --automated 只列出automated build类型的镜像
- 下载镜像
docker pull 镜像名:TAG
# TAG表示版本,最新的版本为latest,若不指定,则默认下载最新版本
- 查看镜像
docker images [OPTIONS]
# 列出本地主机上的镜像。OPTIONS说明如下,可以选择性给定:
# --no-trunc 显示完整的镜像描述
# --digests 显示镜像的摘要信息
# -a 列出本地所有镜像(包括中间映像层)
# -q 只显示镜像ID
- 删除镜像
docker rmi -f 镜像ID或镜像名:TAG
# 强制删除单个镜像,TAG若不指定,则默认删除latest
docker rmi -f 镜像ID或镜像名1:TAG 镜像ID或镜像名2:TAG
# 强制删除多个镜像
docker rmi -f $(docker images -qa)
# 强制删除全部镜像
- 获取镜像元信息
docker inspect 镜像ID或镜像名:TAG
# 获取镜像的元信息,详细信息
4.2 容器命令
- 查看容器列表
docker ps [OPTIONS]
# 查看正在运行的容器列表。OPTIONS说明如下,可选择性给定:
# -a 查看所有已创建的容器(已运行+未运行)
# -q 静默模式,只显示容器编号
# -l 显示最近创建的一个容器
# -n 个数 显示最近创建的几个容器
# --no-trunc 不截断输出
- 新建并启动容器
docker run [OPTIONS] 镜像ID或镜像名:TAG
# 根据已经存在的镜像,新建并运行一个容器。OPTIONS说明如下,可选择性给定:
# --name="容器新名字" 为新建的容器指定一个名称
# -i 以交互模式运行容器,通常与 -t 同时使用
# -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
# -d 后台运行容器,并返回容器ID,也即启动守护式容器
# -P 随机端口映射
# -p 主机端口:容器端口 指定端口映射
# -v 主机目录:容器目录:ro 指定挂载主机目录到容器目录,默认为rw读写模式,ro表示只读
- 退出容器
exit
# 退出容器,并停止容器
ctrl/control+P+Q
# 退出容器,但容器在后台运行
- 进入运行中的容器
docker exec -it 容器ID或容器名 /bin/bash
# 进入正在运行的容器且开启交互模式终端,可以启动新的进程
docker attach 容器ID或容器名
# 直接进入容器启动命令的终端,不会启动新的进程
- 启动容器
docker start 容器ID或容器名
# 启动容器
docker restart 容器ID或容器名
# 重启容器
- 停止容器
docker stop 容器ID或容器名
# 停止容器
docker kill 容器ID或容器名
# 强制停止容器
- 删除容器
docker rm -f 容器ID或容器名
# 强制删除容器
docker rm -f $(docker ps -a -q)
# 强制删除所有容器
- 查看日志
docker logs [OPTIONS] 容器ID或容器名
# 查看容器日志。OPTIONS说明如下,可选择性给定:
# -t 加入时间戳
# -f 跟谁最新的时间打印
# --tail 条数 显示最后多少条
- 查看容器内运行的进程
docker top 容器ID或容器名
# 查看指定容器内部运行的进程
- 拷贝文件
docker cp 主机文件路径 容器ID或容器名:容器路径
# 将主机指定路径下的文件拷贝到容器指定路径下
docker cp 容器ID或容器名:容器路径 主机文件路径
# 将容器指定路径下的文件拷贝到主机指定路径下
- 获取容器元信息
docker inspect 容器ID或容器名
# 查看容器详细信息
5. Docker容器数据卷
5.1 数据卷
5.1.1 概念
Docker容器是用镜像创建的运行实例,它的定义与镜像几乎一模一样,唯一区别在于容器的最上层是可读可写的。因此,在容器中可产生数据(如自定义配置、日志等),若该容器不保存成新的镜像,则在容器被删除后,数据也同时被删除。基于此,可使用数据卷来保存数据。
所谓数据卷,就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,它的设计目的在于数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除其挂载的数据卷。
此外,数据卷除了数据持久化,还具备容器间继承与共享数据的功能。容器之间可通过--volumes-from
实现继承的效果,容器间传递共享时,数据卷的生命周期一直到没有容器使用它为止。
5.1.2 案例演示
以下以镜像centos为例,创建容器并挂载数据卷。
- 下载centos镜像,版本为默认即最新latest:
docker pull centos
。 - 执行挂载数据卷命令:
docker run -it -v 宿主机目录:容器目录 镜像名
。指定的宿主机目录与容器目录均已自动生成。
- 查看数据卷是否挂载成功:
docker inspect 容器ID
。容器ID在上一步创建容器时生成。在返回的容器元数据Json数据串中,key为"Mounts"的value中可以看到数据卷已挂载成功。
- 进入以上创建好的容器,在容器中的共享目录下新建文件,可在宿主机同步。
- 在宿主机共享目录下新建文件,进入容器,可发现文件已可共享。
- 创建一个只读的容器数据卷:
docker run -it -v 宿主机目录:容器目录:ro 镜像名
。可以发现,在新建的容器的指定目录中已自动同步了宿主机目录的内容。注:ro表示read only只读,即本次挂载的数据卷只具备读取的权限。
- 查看数据卷是否挂载成功:
docker inspect 容器ID
。容器ID在上一步创建容器时生成。在返回的容器元数据Json数据串中,key为"Mounts"的value中可以看到数据卷已挂载成功,且读写属性为只读。
- 验证数据卷的读写属性。可发现数据卷指定为ro模式时,无法执行写的操作,但可同步宿主机的内容。
- 运行一个容器命名为con01,再运行容器名为con02、con03均继承自con01,再运行一个容器名为con04继承自con03,可发现其中数据均可实现传递共享。
6. Docker镜像
6.1 概念
Docker镜像的技术基础是Union文件系统,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
bootfs(boot file system):主要包含bootloader和kernel。 bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。这一层与典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
Image:镜像层。镜像是分层的,最下层为Base Image,即基础镜像,不依赖其他镜像,从 scratch 构建,且可以作为其他镜像构建的基础。由下至上包含若干个Image,依次提供依赖而构建镜像,镜像层都是只读的。
Container:容器层。位于Docker镜像的最上层,可读写。所有对容器的改动(添加、删除、修改文件等)都只会发生在容器层中。因此,容器层下面的所有镜像层都是只读的,只有容器层是可写的。可以理解为:容器=镜像层+读写层。
Docker镜像的分层结构设计,最大的好处是实现了资源共享。多个Container可以共享父Image存储,避免部署时的重复拷贝,节省存储空间,提高部署效率。
6.2 Docker镜像制作
6.2.1 使用容器制作镜像
运行的容器内可能会发生变化(自定义配置、日志等),如果想保存下来以便下次直接使用,可以使用docker commit
指令,提交该容器副本,使之成为一个新的镜像。
以下以tomcat为例,演示效果。由于仓库中下载的tomcat镜像,集成系统功能较少,这里只简单演示镜像制作的效果:删除tomcat主页的文档,在浏览器进入已部署的tomcat页面上访问Documentation出现404即可。
- 下载tomcat镜像,版本为默认最新latest:
docker pull tomcat
。 - 运行一个tomcat镜像实例:
docker run -d -p 8090:8080 tomcat
。注:-p表示自己指定端口,如此处指定8090为访问端口,8080表示tomcat容器开放的端口。-d表示后台运行,与-it不同,不会进入容器的交互式界面。执行成功可查看容器已在成功运行。
- 在浏览器访问tomcat:
http://localhost:8090
,此时可能会出现404。
此时首先确认:防火墙是否开启。
开启防火墙后若还是出现404,再进入容器:docker exec -it eb57629df294 /bin/bash
。可以发现,webapps目录下内容为空,而tomcat主页的内容在webapps.dist目录下。
此时,只需要将webapps.dist目录下的内容,复制到webapps目录下即可:cp -r webapps.dist/. webapps
。
再次访问http://localhost:8090
,可正常显示。
点击Documentation选项,可正常进入文档页面。
- 删除容器中tomcat的docs目录:
rm -rf docs/
。
再次点击Documentation选项,或者直接输入地址:http://localhost:8090/docs/
。可发现文档界面404。
- 将删除docs文档的容器保存为一个镜像:
docker commit -a="chavaer" -m="del tomcat docs" eb57629df294 chava/tomcat:1.0
。查看本地镜像,刚才制作的tomcat镜像提交成功。
- 运行刚才制作的tomcat镜像:
docker run -d -p 7070:8080 chava/tomcat:1.0
。这里指定访问端口为7070。
在浏览器访问:http://localhost:7070
,可正常访问,不需要再去容器内复制webapps.dist的内容。
点击Documentation选项,或者直接输入地址:http://localhost:7070/docs/
。可发现文档界面404。
6.2.2 使用Dockerfile制作镜像
6.2.2.1 概念
Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本。定义了进程需要的一切东西,包括执行代码或文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等。
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段:Dockerfile(软件的原材料,面向开发),通过docker build指令生成Docker镜像(软件的交付品,成为交付标准),再通过docker run指令生成Docker容器(软件的运行态,涉及部署运维)。这三者缺一不可,共同充当Docker体系的基石。
Docker执行Dockerfile的大致流程如下:
- Docker从基础镜像运行一个容器;
- 执行一条指令并对容器作出修改;
- 执行类似docker commit的操作,提交一个新的镜像层;
- docker再基于刚才提交的镜像运行一个新容器;
- 执行Dockerfile中的下一条指令直到全部完成。
6.2.2.2 Dockerfile保留字指令
指令名称 | 指令释义 |
---|---|
FROM | 基础镜像,指当前新镜像基于哪个镜像 |
MAINTAINER | 镜像维护者的姓名和邮箱地址 |
RUN | 容器构建时需要运行的命令 |
EXPOSE | 当前容器对外暴露的端口 |
WORKDIR | 指定在容器创建后,终端默认登陆成功进入的工作目录 |
ENV | 用来在构建镜像过程中设置环境变量 |
ADD | 将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL及解压tar包 |
COPY | 拷贝文件和目录到镜像中。两种写法:COPY src dest或COPY[“src”,“dest”] |
VOLUME | 容器数据卷,用于数据保存和持久化工作 |
CMD | 指定一个容器启动时要运行的命令。Dockerfile中可有多个CMD指令,但只有最后一个生效,CMD会被docker run后面指定的参数替换 |
ENTRYPOINT | 指定一个容器启动时要运行的命令。它的目的和CMD一样,都是在指定容器启动程序及参数 |
ONBUILD | 当构建一个被继承的Dockerfile时运行的命令,父镜像在被子继承后,父镜像的OBBUILD被触发 |
6.2.2.3 案例演示
以下以centos为基础镜像,自定义一个tomcat镜像,主要实现功能:安装vim编辑器、修改登陆成功默认进入目录、配置环境变量等。
- 首先在本地宿主机,新建目录~/mydocker/tomcat8,用于放置本次构建镜像需要的内容;
- 准备jdk1.8-linux版本、tomcat-linux版本的tar包放置于上一步新建的目录下;
- 新建test_copy.txt文件,用于测试COPY指令,再新建一个Dockerfile文件:
- 在Dockerfile中添加内容:
FROM centos MAINTAINER chavaer<njchen_08@126.com> # 把宿主机当前上下文的test_copy.txt拷贝到容器/usr/local/路径下 COPY test_copy.txt /usr/local/test_copy.txt #把jdk与tomcat添加到容器中 ADD jdk-8u11-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-8.5.54.tar.gz /usr/local/ # 安装vim编辑器 RUN yum -y install vim # 设置工作访问时候的WORKDIR路径,登录后默认进入的目录 ENV MYPATH /usr/local WORKDIR $MYPATH #配置jdk与tomcat环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_11 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.54 ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.54 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin # 设置容器运行时监听的端口 EXPOSE 8080 # 容器启动时运行tomcat CMD /usr/local/apache-tomcat-8.5.54/bin/startup.sh && tail -f /usr/local/apache-tomcat-8.5.54/logs/catalina.out
- 在Dockerfile同级目录下执行构建镜像的指令:
docker build -t chava/tomcat8:2.0 .
。注:-t后参数表示生成新镜像的名称及版本,"."表示当前路径,这里实际需要一个上下文路径。Dockerfile中的指令都执行完成后,查看本地镜像docker images
,自定义tomcat已构建成功。
- 运行上一步构建成功的容器:
docker run -d -p 8081:8080 --name mytomcat8 -v ~/mydocker/tomcat8/test:/usr/local/apache-tomcat-8.5.54/webapps/test -v ~/mydocker/tomcat8/logs/:/usr/local/apache-tomcat-8.5.54/logs --privileged=true chava/tomcat8:2.0
。注:–privileged=true用于解决可能出现的cannot open directory .: Permission denied问题。查看容器已在正常运行,端口8081也可正常访问:http://localhost:8081。
- 进入容器,查看自定义的功能均已实现。
- 测试:在宿主机的共享目录test下,新建WEB-INF目录,然后新建web.xml文件,完成配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>test</display-name> </web-app>
- 在test目录下新建index.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h3>Hello World!</h3> </body> </html>
- 从浏览器访问:
http://localhost:8081/test/index.html
。刚刚在宿主机中新添加的页面直接可以访问。
- 直接编辑index.html文件,再次访问,修改内容可直接同步更新。
7. Docker镜像发布
7.1 构建SpringBoot应用镜像
7.1.1 准备
- 将SpringBoot项目打包成可执行jar包:
- 将该jar包放入~/mydocker/demo目录下,便于后面进行镜像的构建。
7.1.2 构建
- 新建Dockerfile文件,并写入内容:
# 指定基础镜像,本地没有会从dockerHub pull下来 FROM java:8 # 将可执行jar包复制到基础镜像的根目录下 ADD docker_demo-0.0.1-SNAPSHOT.jar /docker_demo-0.0.1-SNAPSHOT.jar # 镜像要暴露的端口,若要使用,在执行docker run命令时使用-p生效 EXPOSE 80 # 在镜像运行为容器后执行的命令 ENTRYPOINT ["java","-jar","/docker_demo-0.0.1-SNAPSHOT.jar"]
- Dockerfile放在~/mydocker/demo目录下,与可执行jar包同级:
- 使用docker build命令构建镜像:
docker build -f Dockerfile -t chava/docker-demo:1.0 .
。注:-f指定Dockerfile的路径与名称,-t指定生成镜像的名称与TAG,"."表示当前目录,这里实际需要指定一个上下文路径。构建完成,查看本地镜像docker images,发现构建成功。
7.1.3 运行
- 执行运行指令:
docker run -d --name docker-demo -p 7070:8080 chava/docker-demo:1.0
。
- 浏览器访问:
http://localhost:7070/
。
7.2 发布镜像
7.2.1 本地镜像推送阿里云
- 创建镜像仓库:
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
。淘宝或支付宝授权登录。
这里代码源选择本地仓库,可以通过命令行推送镜像到镜像仓库。也可选择GitHub,绑定GitHub账号。
创建镜像仓库完成后,可以查看该仓库的基本信息,以及推送镜像的操作指南。
- 登录阿里云Docker Registry:
docker login --username=chavaer registry.cn-hangzhou.aliyuncs.com
。username是阿里云的登录用户名,输入密码,阿里云服务的登录密码,即可登陆成功。
- 打一个上传阿里云的tag:
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/chava/docker-demo:[镜像版本号]
。镜像ID可以在本地查询后指定。后面的地址为“阿里云地址/命名空间/仓库名称:tag”。
确认打tag成功:
- 推送到阿里云远程仓库:
docker push registry.cn-hangzhou.aliyuncs.com/chava/docker-demo:[镜像版本号]
。
查看推送成功:
7.2.2 下载镜像
- 首先将上一节生成的本地镜像删除:
docker rmi -f 镜像ID
。查看删除成功。
- 拉取阿里云上已上传的镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/chava/docker-demo:1.0
。本地仓库有镜像层缓存,因此拉取较快。可查看拉取成功。
- 运行:
docker run -d --name ali-docker-demo -p 7777:8080 3e39466a3803
。
查看运行成功,可在浏览器访问:http://localhost:7777/
,可以正常访问。