【云原生】Ubuntu 中 Docker 环境的安装与使用

【1】安装 Docker 环境

【1.1】安装依赖

apt install apt-transport-https ca-certificates curl software-properties-common

【1.2】添加 Docker 官方密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

【1.3】添加 Docker 源

add-apt-repository \
      "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) \
      stable"
add-apt-repository \
      "deb [arch=arm64] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) \
      stable"

【1.4】安装 Docker

sudo apt-get install docker-ce=5:18.09.9~3-0~ubuntu-bionic

sudo apt-get install docker-ce docker-ce-cli containerd.io

【1.5】查看 Docker 信息

# 查看 Docker 版本等基本信息
docker -v
docker version
docker info

# 查看 Docker 的内存、CPU 使用情况
docker stats

【2】Docker 常用命令总结

Docker 的三个基本概念

  • 镜像(Image) : Docker 镜像(Image),相当于是一个 root 文件系统
  • 容器(Container) : 镜像(Image)和容器(Container)的关系,即镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等
  • 仓库(Repository) : 仓库可看成一个代码控制中心,用来保存镜像

【2.1】Docker 镜像管理命令

  • docker pull -- 从镜像仓库中拉取或者更新指定镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
功能,从镜像仓库中拉取或者更新指定镜像
参数
    -a : 拉取所有 tagged 镜像
    --disable-content-trust : 忽略镜像的校验,默认开启
  • docker search -- 搜索镜像
docker search [OPTIONS] TERM
功能,搜索镜像
参数
    --automated : 只列出 automated build 类型的镜像
    --no-trunc : 显示完整的镜像描述
    -f <过滤条件> : 列出收藏数不小于指定值的镜像
  • docker images -- 列出本地镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
功能,列出本地镜像
参数
	-a : 列出本地所有的镜像 (含中间映像层,默认情况下,过滤掉中间映像层)
	--digests : 显示镜像的摘要信息
	-f : 显示满足条件的镜像
	--format : 指定返回值的模板文件
	--no-trunc : 显示完整的镜像信息
	-q : 只显示镜像 ID
  • docker commit -- 从容器创建一个新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
功能,从容器创建一个新的镜像
参数
	-a : 提交的镜像作者;
	-c : 使用 Dockerfile 指令来创建镜像;
	-m : 提交时的说明文字;
	-p : 在 commit 时,将容器暂停;
  • docker save -- 将指定镜像保存成 tar 归档文件
docker save [OPTIONS] IMAGE [IMAGE...]
功能,将指定镜像保存成 tar 归档文件
参数
	-o :输出到的文件
  • docker load -- 导入使用 docker save 命令导出的镜像
docker load [OPTIONS]
功能,导入使用 docker save 命令导出的镜像
参数
	--input , -i : 指定导入的文件,代替 STDIN
	--quiet , -q : 精简输出信息
  • docker export -- 导出容器快照
docker export [OPTIONS] CONTAINER
功能,导出容器快照
参数
	-o : 将输入内容写到文件
  • docker import -- 导入容器快照
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
功能,导入容器快照
参数
	-c : 应用 docker 指令创建镜像
	-m : 提交时的说明文字
  • 说明
    • docker save 保存的是镜像(image),docker export 保存的是容器(container)
    • docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像
    • docker load 不能对载入的镜像重命名,docker import 可以为镜像指定新名称
  • docker rmi -- 删除本地一个或多个镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
功能,删除本地一个或多个镜像
参数
	-f : 强制删除;
	--no-prune : 不移除该镜像的过程镜像,默认移除
  • docker tag -- 标记本地镜像,将其归入某一仓库
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
功能,标记本地镜像,将其归入某一仓库

【2.2】Docker 实例管理命令

  • docker ps -- 列出容器
docker ps [OPTIONS]
功能,列出容器
参数
	-a : 显示所有的容器,包括未运行的
	-f : 根据条件过滤显示的内容
	--format : 指定返回值的模板文件
	-l : 显示最近创建的容器
	-n : 列出最近创建的 n 个容器
	--no-trunc : 不截断输出
	-q : 静默模式,只显示容器编号
	-s : 显示总的文件大小
  • docker attach -- 连接到正在运行中的容器
