Docker基础

1.什么是Docker

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 控制组(cgroup),命名空间(namespace),以及 AUFS 类的 联合文件系统(Union FS) 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Dokcer实际是宿主机的一个普通的进程。

2.Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

概念说明
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker 仓库(Registry)

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。
一个仓库注册服务(Docker Registry) 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

3.Docker的概念,安装及镜像管理

3.1 docker的概念

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,看看下面这张图:image ufs

右边我们看到了多个只读层,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker内部的实现细节,并且能够在docker宿主机的文件系统上访问到。统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于所有的镜像都是只读的,容器的最上面那一层是可读可写的等于镜像加上一个可读写的层,同一个镜像可以对应多个容器。。container ufs

一个运行态容器被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程。

  • 仓库(Repository):仓库可看成一个代码控制中心,是集中存放镜像文件的场所。

网络模式

Docker的本地网络实现其实就是利用了linux上的网络命名空间和虚拟网络设备(特别是veth pair)。
在使用docker run 命令启动容器的时候 可以指定--net参数来指定容器的配置,网络配置可选值 bridge、none、containrer、host和用户定义的网络

  1. --net=bridge:默认值,在docker网桥docker0上为容器创建新的网络栈;
  2. --net=none:让Docker将新容器放到隔离的网络栈中,但是不进行网络配置,之后用户可以自行进行配置 。
  3. --net=container:NAME_OR_ID: 让Docker将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己 的文件系统、进程列表和资源限制,但是会和已存在的容器共享IP地址和端口等网络资源 ,两者进程 可以直接通过LO环回接口通信。
  4. --net=host:告诉Docker不要将容器网络放到隔离的命名空间中,即不要容器化容器内的网络,此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以和主机其它root进程一样打开低范围内的端口,可以访问本地网络服务,比如D-bus,如果进一步使用 --privileged=true参数,容器甚至会被允许直接配置主机的网络栈。
  5. --net=user_defined_network:用户自行用network命令创建一个网络,通过这种方式将容器连接到指定的已创建网络上去。

3.2 CentOS Docker 安装

使用官方安装脚本在线自动安装

安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh

3.3 Docker Dockerfile

什么是 Dockerfile?


Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

使用 Dockerfile 定制镜像

在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容。以定制一个 nginx 镜像:
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

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 层镜像。

详细可参考官方Dockerfile参考Alpine Linux package management(docker常用的alpine镜像,这个版本缺 glibc),Dockerfile实践指南之RUN命令使用或者使用hadolint工具检查Dockerfile写法问题,metersphere项目的jmeter dockerfile文件

3.4 Docker Compose

Compose 简介

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

使用 Dockerfile 定义应用程序的环境。
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
最后,执行 docker-compose up 命令来启动并运行整个应用程序。

Compose 安装

Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。
运行以下命令以下载 Docker Compose 的当前稳定版本:
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要安装其他版本的 Compose,请替换 1.24.1。

