Docker——基础篇

文章目录

一. 前言

本博客仅适合0基础小白或者对docker有小小的了解的小伙伴在某些docker命令等概念性的知识用快速阅读了解即可,无需刻意背下来。对容器数据卷、DockerFile需要深入了解

二. 问题背景

笔者对docker仅处于认知阶段,准备使用docker搭建一些应用集群(比如MySQL、redis)。学习的过程中做一下笔记来加深印象。

参考自:尚硅谷_Docker核心技术(基础篇)视频中使用到的mmap笔记文件也有的。

三. 知识储备

学习Docker,笔者认为需要了解以下技术:

  1. Java基础知识。 起码要知道Java文件要经历编译,成为class文件,再打包成为jar或者war,才是可执行的程序。

  2. Linux知识。 起码要知道怎么复制、粘贴、剪切、查看ip地址、编辑一个文本、Linux目录结构、搭建Linux环境。

  3. git知识。 起码要知道git的常用命令,git的结构。

  4. 有一颗阅读技术文档(英文、中文)的心。 笔者从0基础小白入门Java,学了基本的web框架,个人认为后期想要再增长知识,需要去基础官方文档的东西了,大部分流行的开源产品都出自国外,阅读英文的官方文档是必不可少的。

了解以上技术,再去学习Docker会比较容易理解。

三. Docker简介

了解一个新的东西,笔者认为要有一个宏观认识:是什么;为什么;怎么样。即Docker是什么,为什么会有Docker,Docker可以干些什么事情

3.1 为什么会有Docker

一个产品从开发到上线,需要经历开发、打包应用程序、配置操作系统、配置应用运行环境阶段。这个过程还不算麻烦,但是当版本迭代的时候呢?还要考虑版本对应的操作系统、运行环境、应用配置是否要更改。单体应用的时候手动改也还算能容忍吧,那么当应用的服务越来越多,使用了分布式架构后,几十个服务几十个运行环境,运维的成本是非常高的。因此开发人员就想软件带环境安装,我只需安装一次,就可以copy这个安装包,分别在其他机器上安装了。因此Docker实现了这样的功能。

3.2 Docker是什么

Docker是基于Go语言实现的云开源项目。Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

3.3 Docker能干什么

3.3.1 虚拟机技术

虚拟机技术的缺点:

  1. 资源占用多
  2. 冗余步骤多
  3. 启动慢

3.3.2 容器虚拟化技术

由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。它不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

3.3.3 Docker 和传统虚拟化方式的不同之处

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

如下图所示:
在这里插入图片描述

四. Docker的基本组成

4.1 镜像(image)

可以类比Java来了解镜像的概念。镜像就好比是Java中的类,他是一个模板,只读的。一个类可以创建多个实例,那么一个镜像可以创建多个容器。容器就好比Java中的实例对象。

4.2 容器(container)

容器就好比Java中的实例对象。容器是用镜像创建的运行实例。它可以被启动、停止、重启、删除。每个容器都是相互隔离的,保证平台的安全(提前说一下,容器间也可以通过数据卷进行沟通、共享数据。后面会详细讲述)

4.3 仓库(repository)

类比git,docker也有仓库。我们可以从仓库拉取自己想要的镜像。国外的仓库有Docker Hub。国内的仓库有阿里云、网易云。

4.4 总结

在这里插入图片描述

五. 安装Docker

5.1 去哪下载

考虑到国内访问docker官网速度超级慢、阿里云的云产品在国内也是棒棒的,这里建议使用阿里云官网下载docker。步骤如下:

  • 访问阿里云官网,选择”开发者“->”镜像站",跳转到另一个页面,选择“容器”,如下:
    在这里插入图片描述
  • 来到如下界面:
    在这里插入图片描述
  • 下拉页面,可以看到CentOS操作系统下载Docker CE镜像的教程,这里贴出代码,只需照着代码执行即可:
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

5.2 配置阿里云镜像加速

  • 使用百度搜索引擎访问 dev.aliyun.com,然后在搜索框输入”docker“,如下:
    在这里插入图片描述
  • 点击搜索后,可能会跳转到登陆页面,使用支付宝扫码登陆即可,或者淘宝、阿里云登陆。然后点击如下:

在这里插入图片描述
这里贴出配置执行的代码:

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://bxvi4112.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

六. Docker的hello-world

在终端运行docker run hello-world。出现如下代码证明测试成功:

[root@localhost1 ~]# docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

七. Docker底层原理

7.1 Docker是怎么工作的

Docker是一个C/S结构的系统。daemon守护进程运行在主机上,通过socket连接客户端。daemon守护进程监听客户端的命令,并管理运行在主机上的容器。容器的本质就是一个运行时环境。

如下图:
在这里插入图片描述

