Docker

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中的其他指令直到所有直到执行完成
posted @ 2021-07-01 23:44  温茶又折花  阅读(46)  评论(0编辑  收藏  举报