也可以程序自动检测最新版本,再下载:
COMPOSEVERSION=$(curl -s https://github.com/docker/compose/releases/latest/download 2>&1 | grep -Po [0-9]+\.[0-9]+\.[0-9]+)
curl -L "https://github.com/docker/compose/releases/download/$COMPOSEVERSION/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 2>&1 | tee -a ${CURRENT_DIR}/install.log

将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
创建软链:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否安装成功:
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

创建 docker-compose.yml

docker-compose.yml 的配置案例可以查看官方文档:撰写 docker-compose.yml 文件参考

使用 Compose 命令构建和运行您的应用

在测试目录中,执行以下命令来启动所有服务:
docker-compose up
如果你想在后台执行所有服务可以加上 -d 参数:
docker-compose up –d

指定Compose模板文件
-f,–file FILE指定Compose模板文件,默认为docker-compose.yml,可以多次指定。如
docker-compose -f docker-compose-base.yml -f docker-compose-server.yml -f docker-compose-node-controller.yml

详情可参考官方 docker-composer命令行

3.5 启动 docker

service docker start 2>&1 | tee -a ${CURRENT_DIR}/install.log

3.6 docker 镜像管理

3.6.1 获取镜像

语法:docker pull NAME[:TAG]
其中,NAME是镜像仓库的名称(用来区分镜像),TAG是镜像的标签(用来表示版本信息)
docker pull  centos  从docker.com获取centos镜像

3.6.2 查看镜像

语法:docker images

3.6.3 搜索镜像

docker search [image-name]:从docker仓库搜索docker镜像,后面是关键词

3.6.4 删除镜像

docker rmi centos
用来删除指定镜像,其中后面的参数可以是tag,如果是tag时,实际上是删除该tag,只要该镜像还有其他tag,就不会删除该镜像。当后面的参数为镜像ID时,则会彻底删除整个镜像,连通所有标签一同删除。

3.6.5 创建镜像

创建镜像的方法有以下3种方式:
(1)基于已有镜像的容器创建
(2)基于本地模板导入
(3)基于Dockerfile创建

(1)基于已有镜像的容器创建
命令格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
主要选项:
-a:提交的镜像作者信息;
-c:使用Dockerfile指令来创建镜像;
-m:提交时的说明文字;
-p:提交时暂停容器运行;
运行docker run后,进入到该容器中,我们做一些变更,比如安装一些东西,然后针对这个容器进行创建新的镜像。

(2)基于本地模板导入
命令格式:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
主要选项:
-c :应用docker 指令创建镜像;
-m :提交时的说明文字;
模块获取可以直接在网上下载一个模块,再导入
# wget https://download.openvz.org/template/precreated/contrib/centos-7-x86_64-minimal-20170709.tar.xz
cat centos-7-x86_64-minimal-20170709.tar.xz |docker import - centos-5-x86

(3)基于Dockerfile创建
命令格式:docker build [OPTIONS] PATH | URL | -
主要选项:
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares, -c :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
--file, -f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
--squash :将 Dockerfile 中所有的操作压缩为一层。
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
--network: 默认 default。在构建期间设置RUN指令的网络模式
$ docker build -t runoob/centos:6.7 .
参数说明:
-t :指定要创建的目标镜像名和标签
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

3.6.6 设置镜像标签

命令格式:docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像:
docker tag ubuntu:15.10 runoob/ubuntu:v3

3.3.7 存出和载入镜像以及上传镜像

docker save : 将指定镜像保存成 tar 归档文件。
命令格式:docker save [OPTIONS] IMAGE [IMAGE...]
主要选项:-o :输出到的文件。
将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档:
$ docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3

docker load : 导入使用 docker save 命令导出的镜像。
命令格式:docker load [OPTIONS]
主要选项:
--input , -i : 指定导入的文件,代替 STDIN。
--quiet , -q : 精简输出信息。
导入镜像:docker load < busybox.tar.gz
docker load --input fedora.tar

3.3.8 查看指定镜像的创建历史

命令格式:docker history [OPTIONS] IMAGE
主要选项:
-H :以可读的格式打印镜像大小和日期,默认为true;
--no-trunc :显示完整的提交记录;
-q :仅列出提交记录ID。
查看本地镜像runoob/ubuntu:v3的创建历史:
$ docker history runoob/ubuntu:v3

3.3.9 管理镜像

命令格式:docker image COMMAND
主要选项:
   build       从 Dockerfile 构建一个镜像
   history     显示一个镜像的历史
   import      从tarball导入内容以创建文件系统镜像
   inspect     检查显示一个或者多个镜像的详细信息
   load        从tar存档或者STDIN中加载一个镜像
   ls          列出所有的镜像
   prune       移除未使用的镜像
   pull        从仓库中拉取一个镜像或者存储库
   push        将镜像或者储存库推入仓库
   rm          移除一个或多个镜像
   save        将一个或多个图像保存到tar存档文件(默认情况下流到STDOUT)
   tag         创建一个引用SOURCE_IMAGE的TARGET_IMAGE标记

3.7 操作Docker容器

3.7.1 创建容器

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。

docker start [OPTIONS] CONTAINER [CONTAINER...]
docker start命令启动一个或多个已经被停止的容器

docker restart [OPTIONS] CONTAINER [CONTAINER...]
docker restart命令重启容器

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

3.7.2 终止容器

docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker stop命令停止一个运行中的容器

3.7.3 进入容器

进入容器有以下3种方法:
(1)attach命令
(2)exec命令(推荐方式)
(3)nsenter工具

(1)attach命令
命令格式:docker attach [OPTIONS] CONTAINER
要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。
# docker attach mynginx
注意:使用attach命令有时候并不方便,当多个窗口同时使用attach命令链接到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法进行操作。

(2)exec命令(推荐方式)
命令格式:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
主要选项:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端

(3)nsenter工具
[root@localhost ~]# yum install -y util-linux #安装nsenter工具
为了使nsenter链接到容器,还需要找到容器进程的PID,可以通过以下命令获取
PID=$(docker inspect --format "{{.State.Pid}}" container)
通过这个pid就可以连接到这个容器
nsenter -t $PID -u -i -n -p
一般情况下,将这个工具写成一个脚本更方便:
[root@localhost ~]# cat ns.sh
#!/bin/bash
PID=`docker inspect --format "{{.State.Pid}}" $1`
nsenter -t $PID -u -i -n -p
[root@localhost ~]# ./ns.sh mynginx

3.7.4 杀掉一个运行中的容器

命令格式:docker kill [OPTIONS] CONTAINER [CONTAINER...]
主要选项:-s :向容器发送一个信号
杀掉运行中的容器mynginx:docker kill -s KILL mynginx

3.7.5 暂停/回复容器中的所有进程

docker pause :暂停容器中所有的进程。
docker pause [OPTIONS] CONTAINER [CONTAINER...]

docker unpause :恢复容器中所有的进程。
docker unpause [OPTIONS] CONTAINER [CONTAINER...]

3.7.6 删除容器

命令格式:docker rm [OPTIONS] CONTAINER [CONTAINER...]
主要选项:
--force ,-f :通过 SIGKILL 信号强制删除一个运行中的容器。
--link ,-l :移除容器间的网络连接,而非容器本身。
--volumes ,-v :删除与容器关联的卷。

3.7.7 列出容器

命令格式:docker ps [OPTIONS]
主要选项:
--all , -a :显示所有的容器,包括未运行的。
--filter , -f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
--latest , -l :显示最近创建的容器。
--last ,-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
--quiet ,-q :静默模式,只显示容器编号。
-size , -s :显示总的文件大小。

docker top :查看容器中运行的进程信息,支持 ps 命令参数。
命令格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]