7.2 为什么Docker比VM快

  1. Docker有着比虚拟机更少的抽象层,docker没有实现Hypervisor硬件虚拟化。docker直接使用物理机上的硬件资源。因此在CPU、内存利用率上docker会有更明显的优势。

  2. docker利用的是宿主机的内核,无需Guest OS (Guest OS,虚拟机的操作系统;Host OS,物理机的操作系统)。因此docker无需加载操作系统,节省引寻、加载内核的时间。

两者的架构图如下所示:
在这里插入图片描述

八. Docker常用命令

8.1 帮助命令

命令 作用
docker version 查看docker其中各种组件的版本(client版本、server版本、git版本、go版本等等)
docker info 查看docker更详细的信息
docker --help docker命令手册,经常用到,我们忘记某个命令就敲这个

8.2 镜像命令

命令 作用
docker images 列出本地主机上所有镜像,-q参数只列出镜像id,-a参数列出所有镜像(包含隐藏的镜像)
docker search 某个xxx镜像名字 去docker仓库搜索镜像,比如hub.docker.com,百度搜索引擎搜索dev.aliyun.com
docker pull 某个镜像名字[:tag] 下载某个镜像,可以指定特定tag的镜像
docker rmi -f 镜像id
docker rmi -f 镜像名1:tag 镜像名2:tag
docker rmi -f $(docker images -qa)
强制删除某个镜像,-f是强制的作用
删除多个镜像
删除所有的镜像

思考:类比git,docker是否会有commit、push的命令呢?
答:查查docker --help就知道了

8.3 容器命令

有镜像才能有容器,我们下载一个centos镜像来做实验。输入docker pull centos

命令 作用
docker run [options] 镜像名或ID [command] [arg] opion说明:
--name=“容器新名字”:为容器指定一个名字,不配置则自动随机命名;
-d:后台运行容器,并返回容器id,即启动守护式容器;
-i:以交互模式启动容器,通常与-t同时使用;
-t:为容器分配一个伪输入终端,通常与-i一起使用;
-P:随机端口映射;
-p:指定端口映射(ip:hostPort:containerPort;ip::containerPort;hostPort:containerPort;containerPort;)
使用centos镜像以交互模式启动一个容器,并在容器内执行/bin/bash命令:docker run -it centos /bin/bash
docker ps [options] options说明:
-a:列出当前所有正在运行的容器+历史上运行过的;
-l:显示最近创建的容器;
-n 数字:显示最近创建的n个容器;
-q:静默模式,只显示正在运行的容器id;
--no-trunc:不截断容器id输出;
exit
ctrl + p + q
停止容器并退出容器;
不停止容器并退出容器;
docker start 容器名或id 启动容器
docker restart 容器名或id 重启容器
docker stop 容器名或id 停止容器
docker kill 容器名或id 强制停止容器id或容器名
docker rm -f 容器名或id
docker rm -f $(docker ps -qa)
docker ps -qa | xargs docker rm -f
强制删除容器;
强制删除所有容器;
强制删除所有容器;

8.4 重要的容器命令

8.4.1 启动守护式容器

以后台模式启动一个容器,如下:

docker run -d 容器名或id

执行上面的命令后,再执行如下:

docker ps -a

会发现刚刚以后台模式启动的容器已退出。

总结:Docker容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如top,tail),容器就会自动退出。 这个是docker的机制,笔者不了解详情,高级篇再仔细研究

8.4.2 查看容器日志

docker logs -tf --tail 数字 容器名或id

说明:

  • -t是加入时间戳
  • -f跟随最新日志的打印
  • --tail 数字,是显示最后多少条

8.4.3 查看容器内的进程

docker top 容器名或id

8.4.4 查看容器内部的细节

docker inspect 容器名或id

8.4.5 进入正在运行的容器并以命令行交互

  • docker exec -it 容器名或id /bin/bash在容器中打开新的终端并启动新的线程

  • docker attach 容器名或id 直接进入容器的终端,不会启动新的线程

8.4.6 从容器内拷贝文件到物理机上

docker cp 容器名或id:容器内路径 目的主机路径

九. Docker镜像

9.1 是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

9.2 特点

Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

9.3 Docker镜像的commit操作

docker commit -a="作者" -m="提交的描述信息" 容器id 要创建的目标镜像名:[标签名]

十. Docker容器数据卷

10.1 为什么会有Docker容器数据卷

我们知道Docker的理念是一次打包,到处运行。即将应用与运行环境一起打包的。但是Docker运行就会产生数据,那么这些数据怎么办?Docker会进行处理或者备份吗?因此我们希望保存在容器里面的数据可以持久化。 并且希望容器间可以共享数据(通信)。

因此有了容器数据卷这个东西。

10.2 数据卷到底是什么

卷,就是目录或文件。 它可以存在与若干个容器中,由docker挂载到容器中。设计卷的目的就是持久化,卷完全独立于容器的生命周期,因此删除docker的时候不会删除挂载在容器上面的卷。

