Docker 操作指北
一)常用命令
拉取 Docker
镜像
1 | docker pull image_name |
我们通过最简单的 image
文件 “hello world”,感受一下 Docker
。
因为国内连接 Docker
的官方仓库很慢,因此我们在日常使用中会使用 Docker
中国加速器。通过 Docker
官方镜像加速,中国区用户能够快速访问最流行的 Docker
镜像。该镜像托管于中国大陆,我们配置国内镜像可以享受到更快的下载速度和更强的稳定性,从而能够更敏捷的开发和交付 Docker
化应用。
Docker
中国官方镜像加速可通过 registry.docker-cn.com
访问。该镜像只包含流行的公有镜像,私有镜像仍需要从美国镜像中拉去。
修改系统中 Docker
对应的配置文件即可,如下包含了公司仓库和一些其他国内镜像:
1 | { |
win10配置方式:
右键电脑右下角的Docker 图标–>Settings–>Docker Engine—> 将加速器地址复制到该页面上的文本框中,点击Apply 然后等待Docker重启,重启完毕就可以使用新的Docker镜像源了!!!
其他 windows 配置方式:
1 | # 进入 Docker 虚拟机 |
linux 系统配置方式:
配置好后运行如下命令,将 image (镜像) 文件从仓库抓去到本地:
1 | docker image pull library/hello-world |
上面的代码中,docker image pull
是抓取 image
文件的命令。library/hello-world
是 image
文件在仓库里面的位置,其中 library
是 image
文件所在的组,hello-world
是 image
文件的名字。
查看宿主机上的镜像,Docker
镜像保存在 /var/lib/docker
目录下
1 | docker images [OPTIONS] [REPOSITORY[:TAG]] |
OPTIONS
说明:
- -a:列出本地所有的镜像(含中间映像蹭,默认情况下,过滤调中间映像层);
- –digests:显示镜像的摘要信息;
- -f:显示满足条件的镜像;
- –format:指定返回值的模版文件;
- –no-trunc:显示完整的镜像信息;
- -q:只显示镜像ID;
hello-world
镜像抓取成功后,就可以在本机看到这个 image
文件了。
运行镜像:会创建一个新的容器并运行
1 | docker run [OPTIONS] image_name/image_id [COMMAND] [ARGS...] |
OPTIONS
说明:
- -a stdin:指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
- -d:后台运行容器,并返回容器ID;
- -i:以交互模式运行容器,通常与 -t 同时使用;
- -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- -P:随机端口映射,容器内部端口随机映射到主机的高端口;
- -p:指定端口映射,格式为:主机(宿主)端口:容器端口;
- –name:为容器指定一个名称;
- –dns:指定容器使用的DNS服务器,默认和宿主一致;
- –dns-search:指定容器DNS搜索域名,默认和宿主一致;
- -h:指定容器的
hostname
; - -e:设置环境变量;
- –env-file:从指定文件读入环境变量;
- –cpuset:绑定容器到指定CPU运行;
- -m:设置容器使用内存最大值;
- –network:指定容器网络模式;
- –ip:指定容器IP;
- –network-alias:指定容器网络别名;
- …:其他可通过 docker run –help 查看
现在运行 hello-world
这个镜像文件:
输出这段提示以后,hello-world
就会停止,容器自动终止。有些容器不会自动终止,因为提供的是服务,比如 Oracle
、Mysql
镜像等。
查看容器
1 | docker ps [OPTIONS] |
OPTIONS
说明:
- -a:显示所有的容器,包括未运行的;
- -f:根据条件过滤显示的内容;
- –format:指定返回值的模版文件;
- -l:显示最近创建的容器;
- -n:列出最近创建的n个容器;
- –no-trunc:不截断输出;
- -q:只显示容器ID;
- -s:显示总的文件大小;
查看之前启动的 hello-world
容器:
输出详情介绍:
CONTAINER ID:容器ID;
IMAGE:使用的镜像;
COMMAND:启动容器运行时的命令;
CREATED:容器的创建时间;
STATUS:容器状态
- created:已创建
- restarting:重启中
- running:运行中
- removing:迁移中
- paused:暂停
- exited:停止
- dead:死亡
PORTS:容器的端口信息和使用的连接类型(tcp/udp)
NAMES:自动分配的容器名称;
启动、停止、重启容器
1 | docker start container_name/container_id |
我们现在可以将 hello-world
容器启动:
进入容器
1 | docker exec [OPTIONS] container_name/container_id COMMAND [ARG...] |
OPRIONS
说明:
- -d:分离模式,在后台运行
- -i:即使没有附加也保持STDIN打开
- -t:分配一个伪终端
通过 exec
命令对指定的容器执行 sh:
通过 exec
命令对指定的容器执行 bash:
查看容器日志
1 | docker logs [OPTIONS] container_name/container_id |
OPTIONS
说明:
- -f:跟踪日志输出;
- –since:显示某个开始时间的所有日志
- -t:显示时间戳
- –tail:仅列出最新的N条容器日志
删除容器
1 | docker rm [OPTIONS] container_name/container_id |
OPTIONS
说明:
- -f:通过 SIGKILL 信号强制删除一个运行中容器;
- -l:移除容器间的网络连接,而非容器本身;
- -v:删除与容器相关的卷;
删除镜像
1 | docker rmi [OPTIONS] image_name/image_id |
OPTIONS
说明:
- -f:强制删除;
- –no-prune:不移除该镜像的过程镜像,默认移除;
查看当前系统 Docker
信息
1 | docker info |
二)Dockerfile
概念
Docker
镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,这个脚本就是 Dockerfile
。
Dockerfile
是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile
,当我们需要定制自己额外的需求时,只需要在 Dockerfile
上添加或者修改指令,重新生成 image
即可,省去了敲命令的麻烦。
简单来说:Dockerfile
是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
文件格式
1 | # 1、第一行必须指定 基础镜像信息 |
Dockerfile
分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。一开始必须要指明所基于的镜像名称,接下来一般会说明维护者信息;后面则是镜像操作指令,例如 RUN
指令。每执行一条 RUN
指令,镜像添加新的一层,并提交;最后是 CMD
指令,来指明运行容器时的操作命令。
注意:Dockerfile
的指令每执行一次都会在 docker
上新建一层。所以过多无意义的层会造成镜像膨胀过大;
构建镜像
在 Dockerfile
文件的存放目录下,执行构建动作:
1 | docker build [OPTIONS] PATH | URL | - |
OPTIONS
说明:
- -t / -tag:镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签;
- –build-arg:设置镜像创建时的变量;
- –cpu-shares:设置 cpu 使用权重;
- -f:指定要使用的
Dockerfile
路径; - -m:设置内存最大值;
- …其他可通过 docker build –help 查看
注:docker build -t nginx:test .
代表本次执行的上下文路径(上下文路径是指 docker
在构建镜像,有时候需要使用本机的文件,比如复制,docker build
命令得知这个路径后,会将路径下的所有内容打包)。
推送镜像
1 | docker push [OPTIONS] NAME[:TAG] |
OPTIONS
:说明
- –disable-content-trust:忽略镜像的校验,默认开启
指令详解
FROM:定制的镜像都是基于
FROM
的镜像,这里的nginx
就是定制需要的基础镜像。后续操作都是基于nginx;- 格式:
FROM <image>[:<TAG>]
- 格式:
RUN:用于执行后面跟着的命令,等同于在终端操作的 shell 命令;
- 格式:
RUN <command>
- 格式:
CMD:类似与
RUN
指令,用于运行程序,但两者运行的时间不同CMD
是在docker run
时运行,如果多个CMD
指令仅最后一个生效RUN
是在docker build
时运行
COPY:复制指令,从上下文目录中复制文件或者目录到指定容器里的指定路径
- 格式:
COPY
源路径/文件 目标路径/文件 - 案例:
COPY ./target/service-caterer-2.0.0.war app.war
- 格式:
ADD:添加指令,和
COPY
指令使用格式一致;ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量;
格式:
ENV <key> <value>
或者ENV <key1>=<value1> <key2>=<value2>
案例:
1
2
3ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz"
ARG:构建参数,与
ENV
作业一致。不过作用域不一样,ARG
设置的环境变量仅对Dockerfile
内有效,也就是说只有docker build
的过程有效,构建好的镜像内不存在此环境变量。- 格式:
ARG <参数名>[=<默认值>]
- 格式:
VOLUME:定义匿名数据卷,在启动容器的时候忘记挂载数据卷,会自动挂载到匿名卷。
- 格式:
VOLUME ["<路径1>","<路径2>"...]
- 作用:避免重要的数据,因容器重启而丢失,这是非常致命的
- 格式:
EXPOSE:为构建的镜像设置监听端口,使容器在运行时监听。
- 格式:
EXPOSE <端口1> [<端口2>...]
- 作用:帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;且镜像在运行时使用随机端口映射时,也就是
docker run -P
时,会自动随机映射EXPOSE
的端口。
- 格式:
WORKDIR:指定工作目录。用
WORKDIR
指定的工作目录,会在构建镜像的每一层中都存在(WORKDIR
指定的工作目录,必须时提前创建好的)。格式:
WORKDIR <工作目录路径>
USER:用于指定后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
- 格式:
USER <用户名>[:<用户组>]
- 格式:
三)Docker Compose
待完善。。。