Docker小记
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化. 例如:需要将开发环境中的深度学习算法部署到生产环境中提供网络接口服务时,可能由于依赖库、环境较多,需要在每一个生成环境中一一去配置,若开发环境是ubuntu,生成环境是centos,部署成本更高. 因此,使用docker,可以将整个应用及依赖打包,在新机器上装上docker即可加载运行.
Docker 容器使用
获取镜像
载入ubuntu镜像
docker pull ubuntu
启动容器
以ubuntu镜像启动一个容器,以命令行模式进入该容器
docker run -it ubuntu /bin/bash
参数说明:
- -i: 交互式操作
- -t: 终端
- ubuntu: 镜像名
- /bin/bash:即执行的命令
查看所有容器
docker ps -a
参数说明:
- CONTAINER ID : 容器ID
- IMAGE : 使用的镜像名字
- COMMAND : 执行的命令
- CREATED : 容器创建时间
- SATATUS : 容器状态
- PORTS: 容器端口/端口映射
- NAMES: 随机生成的容器名字,可指定,通过 –name 指定
启动/终止/重启/容器
docker start 容器ID/容器名
docker stop 容器ID/容器名
docker restart 容器ID/容器名
后台运行
docker run -itd --name test ubuntu /bin/bash
- –name: 指定容器名
- -d : 默认不进入容器
进入容器
使用 -d参数时,容器进入后台,可通过以下命令进入:
- docker attach : 不推荐使用,此命令退出容器终端时,容器会停止
docker exec :推荐,退出容器终端时,不会导致容器停止
docker attach 容器ID/容器名 docker exec -it 容器ID/容器名
容器导出与导入
导出:
docker export 容器名/ID > 导出文件名
docker export test > test.tar
导入:
# 将快照文件test.tar 导入到镜像training/webapp:v1
cat test.tar | docker import - training/webapp:v1
# 或指定url或某个目录来导入
docker import http://example.com/exampleimage.tgz example/imagerepo
删除容器
docker rm -f 容器ID/名
# 清理掉所有处于终止状态的容器
docker container prune
web应用程序
docker run -d -P training/webapp python app.py
docker run -d -p 5000:5000 training/webapp python app.py
- -P : 将容器内部使用的网络端口映射到我们使用的主机上
-p : 指定本地主机映射的端口号 本机端口:容器端口
# 查看容器端口映射 docker port 容器ID/名
# 查看容器内部的标准输出 docker logs -f 容器ID/名
# 查看容器内部运行的进程 docker top 容器ID/名
# 查看容器的配置和状态 docker inspect 容器ID/名
Docker 镜像使用
# 列出本地主机上的镜像
docker images
# 使用本机不存在的镜像时,docker 会自动下载
docker pull 镜像名
# 查找镜像
docker search 镜像名
# 删除镜像
docker rmi 镜像名
创建镜像
- 从已创建的容器中更新镜像,并且提交镜像
- 使用Dockerfile指令创建新的镜像
更新镜像
- 创建容器,并对容器进行更新,如 apt-get update
提交容器副本
docker commit -m="update" -a="linyang" 容器ID 目标镜像名 参数说明: -m : 提交的描述信息 -a : 镜像作者
使用新的镜像来启动容器
构建镜像
docker build -t 目标镜像 Dockerfile路径
参数说明:
- -t : 指定要创建的目标镜像名
- . : Dockerfile 文件所在目录,可以指定为绝对路径
Docker Dockerfile 指令
例:
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
FROM
定制的镜像都是基于 FROM 的镜像
RUN
用于执行后面跟着的命令行命令
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
ADD
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY),在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD shell 命令
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ARG
构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量
ARG <参数名>[=<默认值>]
VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在, docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在
USER
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)
USER <用户名>[:<用户组>]
HEALTHCHECK
用于指定某个程序或者指令来监控 docker 容器服务的运行状态
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法