欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1.2 Docker操作基础

程序员文章站 2022-06-03 15:53:22
...

镜像


  • 概念

在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。

1.2 Docker操作基础

由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不 可写,所以镜像是无状态的。

1.2 Docker操作基础

每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。我们有时说,下层那个 镜像是上层镜像的父镜像。

1.2 Docker操作基础

一个没有任何父镜像的镜像,谓之基础镜像。

  • 查找

使用 docker search 命令查找默认仓库中的镜像

[aaa@qq.com ~]# docker search nginx
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                                                  Official build of Nginx.                        9145                [OK]                
jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker con…   1374                                    [OK]
richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable of…   597                                     [OK]
jrcs/letsencrypt-nginx-proxy-companion                 LetsEncrypt container to use with nginx as p…   392                                     [OK]

常用选项:

    --automated  只列出 automated build类型的镜像
    --no-trunc  显示完整的镜像描述
    -s  列出收藏数不小于指定值的镜像

  • 获取

使用 docker image pull 命令来从仓库获取所需要的镜像

[aaa@qq.com ~]# docker image pull nginx:1.14-alpine
1.14-alpine: Pulling from library/nginx
911c6d0c7995: Pull complete 
d0c5e0e017dc: Pull complete 
ec6394c255ac: Pull complete 
8c7e85b0e988: Pull complete 
Digest: sha256:3d36a2c9513a5aa6aa6c41b076201d468bdb94c4f2b4c6e55d32a461ac8f00ee
Status: Downloaded newer image for nginx:1.14-alpine

常用选项:

    -a  拉取所有 tagged 镜像
    --disable-content-trust  忽略镜像的校验,默认开启

  • 查看

使用 docker image ls 命令来显示本地所有的镜像
别名:docker image <ls | list | images>

[aaa@qq.com ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               1.14-alpine         acc350649a48        3 weeks ago         18.6MB
  • 删除

使用 docker image rmi 命令删除本地镜像

[aaa@qq.com ~]# docker image rmi busybox:latest 
Untagged: busybox:latest
Untagged: aaa@qq.com:cb63aa0641a885f54de20f61d152187419e8f6b159ed11a251a09d115fdff9bd
Deleted: sha256:e1ddd7948a1c31709a23cc5b7dfe96e55fc364f90e1cebcde0773a1b5a30dcda
Deleted: sha256:f9d9e4e6e2f0689cd752390e14ade48b0ec6f2a488a05af5ab2f9ccaf54c299d

常用选项:

    -f  强制删除,不保留已有容器
    --no-prune  不移除该镜像的过程镜像,默认移除

容器


  • 概念

容器本质上是进程,我们原先是在一个操作系统上装很多个服务,比如nginx,mysql,或者其他的服务器,掺杂到系统里面,现在有个容器以后,我会在操作系统中运行mysql容器,nginx容器,或者tomcat容器,会把这个3个进程全部打包到容器里面,这样的话,如果这个进程想要的话,我们就把这个容器启动起来,我们这个进程想把这个容器删掉。所以很显而易见docker它不是虚拟化技术。

  • 创建

使用 docker container create 命令新建容器

aaa@qq.com ~]# docker container ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
6fa8be31051f        busybox:latest      "sh"                     10 seconds ago      Created                                           quirky_ramanujan

  • 启动

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。

新键并启动

使用 docker container run 命令来新建容器并启动

[aaa@qq.com ~]# docker run --name webserver -d nginx:1.14-alpine 
92332b871efa7d104e4a32d82bba8368e3a0b9fc60de89a5ddba14d29136c887

常用选项:

    -a stdin  指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
    -d  后台运行容器,并返回容器ID
    -i  以交互模式运行容器,通常与 -t 同时使用
    -p  端口映射,格式为:主机(宿主)端口 容器端口
    -t  为容器重新分配一个伪输入终端,通常与 -i 同时使用
    --name="nginx-lb"  为容器指定一个名称
    --dns 8.8.8.8  指定容器使用的DNS服务器,默认和宿主一致
    --dns-search example.com  指定容器DNS搜索域名,默认和宿主一致
    -h "mars"  指定容器的hostname
    -e username="ritchie"  设置环境变量
    --env-file=[]  从指定文件读入环境变量
    --cpuset="0-2" or --cpuset="0,1,2"  绑定容器到指定CPU运行
    -m  设置容器使用内存最大值
    --net="bridge"  指定容器的网络连接类型,支持 bridge/host/none/container  四种类型
    --link=[]  添加链接到另一个容器
    --expose=[]  开放一个端口或一组端口

重新启动

使用 docker container start 命令重新启动停止状态的容器

[aaa@qq.com ~]# docker start webserver 
webserver

常用选项:

    start  启动一个或多个处于停止状态的容器
    stop  暂停一个处于UP状态的容器
    restart  重启容器

  • 查看

使用 docker container ps 查看容器当前的状态
别名:docker container <ls | list>

[aaa@qq.com ~]# docker ps
   容器ID           镜像名              运行的命令                 运行时间              状态              映射端口              名称
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
92332b871efa        nginx:1.14-alpine   "nginx -g 'daemon of…"   21 minutes ago      Up 11 minutes       80/tcp              webserver

常用选项:

    -a  显示所有的容器,包括未运行的
    -f  根据条件过滤显示的内容
    --format  指定返回值的模板文件
    -l  显示最近创建的容器
    -n  列出最近创建的n个容器
    --no-trunc  不截断输出
    -q  静默模式,只显示容器编号
    -s  显示总的文件大小

  • 暂停