docker attach [OPTIONS] CONTAINER
功能,连接到正在运行中的容器
说明
参考官方文档,attach 后可以通过 CTRL-C 来 detach
但实际上
    如果 container 当前在运行 bash,CTRL-C 是当前行的输入,没有退出;
    如果 container 当前正在前台运行进程,CTRL-C 不仅会导致退出容器,而且还 stop 了容器;
可以带上 --sig-proxy=false 来确保 CTRL-D 或 CTRL-C 不会关闭容器
  • docker run -- 创建一个新的容器并运行一个命令
  • docker create -- 创建一个新的容器但不启动它(语法同 run)
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
功能,创建一个新的容器并运行一个命令

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
功能,创建一个新的容器但不启动它

参数
	-a stdin : 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
	-d : 后台运行容器,并返回容器 ID
	-i : 以交互模式运行容器,通常与 -t 同时使用
	-P : 随机端口映射,容器内部端口随机映射到主机的端口
	-p : 指定端口映射,格式为,主机(宿主)端口:容器端口
	-t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用
	--name="名称" : 为容器指定一个名称
	--dns 8.8.8.8 : 指定容器使用的 DNS 服务器,默认和宿主一致
	--dns-search example.com : 指定容器 DNS 搜索域名,默认和宿主一致
	-h "mars" : 指定容器的 hostname
	-e username="ritchie" : 设置环境变量
	--env-file=[] : 从指定文件读入环境变量
	--cpuset="0-2" or --cpuset="0,1,2" : 绑定容器到指定 CPU 运行
	-m : 设置容器使用内存最大值
	--net="bridge" : 指定容器的网络连接类型,支持 bridge/host/none/container 四种类型
	--link=[] : 添加链接到另一个容器
	--expose=[] : 开放一个端口或一组端口
	--volume , -v : 绑定一个卷
  • docker start/stop/restart/kill 命令 -- 启动/停止/重启/杀死容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
功能 : 启动一个或多个已经被停止的容器

docker stop [OPTIONS] CONTAINER [CONTAINER...]
功能 : 停止一个运行中的容器

docker restart [OPTIONS] CONTAINER [CONTAINER...]
功能 : 重启容器

docker kill [OPTIONS] CONTAINER [CONTAINER...]
功能 : 杀掉一个容器
参数
    -s : 向容器发送一个信号
  • docker exec -- 在运行的容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
功能 : 在运行的容器中执行命令
参数
	-d : 分离模式,在后台运行
	-i : 即使没有附加也保持 STDIN 打开
	-t : 分配一个伪终端
  • docker rm -- 删除一个或多个容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
功能 : 删除一个或多个容器
参数
	-f : 通过 SIGKILL 信号强制删除一个运行中的容器
	-l : 移除容器间的网络连接,而非容器本身
	-v : 删除与容器关联的卷

【2.3】Docker 数操作取相关命令

  • docker cp -- 用于容器与主机之间的数据拷贝
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
参数
	-L : 保持源目标中的链接
  • docker inspect -- 获取容器/镜像的元数据
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
功能,获取容器/镜像的元数据
参数
    -f : 指定返回值的模板文件
    -s : 显示总的文件大小
    --type : 为指定类型返回 JSON
  • docker logs -- 获取容器的日志
docker logs [OPTIONS] CONTAINER
功能 : 获取容器的日志
参数
	-f : 跟踪日志输出
	--since : 显示某个开始时间的所有日志
	-t : 显示时间戳
	--tail : 仅列出最新 N 条容器日志

【3】Docker File 知识点总结

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明;

【3.1】Docker File 指令说明

  • FROM 指定构建镜像基于的镜像
  • MAINTAINER 镜像维护者姓名或邮箱地址
  • RUN 构建镜像时运行的指令
格式
    shell 格式
        RUN <命令行命令>
        # <命令行命令> 等同于,在终端操作的 shell 命令
    exec 格式
        RUN ["可执行文件", "参数1", "参数2"]
        # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
  • CMD 运行容器时执行的 shell 环境,类似于 RUN 指令,用于运行程序 (CMD 在 docker run 时运行,RUN 是在 docker build 时运行)
