bubbleeee

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

【中文社区:https://www.docker.org.cn/index.html】

Docker的优势

(1)更高效的利用系统资源。

(2)更快速的启动时间

(3)一致的运行环境

(4)持续交付和部署

(5)更轻松的迁移

(6)更轻松的维护和扩展

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。

 

 

 

安装参考https://www.runoob.com/docker/ubuntu-docker-install.html

 

 

dockerfile,相当于是一个文档,客户可以基于dockerfile生成新的容器。dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile的指定进行自动构建容器,基于dockerfile制作镜像,每一个指令都会创建一个镜像层,即镜像都是多层叠加而成,因此,层越多,效率越低,创建镜像,层越少越好。因此能在一个指令完成的动作尽量通过一个指令定义。

一个简单的demo

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。
FROM指令是最重要的一个且必须为 Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境. 实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在 docker主机上查找指定的镜像文件。
在其不存在时,则会从 Docker Hub Registry上拉取所需的镜像文件 .如果找不到指定的镜像文件, docker build会返回一个错误信息 COPY . /app
将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
在当前的img1工作目录中,准备好要添加到新镜像的文件放到img1下面,copy过程实际是基于dockerfile在后台启动一个容器,
把工作目录当做卷挂载到后台启动的容器,然后再把这些准备好的文件(img1目录下)拷贝到后台容器,然后基于这个容器制作新镜像。
所以,镜像的制作过程是基于指定的镜像来制作。
WORKDIR /app
指当前容器环境的工作目录,用于为 Dockerfile中所有的 RUN、CMD、ENTRYPOINT、COPY和 ADD指定设定工作目录。指定接下来的工作路径为/app。
RUN npm install
RUN用于指定 docker build过程中运行的程序,其可以是任何命令,但是这里有个限定,一般为基础镜像可以运行的命令
如基础镜像为centos,安装软件命令为yum而不是ubuntu里的apt-get命令
在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
EXPOSE 3000
将容器 3000 端口暴露出来, 允许外部连接这个端口。

其他指令

ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:

ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" 
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"   
ARG
构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,
构建好的镜像内不存在此环境变量。构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:CMD 在docker run 时运行。RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖.如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

 

有了 Dockerfile 文件以后,就可以创建镜像了。

docker build -t runoob/centos:6.7 .
参数:
  • -t :指定要创建的目标镜像名

  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

镜像创建好后可以启动容器

docker run -it ubuntu /bin/bash

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu: ubuntu 镜像。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

其他操作

docker stop ContainerID # 停止一个容器
docker rm ContainerID # 删除一个容器
docker ps -a # 查看所有容器
docker exec -it ContainerID /bin/bash # 进入容器,并打开一个终端窗口

 

posted on 2022-04-02 16:02  bubbleeee  阅读(31)  评论(0编辑  收藏  举报