源于一次内部分享

公司的项目上线后,都运行在 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