Windows使用docker教程(二):镜像与容器的介绍和使用

前端小王hs:
清华大学出版社《后台管理实践——Vue.js+Express.js》作者 
网络工程师 前端工程师 项目经理 阿里云社区博客专家 

email: 337674757@qq.com
vx: 文章最下方有vx链接
资料/交流群: vx备注docker

前文链接:
Windows使用docker教程(一):配置与安装docker

镜像与容器

什么是镜像?

镜像是一个只读模板,包含了运行某个应用所需的代码、运行环境、依赖库、配置文件等,类似于代码中的class,定义了实例对象所需的基础要素

镜像的特性

  • 不可变:镜像被创建后无法更改
  • 分层结构:会在后续教程关于dockerfile的章节中进行解释
  • 可复用:一个镜像可以创建多个容器

逆向记忆“镜像不可变”的特性

MySQL的镜像为例,不同的镜像会对应不同的新的版本(亦称为tag),在dockerhub中搜索MySQL并进入介绍页面,可看到MySQL支持的版本标签和对应的链接
MySQL镜像
换句话说,如果镜像可变,为什么还要发布那么多的版本呢?

如何理解可复用性

一个类可以创建多个实例,例如下面的JavaScript代码:

// 定义一个名为 Person 的类
class Person {
    // 构造函数,用于初始化新创建的对象
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    // 方法:问候
    greet() {
        console.log(`我的名字是 ${this.name} ,我今年 ${this.age} 岁.`);
    }
}

// 使用 'new' 关键字创建 Person 类的实例
let person1 = new Person('王五', 25);
let person2 = new Person('张三', 30);

// 调用实例的方法
person1.greet(); // 输出: 我的名字是 王五, 我今年 25 岁.
person2.greet(); // 输出: 我的名字是 张三, 我今年 30 岁.

// 访问实例的属性
console.log(person1.name); // 输出: 王五
console.log(person2.age);  // 输出: 30

什么是容器?

容器镜像的一个运行实例,是一个可读写的隔离环境实际运行的就是容器,而不是镜像,即容器是镜像的实例对象

当然,概念或许难以理解,通过下面的使用例子便可拨开云雾见青天

镜像与容器的关系(面试问)

通过镜像,可以创建容器

镜像是静态的,容器是动态的,可运行的

博主觉得最精通的回答是类与实例的关系

镜像和容器的使用

本节以wordpress为例,对wordpress的镜像进行搜索、拉取(安装)和使用

镜像的搜索(查)

搜索的命令格式为docker search '镜像名',例如docker search wordpressdocker search mysql,如下图所示:
docker搜索

  • NAME:镜像名
  • DESCRIPTION:对应镜像的描述
  • STARS:点赞数,类似githubStar
  • OFFICIAL:官方,如[OK]即为官方镜像

搜索可能遇到的问题

需要注意的是,search命令会受到网络影响,容易出现类似下面(当时博主搜索的是nginx)的报错信息:

Error response from daemon: Get "https://index.docker.io/v1/search?q=nginx&n=25": dialing index.docker.io:443 container via direct connection because  has no HTTPS proxy: connecting to index.docker.io:443: dial tcp 199.59.149.231:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

解决的办法

  • 科学上网
  • 增加不同的镜像源
    镜像源

镜像的拉取(增)

拉取的命令格式为docker pull '镜像名',例如docker pull wordpressdocker pull mysql,如下图所示:
拉取docker
最后出现Status: Downloaded newer image for wordpress:latest即表示拉取成功

  • pull:拉取
  • downloaded:已下载(download过去式)

当然,也可以在docker desktop中查看拉取成功(本地)的镜像,如下图所示:
docker images

拉取指定版本镜像

在拉取的镜像后面加上版本号即可,如docker pull wordpress:5.9

查看已拉取的镜像

查看本地镜像的命令格式为docker image lsdocker images,如下图所示:
查看已拉取的镜像

  • REPOSITORY:镜像的名称
  • TAG:版本标签
  • IMAGE ID:镜像的唯一ID
  • CREATED:发布时间(注:不是本地拉取的时间,是镜像发布的时间)
  • SIZE:镜像的大小(随便两三个镜像就超过1G容量了,回想一下第一节提到的修改存储位置,是不是觉得很有必要?)

删除已拉取的镜像(删)

删除本地镜像的命令格式为docker rmi '镜像名',以删除nginx为例,如下图所示:
删除镜像

  • rm:remove👉删除
  • i:image镜像

这里需要注意镜像的删除rmi,可结合单词记忆,容器的删除是rm面试可能会问

删除指定版本的镜像

在删除的镜像后面加上版本号即可,如docker rmi nginx:1.28.0
删除指定版本

运行镜像(开启容器)

以运行wordpress为例,在命令行输入docker run wordpress,如下图所示:
运行
现在,容器便已开启,可以看到命令行的输出中提供了一个IP地址172.17.0.2,但当我们输入该IP地址却无法访问,如下图所示:
无法访问
这是为什么?因为这是容器内部的IP地址,默认在容器外无法访问!! 前面提到,每个容器都是一个运行环境,里面包括了文件系统网络接口等虚拟的环境

解决的方法就是将容器内部的端口与本机的端口进行映射,细分来说一是开启(开放)端口,二是映射端口

端口映射

端口映射的命令是-p 本地端口号:容器端口号,以wordpress为例就是docker run -p 8080:80 wordpress,如下图所示:
端口映射

成功启动wordpress

现在在浏览器中输入localhost:8080即可打开wordpress的配置界面,如下图所示:
wordpress安装界面

查看正在运行的容器

现在,另外启动一个cmd,输入docker ps,查看正在运行的容器,可看到正在运行的wordpress,如下图所示:
查看正在运行的容器

  • CONTAINER ID:容器ID(可用来删除容器、进入容器等操作,很重要
  • IMAGE:镜像
  • COMMAND:容器的启动命令(后续dockerfile会补充这点内容)
  • CREATED:容器的创建(启动)时间
  • STATUS:UP表示启动中,如果为Exited则停止
  • PORTS:端口映射情况
  • NAMES:容器的名字(容器别名)

现在的情况是,当我按ctrl+c退出当前命令即docker run -p 8080:80 wordpress,这个容器就关闭了,这也是为什么博主在另外一个命令行进行查看容器

那么有什么办法能够在后台启动容器?也就是即使按ctrl+c退出当前命令也不会导致容器关闭?

后台启动容器

后台启动容器的命令即-ddocker run -d -p 8080:80 wordpress,那么现在即使退出当前命令,查看正在运行的容器,wordpress还是在运行,如下图所示:
后台启动容器

镜像命令总结

  • 搜索:docker search '镜像名'[:指定版本]
  • 拉取:docker pull '镜像名'[:指定版本]
  • 删除:docker rmi '镜像名'[:指定版本]
  • 查看本地镜像:docker images/docker image ls

容器命令总结

  • 启动:docker run '镜像名'
  • 后台启动:-d
  • 端口映射:-p '本地端口':'容器端口',👉port即端口
  • 查看正在运行容器:docker ps

Windows使用docker教程(三):容器的基本使用命令
Windows使用docker教程(四):挂载MySQL并完成本地映射

欢迎关注csdn前端领域博主: 前端小王hs,喜欢可以点个赞!您的支持是我不断更新的动力!

前端小王hs:
清华大学出版社《后台管理实践——Vue.js+Express.js》作者
网络工程师 前端工程师 项目经理 阿里云社区博客专家 

email: 337674757@qq.com
wx:最下方有联系方式
docker交流: 加v备注docker
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小王hs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值