使用 docker container pause/unpause 暂停或继续容器

pause

[aaa@qq.com ~]# docker container pause Bbox
Bbox
[aaa@qq.com ~]# docker container ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                        PORTS               NAMES
dda975cacb2d        busybox:latest      "sh"                     About a minute ago   Up About a minute (Paused)                        Bbox

unpause

[aaa@qq.com ~]# docker container unpause Bbox
Bbox
[aaa@qq.com ~]# docker container ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
dda975cacb2d        busybox:latest      "sh"                3 minutes ago       Up 3 minutes                            Bbox
  • 中止

使用 docker container kill 中止一个或多个容器

[aaa@qq.com ~]# docker container kill webserver 
webserver

常用选项:

    -s  向容器发送一个信号

  • 删除

使用 docker container rm 删除一个或多个容器

[aaa@qq.com ~]# docker container rm quirky_ramanujan
quirky_ramanujan

常用选项:

    -f  通过SIGKILL信号强制删除一个运行中的容器
    -l  移除容器间的网络连接,而非容器本身
    -v  -v 删除与容器关联的卷

Registry


Registry用于保存docker镜像,包括镜像的层次结构和元数据。用户可自建Registry,也可使用官方的Docker Hub

Docker Registry中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry上保存,供其他人员使用,例如“部署”到生产环境

一个 Registry中可以存在多个Repository

    Repository可分为“顶层仓库”和“用户仓库”
    用户仓库名称格式为“用户名/仓库名”

每个仓库可以包含多个Tag(标签) ,每个标签对应一个镜像

1.2 Docker操作基础

  • 制作镜像

制作镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个

基于已有镜像

首先使用已有镜像启动一个容器

[aaa@qq.com ~]# docker container run --name busybox -it busybox

修改容器中的可写层,此时容器被修改后,后退出容器

使用 docker container commit 命令制作新的镜像副本

[aaa@qq.com ~]# docker container commit -p busybox 
sha256:7c206159e9c093374d9bb3ae41e15cdea37aa78b719db0ec2ecbe0c27f68d4b9
[aaa@qq.com ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              7c206159e9c0        22 seconds ago      1.16MB
[aaa@qq.com ~]# docker container commit busybox jiangbowen/httpbbox:v0.1-1
sha256:03e0f0800758e927c51dd8f30ff5d3398093dea934f774ace5d82368c2d8bf30
[aaa@qq.com ~]# docker image ls
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
jiangbowen/httpbbox   v0.1-1              03e0f0800758        12 seconds ago      1.16MB

常用选项:

    -a  作者信息
    -c  修改内容列表
    -m  提交信息
    -p  暂停容器以创建镜像

Dockerfile

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。

一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

FROM centos:latest

LABEL maintainer="M30_Miriam <aaa@qq.com>"

ENV NGINX_VERSION="nginx-1.12.2" 

COPY epel.repo /etc/yum.repos.d/
COPY nginx-1.12.2-1.el7_4.ngx.x86_64.rpm /data/

RUN yum install -y ${NGINX_VERSION} \
    || yum install -y ${NGINX_VERSION}-1.el7_4.ngx.x86_64.rpm \
    && yum clean all && rm -f /data/${NGINX_VERSION}-1.el7_4.ngx.x86_64.rpm

RUN echo "This is Miriam HomePage" > /usr/share/nginx/html/index.html

EXPOSE 80/tcp

CMD ["nginx", "-g", "daemon off;"]

常用指令:

    FROM
        语法:FROM <image>或FROM <image>:<tag>
        第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)

    MAINTAINER
        语法: MAINTAINER <name>
        指定维护者信息(已废弃)

    LABEL
        语法:LABEL <key>=<value> ...
        指定标签信息,取代 MAINTAINER

    RUN
        语法:RUN <command> 或 RUN ["executable", "param1", "param2"]
        前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现。每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行

    CMD
        支持三种语法:
            CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式
            CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用
            CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数
        指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行,如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令

    EXPOSE
        语法: EXPOSE <port> [<port>...]
        告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口

    ENV
        语法: ENV <key> <value>    
        指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持

    ADD
        语法:ADD <src> <dest>
        该命令将复制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)

    COPY
        语法:COPY <src> <dest>
        复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>
        当使用本地目录为源目录时,推荐使用 COPY

    ENTRYPOINT
        两种格式:
            ENTRYPOINT ["executable", "param1", "param2"]
            ENTRYPOINT command param1 param2(shell中执行)
        配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖
        每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效

    VOLUME
        语法:VOLUME ["/data"]
        创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等

    USER
        语法:USER daemon
        定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户
        当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户。要临时获取管理员权限可以使用 gosu,而不推荐 sudo

    WORKDIR
        语法:WORKDIR /path/to/workdir
        为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录
        可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径

    ONBUILD
        
语法:ONBUILD [INSTRUCTION]
        配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令

    HEALTHCHECK
        语法:HEALTHCHECK [OPTIONS] CMD command
        选项:
            --interval=DURATION (default: 30s)
            --timeout=DURATION (default: 30s)
            --start-period=DURATION (default: 0s)
            --retries=N (default: 3)
        按照定义的参数在容器中执行操作,判断返回值:0为成功,1为故障,2为保留值。当返回值非0时关闭容器

    STOPSIGNAL
        语法:STOPSIGNAL signal
        向容器中的进程发送信号,与 kill 命令的信号相同,9为强制杀死,15为中止

    ARG
        语法:ARG <name>[=<default value>]
        定义一个变量,用户可以通过 --build-arg 在启动时传递给容器

 

相关标签: Docker Dockerfile