docker学习

本文会简单介绍下 docker 的概念和在前端领域的使用方法。

安装

我使用的是 windows10 系统,可以参考 docker 官网的安装方法

概念

  • Dockerfile:是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
  • Image(镜像):是用来创建容器的。
  • Container(容器):容器就像一个虚拟机,容器中运行着一个完整的操作系统。

使用方法

  1. 创建 Dockerfile 文件
  2. 打包镜像 docker image build
  3. 创建容器 docker container create
  4. 启动容器 docker container start

Dockerfile 指令

  • FROM
    指定基础镜像

    1
    FROM nginx
  • RUN
    执行命令行命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # shell 格式
    RUN <命令行命令>
    # <命令行命令> 等同于,在终端操作的 shell 命令。
    # exec 格式
    RUN ["可执行文件", "参数1", "参数2"]
    # 例如:
    # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

    # 注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:
    FROM centos
    RUN yum install wget
    RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
    RUN tar -xvf redis.tar.gz
    # 以上执行会创建 3 层镜像。可简化为以下格式:
    FROM centos
    RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz
    # 如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
  • COPY
    复制指令,从上下文目录中复制文件或者目录到容器里指定路径

  • ADD
    ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)
  • CMD
    类似于 RUN 指令,用于运行程序,但二者运行的时间点不同
    • CMD 在docker run 时运行
    • RUN 是在 docker build
  • ENTRYPOINT
    类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
  • ENV
    设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量
  • ARG
    构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量
  • VOLUME
    定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷
  • EXPOSE
    仅仅只是声明端口
  • WORKDIR
    指定工作目录
  • USER
    用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户
  • HEALTHCHECK
    用于指定某个程序或者指令来监控 docker 容器服务的运行状态
  • ONBUILD
    用于延迟构建命令的执行

Docker Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
使用步骤:

  • 使用 Dockerfile 定义应用程序的环境
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序
    1
    2
    # 启动应用程序,并在后台运行
    docker-compose up -d

Compose 配置指令

  • version
    指定本 yml 依从的 compose 哪个版本制定的
  • build
    指定为构建镜像上下文路径
  • cap_add,cap_drop
    添加或删除容器拥有的宿主机的内核功能
  • cgroup_parent
    为容器指定父 cgroup 组,意味着将继承该组的资源限制
  • command
    覆盖容器启动的默认命令
  • container_name
    指定自定义容器名称,而不是生成的默认名称
  • depends_on
    设置依赖关系
  • deploy
    指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用
  • devices
    指定设备映射列表
  • dns
    自定义 DNS 服务器
  • dns_search
    自定义 DNS 搜索域
  • entrypoint
    覆盖容器默认的 entrypoint
  • env_file
    从文件添加环境变量
  • environment
    添加环境变量
  • expose
    暴露端口,但不映射到宿主机,只被连接的服务访问
  • extra_hosts
    添加主机名映射
  • healthcheck
    用于检测 docker 服务是否健康运行
  • image
    指定容器运行的镜像
  • logging
    服务的日志记录配置
  • network_mode
    设置网络模式
  • restart
    • no:是默认的重启策略,在任何情况下都不会重启容器
    • always:容器总是重新启动
    • on-failure:在容器非正常退出时(退出状态非0),才会重启容器
    • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
  • secrets
    存储敏感数据
  • security_opt
    修改容器默认的 schema 标签
  • stop_grace_period
    指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器
  • stop_signal
    设置停止容器的替代信号
  • sysctls
    设置容器中的内核参数
  • tmpfs
    在容器内安装一个临时文件系统
  • ulimits
    覆盖容器默认的 ulimit
  • volumes
    将主机的数据卷或着文件挂载到容器里

基础命令

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
# 查看docker信息
docker info
# 登录
docker login
# 退出
docker logout
# 推送自己的镜像到 Docker Hub
docker push

# 查看镜像
docker images
# 搜索镜像
docker search [image_name]
# 下载镜像
docker pull [image_name]
# 删除镜像
docker rmi [image_name]
# 打包镜像
docker image build ./ -t [image_name:versions]

# 查看所有容器
docker ps -a
# 查看当前运行的容器
docker container ls
# 创建容器
docker container create -p [port:port] [docker_image:versions]
# 启动容器
docker run [container_id]
# 删除容器
docker rm [container_id]
# 停止容器
docker stop [container_id]
# 重启容器
docker restart [container_id]
# 启动一个已停止的容器
docker start [container_id]
# 进入容器内部
docker container exec -it [container_id] /bin/bash
# 清理掉所有处于终止状态的容器
docker container prune
# 查看容器内部输出
docker logs -f [container_id]
# 查看容器内部运行的进程
docker top [container_id]
# 查看容器配置和状态信息
docker inspect [container_id]

资源

Docker官方文档
菜鸟教程