搭建自己的云服务器时用到的Docker方法总结

185 阅读5分钟

最近在腾讯云买了个轻量级服务器,使用了Docker,Docker属于 操作系统层面的虚拟化技术

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

截屏2022-06-12 21.21.04.png

下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

截屏2022-06-12 21.23.35.png

Docker中有三大概念

  • 镜像ImageDocker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。就像我们面向对象语言中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

错误解决!

退出容器

使用上面的命令进入容器之后,退出容器有两种方法

  1. 正常退出不关闭容器,请按Ctrl+P+Q进行退出容器
  2. 使用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

其他操作

以腾讯云的轻量级服务器为例。 有时候我们把容器的端口映射到服务器端口上之后,在浏览器中访问不到,有可能是防火墙设置的原因。

在腾讯云的控制台中找到防火墙配置,默认配置如下 截屏2022-06-12 21.49.53.png

开放某个端口给外界则使用 截屏2022-06-12 21.49.58.png

填上开放的端口就可以。

比如我开放了3000端口,3000端口映射到了我node实例(winode)80端口上了,我在浏览器中访问我服务器中的3000端口就可以访问到node容器的80端口所开放的服务。

这里我安装了http-server

npm install http-server -g

并开启一个80端口的服务

http-server -p 80

截屏2022-06-12 21.53.12.png

另外,一般服务器上会安装好几个服务,建议先安装一个nginx容器,并将nginx绑定到服务器的80端口(HTTP)/443端口(HTTPS),然后在nginx配置代理,转发到各个服务。

比如我安装的nginx容器如下

截屏2022-06-12 21.54.00.png