Docker 学习笔记 02——镜像和容器

84 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Docker 镜像

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。分层存储的特征使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

常用命令

# 搜索镜像
docker search [option] [keyword]
# eg. docker search mysql
# 获取镜像,具体的选项可以通过 docker pull --help 命令
docker pull [option] [Docker Registry URL[:port]/]仓库名[:tag]
# 查看下载的镜像
docker images
docker image ls
# 查看镜像的详细信息
docker inspect [image]
docker inspect -f {{"{.[prop]}"}} [image]
# 删除镜像
docker rmi [镜像名/镜像ID]
docker image rm [镜像名/镜像ID]

创建镜像

使用 Dockerfile 定制镜像

Dockerfile 是用来构建 Docker 镜像的脚本文件。

# 默认执行 PATH/Dockerfile
docker build [-f] [Dockerfile] -t [image]:[tag] [.]

Dockerfile 指令详解:

指令含义
FROM基础镜像
MAINTAINER维护者信息 "姓名<邮箱>"
RUN镜像构建的时候需要运行的命令
ADD复制文件进容器(会自动解压)
WORKDIR设置当前工作目录
VOLUME设置卷,挂载主机目录
EXPOSE指定对外的端口
CMD容器启动的时候运行的命令(只执行最后一条)
ENTRYPOINT容器启动的时候运行的命令(追加命令)
ONBUILD构建子镜像的指令触发器(不能隔代继承)
COPY类似 ADD
ENV设置环境变量

其他方式

# 基于已有容器创建(不建议使用)
docker commit [OPTIONS] [容器名/容器ID] [REPOSITORY[:TAG]]
# 基于本地模板导入
docker import [OPTIONS] file[URL] - [REPOSITORY[:TAG]]

导出/导出镜像

# eg. 导出本地的 ubuntu:18.04 镜像为文件 ubuntu_18.04.tar
docker save -o ubuntu_18.04.tar ubuntu:18.04
# 导入
docker load -i ubuntu_18.04.tar

Docker 容器

镜像 Image 和容器 Container 的关系,就像是面向对象程序设计中的实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

常用命令

# 查看运行中的容器(-a 为所有的容器)
docker container ls [-a]
docker ps [-a]
# 运行容器(-d 为后台运行,-p 为映射端口)
docker run --name [容器名] [-d] [-p [主机IP]:[容器IP]] [镜像名/镜像ID]
# 启动容器
docker start [容器名/容器ID]
# 停止容器
docker stop/kill [容器名/容器ID]
# 重启容器
docker restart [容器名/容器ID]
# 删除已停止的容器(-f 为强制删除)
docker rm [-f] [容器名/容器ID]
# 清理所有处于终止状态的容器
docker prune
# 修改容器名称
docker rename [旧容器名] [新容器名]
# 查看容器日志
docker logs [容器名/容器ID]
# 查看容器运行状态信息
docker stats
# 获取容器/镜像的元数据
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
# 查看容器中运行的进程信息,支持 ps 命令参数
docker top [OPTIONS] CONTAINER [ps OPTIONS]

进入容器

# 查看容器内部的文件
docker exec [容器名/容器ID] ls -a /
# 查看更详细的内容
docker exec [容器名/容器ID] ls -al /
# 进入容器后打开新的终端
docker exec -it [容器名/容器ID] /bin/bash
# 进入容器正在执行的终端
docker attach [容器名/容器ID]

文件管理

# 将宿主机目录拷贝到容器目录
docker cp [path1] [容器名/容器ID]:[path2]
# 将容器目录拷贝到宿主机目录
docker cp [容器名/容器ID]:[path2] [path1]

导入/导出容器

# 导出
docker export [容器名/容器ID] > [filename].tar
# 导入
cat [filename].tar | docker import - [容器名/容器ID:[tag]]