概念
Image:类似于虚拟机,里面构建了程序运行的基础环境
Container:基于image实现的实例化对象,具有特定功能
配置文件Dockerfile
FROM
FROM指令的功能是为后面的指令提供基础镜像,因此Dockerfile必须以FROM指令作为第一条非注释指令。从公共镜像库中拉取镜像很容易,基础镜像可以选择任何有效的镜像。 在一个Dockerfile中FROM指令可以出现多次,这样会构建多个镜像。tag的默认值是latest,如果参数image或者tag指定的镜像不存在,则返回错误。
FROM [<image> |<image>:<tag>]
选择基础镜像时,尽量选择当前官方镜像库的肩宽,不同镜像的大小不同,目前Linux镜像大小由如下关系:
镜像大小:busybox < debian < centos < ubuntu
同时在构建自己的Docker镜像时,只安装和更新必须使用的包。此外相比Ubuntu镜像,更推荐使用Debian镜像,因为它非常轻量级(目前其大小是在100MB以下),并且仍然是一个完整的发布版本。
WORKDIR
WORKDIR指令设置工作目录,它之后的RUN、CMD、ENTRYPOINT、COPY以及ADD指令都会在这个工作目录下运行。如果这个工作目录不存在,则会自动创建一个。
WORKDIR [path]
ADD/COPY
复制本地文件到镜像的功能,但ADD指令还支持网络url
ADD/COPY <src> <dest>
当拷贝文件到镜像中时,尽量只拷贝需要的文件,切忌使用 COPY .
指令拷贝整个目录。如果被拷贝的文件内容发生了更改,缓存就会被破坏。
RUN
RUN可用于在容器中执行系统指令,然而每一个 RUN
指令都会被看作是可缓存的执行单元。太多的 RUN 指令会增加镜像的层数,增大镜像体积,而将所有的命令都放到同一个 RUN 指令中又会破坏缓存,从而延缓开发周期。在使用较长的RUN指令时可以使用反斜杠\分隔多行。
RUN <command>
当使用包管理器安装软件时,一般都会先更新软件索引信息,然后再安装软件。推荐将更新索引和安装软件放在同一个 RUN 指令中,这样可以形成一个可缓存的执行单元,否则你可能会安装旧的软件包。
不要在一行中单独使用指令RUN apt-get update。当软件源更新后,这样做会引起缓存问题,导致RUN apt-get install指令运行失败。所以,RUN apt-get update和RUN apt-get install应该写在同一行。比如 RUN apt-get update && apt-get install -y package-1 package-2 package-3
#生成2层容器
RUN apt-get update
RUN apt-get install XX
#仅生成一层容器
RUN apt-get update\\
&&apt-get install XX
避免使用指令RUN apt-get upgrade 和 RUN apt-get dist-upgrade。因为在一个无特权的容器中,一些必要的包会更新失败。如果需要更新一个包(如package-1),直接使用命令RUN apt-get install -y package-1。
CMD
CMD指令在构建镜像时并不执行任何命令,而是在容器启动时默认将CMD指令作为第一条执行的命令。
CMD <command>
EXPOSE
EXPOSE指令通知Docker该容器在运行时侦听指定的网络端口。可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。 这个指令仅仅是声明容器打算使用什么端口而已,并不会自动在宿主机进行端口映射,可以在运行的时候通过docker -p指定。
EXPOSE <port>
使用Dockerfile的EXPOSE指令,虽然可以将容器端口映射在主机端口上,但会破坏Docker的可移植性,且这样的镜像在一台主机上只能启动一个容器。所以端口映射应在docker run命令中用-p 参数指定。
# 不要再Dockerfile中做如下映射
EXPOSE 80:8080
Dockerfile
# Use an official Python runtime as a parent image
FROM debian
# Set the working directory to /app
WORKDIR /docker/my_test
ADD . /docker/my_test
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requires.txt
EXPOSE 80
# Run app.py when the container launches
CMD ["python", "app.py"]
创建指令
#创建镜像
docker build -t [name:tag] -f [path] .
#读取镜像
docker load -i [path]
docker build [OPTIONS] [path] .
docker build -t [image_name]:[tag] -f [path] .
#从url拉取镜像
docker build [url]
OPTIONS:
-t [image_name]:[tag],指定image别名
-f [path],指定Dockerfile的位置
存储和读取
#从文件读取镜像
docker load -i [path]
#保存镜像到文件
docker save -o [path] [image]:[tag]
查看指令
#查看container相关的ip和端口
docker port [container]
#查看container的具体信息
docker network inspect bridge
#查看container列表
docker ps
修改指令
#修改image的名称和版本
docker tag [image id] [name]:[tag]
删除指令
docker [image|container] rm -f [id|name]
运行指令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
#停止容器
docker stop [name]
#启动容器
docker start [name]
OPTIONS:
-**P:** 随机端口映射,容器内部端口**随机**映射到主机的端口
-**p:** 指定端口映射,格式为:**主机(宿主)端口:容器端口**
—**name="nginx-lb":** 为容器指定一个名称;
-**m :**设置容器使用内存最大值;
docker run -v /home/bx_admin/jenkins_work/test:/usr/src/python -w /usr/src/python python:3.5 python test.py
命令说明: docker run 创建容器
-v [local_dir]:[container_dir]
将主机中/home/bx_admin/jenkins_work/test目录挂载到容器的/usr/src/python
-w [container_dir]
指定容器的/usr/src/python目录为工作目录
python:3.5 是镜像
python test.py 是命令执行test.py脚本,test脚本理应在build时加入到image的文件中
PS:当执行test.py的时候python程序是在容器内运行,所以需要设置容器的工作目录workdir
清除指令
#杀死所有正在运行的容器
docker kill $(docker ps -a -q)
#删除所有已经停止的容器
docker rm $(docker ps -a -q)
#删除所有镜像
docker rmi $(docker images -q)