作用 : 为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束,
    CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖
注意 : 如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效
格式
    CMD <shell 命令> 
    CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
    CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
  • ENTRYPOINT 运行容器时执行的 shell 命令,类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
优点 : 在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数
注意 : 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效
格式
    ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
  • VOLUME 定义匿名数据卷,在启动容器时若未挂载数据卷,则会自动挂载到匿名卷
作用
    避免重要的数据,因容器重启而丢失
    避免容器不断变大
格式
    VOLUME ["<路径1>", "<路径2>"...]
    VOLUME <路径>
说明
    在启动容器 docker run 的时候,可以通过 -v 参数修改挂载点
  • USER 指定执行后续命令的用户和用户组,此处只是切换后续命令执行的用户(用户和用户组必须提前已经存在)
格式
    USER <用户名>[:<用户组>]
  • WORKDIR 指定工作目录
说明
    用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在
        (WORKDIR 指定的工作目录,必须是提前创建好的)
    docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层,
        只有通过 WORKDIR 创建的目录才会一直存在
格式
    WORKDIR <工作目录路径>
  • HEALTHCHECH 用于指定某个程序或者指令来监控 docker 容器服务的运行状态
格式
    HEALTHCHECK [选项] CMD <命令> : 设置检查容器健康状况的命令(可以参考 CMD 的用法)
    HEALTHCHECK NONE : 如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
  • ENV 设置容器环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量
格式
    ENV <key> <value>
    ENV <key1>=<value1> <key2>=<value2>...
  • ARG 构建时指定的一些参数,ARG 设置的环境变量仅对 Dockerfile 内有效,即只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量
说明
    构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖
格式
    ARG <参数名>[=<默认值>]
  • EXPOSE 声明容器的服务端口(仅仅是声明)
作用
    帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射
    在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口
格式
    EXPOSE <端口1> [<端口2>...]
  • COPY 复制指令,从上下文目录中复制文件或者目录到容器里指定路径,不具备自动下载或解压的功能
格式
    COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
    COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]
参数
    [--chown=<user>:<group>] : 可选参数,用户改变复制到容器内文件的拥有者和属组
    <源路径> : 源文件或者源目录,这里可以是通配符表达式,
               其通配符规则要满足 Go 的 filepath.Match 规则
    <目标路径> : 容器内的指定路径,该路径不用事先建好,路径不存在则会自动创建
  • ADD 拷贝文件或目录到容器中,与 COPY 类似
ADD 的优点 : 若执行 <源文件> 为 tar 压缩文件,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>
ADD 的缺点 : 在不解压的前提下,无法复制 tar 压缩文件,会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢
  • ONBUILD 执行延迟构建命令
作用
用于延迟构建命令的执行
    Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像(如 test-build)的过程中不会执行;
    当有新的 Dockerfile 使用了之前构建的镜像(如 FROM test-build),
        此时执行新镜像的 Dockerfile 构建时,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令
格式
    ONBUILD <其它指令>
  • LABEL 用来以键值对的形式给镜像添加一些元数据 (metadata)
格式
    LABEL <key>=<value> <key>=<value> <key>=<value> ...

【附录】Docker File 补充说明

  • 上下文路径
    • docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包
    • 解析 : 由于 docker 的运行模式是 C/S,本机是 C,docker 引擎是 S,实际的构建过程是在 docker 引擎下完成的,所以此时无法使用本机的文件,需要把本机指定目录下的文件一起打包提供给 docker 引擎使用
    • 默认的上下文路径是 Dockerfile 所在的位置
    • 注意 : 上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢

参考与致谢
本博客为博主学习笔记,同时参考了网上众博主的博文以及相关专业书籍,在此表示感谢,本文若存在不足之处,请批评指正。

【1】openvm gitee 项目

【2】Ubuntu-18.04安装Docker

【3】菜鸟教程

【4】docker save与docker export的区别

【5】Docker导入、导出、删除容器

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