Docker 的概念和基本使用方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Imkiimki/article/details/81079857

本文是《Docker 从入门到实践》的阅读总结。

CSDN上的一篇文章[宋宝华]说道,虚拟化无非有两种:虚拟出一个世界;虚拟出一个氛围。Docker就是在宿主OS上通过命名空间nameSpace虚拟出了一个氛围。结果就是,在容器中的应用看来,它感觉操作系统上只有它自己一个应用在运行。Docker的理念是,build, ship, and run everywhere. 这对于持续集成,快速交付有很大的吸引力。

  • 基本概念(镜像、容器和仓库)

    • 镜像image:静态、分层存储的文件系统,使用了Union FS技术。

    • 容器container:运行的实体,可以被创建、启动、停止、删除、暂停等。 

      容器的本质是进程,但有独立的命名空间。

      容器在运行时以镜像为基础,创建一个存储层。存储层的生命周期与容器相同,会随着容器删除而丢失。

      容器的存储层应当保持无状态化,文件写入操作应使用数据卷(volume), 或者绑定宿主目录。

    • 仓库注册表registry: 集中存储、分发镜像的服务。registry中可以包含多个Repository. 

      镜像的命名:【用户名/仓库名:标签】,缺省标签为latest. 

  • 使用镜像

    • 获取镜像:docker pull  [选项] [docker registry地址[:端口]/ ]仓库名[:label]  默认registry地址是library,即官方仓库。

    • 运行: docker run [opt] <image> [命令],

      如:docker run -it --rm ubuntu:16.04 bash , -it是交互式终端,--rm是运行结束后就删除container

    • 镜像管理:

      • 列出镜像: docker image ls

      • 查看系统占用空间:docker system df

      • 清理镜像:docker image prune

      • 镜像查找过滤: -f 参数

      • 删除镜像: docker image rm [opt] <镜像1> [<镜像2>]

    • 使用dockerfile 定制镜像

      Dockerfile是一个文本文件,内容格式如下:

      from nginx

      run echo ‘<h1>HelloWorld</h1>’ > /usr/share/nginx/html/index.htm

      from 选定了一个基础镜像。从空白镜像开始创建使用from scratch,直接将可执行文件复制进镜像中就这样做。

      run用来执行命令行命令。run一次会建立一层存储层,因此多条命令应该使用一个run,用&&连接起来。

    • 使用build 构建镜像

      在Dockerfile所在目录 运行 docker build -t <名称: 标签> .   -t 命令是输入名称标签列表。注意后面有一个. 表示上下文目录。 默认是读取上下文目录中的dockerfile.

    • 其他build方法

      • 从git 仓库构建: docker build https:github.io/xxx/xxx.git

      • 从网络上的tar包构建:docker build http://xxx/xx/tar.gz

      • 重定向读取Dockerfile构建: docker build - < Dockerfile   或者 cat Dockerfile | docker build -

      • 重定向从压缩包进行构建:docker build - < context.tar.gz

    • Dockerfile 指令.  

      • RUN: 运行一个命令。有两种形式:shell形式(RUN <命令>)或者exec形式(["命令","参数1","参数2"]),下同

      • COPY: COPY <源路径> <目标路径>

      • ADD: 与ADD格式和用法基本一致,但增加了从URL路径下载的功能,gzip压缩文件会自动解压。ADD 命令基本不用

      • CMD: 指定容器主进程的默认启动命令。例如,ubuntu镜像的CMD是 /bin/bash ,所以运行后是bash shell.

      • ENTERPOINT: 作用与CMD一样,指定容器主进程运行后的命令。用法1:使用ENTERPOINT可以将docker run <image> 后面的参数添加到ENTERPOINT内容后面,而使用CMD,docker run <image>后面的参数作为全新的cmd.  用法2:用ENTERPOINT运行一个SH文件:ENTERPOINT ["docker-enterpoint.sh"], docker run <image>后的参数作为sh程序的输入选项。

      • ENV环境变量: 定义键值对,使用时 $key可以展开获得value值

        格式:ENV <key> <value>

        ENV <key1>=<value1> (有空格需要双引号)

      •  ARG构建参数:ARG <key>[=<value>] 也是设置环境变量,但只是先声明,在build时用 --build-arg  <key>[=<value>] 重新覆盖

      • VOLUME: 事先指定某些目录,如果运行时用户没有挂载他们,就挂载为匿名卷,防止大量数据写入容器存储层中

        VOLUME ["<路径1>","<路径2>"]

        VOLUME <路径>

      • EXPOSE: 声明端口, docker run -P 时随机映射到EXPOSE声明的端口

        EXPOSE <port1> [<port2>]

      • WORKDIR: 指定工作目录。

        WORKDIR <工作目录>  指定以后各层的工作目录,例如在RUN命令前指定目录,相当于在同一行中使用cd命令。

      • USER: 指定以后执行命令的用户

        USER <用户名>   使用前要确保已经建立了要用的用户名,例如RUN groupadd -add redis && useradd -r -g redis  redis

      • ONBUILD: 下一次基于该镜像构建时执行。

        ONBUILD <其他指令>。

    • 多阶段构建:为了减小镜像的体积,发布时应该只包含运行环境和二进制文件,而不包括源码。使用from as 可以定义多个阶段,例如 FROM xxx:xxx as stage0, FROM xxx:xxx as stage1。 COPY --from=stage0 可以从stage0中复制出文件。

  • 操作容器

    • 启动容器 

      • docker run <image> [opt] [cmd/enterpoint] 从image启动容器。常用选项: -i 保持标准输入打开 -t 分配一个伪终端

      • docker container start [opt] <CONTAINER> 启动一个已经终止的容器

    • 终止容器:docker container stop [CONTAINER]  docker container ls -a #查看停止的容器

    • 后台运行

      • d参数后台运行:docker run -d #容器后台运行

      • 查看运行的容器,并显示输出信息:docker container ls, docker container logs <CONTAINER>

    • 进入容器:docker attach <CONTAINER ID> #进入后台运行着的容器 / docker exec -it <CON ID> bash

    • 导入和导出容器: 导出:docker export <CON> > exportCon.tar / 导入:docker import

    • 删除容器:docker container rm 清理处于终止状态的容器:docker container prune

  • 访问仓库

    • login、logout 、 search、push、pull  

  • 数据管理。有两种方式:数据卷(volumes)、挂载主机目录(Bind mounts)

    • 数据卷:独立于容器的生存周期,容器之间可以共享或重用

      • 创建数据卷:docker volume create my-vol,

      • 查看数据卷docker volume ls

      • 查看某个数据卷的信息 docker volume inspect my-vol

      • 挂载到容器:docker run -d --mount source=my-vol,target=/webapp <image>

    • 挂载主机目录:直接将本地主机目录挂载到容器中

      • docker run -d --mount type=bind,source=/src/webapp,target=opt/webapp <image>

    • inspect 查看状态。可以docker volume inspect <vol>,也可以docker inspect <image>

  • 使用网络

    • docker network

  • 高级网络配置

猜你喜欢

转载自blog.csdn.net/Imkiimki/article/details/81079857