docke基本使用

介绍docker架构及三个基本概念:镜像、容器和仓库。介绍镜像和容器的基本操作;从官方仓库拉取镜像(再创建自己的镜像)。

1、Docker架构

1.1、Docker三个基本概念

  • 镜像(Image)
    Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
    Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
    Docker 容器通过 Docker 镜像来创建。

1.2、架构

Docker Client 客户端通过命令行或者其他工具使用 Docker SDK 与Docker守护进程通信。
Docker Host 主机是一个物理的或虚拟的机器,用于运行docker容器或守护进程,主机中有本地镜像。
Docker Registry会有多个仓库,每个仓库都,每个仓库可以包含多个标签,每个标签对应一个镜像。
docke基本使用_第1张图片

2、Docker镜像

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

2.1 docker images

列出本地主机上的镜像
docke基本使用_第2张图片

2.2 docker pull

从镜像仓库中拉取或者更新指定镜像。

(1)语法

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

OPTIONS说明:

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

(2)实例

从Docker Hub下载java最新版镜像。

docker pull ubuntu

从Docker Hub下载ubuntu 18.04镜像

docker pull ubuntu:18.04

2.3 docker rmi

删除本地仓库的镜像

3、Docker容器

3.1 docker run

创建一个新的容器并运行一个命令,语法如下

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

常见的选项

  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口(默认为tcp)
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

几个例子如下:

使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

docker run --name mynginx -d nginx:latest

使用镜像ubuntu以交互模式启动一个容器,将主机的80端口映射到容器8080端口,并在容器内执行/bin/bash命令。

docker run -p 80:8080 –it ubuntu bash

以后台服务运行,成功后返回容器id

docker run -itd --name ubuntu-test ubuntu /bin/bash

3.2 docker ps

列出容器列表,默认docker ps输出运行中的容器。如法如下

docker ps [OPTIONS]

常见选项有

  • -a :显示所有的容器,包括未运行的。
  • -f :根据条件过滤显示的内容。
  • –format :指定返回值的模板文件。
  • -l :显示最近创建的容器。
  • -n :列出最近创建的n个容器。
  • –no-trunc :不截断输出。

输出容器信息的常见的字段有CONTAINER ID、IMAGE、COMMAND、CREATED、STATUS、PORTS、NAMES等。

3.3 docker exec

在使用-d参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:

docker exec -it 243c32535da7 /bin/bash

当使用exit从容器退出时,不会导致容器的退出。

3.4 docker start/stop/restart

这里要求容器是存在的。

  • docker start 启动一个或多个已经被停止的容器
  • docker stop 停止一个运行中的容器
  • docker restart 重启容器

3.5 docker kill

选项-s :向容器发送一个信号,例如杀掉运行中的容器mynginx

$ docker kill -s KILL mynginx

3.6 docker rm

删除一个不再需要的容器,这个容器必须是停止状态的。

查看停止状态的容器可以命令 docker ps -f status=exited

4、本地镜像管理.

主要是自己定制镜像。

4.1 使用Dockerfile定制镜像

Dockerfile 是一个用在来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。使用docker build命令根据Dockerfile创建镜像,命令语法为

docker build [OPTIONS] PATH | URL | -

选项较多,使用help命令查询。

4.1.1 简单示例

例如,当前目录下创建一个Dockerfile文件,内容为

FROM    ubuntu:18.04
COPY    ./test_docker_1 /app/

拉取镜像ubuntu:18.04,并将当前目录的test_docker_1复制到镜像的/app/目录下。执行命令创建Dockerfile的目录。

docker build -t ubuntu:test_app . 

成功后查看当前容器
在这里插入图片描述
多出的内存其实就是copy的文件大小。

在这里插入图片描述
当我们使用该镜像启动容器,交互模式下使用命令就可以执行该程序。

4.1.2 Dockerfile编写常见命令

(1)FROM 和 RUN

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

shell 格式:

RUN <命令行命令>
#<命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:

RUN ["可执行文件", "参数1", "参数2"]
例如:
RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

(1)COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
格式:

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

[–chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建注意,目录需要带斜杠

(2)ADD

ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD 的优点:
    在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点:
    在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

(3)CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行。
  • RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

格式:

CMD <shell 命令> 
CMD ["<可执行文件或命令>","","",...] 
CMD ["","",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

4.2 从docker container导出

在docker 容器中构建好自己需要的环境,再导出为image镜像。当前操作起始做的就是dockerfile的事情。

延续4.1中定制的镜像。首先直接使用官方的镜像ubuntu:18.04启动容器,进入容器并创建/app目录并复制test_docker_1文件,此时运行的容器完全同4.1从Dockerfile创建的镜像启动的容器。
在这里插入图片描述
使用容器导出和导入命令生成定制的镜像

$ docker export 10da36c7ee3f | docker import - ubuntu:test_app2

从新查看本地镜像,多了一个ubuntu:test_app2。
在这里插入图片描述

你可能感兴趣的:(docker,容器,镜像,docker,build,docker,images)