上一篇我们聊到了容器,现在大家应该也知道了,没有镜像就没有容器,所以镜像对docker来说是非常重要的,关于镜像的特性和原理作为入门系列就不阐

述了,我还是通过aspnetcore的小sample去熟悉镜像的操控。

一:镜像在哪里

这个问题问到点子上了,就好像说肉好吃,那你告诉我哪里才能买的到?

1. docker官方渠道

docker官方有一个 https://hub.docker.com/ 网址,你能想到和想不到的镜像这上面都有,比如web开发者熟悉的nginx,redis,mongodb等等,而且还告诉

你怎么去下载,如下图:

接下来你可以通过docker pull nginx 来获取docker hub 上最新的镜像了。

[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
6ae821421a7d: Pull complete
da4474e5966c: Pull complete
eb2aec2b9c9f: Pull complete
Digest: sha256:dd2d0ac3fff2f007d99e033b64854be0941e19a2ad51f174d9240dda20d9f534
Status: Downloaded newer image for nginx:latest

那怎么去验证images是否真的pull到本地了呢,可以通过 docker images 查看一下,如下所示,确实下载到本地了。

[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f09fe80eb0e7 days ago 109MB

2. 阿里云渠道

官方渠道之外,有很多第三方机构都搭建了自己的docker hub服务器,比如阿里云,灵雀云等,进入这个:https://cr.console.aliyun.com/cn-hangzhou/images

如果没有登录的话自己登录一下。

关于这些镜像质量怎么样,需要你自己鉴别啦,接下来就可以 docker pull 咯。

[root@localhost ~]# docker pull registry.cn-hangzhou.aliyuncs.com/xynginx/nginx
Using default tag: latest
latest: Pulling from xynginx/nginx
7dc0dca2b151: Pull complete
c4757245bbef: Pull complete
0a46433073b6: Pull complete
Digest: sha256:c0eaf80075734ba7b095162a1a9b2991a48987174f2f3424882714ba7b3c4033
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/xynginx/nginx:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f09fe80eb0e7 days ago 109MB
registry.cn-hangzhou.aliyuncs.com/xynginx/nginx latest 3966d32f8bd8 months ago 347MB
[root@localhost ~]#

上面标红的地方大家要注意一下,Repository的构成是这样的: ip+namespace+imagename,也就是ip地址+命令空间+镜像名,那第一行的nginx为什么就

没有ip和命名空间呢? 这是因为如果没有ip地址,默认就是官方的docker hub地址,没有namespace是因为nginx在dockerhub上是官方的顶级空间上,不需

要特别的namespace,命名空间主要还是区别各自的开发者,比如你看的“xynginx”就是一个namespace,还记得上一篇我给images 打标的tag吗?

huangxincheng/webnotebook:v1  , 前面的“huangxincheng”就是namespace,“v1” 表示(webnotebook)镜像的版本号,方便我后期做回滚啥的,如果没

有就是上面你看到的默认的 TAG=latest,表示最新版。

二:  自己动手做镜像

镜像的来源是找到了,但对于我的这个webnotebook程序来说用处不是特别大,我自己的程序还得我自己打包成镜像,那些现成的只能作为webnotebook的

基础镜像, 那问题来了,自己做镜像怎么做呢?通常来说用dockerfile这个小文件来实现。

1. dockerfile

dockerfile的本质就是把一些安装操作通过一个文本形式展示出来,这样docker引擎就会按照你的安装步骤进行自动化执行,听起来很牛逼,但到底该怎么写

呢,官网上有一个比较全的文档:https://docs.docker.com/engine/reference/builder/   有兴趣的话大家可以看一看。

《1》 上一篇容器运行采用的是这个镜像,如下图。

FROM microsoft/dotnet:2.2-aspnetcore-runtime
LABEL author="hxc@qq.com"
RUN mkdir /data
COPY ./ /data
WORKDIR /data
EXPOSE
CMD [ "dotnet","WebNotebook.dll" ]

FROM: 这个后面定义的是一个镜像名,表示我后面的所有操作都是基于这个镜像来的,如果好奇这个基础镜像写了什么,可以去hub上找一下。

Label: 可以用来定义一些标签数据,比如镜像的作者,镜像的版本等。。

RUN: 这个标签后面,就可以执行一些Shell 命令,比如我创建了一个data目录。

COPY:将dockerfile所在目录的内容copy到容器的/data目录, dockerfile所在的目录就是上一篇说到的publish文件夹哦,这是你在docker build的时候指定

         的 . 确定的路径。

WORKDIR :  这个和cd 命令是一个意思,切换到 指定的目录,后续的操作都是在这个切换后的目录上进行操作的。

EXPOSE : 表示容器在运行后监听你指定的端口号。

CMD:  这个是容器起来后,在shell上执行的命令参数,比如启动webnotebook.dll 。

2.  进一步改造dockerfile

在上一篇也说到了,microsoft/dotnet:2.2-aspnetcore-runtime 镜像不是采用centos作为基础镜像的,所以你熟悉的yum 命令就玩不下去了,既然都是

命令的自动化执行,那何不我自己动手下载安装netcore环境呢? 把下面的安装命令写到dockerfile即可。

有了上面的想法之后,改造后的dockerfile如下:

FROM centos
LABEL author=hxc
USER root RUN rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
RUN yum install -y dotnet-sdk-2.2 RUN mkdir /data
COPY ./ /data
WORKDIR /data
EXPOSE
CMD [ "dotnet","WebNotebook.dll" ]

然后就可以通过 docker build 构建镜像啦,后面的 .  表示把当前publish文件夹作为docker构建过程中的根目录哦。

[root@localhost publish]# docker build -t huangxincheng520/webnotebook:v1 -f ./Dockerfile .
Sending build context to Docker daemon .201MB
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
dotnet-sdk-2.2 x86_64 2.2.- packages-microsoft-com-prod M
Installing for dependencies:
aspnetcore-runtime-2.2 x86_64 2.2.- packages-microsoft-com-prod M
dotnet-host x86_64 2.2.- packages-microsoft-com-prod k
dotnet-hostfxr-2.2 x86_64 2.2.- packages-microsoft-com-prod k
dotnet-runtime-2.2 x86_64 2.2.- packages-microsoft-com-prod M
dotnet-runtime-deps-2.2 x86_64 2.2.- packages-microsoft-com-prod 2.8 k
libicu x86_64 50.1.-.el7 base 6.9 M Transaction Summary
================================================================================
Install Package (+ Dependent packages) Total download size: M
Installed size: M
Downloading packages:
warning: /var/cache/yum/x86_64//packages-microsoft-com-prod/packages/dotnet-host-2.2.-x64.rpm: Header V4 RSA/SHA256 Signature, key ID be1229cf: NOKEY
Public key for dotnet-host-2.2.-x64.rpm is not installed
warning: /var/cache/yum/x86_64//base/packages/libicu-50.1.-.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for libicu-50.1.-.el7.x86_64.rpm is not installed
--------------------------------------------------------------------------------
Total kB/s | MB :
Retrieving key from https://packages.microsoft.com/keys/microsoft.asc
Importing GPG key 0xBE1229CF:
Userid : "Microsoft (Release signing) <gpgsecurity@microsoft.com>"
Fingerprint: bc52 b50d 79e3 39d3 721c eb3e 94ad be12 29cf
From : https://packages.microsoft.com/keys/microsoft.asc
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
Fingerprint: ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
Package : centos-release--6.1810..el7.centos.x86_64 (@CentOS)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
Installing : libicu-50.1.-.el7.x86_64 /
Installing : dotnet-runtime-deps-2.2-2.2.-.x86_64 /
Installing : dotnet-host-2.2.-.x86_64 /
Creating dotnet host symbolic link: /usr/bin/dotnet
Installing : dotnet-hostfxr-2.2-2.2.-.x86_64 /
Installing : dotnet-runtime-2.2-2.2.-.x86_64 /
Installing : aspnetcore-runtime-2.2-2.2.-.x86_64 /
Installing : dotnet-sdk-2.2-2.2.-.x86_64 /
This software may collect information about you and your use of the software, and send that to Microsoft.
Please visit http://aka.ms/dotnet-cli-eula for more information.
Welcome to .NET Core!
---------------------
Learn more about .NET Core: https://aka.ms/dotnet-docs
Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs Dependency Installed:
aspnetcore-runtime-2.2.x86_64 :2.2.- dotnet-host.x86_64 :2.2.-
dotnet-hostfxr-2.2.x86_64 :2.2.- dotnet-runtime-2.2.x86_64 :2.2.-
dotnet-runtime-deps-2.2.x86_64 :2.2.- libicu.x86_64 :50.1.-.el7
Complete!
Successfully tagged huangxincheng520/webnotebook:v1

最后用docker run 把容器跑起来,然后到容器里面用curl看一看,可以正常看到html内容的。

[root@localhost publish]# docker run --name webnotebook -d huangxincheng520/webnotebook:v1
c4f6fcf41bb7f16a5d071670b9715f29930769bce4dfdc332f729421ea758adf
[root@localhost publish]# docker logs webnotebook
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[]
No XML encryptor configured. Key {89febb45-379d-434c-8d6f-519982cf7dd3} may be persisted to storage in unencrypted form.
warn: Microsoft.AspNetCore.Server.Kestrel[]
Unable to bind to http://localhost:5000 on the IPv6 loopback interface: 'Cannot assign requested address'.
Hosting environment: Production
Content root path: /data
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
[root@localhost publish]# docker exec -it webnotebook /bin/bash
[root@c4f6fcf41bb7 data]# curl http://localhost:5000
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Home Page - WebNotebook</title>

3.  删除(批量)镜像

删除镜像之前先把容器给删除了,使用 docker rm 即可,加 " -f " 表示force模式的删除。

[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c4f6fcf41bb7 370bac31a610 "dotnet WebNotebook.…" minutes ago Up minutes /tcp webnotebook
[root@localhost ~]#
[root@localhost ~]# docker rm -f webnotebook
webnotebook

然后再删除镜像,可以用镜像名或者ID都可以。

[root@localhost ~]# docker rmi -f 370bac31a610
Deleted: sha256:370bac31a610d019d1fe587f458cfa250761d2cb71921f55aa2e49593fa0f770
Deleted: sha256:a6a145a4e99324415d9f55135d428df0fb1c92c4c7cd0f738d7ccf0b456a6cff
Deleted: sha256:be8c2b370bb62edb20f0388afd767b5ae7a3b0f7b7c579b03d9ab0600d12c708
Deleted: sha256:01cb9ef8025421c112567a7a183b71264d2c960c5b032d4a0460752ef1609315
Deleted: sha256:73ebb899a30a18bbfdac2d275eb7817eaccde799841f049c08328e8e2d25c20e
Deleted: sha256:f0d3b80f85fc35efe302aeac376404f093a19443d5c8cd0cbd5ffd5dc3273c80
Deleted: sha256:aba79a0d1eb6d51fbcc7835842118054a29aa638f5a5f6e9d64052ebc989b807
Deleted: sha256:6cb7a3cb0c1b3a61f9776b1f0458a45c8833fa48adce58e0dceed54dafc92c57
Deleted: sha256:759696abeffa01d0c698aa29eb88bf48e6c11896d473597487d401d1b32bb118
Deleted: sha256:9c9cc8dd7605f836736bfeb72b9672635c37dc923ff5e39da68773f14497a3ab
Deleted: sha256:a0ceb44bdbaf4b654cd4dd623756b4d0e439561e6e2c53f58dd3f7ed35ec0ee0
Deleted: sha256:d6c422802c9c39bf7ffee0495205f434bd679e25cad1d188d1d1d561490980ae
Deleted: sha256:76c79033917b2a75b2b624aa3b3e0936bef76e3322f62508153fb6d9cf825e76
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 1e1148e4cc2c months ago 202MB
[root@localhost ~]#

也可以使用批量命令,一次性删除容器或者镜像。

docker rm -f `docker ps -a -q`        # 删除所有容器
docker rmi -f `docker images -q` # 删除所有的镜像

好了,本篇就先说到这里,希望对你有帮助。

8天入门docker系列 —— 第三天 使用aspnetcore小案例熟悉对镜像的操控的更多相关文章

  1. 8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署

    这一篇继续完善webnotebook,如果你读过上一篇的内容,你应该知道怎么去挂载webnotebook日志和容器的远程访问,但是这些还远不够,webnotebook 总要和一些数据库打交道吧,比如说 ...

  2. 8天入门docker系列 —— 第四天 使用aspnetcore小案例熟悉端口映射和挂载目录

    到目前为止大家应该对镜像和容器有了一个大概认知,而且也用了docker进行了一个简单化的部署,但仔细一看问题还有很多,所以这篇我们继续完善. 一:如何让外网访问到容器内应用 我们知道容器内拥有自己的子 ...

  3. 8天入门docker系列 —— 第二天 通过一个aspnetcore程序加深对容器的理解

    我们知道容器是一个打包了应用和相关依赖的盒子,那怎么去操控这个盒子呢? 这一篇我通过一个简单的aspnetcore程序来加深对盒子的理解,使用之前先 安装一下Docker的环境. 一:Docker的安 ...

  4. 8天入门docker系列 —— 第一天 docker出现前的困惑和简单介绍

    docker出来也有很多年了,但用到的公司其实并不是很多,docker对传统开发是一个革命性的,几乎颠覆了之前我们传统的开发方法和部署模式,而大多 公司保守起见或不到万不得已基本上不会去变更现有模式. ...

  5. 8天入门docker系列 —— 第八天 让程序跑在swarm集群上

    真正的落地部署都是希望程序跑在集群下,而不是单机版下测测玩玩,所以这篇就来聊一下怎么使用docker swarm进行部署,因为是swarm是docker自带的, 所以部署起来还是非常简单的. 一:前置 ...

  6. Docker系列(三)Dockerfile 离线构建镜像

    一.Dockfile介绍: Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfil ...

  7. 8天入门docker系列 —— 第七天 让你的container实现跨主机访问

    当你有若干个容器之后,你可能就希望实现容器的跨机部署访问了,比如aspnetcore在一台host上,mysql在另外一个host上,如果要实现这样的功能,需要你借助 docker自带的overlay ...

  8. Ext入门学习系列(三)复杂自定义窗体

    通过前2节的学习,基本掌握了Ext的语法和运行原理,可以作出一些简单的应用.本节我们一起来完成复杂点的对话框操作,因为在实际项目中经常要用到确认对话框等多种操作,然后根据客户的选择作出不同的响应. 一 ...

  9. 8天入门docker系列 —— 第六天 搭建自己的私有镜像仓库Registry

    这一篇我们来聊聊私有仓库的搭建,其实不管你是通过docker build还是compose的方式进行构建,最终还是要将生成好的镜像push到远程的仓库中,这样多个 平台可以方便的获取你registry ...

随机推荐

  1. juniper srx 配置

    天涯海角- juniper为人所熟悉的一定是从netscreen开始的,作为一线防火墙品牌,还是有很高的地位.但是以前玩netscreen,都是用的网页版去配置,而且网页版做得很不错.但是现在nets ...

  2. mysql中enum类型理解

    ENUM是枚举类型,它虽然只能保存一个值,却能够处理多达65535个预定义的值.下面是我写的一个mysql语句 CREATE TABLE student( id INT(11) PRIMARY key ...

  3. SpringMVC中的异常处理

    springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1. 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeExc ...

  4. windows下Redis的安装配置以及注意事项

    一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址 ...

  5. left join 后的条件 位置不同,查询的结果不同

    表t_a id name 1 a1 2 a2 表t_b a1_id name num 2 b2 1 3 b3 100 left join 后加查询条件 select a.* from t_a a le ...

  6. 并行(Parallelism)与并发(Concurrency)

    并行(Parallelism):多任务在同一时刻运行.例如,多个任务在多核处理器上运行. 并发(Concurrency):两个或者两个以上的任务在一段时间内开始.运行.完成,这意味着它们不是在同一时刻 ...

  7. D. Kuro and GCD and XOR and SUM

    Kuro is currently playing an educational game about numbers. The game focuses on the greatest common ...

  8. tkinter中checkbutton多选框控件和variable用法(六)

    checkbutton控件 简单的实现多选: import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry ...

  9. Git常用命令解说

    http://blog.csdn.net/hangyuanbiyesheng/article/details/6731629 1. Git概念  1.1. Git库中由三部分组成         Gi ...

  10. 巩固java(三)---java修饰符

    正文:               下面的表格列出了java中修饰符的一些信息: 修饰符名称 类型 类 变量 方法 abstract 非访问控制符 抽象类          -- 抽象方法 final ...