前言

Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

优点:
Docker是一个快速交付应用、运行应用的技术:

  1. 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统[1]。
  2. 运行时利用沙箱机制形成隔离容器,各个应用互不干扰。
  3. 启动、移除都可以通过一行命令完成,方便快捷。

[1]: 因为Docker是将依赖、运行环境一起打包的,而 Docker容器在任何操作系统上都是一致的,所以就有效避免了测试部署环境和开发环境不一致可能出现的各种问题(开发能跑,测试部署跑不起来的问题得到了有效解决),这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

Docker结构:

  • 服务端:接收命令或远程请求,操作镜像或容器
  • 客户端:发送命令或者请求到Docker服务端

Docker和虚拟机

图片
docker是一个系统进程;虚拟机是在操作系统中的操作系统
docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般

镜像、容器、仓库

镜像(Image):
镜像就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器,相当于容器的“源代码”。
Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):
容器是用镜像创建的运行实例。
镜像中的应用程序运行后形成的进程就是容器。只是Docker会给容器做隔离,对外不可见。
仓库(Repository):
仓库就是集中存放镜像文件的场所。
最大的公开仓库是 Docker Hub(https://hub.docker.com/))

联合文件系统

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

安装运行

docker官网

  • 安装docker之前先安装gcc以及gcc的c++支持

    1
    2
    3
    $ yum -y install gcc

    $ yum -y install gcc-c++

    以centos为例:
    在docker文档中找到Docker Engine,然后在Install中找到centos的文档,就可以找到安装命令。

  • 若之前有安装过docker,需要先卸载旧版:

    1
    2
    3
    4
    5
    6
    7
    8
    $ sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
  • 根据文档提示,首次安装需要安装引擎库:

    1
    2
    3
    4
    5
    $ sudo yum install -y yum-utils

    $ sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    官网提供的stable镜像仓库为https://download.docker.com/linux/centos/docker-ce.repo,国内访问速度较慢,所以上面用到地址是阿里云的镜像地址

  • 更新yum包索引(可选)

    1
    $ yum makecache fast
  • 最后安装docker引擎

    1
    $ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

    图片

  • 启动docker

    1
    $ sudo systemctl start docker
  • 测试运行hello-world镜像,测试docker是否正确安装

    1
    $ sudo docker run hello-world

    首次运行可能会提示找不到镜像,docker会自动下载镜像,然后在控制台看到Hello from Docker!即为成功

图片

  • 卸载docker

停止docker

1
$ sudo systemctl stop docker

卸载docker

1
$ sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin

删除docker路径下文件

1
2
$ sudo rm -rf /var/lib/docker
$ sudo rm -rf /var/lib/containerd

配置加速器

配置镜像加速器,可以提升docker访问速度。各大云服务器厂商均有提供容器镜像服务。
腾讯云:
容器镜像服务中找到镜像加速,按照提示配置即可。
图片
阿里云:
在阿里云官网找到容器镜像服务,创建一个个人版实例
然后选择镜像加速器,根据下方的操作文档配置加速器
图片

常用命令

  • 启动docker: systemctl start docker
  • 停止docker: systemctl stop docker
  • 重启docker: systemctl restart docker
  • 查看docker状态: systemctl status docker
  • 开机启动: systemctl enable docker
  • 查看docker概要信息:docker info
  • 查看docker总体帮助文档: docker --help

    镜像常用命令

    图片

    查看镜像

    docker images [OPTIONS]
    可选参数:
    -a:列出本地所有的镜像(含历史映像层)
    -q:只显示镜像ID
    示例:
    1
    $ docker images -a

    查找镜像

    docker search [OPTIONS] 镜像名字
    可选参数:
    --limit: 只列出N个镜像,默认为25
    示例:
    1
    $ docker search --limit 5 ahzoo

    下载镜像

    docker pull 镜像名字[:TAG]

    TAG:镜像标签,一般是版本号,默认为latest

1
2
3
4
$ docker pull 镜像名字

## 等价于:
$ docker pull 镜像名字:latest

查看镜像/容器/数据卷所占的空间

1
$ docker system df 

删除镜像

删除指定镜像:docker rmi 镜像ID
删除多个镜像:docker rmi -f 镜像名1:TAG 镜像名2:TAG
示例:

1
2
## 删除全部镜像
$ docker rmi -f $(docker images -qa)

容器常用命令

有镜像才能创建容器

在使用容器之前可以拉取一个镜像:

1
2
3
$ docker pull centos
## 或者:
$ docker pull ubuntu

图片

新建/启动容器

docker run [OPTIONS] 镜像名 [COMMAND] [ARG...]

COMMAND:命令语句
ARG:其它可选参数

可选参数:
--name="容器新名字":为容器指定一个名称
-d:后台运行容器并返回容器ID,即启动守护式容器(后台运行)
-i:以交互模式运行容器,通常与 -t 同时使用
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用,即启动交互式容器(前台有伪终端,等待交互)
下面几个的命令使用可以在容器数据卷中查看示例:
-P:随机端口映射
-p:指定端口映射
-v:挂载路径
示例:

1
2
3
4
5
6
## 使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
$ docker run -it centos /bin/bash


## 后台运行容器
$ docker run -d centos

/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash

列出当前所有正在运行的容器

docker ps [OPTIONS]
可选参数:
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q:静默模式,只显示容器编号
示例:

1
$ docker ps -a

停止/重启容器

退出容器

两种方式:

  1. ctrl+p+q,退出容器,不会停止容器运行
    1
    2
    ## 退出并停止容器运行
    $ exit

    停止容器

    1
    2
    3
    4
    $ docker stop 容器ID或者容器名

    ## 强制停止容器
    $ docker kill 容器ID或容器名

    重启容器

    1
    $ docker restart 容器ID或者容器名

    启动已停止容器

    1
    $ docker start 容器ID或者容器名

    删除已停止容器

    1
    2
    3
    4
    5
    6
    7
    $ docker rm 容器ID

    ## 一次性删除多个容器实例
    $ docker rm -f $(docker ps -a -q)

    $ docker ps -a -q | xargs docker rm

    调试容器

    查看容器日志

    1
    $ docker logs 容器ID

    查看容器内运行进程

    1
    $ docker top 容器ID

    查看容器内部细节

    1
    $ docker inspect 容器ID

    进入正在运行的容器并以命令行交互

    docker [exec/attach] [OPTIONS] 容器ID [COMMAND] [ARG...]
    可选参数:
    -d:后台运行容器并返回容器ID,即启动守护式容器(后台运行)
    -i:以交互模式运行容器,通常与 -t 同时使用
    -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用,即启动交互
    1
    2
    3
    4
    5
    6
    7
    ## 在容器中打开新的终端,并且可以启动新的进程
    ## 不会导致容器的停止
    $ docker exec -it d06b341e9fe3 /bin/bash

    ## 直接进入容器启动命令的终端,不会启动新的进程
    ## 会导致容器的停止
    $ docker attach d06b341e9fe3

导入/导出容器

1
2
3
4
5
6
7
8
9
## 导出
$ docker export 容器ID > 文件名.tar


## 从本机路径导入容器快照
$ cat docker/ubuntu.tar | docker import - ahzoo/ubuntu:v1

## 从网页导入
$ docker import http://ahzoo.cn/ahzooimage.tgz ahzoo/imagerepo

容器数据卷

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
作用:为了将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全与持久化。
由于数据卷独立于Docker,因此不会在Docker容器删除时删除其挂载的数据卷。

Docker挂载主机目录访问如果出现:cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可

数据互通

宿主机文件和Docker容器的文件会进行同步。即使再容器关闭时操作文件,容器重启时也会进行同步。

示例:
运行一个带有容器卷存储功能的容器实例(将主机的目录映射到容器内部)

1
2
3
4
5
$ docker run \
--name mnginx \ ## 为容器命名为mnginx
-v /ahzoo/html:/root/html \ ## 将主机下的/ahzoo/html目录作为数据卷挂载到容器内的/root/html这个目录中
-p 8080:80 \ ## 8080对应主机真实ip,80对应容器内ip
nginx \ ## 镜像名称

示例2:
在容器中创建一个文件,查看是否同步持久化到主机真实路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
## 查看刚创建的容器ID
$ docker ps -n 1

## 进入容器内部,执行命令
$ docker exec -it d06b341e9fe3 /bin/bash

## 进入容器目录
$ cd root/html

## 创建文件
$ touch ahzoo.html

## 退出容器
$ exit

## 进入主机真实路径
$ cd /ahzoo/html

## 查看文件是否持久化到主机真实路径
$ ls

## 还可以在主机真实路径创建一个文件,同样会映射到docker容器中

图片

读写规则

在容器创建时,为容器添加读写权限

可读写read + write(rw):

1
$ docker run --name mnginx -v /ahzoo/html:/root/html:rw -p 8080:80 nginx

只能读取readonly(ro):

1
$ docker run --name mnginx -v /ahzoo/html:/root/html:ro -p 8080:80 nginx

继承

创建容器时,继承一个已有的容器的卷规则

1
$ docker run --volumes-from 要继承的父类容器名称  --name ouo ubuntu

部署

部署tomcat

在镜像仓库找到tomcat拉取命令及使用方法:
图片
拉取镜像:

1
2
3
4
5
6
7
8
## 拉取镜像
$ docker pull tomcat

## 查看镜像信息,验证是否拉取成功
$ docker images tomcat

## 创建容器实例
$ docker run -d -p 8080:8080 tomcat

由于新版首页文件并没有在默认的webapps目录下,所以直接访问会出现404情况。如果要访问首页需要(进入容器内部)手动将webapps.dist的首页项目文件移动至webapps路径下。

图片
访问tomcat首页:
图片