10.3 数据卷的特点

  1. 数据卷可以在容器之间共享数据或重用数据;
  2. 卷中的更改直接生效
  3. 中的更改不会包含在镜像的更新中,即在卷中做出的更改,不会更新到新的镜像中
  4. 卷的生命周期一直持续到没有容器调用它为止

10.4 容器内添加数据卷

10.4.1 命令

docker run -it -v /宿主机目录:/容器内目录 镜像名 命令

10.4.2 查看数据卷是否挂载成功

docker inspect 容器id

在这里插入图片描述
在这里插入图片描述

10.4.3 测试

  • 先在宿主机上创建目录,如下路径的目录:
[root@localhost1 docker]# pwd
/work/docker
  • 使用systemctl start docker启动docker

  • 执行以下代码新建并运行一个容器,并且挂载数据卷,实现宿主机与容器间可以数据共享,如下:

[root@localhost1 docker]# docker run -it --name mycentos -v /work/docker/:/work/docker/ centos /bin/bash
  • 使用docker inspect 容器id查看是否成功挂载

  • 若挂在成功,那么就开始测试是否能实现数据共享了

  • 先在宿主机/work/docker/中新建一个file.txt,在里面随便编辑内容,保存退出。如下:
    (file.txt文件的内容是host write.)

[root@localhost1 docker]# pwd
/work/docker
[root@localhost1 docker]# ll
总用量 4
-rw-r--r--. 1 root root 12 11月  9 11:32 file.txt
  • 使用docker exec -it 容器名或id /bin/bash进入容器,如下:
[root@localhost1 docker]# docker exec -it mycentos /bin/bash
[root@20e344952abf /]#
  • 进入容器的/work/docker/目录,并查看file.txt内容,如下:
[root@20e344952abf /]# cd /work/docker/
[root@20e344952abf docker]# ls
file.txt
[root@20e344952abf docker]# cat file.txt 
host write.
[root@20e344952abf docker]#
  • 容器能读取宿主机写入的数据。

  • 现在在容器里面编辑file.txt文件,保存退出。并使用ctrl + p + q切换到宿主机,如下:

[root@20e344952abf docker]# vi file.txt 
[root@20e344952abf docker]# cat file.txt 
host write.
docker mycentos write.
[root@20e344952abf docker]# lsread escape sequence
[root@localhost1 docker]#
  • 进入宿主机的目录/work/docker/,并查看file.txt的内容,如下:
[root@localhost1 docker]# pwd
/work/docker
[root@localhost1 docker]# cat file.txt 
host write.
docker mycentos write.
[root@localhost1 docker]# 
  • 宿主机读取容器写入的数据成功

测试完成

10.4.4 带权限挂载数据卷

命令:

docker run -it --name= 容器名 -v /宿主机目录/:/容器目录:ro 镜像名

ro:read only,只读的意思

测试:

[root@localhost1 docker]# docker rm -f mycentos
mycentos
[root@localhost1 docker]# docker run -it --name=mycentos -v /work/docker/:/work/docker/:ro centos
[root@b820ef9db0a1 /]# cd work/docker/
[root@b820ef9db0a1 docker]# ls
file.txt
[root@b820ef9db0a1 docker]# mkdir file2.txt
mkdir: cannot create directory 'file2.txt': Read-only file system
[root@b820ef9db0a1 docker]# 

结果:在容器里面创建文件失败,报错是Read-only file system

10.5 DockerFile中添加数据卷

DockerFile是描述一个镜像的文件,其实镜像就是根据DockerFile生成的。 后面会详细讲述DockerFile。

在DockerFile中可以使用 VOLUME指令 给镜像添加一个或多个数据卷

说明:出于可移植和分享的考虑,用-v 宿主机目录:容器目录这种方法不能够直接在DockerFile中实现。因为宿主机目录依赖与宿主机,不能保证所有的宿主机上都存在特定的目录

例子:
在DockerFile中增加

VOLUME["/dataVolumeContainer","/dataVolumeContainer2"]

通过上述步骤,容器内的卷目录地址已经知道。对应的主机目录地址哪??

答:使用docker inspect 容器id,如下:
在这里插入图片描述

10.6 Docker挂载主机目录Docker访问出现cannot open directory

解决办法: 在挂载目录后多加一个–privileged=true参数即可

十一. DockerFile(重要)

11.1 是什么

DockerFile是用来构建docker镜像的构建文件,是由一些命令和参数构成的脚本

例子:这是通过dev.aliyun.com搜索docker找到的DockerFile,如下:

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL \
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20200809" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-08-09 00:00:00+01:00"

CMD ["/bin/bash"]

说明:反斜杠\是docker的换行符;scratch是一个基础镜像(Base镜像),Docker Hub中99%的镜像都是通过在Base镜像中安装和配置需要的软件构建出来的

