源于一次内部分享
公司的项目上线后,都运行在 docker 容器中。同时由于运维同事在项目遇到问题时,会要求我们把项目先在本地搭建的 docker 容器运行,没有问题再推上服务端发布。但团队中没有同事了解 docker,技术交接文档中也没有对 docker 进行描述的内容,因而利用了空闲时间(摸鱼时间)整理了一篇 docker 文档,现在记录一下可以分享到外网的部分。
docker 是什么
docker 是一种虚拟化容器技术,将应用程序与程序所依赖的环境,打包到一个文件里,运行这个文件,产生一个虚拟容器,让程序在这个容器中运行。可以让我们忽略环境问题,方便我们的开发。
docker 的组成
三个核心概念:Image、Container、Repository Image:镜像。镜像是层叠的,最底层是 Linux 内核。 Linux 系统分为内核和用户空间,在启动内核后,通过挂在 Root 文件系统来提供用户空间,docker 镜像就是一个 Root 文件系统,提供来容器运行所需要的程序、库、资源、配置等文件。镜像在构建之后也不会发生改变。 Container:容器。容器是镜像的实例。 创建的容器是一个独立于宿主机的隔离进程。 Repository:仓库。镜像仓库,类似于 github,可以将制作的镜像推到仓库,也可以从仓库下载需要的镜像。
docker 常用命令
镜像命令
1 2 3 4 5 6 7 8 9 10 11 12
| build 构建镜像的命令 history 显示镜像构建历史过程 import 导入一个由容器导出的镜像 inspect 显示一个镜像的详细信息 load 从一个文件或标准输入流中导入镜像 images 查看镜像列表 prune 删除虚悬镜像 pull 从仓库拉取镜像 push 推送镜像到仓库 rm 删除镜像 save 保存镜像到文件 tag 给镜像打标签
|
容器命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| attach 进入一个添加-d 参数运行在后台的容器 docker attach 容器 id commit 把容器保存为镜像 cp 拷贝文件到容器 create 创建一个新的容器,只创建,不运行 diff 查看容器内部发生改变的文件 docker diff 容器 id exec 在一个运行的容器中执行命令 export 导出本地某个容器 docker export 容器 id > ubuntu.tar (导出一个容器快照的压缩包) import 导入容器 inspect 用于查看容器的配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等 kill 强制中止一个或多个正在运行的容器 logs 查看容器日子 ps 显示正在运行的容器 pause 暂停容器内的所有进程 port 输出容器端口与宿主机端口的映射情况 rename 重命名容器 restart 重启一个或多个容器 rm 删除一个或多个容器 docker rm -f 容器 id 加-f 表示强制删除一个容器 run 运行一个新的容器 start 启动一个已停止的容器 stats 动态显示容器的资源消耗情况,包括:CPU、内存、网络 I/O stop 停止一个或多个容器 top 查看容器中正在运行的进程 unpause 恢复容器内暂停的进程,与 pause 参数相对应 wait 阻塞运行直到一个或多个容器停止 prune 删除所有已停止的容器
|
命令参数 (在不同的命令下可能会有不同的含义)
1 2 3 4 5 6 7 8 9 10 11
| -i 交互式操作 对容器内输入命令进行交互。 -t 终端 在新容器内指定一个伪终端或终端。 所有-it 都是 -i -t 的缩写。不分前后 -P 容器内部端口随机监听本机的端口 -p 监听本机指定的端口 --rm 容器退出时自动清理容器内部文件系统 -h HOSTNAME 或 --hostname=HOSTNAME 设置容器的主机名 --dns=IP_ADDRESS 添加 dns 服务器到容器中 -d 容器在后台运行 -f 像 tail -f(linux 命令)一样输出容器内容标准输出 -u 指定容器用户 -w 指定容器工作目录
|
常用命令示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| docker ps docker ps 查看正在运行的容器 docker ps -a 显示所有的容器
docker exec docker exec -it 容器 id /bin/bash 进入容器 docker exec -it 容器 id /bin/sh 进入容器 exec 和 attach 进入的容器不同在于退出后,exec 不会导致容器停止,attach 会让容器停止运行
docker run docker run -p 8890:8890 容器名称 监听本机器的 8890 端口 通过-i-t 参数,让容器具有命令交互的能力 docker run -i -t ubuntu:15.10 /bin/bash
docker rm docker rm 容器 id 不能删除一个正在运行的容器,需要先停止 docker rm -f 容器 id 加-f 表示强制删除一个容器
docker cp docker cp 项目绝对路径 容器 id:/容器内项目目录 docker cp /file 容器 id:/node
|
Dockerfile 学习
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| 1.基础镜像:以哪个镜像为基础制作一个镜像,语法 FROM 镜像名称 例如 FROM node 意为以 node 环境为基础,制作一个镜像 2.镜像操作命令 要执行哪些操作 语法:RUN 2.1 RUN 命令有两种格式 2.1.1 shell 格式: RUN echo '输出一个内容' RUN mkdir 文件夹名称 2.1.2 exec 格式: RUN ['可执行文件','参数','参数',......] 可执行文件可以是一个具体文件,也可以是类似 npm 这样的命令 RUN ['node ./node.js','dev','test'] 2.1.3 注意事项: RUN 命令每执行一次都会在 docker 上新建一层,如果有过多无意义的层,会造成镜像膨胀过大,所以可以简写为一层 RUN npm config set registry https://registry.npm.taobao.org RUN npm install RUN npm run dev 可以简写成 RUN npm config set registry https://registry.npm.taobao.org && npm install && npm run dev 3.容器启动命令 执行哪些命令 语法:CMD 命令或 ENTRYPOINT 3.1 CMD 命令 CMD 类似于 RUN 指令。区别在于执行时机不同 CMD 在 docker run 时执行 RUN 在 docker build 时执行 CMD 指令指定的程序可以被 docker run 命令行传入的参数所覆盖 注意:Dockerfile 中如果存在多个 CMD 命令,仅最后一个生效 3.1.1 CMD 有 3 种写法 CMD shell 命令 CMD ['可执行文件或命令','参数','参数'] CMD ['参数','参数'] 这种写法是为 ENTRYPOINT 指定程序提供默认参数
注意事项:推荐使用第二种,第一种格式实际上在运行过程中也会自动转换成第二种格式
CMD ['npm','run','start']
3.2 ENTRYPOINT 类似于 CMD 命令,但与 CMD 不同在于不会被 docker run 命令行传入的参数所覆盖,而会把这些参数传给 ENTRYPOINT 指令 但如果在 docker run 时使用了--entrypoint 选项,将覆盖 CMD 指令指定的程序 使用场景就在于需要通过 docker run 命令执行的时候指定所需要的参数 注意:和 CMD 一样,在 Dockerfile 中如果存在多个 ENTRYPOINT,仅最后一个生效。 语法:ENTRYPOINT ['要执行的命令或文件','参数','参数'] 可以和 CMD 搭配使用 ENTRYPOINT ['node','./a.js'] CMD ['node','文件名.js']
当执行docker run 镜像名称 默认会执行node ./a.js 当带参数执行docker run 镜像名称 ./b.js 会执行CMD的命令
其他一些配置项 ENV 设置环境变量 语法: ENV <key> <value> ENV HOST '0.0.0.0' EXPOSE 声明端口 仅仅只是声明端口。方便镜像使用者没,方便配置映射 在运行镜像时, 如果不指定将随机创建端口 EXPOSE 端口 指定端口 COPY 拷贝到目录中 COPY 目标文件/文件夹 要移 动到的文件夹名称 如果要移动到的文件夹没有创建,会自动创建 COPY . . 把所有文件移动到镜像中 如果有不需要的,可以指定.dockerignore 忽略文件
|
制作一个镜像
1 2 3 4 5 6 7
| 根据 Dockerfile 来操作容器 基本命令 docker build -t 镜像名称 镜像路径 -t 指定要创建的目标镜像名 进入 Dockerfile 文件夹目录制作镜像 docker build -t test-docker-r1 . . 代表当前 Dockerfile 所在的文件夹目录,会根据当前目录下的 Dockerfile 来构建镜像 根据绝对路径创建 docker build -t /Users/yangzhenliang/project-study/docker-nuxt/docker
|