前端小王hs:
清华大学出版社《后台管理实践——Vue.js+Express.js》作者
网络工程师 前端工程师 项目经理 阿里云社区博客专家
email: 337674757@qq.com
vx: 文章最下方有vx链接
资料/交流群: vx备注docker
前文链接:
Windows使用docker教程(一):配置与安装docker
镜像与容器的介绍和使用
镜像与容器
什么是镜像?
镜像是一个只读模板,包含了运行某个应用所需的代码、运行环境、依赖库、配置文件等,类似于代码中的class,定义了实例对象
所需的基础要素
镜像的特性
- 不可变:镜像被创建后无法更改
- 分层结构:会在后续教程关于
dockerfile
的章节中进行解释 - 可复用:一个镜像可以创建多个容器
逆向记忆“镜像不可变”的特性
以MySQL
的镜像为例,不同的镜像会对应不同的新的版本(亦称为tag
),在dockerhub
中搜索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 wordpress
、docker search mysql
,如下图所示:
- NAME:镜像名
- DESCRIPTION:对应镜像的描述
- STARS:点赞数,类似
github
的Star
- 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 wordpress
、docker pull mysql
,如下图所示:
最后出现Status: Downloaded newer image for wordpress:latest
即表示拉取成功
- pull:拉取
- downloaded:已下载(download过去式)
当然,也可以在docker desktop
中查看拉取成功(本地)的镜像,如下图所示:
拉取指定版本镜像
在拉取的镜像后面加上版本号即可,如docker pull wordpress:5.9
查看已拉取的镜像
查看本地镜像的命令格式为docker image ls
或docker 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
的配置界面,如下图所示:
查看正在运行的容器
现在,另外启动一个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
退出当前命令也不会导致容器关闭?
后台启动容器
后台启动容器的命令即-d
,docker 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