docker
Linux 容器的一种封装,提供简单易用的容器使用接口。Docker 中包括三个基本的概念:镜像(Image),容器(Container),仓库(Repository)
镜像
docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像(Image)就是一堆只读层(read-only layer)的统一视角:镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。
容器
容器也是一堆层的统一视角,和镜像的区别在于容器的最上面那一层是可读可写的。
镜像搜索操作
搜索镜像:
docker search image_name
搜索结果过滤是否官方镜像:
docker search --filter "is-official=true" image_name
搜索结果过滤是否自动化构建:
docker search --filter "is-automated=true" image_name
搜索结果过滤大于多少颗星:
docker search --filter stars=3 image_name
列出本地主机上的镜像
列出本地所有的镜像(包含中间映像层)
docker images -a
只显示镜像ID
docker images -q
显示镜像的摘要信息
docker images --digests
显示完整的镜像信息
docker images --notrunc
创建容器
docker run -itd --name=container_name image_name
参数说明:
-i: 表示以交互模式运行容器
-d: 表示后台运行容器,并返回容器ID
-t: 为容器重新分配一个伪输入终端
--name: 为容器指定名称
容器基础操作
查看运行中的容器
docker ps
查看所有容器(包括已停止):
docker ps -a
停止容器:
docker stop container_name/container_id
启动容器:
docker start container_name/container_id
重启容器:
docker restart container_name/container_id
删除容器:
docker rm container_name/container_id
查看容器日志
docker logs -f -t --tail 900 container_id
参数说明:
-f: 跟随最新的日志
-t: 加入时间戳
--tail 900: 显示最后面的900条日志
查看容器的运行
查看容器内运行的进程
docker top container_id
查看容器内部细节
docker inspect container_id
进入容器和退出容器
进入容器
docker exec -it container_name/container_id /bin/bash
退出容器
exit
容器的修改和保存容器修改
提交容器修改
docker commit -a "username" -m "commit message" container_name/container_id new_image_name:tag_name
参数说明:
-a: 可选,指定作者
-m: 可选,提交信息
container_name/container_id: 容器名或者容器ID
new_image_name: 镜像名
tag_name: 镜像标签,不写时默认标签为latest
容器内和本地机器间的文件和数据操作
端口映射
docker run -itd -p 机器端口号:容器端口号
文件挂载
docker run -itd -v 机器目录:容器目录
将容器的文件复制到本地
docker cp 容器名:/容器目录/文件名 /机器目录/文件名
将机器本地的文件复制到容器
docker cp /机器目录/文件名 容器名:/容器目录/文件名
容器互联
docker run -itd --link 要关联的容器名字:容器在被关联的容器中的别名
Dockerfile
Dockerfile 是一个内容包含以下linux命令的文件,docker通过读取文件中的命令来创建镜像。
Dockerfile 一般分为四个部分:基础镜像信息,维护者信息,镜像操作指令 和 容器启动时的执行指令
Dockerfile的运行:
docker build -t image_name:tag_name .
或者
docker build -f /path/Dockerfile .
Dockerfile常用命令
FROM: 第一个命令(且必须为第一个),指定基础镜像
‘’‘
格式如下:
FROM <image_name>
FROM <image_name>:<tag>
FROM <image_name>@<digest>
eg:
FROM centos:7.0
’‘’
MAINTAINER: 维护者信息
'''
格式如下:
MAINTAINER <username>
eg:
MAINTAINER yanfeici
'''
RUN: 构建镜像是执行的命令
'''
格式如下:
RUN <command>
或者
RUN ["executable", "param1", "param2"]
eg:
RUN yum install nginx
RUN ["/bin/executable", "param1", "param2"]
'''
ADD: 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网路资源,类似wget
'''
格式如下:
ADD <src> <dest>
ADD ["<src>", "<dest>"]
eg:
ADD test* /mydir/ # 添加所有以test开头的文件到/mydir/
ADD tes?.txt /mydir/ # ?替代一个单字符,如:test.txt
ADD test /mydir/ # 添加test 到 /mydir/
备注:第一个路径为机器本地文件路径,第二个路径为容器路径
COPY的功能类似ADD,但是不会自动解压文件,也不能访问网络资源
'''
CMD: 构建容器后调用,也就是在容器启动时才进行调用
'''
格式如下:
CMD ["executable", "param1", "param2"]
CMD ["param1", "param2"]
CMD command param1 param2
eg:
CMD echo "test" | wc -
CMD ["/usr/bin/wc", "--help"]
备注: CMD和RUN不同,CMD用于指定在容器启动时所需要执行的命令,而RUN用于指定镜像构建时所要执行的命令
'''
ENTRYPOINT: 配置容器,使其可执行化。配合CMD可省去"application",只使用参数
'''
格式如下:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
eg:
ENTRYPOINT ["top", "-b"]
备注: ENTRYPOINT和CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当作参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令
'''
LABEL: 用于为镜像添加元数据
'''
格式如下:
LABEL <key>=<value> <key>=<value> ...
eg:
LABEL version="2.0" description="this is a test image"
备注: 使用LABEL指定元数据时,一条LABEL指定可以指定一条或者多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令来指定,以免生产过多的中间镜像
'''
ENV: 设置环境变量
'''
格式如下:
ENV <key> <value> # <key>之后的所有内容均会被视为其<value>的组成部分,因此一次只能设置一个变量
ENV <key>=<value>... # 可以设置多个变量,如果key中包含空格,可以使用来转义,也可以使用""来标识,且反斜线可以用来续行
eg:
ENV username tom smith
ENV username=tomsmith
'''
EXPOSE: 指定与外界交互的端口
'''
格式如下:
EXPOSE <port> [<port>...]
eg:
EXPOSE 80 8080
EXPOSE 8443
备注: EXPOSE不会让容器的端口访问到主机,要使其可以访问,需要在docker run运行容器时通过-p来发布这些端口,或者通过-P参数来发布EXPOSE导出的所有端口
'''
VOLUME: 指定持久化目录
'''
格式如下:
VOLUME ["/path/to/dir"]
eg:
VOLUME ["/data"]
VOLUME ["/var/www", "/home/html", "/etc/nginx"]
备注: 一个卷可以存在于一个或者多个容器的指定目录,该目录可以绕过联合文件系统并具有以下功能:
1. 可以容器间共享重用
2. 容器并不一定要和其他容器共享卷
3. 修改卷后会立即生效
4. 对卷的修改不会对镜像产生影响
5. 卷会一直存在,直到没有任何容器使用它
'''
WORKDIR: 工作目录,类似cd命令
'''
格式如下:
WORKDIR /path/to/workdir
eg:
WORKDIR /home/project # /home/project
WORKDIR nginx # /usr/local/nginx
WORKDIR sbin # /usr/local/nginx/sbin
备注: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN,CMD,ENTRYPOINT,ADD,COPY等命令都会在该目录下执行,在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录
'''
USER: 指定运行容器时的用户名或者UID,后续的RUN也会使用指定用户。使用USER指定用户时,可以使用用户名,UID或者GID,或者两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在之前创建所需要的用户
'''
格式如下:
USER linux_user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
eg:
USER nginx
备注: 使用USER指定用户后,Dockerfile中其后的命令RUN,CMD,ENTRYPOINT都将使用该用户,构建镜像完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户
'''
ARG: 指定传递给构建运行时的变量
'''
格式如下:
ARG <name>[=<default value>]
eg:
ARG site
ARG build_user=www
'''
ONBUILD: 设置镜像触发器
'''
格式如下:
ONBUILD [INSTRUCTION]
eg:
ONBUILD ADD . /webapp/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
备注: 当所构建的镜像被用做其他镜像的基础镜像,该镜像中的触发器将会被触发
'''
Dockerfile命令总结
一个Dockerfile例子
docker执行Dockerfile的流程
1. docker从基础镜像运行一个容器
2. 执行一条指令并对容器做出修改
3. 执行类似docker commit的操作提交一个新的镜像层
4. docker再基于刚刚提交的镜像运行一个新的容器
5. 执行Dockerfile中的其他指令直到所有直到执行完成