3.7.8 获取容器/镜像的元数据

命令格式:docker inspect [OPTIONS] NAME|ID [NAME|ID...]
主要选项:
--format , -f :指定返回值的模板文件。
--size ,-s :显示总的文件大小。
--type :为指定类型返回JSON。

3.7.9 从服务器获取实时事件

命令格式:docker events [OPTIONS]
主要选项:
--filter , -f :根据条件过滤事件;
--format :指定返回值的Go模板文件。
--since :从指定的时间戳后显示所有事件;
--until :流水时间显示到指定的时间为止。

3.7.10 阻塞运行直到容器停止,然后打印出它的退出代码

命令格式:docker wait [OPTIONS] CONTAINER [CONTAINER...]

3.7.11 导入和导出容器

docker import : 从归档文件中创建镜像。
命令格式:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
主要选项:
-c :应用docker 指令创建镜像;
-m :提交时的说明文字。

docker export :将文件系统作为一个tar归档文件导出到STDOUT。
命令格式:docker export [OPTIONS] CONTAINER
主要选项:
-o :将输入内容写到文件。

3.7.12 列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口

命令格式:docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
$ docker port mymysql
3306/tcp -> 0.0.0.0:3307
注意:3306是主机端口,3307是容器内部的端口。

3.7.13 获取容器的日志

命令格式:docker logs [OPTIONS] CONTAINER
主要选项:
--details:显示额外的详细日志信息;
--follow ,-f : 跟踪日志输出;
--since :展示从某个时间节点开始的所有日志(时间节点为以秒为单位的时间戳);
--timestamps ,-t : 显示时间戳;
--tail :仅列出最新N条容器日志;
--until:显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

3.7.14 容器与主机之间数据拷贝

命令格式:docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
主要选项:
-L :保持源目标中的链接

其他详见官方Docker命令参考

3.8 Docker帮助

命令格式:docker command --help
$ docker stats --help

Usage:  docker stats [OPTIONS] [CONTAINER...]

Display a live stream of container(s) resource usage statistics

Options:
   -a, --all             Show all containers (default shows just running)
       --format string   Pretty-print images using a Go template
       --no-stream       Disable streaming stats and only pull the first result
       --no-trunc        Do not truncate output

4.Docker 仓库管理

4.1 公共仓库

Docker 官方维护了一个公共仓库 Docker Hub,在 其上 可以免费注册一个 Docker 账号。
登录和退出:docker login (登录需要输入注册的用户名和密码)
docker logout

推送镜像
用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。
以下命令中的 username 请替换为你的 Docker 账号用户名。
$ docker tag ubuntu:18.04 username/ubuntu:18.04

4.2 私有仓库

使用registry镜像来创建私有仓库:docker pull registry
//以registry镜像启动容器,-p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口
# docker run -d -p 5000:5000 registry #这里将自动下载registry镜像并启动容器,创建本地私有仓库。
默认的情况下,会将仓库创建在容器的/tmp/registry目录下,可以通过-v参数来将镜像文件存放在本地的指定路径上。

其他请参考Docker入门篇(一)之docker基础

posted on 2020-12-07 17:04  农夫山药  阅读(160)  评论(0编辑  收藏  举报