概念

Image:类似于虚拟机,里面构建了程序运行的基础环境

Container:基于image实现的实例化对象,具有特定功能

dockerfile构建基础镜像 docker from基础镜像_dockerfile构建基础镜像

 


配置文件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)