1.2 Docker操作基础

镜像


  • 概念

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

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

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

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

  • 查找

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

[root@CentOS74 ~]# 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 命令来从仓库获取所需要的镜像

[root@CentOS74 ~]# 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>

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

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

[root@CentOS74 ~]# docker image rmi busybox:latest 
Untagged: busybox:latest
Untagged: busybox@sha256:cb63aa0641a885f54de20f61d152187419e8f6b159ed11a251a09d115fdff9bd
Deleted: sha256:e1ddd7948a1c31709a23cc5b7dfe96e55fc364f90e1cebcde0773a1b5a30dcda
Deleted: sha256:f9d9e4e6e2f0689cd752390e14ade48b0ec6f2a488a05af5ab2f9ccaf54c299d

常用选项:

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

容器


  • 概念

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

  • 创建

使用 docker container create 命令新建容器

root@CentOS74 ~]# 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 命令来新建容器并启动

[root@CentOS74 ~]# 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 命令重新启动停止状态的容器

[root@CentOS74 ~]# docker start webserver 
webserver

常用选项:

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

  • 查看

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

[root@CentOS74 ~]# 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

[root@CentOS74 ~]# docker container pause Bbox
Bbox
[root@CentOS74 ~]# 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

[root@CentOS74 ~]# docker container unpause Bbox
Bbox
[root@CentOS74 ~]# 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 中止一个或多个容器

[root@CentOS74 ~]# docker container kill webserver 
webserver

常用选项:

    -s  向容器发送一个信号

  • 删除

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

[root@CentOS74 ~]# 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(标签) ,每个标签对应一个镜像

  • 制作镜像

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

基于已有镜像

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

[root@CentOS74 ~]# docker container run --name busybox -it busybox

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

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

[root@CentOS74 ~]# docker container commit -p busybox 
sha256:7c206159e9c093374d9bb3ae41e15cdea37aa78b719db0ec2ecbe0c27f68d4b9
[root@CentOS74 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              7c206159e9c0        22 seconds ago      1.16MB
[root@CentOS74 ~]# docker container commit busybox jiangbowen/httpbbox:v0.1-1
sha256:03e0f0800758e927c51dd8f30ff5d3398093dea934f774ace5d82368c2d8bf30
[root@CentOS74 ~]# 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 <[email protected]>"

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 在启动时传递给容器

猜你喜欢

转载自blog.csdn.net/M30_Miriam/article/details/81334490
1.2