一、前言
为了实现环境隔离,想到的办法:虚拟化硬件、操作系统软件、Linux容器
容器的实现原理:
namespace:**限制容器的查看与访问范畴**,Docker会创建多个命名空间供特定容器使用。Docker会创建多个命名空间供特定容器使用(NET、PID、、、)。-----控制容器内部访问外界
控制组:一组进程的资源使用量(包括CPU、内存、磁盘I/O以及网络等)进行隔离、排序与计数。这意味着cgroup能够确保Docker容器只使用其必需的资源——并在必要情况下设置其所能使用的资源上限。另外,cgroups还能够确保单一容器不至于占用太多资源并导致整体系统陷入瘫痪。-------------控制进程资源使用
二、Linux容器
之前使用的是虚拟机,但是由于虚拟机具有启动慢、占用资源多等问题,Linux开发了另一套影响至今的虚拟化技术----LInux容器技术,
Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离,可以看成是在正常的进程之外套了一层保护套,对于容器里面的进程来说,他接触到的资源都是虚拟的,从而实现和底层系统的隔离。
由于容器是进程级别的,相比虚拟机有很多优势;启动快、体积少、耗费资源少
三、Docker
Docker是一个开源的应用容器引擎,是Linux容器的一种封装,并提供了简单易用了容器接口
Docker将应用程序与程序的依赖打包到一个文件当中,运行这个文件就会生成一个虚拟容器,程序在虚拟容器当中运行就好像在真实的物理机上运行一样,解决了环境问题。
3.1 docker安装
安装完成后,运行下面的命令,验证是否安装成功。
$ docker version
# 或者
$ docker info
3.2 docker 启动
Docker 是服务器----客户端架构。命令行运行docker命令的时候,需要本机有 Docker 服务。如果这项服务没有启动,可以用下面的命令启动(官方文档)。
# service 命令的用法 $ sudo service docker start # systemctl 命令的用法 $ sudo systemctl start docker
3.3 docker容器
#查看所有容器
docker ps
#查看已运行的容器
docker ps -a
#获得容器信息
docker container ls -a
#停止容器
docker container stop <container ID>
#删除容器
docker container rm <container ID>
# 容器运行日志
docker logs --tail 100 tml-hes
docker logs --since 2021-11-09T08:30:00 --until 2021-11-10T20:05:00 tml-hes
3.4 docker 镜像
Docker把应用程序及其依赖打包到一个image文件当中,只有通过这个文件才可以生成Docker容器。同一个Image文件可以生成多个容器,image文件是一个二进制文件,一台机器上的image文件在另一台机器上也可以使用。
#列出本机所有的镜像
docker images
docker image ls
#删除镜像
docker image rm ImagesID 、docker rmi -f f78
$ 从仓库抓取镜像
docker image pull hello-world
# 注意,docker container run命令具有自动抓取 image 文件的功能,如果本地不存在,则抓取,并创建容器运行
docker container run hello-world
$ 查看镜像详情
docker inspect redis:3.2
有些容器在运行完毕后,容器自动终止;有些则不会,对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止。
$ docker container kill [containID]
3.5 dockerFile文件
dockerfile文件时一个文本文件,用来配置image文件;docker根据该文件生成image文件
3.5.1 编写dockerfile文件
首先,在项目的根目录下,新建一个文本文件.dockerignore,写入下面的内容。
.git node_modules npm-debug.log
上面代码表示,这三个路径要排除,不要打包进入 image 文件。如果你没有路径要排除,这个文件可以不新建。
然后,在项目的根目录下,新建一个文本文件 Dockerfile,写入下面的内容。
FROM node:8.4 COPY . /app WORKDIR /app RUN npm install --registry=https://registry.npm.taobao.org EXPOSE 3000
上面代码一共五行,含义如下。
FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。WORKDIR /app:指定接下来的工作路径为/app。RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。
3.5.2 创建image文件
有了DockerFile文件,则可以通过命令直接生成image文件
$ docker image build -t koa-demo .
# 或者
$ docker image build -t koa-demo:0.0.1 .

3.5.3 生成容器
docker container run命令会从 image 文件生成容器。
$ docker container run -p 8000:3000 -it koa-demo /bin/bash # 或者 $ docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash # 查出容器的 ID $ docker container ls --all # 删除指定的容器文件 $ docker container rm [containerID]
上面命令的各个参数含义如下:
-p参数:容器的 3000 端口映射到本机的 8000 端口。-it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。/bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。
现在,在容器的命令行,按下 Ctrl + c 停止 Node 进程,然后按下 Ctrl + d (或者输入 exit)退出容器。此外,也可以用docker container kill终止容器运行。
3.5.3.4 发布 image 文件
容器运行成功后,就确认了 image 文件的有效性。这时,我们就可以考虑把 image 文件分享到网上,让其他人使用。
首先,去 hub.docker.com 或 cloud.docker.com 注册一个账户。然后,用下面的命令登录。
$ docker login
接着,为本地的 image 标注用户名和版本。
$ docker image tag [imageName] [username]/[repository]:[tag] # 实例 $ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
也可以不标注用户名,重新构建一下 image 文件。
$ docker image build -t [username]/[repository]:[tag] .
最后,发布 image 文件。
$ docker image push [username]/[repository]:[tag]
发布成功以后,登录 hub.docker.com,就可以看到已经发布的 image 文件。