最近在腾讯云买了个轻量级服务器,使用了Docker,Docker属于 操作系统层面的虚拟化技术。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
Docker中有三大概念
- 镜像(
Image) Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。就像我们面向对象语言中Class类的概念一样。 - 容器(
Container) 容器之于镜像类似于实例变量(instance)之于类(Class)。
通过镜像我们可以运行一个容器,容器才是我们真正操作的对象,比如在Docker中获取一个node镜像,然后根据这个镜像来run一个node容器,这个容器就有了node相关的环境变量。
- 仓库(
Repository)
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker常见命令
下面我们以node镜像为例来看一下Docker中常用的操作。
获取最新的node
docker pull node:latest
获取某个版本的node
docker pull node:16.15.1
查看所有镜像
docker images
删除一个镜像
docker rmi e3cb0fb99b7c
查看所有容器
docker container ls -a
进入/使用一个容器
docker attach 243c
停止一个容器,最后跟的是容器id
docker container stop e4283366a16a
使用镜像node:16.15.1启动一个容器,命名为winode,镜像端口80映射到虚拟机端口8000上
docker run -itd --name winode -p 8088:80 node:16.15.1
格式:docker run -it -d --name [container-name] -p 8088:80 [image-name]
参数说明:
- -d 表示后台运行容器
- -t 为docker分配一个伪终端并绑定到容器的标准输入上
- -i 是让容器的标准输入保持打开状态
- -p 指定映射端口 给容器绑定一个端口
启动一个容器之后,进入这个容器操作,winode是容器名称
docker exec -it winode /bin/bash
执行命令后遇到报错: docker exec -it winginx /bin/bash OCI runtime exec failed: exec failed: container_linux.go:367: starting container process caused: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown
原因是因为该镜像是使用alpine制作的,要进入该容器需要输入:
docker exec -it winginx /bin/sh
错误解决!
退出容器
使用上面的命令进入容器之后,退出容器有两种方法
- 正常退出不关闭容器,请按Ctrl+P+Q进行退出容器
- 使用exit退出,在退出之后会关闭容器,可以使用下面方法进行恢复
- 第一步:使用docker restart命令重启容器
- 第二步:使用docker attach命令进入容器
删除一个容器
docker container rm node-stable
注意:apple m1芯片制作docker镜像时需要指定架构平台. 首先查看CPU架构
[root@db ~]# arch # 输出x86_64
指定架构
x86_64DOCKER_DEFAULT_PLATFORM=linux/x86_64 docker build . -t coderh2o/node-webtest-app
其他操作
以腾讯云的轻量级服务器为例。 有时候我们把容器的端口映射到服务器端口上之后,在浏览器中访问不到,有可能是防火墙设置的原因。
在腾讯云的控制台中找到防火墙配置,默认配置如下
开放某个端口给外界则使用
填上开放的端口就可以。
比如我开放了3000端口,3000端口映射到了我node实例(winode)80端口上了,我在浏览器中访问我服务器中的3000端口就可以访问到node容器的80端口所开放的服务。
这里我安装了http-server
npm install http-server -g
并开启一个80端口的服务
http-server -p 80
另外,一般服务器上会安装好几个服务,建议先安装一个nginx容器,并将nginx绑定到服务器的80端口(HTTP)/443端口(HTTPS),然后在nginx配置代理,转发到各个服务。
比如我安装的nginx容器如下