11.2 构建三步骤

  1. 编写DockerFile文件
  2. docker build
  3. docker run

11.3 DockerFile内容基础知识

  1. 每条保留指令字都必须大写,且后面至少跟随一个参数
  2. 指令从上到下顺序执行
  3. 井号#表示注释
  4. 每条指令都会创建一个镜像层并对镜像进行提交,也就是一个完整的镜像是由多个小镜像包裹组成的。如下图所示:
    在这里插入图片描述

11.4 Docker执行DockerFile的大致流程

  1. docker从基础镜像执行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit提交一个新的镜像层
  4. docker再基于刚才提交的镜像运行一个新的容器
  5. 执行DockerFile中下一条指令,直到所有指令都执行完成

如下图所示:
在这里插入图片描述

11.5 DockerFile保留指令字

指令字 作用
FROM 基础镜像,当前新镜像是基于那个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令,一般用来安装某些linux工具包
EXPOSE 当前容器对外暴露的端口
WORKDIR 指定在创建容器后,默认登陆的一个工作目录,一个落脚点
ENV 构建镜像过程中配置的环境变量
ADD 将宿主机目录下的文件拷贝进镜像并且ADD命令会自动处理url以及解以tar包
COPY 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令。DockerFile中允许有多个CMD,但最终有效的是最后一个。CMD会被docker run之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令。与CMD不同的是,多个ENTRYPOINT都有效
ONBUILD 当构建一个被继承的DockerFile时运行命令,父镜像被子镜像继承后,父镜像的ONBUILD被触发

11.6 案例

11.6.1 docker hub中默认的cantos镜像的DockerFile

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL \
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20200809" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-08-09 00:00:00+01:00"

CMD ["/bin/bash"]

说明:FROM指令后面的scratch,是一个基础镜像。Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的

11.6.2 自定义镜像mycentos

  • 进入/work/docker/编写DockerFile文件,如下:
[root@localhost1 docker]# pwd
/work/docker
[root@localhost1 docker]# ll
总用量 4
-rw-r--r--. 1 root root 35 11月  9 11:58 file.txt
[root@localhost1 docker]# vim Dockerfile

注意:文件名必须叫Dockerfile,否则会报错。

DockerFile文件如下:

FROM centos
MAINTAINER gzl<[email protected]>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD echo $MYPATH
CMD echo "success......OK"
CMD /bin/bash

  • 使用如下命令创建镜像:
[root@localhost1 docker]# pwd
/work/docker
[root@localhost1 docker]# ll
总用量 8
-rw-r--r--. 1 root root 204 11月  9 16:17 Dockerfile
-rw-r--r--. 1 root root  35 11月  9 11:58 file.txt
[root@localhost1 docker]# docker build -t mycentos:1.0 .

注意:docker build -t mycentos:1.0 .命令最后有一个英文句号!!!它表示当前目录。

  • 执行如下命令新建并运行容器:
[root@localhost1 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            1.0                 bb8d1e431a86        3 minutes ago       295MB
atguigu/mytomcat    1.2                 c5ed45489959        4 days ago          650MB
tomcat              latest              35064a4fcc93        6 days ago          648MB
centos              latest              0d120b6ccaa8        3 months ago        215MB
hello-world         latest              bf756fb1ae65        10 months ago       13.3kB
[root@localhost1 docker]# docker run -it --name centos1 mycentos:1.0
[root@3b92058dff93 local]# vim test.txt
[root@3b92058dff93 local]# cat test.txt 
write with vim
[root@3b92058dff93 local]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name 

可以看到,vim、netstat命令都可以使用了。

自定义镜像成功。

可以通过使用命令docker history 镜像名列出镜像变更史

11.6.3 自定义镜像tomcat9

  • Dockerfile如下:
FROM         centos
MAINTAINER    zzyy<[email protected]>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE  8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out

  • 使用docker build -t 镜像名 .构建docker

  • 使用如下命令启动容器:

docker run -d -p 9080:8080 --name myt9 -v \
/zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test \
-v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs \
--privileged=true zzyytomcat9

11.7 总结

在这里插入图片描述

十二. 本地镜像发布到阿里云

12.1 流程

在这里插入图片描述

12.2 生成一个镜像

从容器创建一个新的镜像,命令如下:

docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]

说明:参数有-a,表示提交镜像的作者;参数-m表示提交时的说明文字。类比git来理解即可。

登陆dev.aliyun.com,在 ”镜像搜索“ 按钮旁边的框输入docker,来到docker的管理界面。我们点击左上角的 ”镜像仓库“,按要求填写信息,如下:
在这里插入图片描述

  • 将镜像推送到registry,执行如下:

在这里插入图片描述

推送成功后,通过下图方式搜索:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40634846/article/details/109507462