Docker总结

时间:2019-08-26
本文章向大家介绍Docker总结,主要包括Docker总结使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 

1. Docker 简介

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口 (类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 的应用场景

  • Web 应用的自动化打包和发布
  • 自动化测试和持续集成、发布
  • 在服务型环境中部署和调整数据库或其他的后台应用
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS (Platform-as-a-Service) 环境
  • 简化程序:Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。
  • 避免选择恐惧症:如果你有选择恐惧症,还是资深患者。Docker 帮你打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
  • 节省开支:一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。

Docker 的优点

Docker 引擎

Docker 引擎是一个包含以下主要组件的客户端服务器应用程序。

  • 一种服务器,它是一种称为守护进程并且长时间运行的程序。
  • REST API用于指定程序可以用来与守护进程通信的接口,并指示它做什么。RPC  restFull
  • 一个有命令行界面 (CLI) 工具的客户端。

Docker 引擎组件的流程如下图所示:

2. Docker 功能特点

虽然Docker提供了很多功能,但这里只列出了一些主要功能,如下所示:

轻松快捷的配置

这是Docker的一个主要功能,可帮助我们轻松快速地配置系统。可以在更少的时间和精力的情况下部署代码。 由于Docker可以在各种各样的环境中使用,基础架构不再要求与应用程序的环境相关联。

提高工作效率

通过放宽技术配置和应用的快速部署。 毫无疑问,它节约了时间提高了生产率。 Docker不仅有助于在孤立环境中执行应用程序,而且还减少了资源。

应用隔离

Docker提供用于在隔离环境中运行应用程序的容器。 每个容器独立于另一个容器,并允许执行任何类型的应用程序。

云调度

它是Docker容器的集群和调度工具。 Swarm(是Docker的集群调度工具,使用Swarm控制和管理Docker的集群)使用Docker API作为其前端,这有助于我们使用各种工具来控制它。 它还可以将Docker主机集群控制为一个虚拟主机。 这是一个用于启用可插拔后端的自组织引擎组。

路由网

它将可用节点上已发布端口的传入请求路由到活动容器。 即使节点上没有任务正在运行,此功能也可以实现连接。

服务

服务是允许指定集群内的容器状态的任务列表。 每个任务表示一个应该运行的容器的一个实例,并且Swarm在节点之间调度它们。

安全管理

它允许将保密数据保存到云群 (swarm) 中,然后选择给予服务访问某些保密数据。它包括一些重要的命令给引擎,如保密数据检查,保密数据创建等。

3. Docker 系统架构

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

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

容器与镜像的关系类似于面向对象编程中的对象与类。

根据镜像实例化一个或多个容器,所有的操作都会在容器上进行

Docker

面向对象

容器

对象

镜像

                                      这里需要大家进行理解

标题

说明

镜像(Images)

Docker 镜像是用于创建 Docker 容器的模板。

容器(Container)

容器是独立运行的一个或一组应用。

客户端(Client)

Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。

主机(Host)

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

仓库(Registry)

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

Docker Machine

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

4. Docker 安装(安装之前clone出一台新的虚拟机)

可以在任何操作系统上安装 Docker,无论是 Mac,Windows,Linux 还是任何云服务器。Docker 引擎在 Linux 发行版上运行。 在这里,我们将以 Linux Ubuntu Server 16.04 作为演示安装 Docker 引擎的过程。

前提条件

Docker 需要两个重要的安装要求:

  • 它仅适用于 64 位 Linux 安装
  • 它需要 Linux 内核版本 3.10 或更高版本。

要查看当前的内核版本,请打开终端并键入uname -r命令以查看内核版本:

suchuanqi@UbuntuBase:~$ uname -r
4.4.0-21-generic

查看操作系统是32位还是64位:

suchuanqi@UbuntuBase:~$ uname --m
x86_64

在安装Docker之前先更改数据源,用阿里源即可

vi /etc/apt/sources.list   修改的配置文件
 
修改的阿里源(注意把配置文件里面的内容全部替换掉)
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
 
执行阿里源的更新
apt-get update

使用脚本安装 Docker

使用在线安装脚本

curl -sSL https://get.daocloud.io/docker | sh         

执行后会自动下载并安装 Docker 及依赖包

suchuanqi@UbuntuBase:~$ curl -sSL https://get.daocloud.io/docker | sh
# Executing docker install script, commit: 49ee7c1
+ sudo -E sh -c apt-get update -qq >/dev/null
+ sudo -E sh -c apt-get install -y -qq apt-transport-https ca-certificates curl software-properties-common >/dev/null
+ sudo -E sh -c curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" | apt-key add -qq - >/dev/null
+ sudo -E sh -c echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial edge" > /etc/apt/sources.list.d/docker.list
+ [ ubuntu = debian ]
+ sudo -E sh -c apt-get update -qq >/dev/null
+ sudo -E sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null
+ sudo -E sh -c docker version
Client:
 Version:      17.10.0-ce
 API version:  1.33
 Go version:   go1.8.3
 Git commit:   f4ffd25
 Built:        Tue Oct 17 19:04:16 2017
 OS/Arch:      linux/amd64
 
Server:
 Version:      17.10.0-ce
 API version:  1.33 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   f4ffd25
 Built:        Tue Oct 17 19:02:56 2017
 OS/Arch:      linux/amd64
 Experimental: false
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:
 
  sudo usermod -aG docker lusifer
 
Remember that you will have to log out and back in for this to take effect!
 
WARNING: Adding a user to the "docker" group will grant the ability to run
         containers which can be used to obtain root privileges on the
         docker host.
         Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
         for more information.

完成后有个提示

If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:
 
  sudo usermod -aG docker suchuanqi
 
Remember that you will have to log out and back in for this to take effect!

当要以非 root 用户可以直接运行 docker 时,需要执行 sudo usermod -aG docker suchuanqi(执行该命令必须root用户下) 命令,然后重新登陆,否则会有如下报错,该命令在普通用户下操作

docker  version  查看当前用户版本,如果没有上面那句话普通用户是不到版本的所以要使用上面的命令,让普通用户也能访问docker

suchuanqi@UbuntuBase:~$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.33/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

启动 Docker 后台服务,如果成就重启系统

service docker start 启动docker                  重新启动docker----service docker restart

查看 Docker 当前版本

suchuanqi@UbuntuBase:~$ docker version
Client:
 Version:      17.10.0-ce
 API version:  1.33
 Go version:   go1.8.3
 Git commit:   f4ffd25
 Built:        Tue Oct 17 19:04:16 2017
 OS/Arch:      linux/amd64
 
Server:
 Version:      17.10.0-ce
 API version:  1.33 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   f4ffd25
 Built:        Tue Oct 17 19:02:56 2017
 OS/Arch:      linux/amd64
 Experimental: false

配置加速器

由于网络原因,我们在 pull Image 的时候,从 Docker Hub 上下载会很慢... 所以,国内的 Docker 爱好者们就添加了一些国内的镜像 (mirror),方便大家使用。

修改配置文件

vi /lib/systemd/system/docker.service

添加 --registry-mirror=https://jxus37ac.mirror.aliyuncs.com 到 ExecStart:

会显示ExecStart=/usr/bin/dockerd  -H fd://   把-H fd://去掉添加上上面的一句话即可,如下所示:

ExecStart=/usr/bin/dockerd  --registry-mirror=https://jxus37ac.mirror.aliyuncs.com

保存配置:systemctl daemon-reload

重启服务:service docker restart

然后再次查看docker的运行状态:systemctl status docker

5. Docker 基本使用(到这里我们Docker要再克隆一台出来,以便我们更好的操作)

第一个 Docker 应用程序

直接使用docker命令输入的引擎在它的下面有好多命令

比如docker  run表示运行docker的程序

Docker 允许你在容器内运行应用程序,使用 docker run 命令来在容器内运行一个应用程序。

输出 Hello Docker:

suchuanqi@UbuntuBase:~$ docker run ubuntu:15.10 /bin/echo "Hello Docker"   这里的意思就是你要通过ubuntu:15.10这个版本打印一句话hello Docker

Hello Docker   这里的hello Docker是通过ubuntu:15.10这个镜像创建了一个字节的容器然后打印Hello Docker, 注意不是本地计算机打印出来的

上面的语句可能会出现问题因为docker run 后面的 ubuntu:15.10这个版本ubuntu在docker容器中是没有该版本的所以当你执行命令后他会发现在它的容器中并没有该版本,那么他会通过我们设置的阿里云去下载ubuntu,然后执行, 当然如果这个容器存在的话他就不会去下载,上来就直接打印

既然已经下载好了镜像我们可以通过 docker images来进行所有镜像的显示操作,如下所示:

我们可以使用 docker ps -a 命令来查看当前所有的运行的容器(包括运行过的容器),如下所示:

我们也可以删除被启动的容器,使用命令 docker rm  容器的唯一id

在这里我们就看到我们把容器删除掉了, (其实在这里我们可以更加深刻的理解我们的容器,和镜像,   容器就是我们的对象,  镜像就相当于我们的类)

参数解释:

  • docker:Docker 的二进制执行文件
  • run:与前面的 docker 组合来运行一个容器
  • ubuntu:15.10:指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像
  • /bin/echo "Hello Docker":在启动的容器里执行的命令

以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello Docker",然后输出结果。

运行交互式的容器

我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力,也就是我们可以进入到容器内进行操作

suchuanqi@UbuntuBase:~$ docker run -it ubuntu:15.10 /bin/bash     进去顺便启动

root@76ab065de67b:/#

可以使用ll来进行查看该ubuntu的内部文件结构

参数解释:                                  

  • -t:在新容器内指定一个伪终端或终端
  • -i:允许你对容器内的标准输入进行交互

此时我们已进入一个 ubuntu15.10 系统的容器    也就是进入了一个容器的内部我们也管他叫容器上的操作系统

这时我们可以在容器内部使用uname 查看他的系统的名字, 也可以使用uname  -r 来查看当前操作系统的版本或者是 uname  - -m,如果下所示:

我们尝试在容器中运行命令 cat /proc/version 和 ls 分别查看当前系统的版本信息和当前目录下的文件列表

root@76ab065de67b:/# cat /proc/version

Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016

root@76ab065de67b:/# ls

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

退出容器:

  • 运行 exit
  • 使用 CTRL + D
  • 可以使用docker  ps(查看正在运行的容器) 或docker  ps  -a(查看所有容器包括正在运行的和运行过的容器)  进行对容器的查看 

最后使用docker  rm  id删除容器即可

以后台模式运行容器

使用以下命令创建一个以进程方式运行的容器(说白了就是建立一个持久的容器为我服务,前面的都是运行当前就释放了,并且都是在主线程成操作,不能干其他事情)

设置一个后台一个长期运行的服务,就需要启动的容器,让他一直在后台运行,才能够提供持久的服务

suchuanqi@UbuntuBase:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello docker; sleep 1; done"       使用这个命令后台执行一个容器
0977407542d16c5699a2cc0455d977cb5d8ef011a1a762cdcf2323851f6b3ed3     ----这里显示的这串编码翻译过来就是hello docker 
 
docker run 表示执行
-d  表示在后台执行 
ubuntu:15.10 执行的是哪个容器
while true; do 表示死循环 并不断打印 echo hello docker;这句话, 
sleep 1; done   1秒执行一次

在输出中,我们没有看到期望的"hello docker",而是一串长字符

0977407542d16c5699a2cc0455d977cb5d8ef011a1a762cdcf2323851f6b3ed3

这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。

首先,我们需要确认容器有在后台运行,可以通过 docker ps 来查看正在运行的容器       之前的操作docker ps -a 表示显示所有的容器,包括未运行的

suchuanqi@UbuntuBase:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
0977407542d1        ubuntu:15.10        "/bin/sh -c 'while..."   2 seconds ago       Up 1 second                             thirsty_kowalevski

CONTAINER ID:容器ID

NAMES:自动分配的容器名称

在容器内使用 docker logs 命令,查看容器内的标准输出

suchuanqi@UbuntuBase:~$ docker logs 0977407542d1    (0977407542d1 表示容器id)

hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
suchuanqi@UbuntuBase:~$ docker logs thirsty_kowalevski
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
 
 
 
停止容器:  docker stop 容器id 如下图所示:
 
 
跟踪容器日志操作: docker logs -f 0cb8efb396d6,跟踪容器的每次的执行,每隔1秒会打印一次日志操作,也就是跟踪当前容器的状态

与正在运行的容器交互

docker exec -it 容器id /bin/bash      这里的意思是与一个正在执行的容器进行交互,进入到该正在运行容器的内部
 
这个时候我们可以使用ps -ef|grep echo查看当前这个容器正在执行什么,如下所示:
我们可以使用 kill -9  1 来把当前所要执行的命令杀死,那么他将不执行上面 root   1的这个线程的操作即意味着该容器没有持续执行某些命令
最后我们使用 docker stop 容器id 停止该容器即可
 

停止容器

最后我们使用 docker stop 容器id 停止该容器即可,最后在进行删除容器,及查看等操作即可,如下图所示:

6. Docker 容器管理

Docker 客户端

docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。

 

可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。也可以使用我们经常操作docker ps --help来看他下面的所有参数

例如我们要查看 docker stats --help  这里是帮助查看该命令下有哪些具体的参数
docker stats命令用于显示一个或多个容器实时的资源使用情况,包括CPU,内存使用量,网络IO,磁盘IO等信息。 
docker stats命令仅显示正在运行的running容器的实时资源使用情况,不能显示已经停止的容器的资源使用情况

运行 WEB 容器

前面我们运行的容器并没有一些什么特别的用处。

接下来让我们尝试使用 docker 构建一个 web 应用程序。

我们将在 docker 容器中运行一个 Python Flask 应用来运行一个web应用。

suchuanqi@UbuntuBase:~$ docker run -d -P training/webapp python app.py

d89a785788469da23529eebf70f1764611bb28818a8de7fa1ea85154327b807a

参数说明:

  • -d:让容器在后台运行
  • -P:将容器内部使用的网络端口映射到我们使用的主机上
  • training/webapp:   这里的意思是镜像为training/webapp
  • 执行的命令为: python app.py

那么这个时候我们就可以通过网页去访问该容器内的程序

查看 WEB 容器

使用 docker ps 来查看我们正在运行的容器

suchuanqi@UbuntuBase:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
d89a78578846        training/webapp     "python app.py"     2 minutes ago       Up 2 minutes        0.0.0.0:32771->5000/tcp   laughing_cori

这里多了端口信息

PORTS
0.0.0.0:32771->5000/tcp

Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32771 上。

这时我们可以通过浏览器访问WEB应用 

http://192.168.211.130:32768/    通过它进行访问网页

在执行下面的自定义端口前我们使用命令docker stop 4a04170c112b来停止上面运行的容器

我们也可以指定 -p 标识来绑定指定端口

suchuanqi@UbuntuBase:~$ docker run -d -p 5000:5000 training/webapp python app.py
9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb
suchuanqi@UbuntuBase:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
9490b017fdf6        training/webapp     "python app.py"     3 seconds ago       Up 2 seconds  

那么我们就可以通过http://192.168.1.34:5000/这个自定义的端口通过浏览器进行访问了

查看 WEB 应用日志

docker logs [ID或者名字] 可以查看容器内部的标准输出:

suchuanqi@UbuntuBase:~$ docker logs -f 容器id(或容器name)

 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

192.168.75.1 - - [03/Nov/2017 06:14:05] "GET / HTTP/1.1" 200 -

192.168.75.1 - - [03/Nov/2017 06:14:05] "GET /favicon.ico HTTP/1.1" 404 -

192.168.75.1 - - [03/Nov/2017 06:16:57] "GET / HTTP/1.1" 200 -

192.168.75.1 - - [03/Nov/2017 06:16:57] "GET /favicon.ico HTTP/1.1" 404 -

参数说明:

  • -f:让 dokcer logs 像使用 tail -f 一样来输出容器内部的标准输出

从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。

查看 WEB 应用容器的进程

我们还可以使用 docker top 来查看容器内部运行的进程

suchuanqi@UbuntuBase:~$ docker top 容器id[名字] 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                71917               71897               0                   14:13      

检查 WEB 应用程序

使用 docker inspect 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息:(要有一个运行状态下的容器)

suchuanqi@UbuntuBase:~$ docker inspect 容器id(或容器name)
[
    {
        "Id": "9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb",
        "Created": "2017-11-03T06:13:13.053498761Z",
        "Path": "python",
        "Args": [
            "app.py"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 71917,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2017-11-03T06:13:13.374235386Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",
        "ResolvConfPath": "/var/lib/docker/containers/9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb/hostname",
        "HostsPath": "/var/lib/docker/containers/9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb/hosts",
        "LogPath": "/var/lib/docker/containers/9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb/9490b017fdf6b8c6415d5d01b925413c6ed2dd782566d251ad2bdad90263c3cb-json.log",
        "Name": "/amazing_archimedes",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "5000/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "5000"
                    }
                ]
            },
...

docker exec -it 容器id(或容器name)  /bin/bash   我们可以使用它进行容器的交互操作进入容器的内部进行执行,显示的内容如下所示:

进入到内部可以是ll显示当前文件及文件夹

然后我们可以操作它的内部文件 比如我们操作它的显示文件 app.py

我们使用vi  app.py,进入到改文件的内部,如下所示:

这是一段用python写的代码,我们仅进行查看即可

我们在内部容器中使用cd 让他会到根目录

重启 WEB 应用容器

停止WEB应用容器

docker stop 容器id(或容器name)

已经停止的容器,我们可以使用命令 docker start 来启动

docker start容器id(或容器name)

重启WEB应用容器

docker restart容器id(或容器name)

查询全部容器

docker ps -a

查询最后一次创建的容器

docker ps -l

移除 WEB 应用容器

我们可以使用 docker rm 命令来删除不需要的容器:

suchuanqi@UbuntuBase:~$ docker rm 9490b017fdf6 5198a90e2406 d89a78578846 435db4b99464 76aafa3bb20d 0977407542d1
9490b017fdf6
5198a90e2406
d89a78578846
435db4b99464
76aafa3bb20d
0977407542d1

注意:删除容器时,容器必须是停止状态,否则会报错,因为它现在在后台在运行

6. Docker 镜像管理:

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

可以进入该网站www.docker.com进行查看

镜像列表

我们可以使用 docker images 来查看本地主机上的镜像:

suchuanqi@UbuntuBase:~$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

ubuntu              15.10               9b9cb95443b5        15 months ago       137MB

training/webapp     latest              6fae60ef3446        2 years ago         349MB

选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:

docker run -it ubuntu:15.10 /bin/bash

如果要使用版本为14.04的ubuntu系统镜像来运行容器时,命令如下:

docker run -it ubuntu:14.04 /bin/bash

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。

获取镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。

suchuanqi@UbuntuBase:~$ docker pull tomcat        这里就是从镜像docker的镜像仓库来获得相应的镜像的命令
14.04: Pulling from library/ubuntu
bae382666908: Pull complete 
29ede3c02ff2: Pull complete 
da4e69f33106: Pull complete 
8d43e5f5d27f: Pull complete 
b0de1abb17d6: Pull complete 
Digest: sha256:6e3e3f3c5c36a91ba17ea002f63e5607ed6a8c8e5fbbddb31ad3e15638b51ebc
Status: Downloaded newer image for ubuntu:14.04

下载完成后,我们可以直接使用这个镜像来运行容器。

下载tomcat的同时我们要告诉学生其实容器与容器之间是存在依赖关系的,比如tomcat依赖与jdk, jdk依赖于Linux

我现在仓库的镜像有:

REPOSITORY:表示镜像名称, TAG:表示版本,latest表示最后一个版本号   IMAGE ID:表示当前镜像的唯一标识

CREATED:表示最后更新的时间        SIZE:表示镜像的大小

查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/

我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

suchuanqi@UbuntuBase:~$ docker search tomcat
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                 Ubuntu is a Debian-based Linux operating s...   6759                [OK]                
dorowu/ubuntu-desktop-lxde-vnc                         Ubuntu with openssh-server and NoVNC            141                                     [OK]
rastasheep/ubuntu-sshd                                 Dockerized SSH service, built on top of of...   114                                     [OK]
ansible/ubuntu14.04-ansible                            Ubuntu 14.04 LTS with ansible                   88                                      [OK]
ubuntu-upstart                                         Upstart is an event-based replacement for ...   80                  [OK]                
neurodebian                                            NeuroDebian provides neuroscience research...   40                  [OK]                
ubuntu-debootstrap                                     debootstrap --variant=minbase --components...   32                  [OK]                
nuagebec/ubuntu                                        Simple always updated Ubuntu docker images...   22                                      [OK]
tutum/ubuntu                                           Simple Ubuntu docker images with SSH access     19                                      
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          17                                      [OK]
ppc64le/ubuntu                                         Ubuntu is a Debian-based Linux operating s...   11                                      
aarch64/ubuntu                                         Ubuntu is a Debian-based Linux operating s...   9                                       
i386/ubuntu                                            Ubuntu is a Debian-based Linux operating s...   8                                       
darksheer/ubuntu                                       Base Ubuntu Image -- Updated hourly             3                                       [OK]
codenvy/ubuntu_jdk8                                    Ubuntu, JDK8, Maven 3, git, curl, nmap, mc...   3                                       [OK]
1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4      ubuntu-16-nginx-php-5.6-wordpress-4             2                                       [OK]
1and1internet/ubuntu-16-apache-php-7.0                 ubuntu-16-apache-php-7.0                        1                                       [OK]
smartentry/ubuntu                                      ubuntu with smartentry                          0                                       [OK]
1and1internet/ubuntu-16-healthcheck                    ubuntu-16-healthcheck                           0                                       [OK]
pivotaldata/ubuntu-gpdb-dev                            Ubuntu images for GPDB development              0                                       
thatsamguy/ubuntu-build-image                          Docker webapp build images based on Ubuntu      0                                       
ossobv/ubuntu                                          Custom ubuntu image from scratch (based on...   0                                       
1and1internet/ubuntu-16-sshd                           ubuntu-16-sshd                                  0                                       [OK]
pivotaldata/ubuntu                                     A quick freshening-up of the base Ubuntu d...   0                                       
defensative/socat-ubuntu                                                                               0                                       [OK]

说明:

  • NAME:镜像仓库源的名称
  • DESCRIPTION:镜像的描述
  • OFFICIAL:是否docker官方发布

创建镜像

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改:

  • 从已经创建的容器中更新镜像,并且提交这个镜像
  • 使用 Dockerfile 指令来创建一个新的镜像

更新镜像(基于运行的容器来创建对象)

更新镜像之前,我们需要使用镜像来创建一个容器:

suchuanqi@UbuntuBase:~$ docker run -it ubuntu:15.10 /bin/bash      这里是进入容器内部进行操作

root@9a3dcafd7a83:/# apt-get update            使用这个命令来更新数据源

Ign http://archive.ubuntu.com wily InRelease            注意这里面不是用的是阿里云的数据源,我们使用的ubuntu的官方数据源

Ign http://archive.ubuntu.com wily-updates InRelease

Ign http://archive.ubuntu.com wily-security InRelease

Ign http://archive.ubuntu.com wily Release.gpg

Ign http://archive.ubuntu.com wily-updates Release.gpg

Ign http://archive.ubuntu.com wily-security Release.gpg

Ign http://archive.ubuntu.com wily Release

Ign http://archive.ubuntu.com wily-updates Release

Ign http://archive.ubuntu.com wily-security Release

最后你会发现你使用ubuntu的官方数据源的时候你不能下载或更新最新版本,所以我们要去修改数据源

但是你在内部容器中进入到 cd etc/apt/目录找到sources.list这个文件时使用vi sources.list进行对这个命令进行编辑时发现不能够使用这个命令,那就悲催了

那么我们可以这么做使用echo命令向sources.list进行覆盖写入,因为他可以覆盖文件内部的内容,如下所示:

echo deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse           > sources.list

echo deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse  >> sources.list

echo deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse   >> sources.list

echo deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse >> sources.list

使用apt-get update进行更新对ubuntu进行更新操作

然后使用命令lsb_release -a 进行对ubuntu版本的查看,你会发现不能查看ubuntu的版本需要对vim进行安装

然后我们对vim进行安装操作

使用命令apt-get install vim 进行安装,这个是有我们就可以用vim sources.list命名对这个文件进行修改了

上面的操作是对ubuntu和vim等进行了更新,但是一旦我退出该容器,那么所有的操作将会回归到以前版本的状态,做了无用之功

那么接下来的操作是我要修改这个容器让他变为一个镜像才可以,也就是把修改后的版本及其他操作彻底的保存下来,这就好比我在类里面增加了一个属性

那么接下来的操作是新开一个对话

然后我要把刚才更新的ubuntu和vim的那个内部容器的操作从新创建一个镜像即可,我们可以使用命令,如下所示

docker commit -m="has update" -a ="suchuanqi" 2635af4bcd3f suchuanqi/ubuntu:v2即可创建一个新的容器并把之前所做的操作保留下来,如下所示:

上面黄色部分的容器的id为修改之前的容器的id号

然后使用docker images显示所有容器你就会看到刚才我么自己创建的容器

在运行的容器内使用 apt-get update 命令进行更新。

在完成操作之后,输入 exit 命令来退出这个容器。

此时ID为 9a3dcafd7a83 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。

suchuanqi@UbuntuBase:~$ docker commit -m="has update" -a="suchuanqi" 9a3dcafd7a83 suchuanqi/ubuntu:v2

sha256:2642b4944b285974e5f007f30bc33b651220ea9931982c3c53b61a8f8fd5011b

各个参数说明:

  • -m:提交的描述信息
  • -a:指定镜像作者
  • 9a3dcafd7a83:容器ID
  • suchuanqi/ubuntu:v2:指定要创建的目标镜像名

我们可以使用 docker images 命令来查看我们的新镜像 suchuanqi/ubuntu:v2:

suchuanqi@UbuntuBase:~$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

suchuanqi/ubuntu      v2                  2642b4944b28        2 minutes ago       137MB

ubuntu              14.04               dea1945146b9        7 weeks ago         188MB

ubuntu              15.10               9b9cb95443b5        15 months ago       137MB

training/webapp     latest              6fae60ef3446        2 years ago         349MB

使用我们的新镜像 suchuanqi/ubuntu 来启动一个容器:

suchuanqi@UbuntuBase:~$ docker run -it suchuanqi/ubuntu:v2 /bin/bash

root@060f7af5fbec:/#

Dockerfile(创建镜像)

我们要创建自己的镜像必须要先创建统一的文件夹,我们使用名 cd /usr/local 进入该文件夹中然后使用命令mkdir docker命令创建docker文件夹即意味着所有自定义的我文件都安装到usr/local这个文件夹下。

那么我们现在开始创建自己的镜像:   首先在docker这个文件里使用mkdir myubuntu创建一个文件夹,然后在这里面开始使用命令vi Dockerfile创建文件及编译文件,注意你的Dockerfile必须要使用这个文件名在创建这个文件,

那么这个时候开始进入文件进行编辑操作

FROM ubuntu:15.10

MAINTAINER suchuanqi99@sina.com

RUN /bin/bash -c 'echo "helloWorld"'

COPY text.txt /home     (这里需要外部有个text.txt文件)

WORKDIR /home

EXPOSE 80

EXPOSE 8080

CMD ["/bin/echo", "this is a echo test"]

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。

docker build 命令用于从Dockerfile构建映像。可以在 docker build 命令中使用 -f 标志指向文件系统中任何位置的Dockerfile。

docker build -f /path/to/a/Dockerfile

Dockerfile文件说明

说明不区分大小写,但必须遵循建议使用大写字母的约定。

Docker 以从上到下的顺序运行 Dockerfile 的指令。为了指定基本映像,第一条指令必须是 FROM

一个声明以字符开头则被视为注释。可以在Docker文件中使用RUNCMDFROMEXPOSEENV等指令。

在这里列出了一些常用的说明。

FROM

该指令用于设置后续指令的基本映像。有效的 Dockerfile 必须使用FROM作为其第一条指令。

FROM ubuntu

MAINTAINER

指定镜像的作者

MAINTAINER <name>

RUN

该指令用于执行当前映像的任何命令。 比如我想执行tomcat我们必须要为tomcat进行解压那么我们就可以使用 RUN -zxvf tomcat.tar.gz,表示我们要使用tomcat要执行解压命令

RUN /bin/bash -c 'echo "Hello World"'

CMD

这用于执行映像的应用程序。应该以下列形式总是使用CMD

CMD ["executable", "param1", "param2"]

这是使用CMD的首选方法。Dockerfile文件中只能有一个CMD。如果使用多个CMD,则只会执行最后一个CMD。

例:CMD [“/bin/echo”, “this is a echo test ”]

COPY---将sudo机中的文件复制到容器中

该指令用于将来自源的新文件或目录复制到目的地的容器的文件系统。

COPY abc/ /xyz

规则:

  • source路径必须在构建的上下文之内。无法使用COPY ../something /something,因为docker构建的第一步是将上下文目录(和子目录)发送到 docker 守护程序。
  • 如果source是目录,则会复制目录的全部内容,包括文件系统元数据。

WORKDIR---用来指定工作目录

WORKDIR用于为Dockerfile中的RUNCMDCOPY指令设置工作目录。如果工作目录不存在,它默认将会创建。

我们可以在Dockerfile文件中多次使用WORKDIR

备注:可以简单理解为 cd 命令,但是如果目录不存在它会自动创建。

构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

root@localhost:/usr/local/docker/myubuntu# docker build -t suchuanqi/myubuntu .
Sending build context to Docker daemon  3.072kB
Step 1/8 : FROM ubuntu:15.10
 ---> 9b9cb95443b5
Step 2/8 : MAINTAINER suchuanqi99@sina.com
 ---> Running in fa936b072333
Removing intermediate container fa936b072333
 ---> 916fc56e3d1c
Step 3/8 : RUN /bin/bash -c 'echo "helloWorld"'
 ---> Running in 958324b988f8
helloWorld
Removing intermediate container 958324b988f8
 ---> a8b51a2b0131
Step 4/8 : COPY text.txt /home
 ---> e7061c6a3d2a
Step 5/8 : WORKDIR /home
 ---> Running in 563e719cc3e8
Removing intermediate container 563e719cc3e8
 ---> bc123d948c54
Step 6/8 : EXPOSE 80
 ---> Running in 5dc8da7f8943
Removing intermediate container 5dc8da7f8943
 ---> bca43c71df89
Step 7/8 : EXPOSE 8080
 ---> Running in 56360de0c019
Removing intermediate container 56360de0c019
 ---> 70d24a500db4
Step 8/8 : CMD ["/bin/echo", "this is a echo test"]
 ---> Running in 0f54ce040ffc
Removing intermediate container 0f54ce040ffc
 ---> ff89b95d0de2
Successfully built ff89b95d0de2
Successfully tagged suchuanqi/myubuntu:latest
root@localhost:/usr/local/docker/myubuntu#  docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
suchuanqi/myubuntu   latest              ff89b95d0de2        9 seconds ago       137MB
suchuanqi/ubuntu     v2                  2deac3a7b242        23 hours ago        211MB
tomcat                 latest              05af71dd9251        2 days ago          463MB
ubuntu                 15.10               9b9cb95443b5        2 years ago         137MB
training/webapp        latest              6fae60ef3446        3 years ago         349MB
 

参数说明:

  • -t:指定要创建的目标镜像名
  • .:Dockerfile 文件所在目录,可以指定 Dockerfile 的绝对路径

使用 docker images 查看创建的镜像已经在列表中存在,镜像ID为 6cdd9c6b840d

root@localhost:/usr/local/docker/myubuntu#  docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
suchuanqi/myubuntu   latest              ff89b95d0de2        9 seconds ago       137MB
suchuanqi/ubuntu     v2                  2deac3a7b242        23 hours ago        211MB
tomcat                 latest              05af71dd9251        2 days ago          463MB
ubuntu                 15.10               9b9cb95443b5        2 years ago         137MB
training/webapp        latest              6fae60ef3446        3 years ago         349MB

设置镜像标签(复制)

我们可以使用 docker tag 命令,为镜像添加一个新的标签。

docker tag 6cdd9c6b840d suchuanqi/ubuntu:dev

docker tag 镜像ID,这里是 6cdd9c6b840d ,用户名称、镜像源名(repository name)和新的标签名(tag)。

使用 docker images 命令可以看到,ID为 6cdd9c6b840d 的镜像多一个标签。

root@UbuntuBase:/usr/local/docker/ubuntu# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
suchuanqi/ubuntu      dev                 6cdd9c6b840d        15 minutes ago      122MB       这个两个id一致也就是所dev依赖了latest这个镜像而创建的
suchuanqi /ubuntu      latest              6cdd9c6b840d        15 minutes ago      122MB
suchuanqi /ubuntu      v2                  2642b4944b28        About an hour ago   137MB
ubuntu              latest              747cb2d60bbe        3 weeks ago         122MB
ubuntu              14.04               dea1945146b9        7 weeks ago         188MB
ubuntu              15.10               9b9cb95443b5        15 months ago       137MB
training/webapp     latest              6fae60ef3446        2 years ago         349MB

7.Docker实例教程

Docker 安装 Tomcat

查找 Docker Hub 上的 Tomcat 镜像

root@UbuntuBase:/usr/local/docker/tomcat# docker search tomcat
NAME                           DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
tomcat                         Apache Tomcat is an open source implementa...   1550                [OK]                
dordoka/tomcat                 Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 ba...   43                                      [OK]
tomee                          Apache TomEE is an all-Apache Java EE cert...   42                  [OK]                
davidcaste/alpine-tomcat       Apache Tomcat 7/8 using Oracle Java 7/8 wi...   21                                      [OK]
consol/tomcat-7.0              Tomcat 7.0.57, 8080, "admin/admin"              16                                      [OK]
cloudesire/tomcat              Tomcat server, 6/7/8                            15                                      [OK]
maluuba/tomcat7                                                                9                                       [OK]
tutum/tomcat                   Base docker image to run a Tomcat applicat...   8                                       
jeanblanchard/tomcat           Minimal Docker image with Apache Tomcat         8                                       
andreptb/tomcat                Debian Jessie based image with Apache Tomc...   7                                       [OK]
bitnami/tomcat                 Bitnami Tomcat Docker Image                     5                                       [OK]
aallam/tomcat-mysql            Debian, Oracle JDK, Tomcat & MySQL              4                                       [OK]
antoineco/tomcat-mod_cluster   Apache Tomcat with JBoss mod_cluster            1                                       [OK]
maluuba/tomcat7-java8          Tomcat7 with java8.                             1                                       
amd64/tomcat                   Apache Tomcat is an open source implementa...   1                                       
primetoninc/tomcat             Apache tomcat 8.5, 8.0, 7.0                     1                                       [OK]
trollin/tomcat                                                                 0                                       
fabric8/tomcat-8               Fabric8 Tomcat 8 Image                          0                                       [OK]
awscory/tomcat                 tomcat                                          0                                       
oobsri/tomcat8                 Testing CI Jobs with different names.           0                                       
hegand/tomcat                  docker-tomcat                                   0                                       [OK]
s390x/tomcat                   Apache Tomcat is an open source implementa...   0                                       
ppc64le/tomcat                 Apache Tomcat is an open source implementa...   0                                       
99taxis/tomcat7                Tomcat7                                         0                                       [OK]
qminderapp/tomcat7             Tomcat 7                                        0

这里我们拉取官方的镜像

docker pull tomcat              ---当然我们之前已经拉去过了镜像

等待下载完成后,我们就可以在本地镜像列表里查到 REPOSITORY 为 tomcat 的镜像。

运行容器:

docker run --name tomcat -p 8080:8080 -d tomcat
--name tomcat运行容器的名称自定义
-p 8080:8080  第一个8080表示sudo机的端口号 第二个8080表示映射到容器的端口号,
-d tomcat    -d表示后台运行容器tomcat
 
然后使用docker  ps 查看运行的容器
 
 
然后我么做个小实验,首先使用命令docker run -it tomcat /bin/bash(非运行的容器,用这个等于新开一个容器 并不能映射到端口号)  或者使用命令docker exec -it tomcat /bin/bash(已经运行的容器) 都可以进入到容器的内部进行操作
使用ll进行操作是你会发现没有改命令显示文件目录,那么我们使用ls -l命令显示tomcat下的所有文件及文件夹
然后使用名cd webapps/进入该文件夹后创建一个文件夹mkdir test,然后在里面创建一个html文件使用命令echo "hello tomcat" > index.html创建一个html,那么我们可以通过外部浏览器进行访问如:http://192.168.211.130:8080/test/index.html
 
 
  • -p 8080:8080:将容器的8080端口映射到主机的8080端口
  • -v $PWD/test:/usr/local/tomcat/webapps/test:将主机中当前目录下的test挂载到容器的/test

Docker 安装 MySQL

查找 Docker Hub 上的 MySQL 镜像

root@UbuntuBase:/usr/local/docker/mysql# docker search mysql
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                                                  MySQL is a widely used, open-source relati...   5177                [OK]                
mariadb                                                MariaDB is a community-developed fork of M...   1602                [OK]                
mysql/mysql-server                                     Optimized MySQL Server Docker images. Crea...   361                                     [OK]
percona                                                Percona Server is a fork of the MySQL rela...   298                 [OK]                
hypriot/rpi-mysql                                      RPi-compatible Docker Image with Mysql          72                                      
zabbix/zabbix-server-mysql                             Zabbix Server with MySQL database support       62                                      [OK]
centurylink/mysql                                      Image containing mysql. Optimized to be li...   53                                      [OK]
sameersbn/mysql                                                                                        48                                      [OK]
zabbix/zabbix-web-nginx-mysql                          Zabbix frontend based on Nginx web-server ...   36                                      [OK]
tutum/mysql                                            Base docker image to run a MySQL database ...   27                                      
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          17                                      [OK]
schickling/mysql-backup-s3                             Backup MySQL to S3 (supports periodic back...   16                                      [OK]
centos/mysql-57-centos7                                MySQL 5.7 SQL database server                   15                                      
linuxserver/mysql                                      A Mysql container, brought to you by Linux...   12                                      
centos/mysql-56-centos7                                MySQL 5.6 SQL database server                   6                                       
openshift/mysql-55-centos7                             DEPRECATED: A Centos7 based MySQL v5.5 ima...   6                                       
frodenas/mysql                                         A Docker Image for MySQL                        3                                       [OK]
dsteinkopf/backup-all-mysql                            backup all DBs in a mysql server                3                                       [OK]
circleci/mysql                                         MySQL is a widely used, open-source relati...   2                                       
cloudposse/mysql                                       Improved `mysql` service with support for ...   0                                       [OK]
astronomerio/mysql-sink                                MySQL sink                                      0                                       [OK]
ansibleplaybookbundle/rhscl-mysql-apb                  An APB which deploys RHSCL MySQL                0                                       [OK]
cloudfoundry/cf-mysql-ci                               Image used in CI of cf-mysql-release            0                                       
astronomerio/mysql-source                              MySQL source                                    0                                       [OK]
jenkler/mysql                                          Docker Mysql package                            0

这里我们拉取官方的镜像

docker pull mysql

等待下载完成后,我们就可以在本地镜像列表里查到 REPOSITORY 为 mysql 的镜像

运行容器:   

docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
48f81c14530203c98735e85eccd065228d5b6468c68e88923bfa19c3f46ccfe5
root@localhost:/usr/local/docker# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
48f81c145302        mysql:5.7         "docker-entrypoint.s…"   13 seconds ago      Up 11 seconds       0.0.0.0:3306->3306/tcp   mysql
81c42ab338ef        tomcat              "catalina.sh run"        2 hours ago         Up 2 hours          0.0.0.0:8080->8080/tcp   tomcat
root@localhost:/usr/local/docker#
 
 
这里是一条命令 \ 表示可以换行,使用该命令后即

命令参数:

  • -p 3306:3306:将容器的3306端口映射到主机的3306端口
  • -v /usr/local/docker/mysql/conf:/etc/mysql:将主机当前目录下的 conf 挂载到容器的 /etc/mysql
  • -v /usr/local/docker/mysql/logs:/var/log/mysql:将主机当前目录下的 logs 目录挂载到容器的 /var/log/mysql
  • -v /usr/local/docker/mysql/data:/var/lib/mysql:将主机当前目录下的 data 目录挂载到容器的 /var/lib/mysql
  • -e MYSQL\_ROOT\_PASSWORD=123456:初始化root用户的密码
  • -d mysql:5.6  表示后台运行mysql
  • 在我这里最新版的mysql不能启动起来在这里我用命令docker pull mysql:5.7拉取了mysql的5.7的版本进行操作

查看容器启动情况

root@UbuntuBase:/usr/local/docker/mysql# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
bc49c9de4cdf        mysql:latest        "docker-entrypoint..."   4 minutes ago       Up 4 minutes        0.0.0.0:3306->3306/tcp   mysql

使用客户端工具sqlyod连接 MySQL

如果要重新设置密码需要删除到宿主机路径下/usr/local/docker/mysql/里面的3个文件(conf, data logs)把他删除从新设置密码就可以了

docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=abcdef \
-d mysql:5.7

Docker 部署应用

  • 上传应用到服务器
  • 创建 Dockerfile

首先在 /usr/local/docker 的文件夹下创建一个文件tomcat,然后根据项目名创建一个news文件夹,然后把外部的项目以war包结尾的文件拉进就可以了

然后创建文件vi Dockerfile,按照下面的语法编辑Dockerfile文件就可以了

FROM tomcat

MAINTAINER suchuanqi

ADD news.war /usr/local/tomcat/webapps/news.war

  • 构建镜像

docker build -t suchuanqi/tomcat .

  • 启动容器

docker run --name tomcat -p 8080:8080 suchuanqi/tomcat

Docker 数据卷

数据卷简介

数据卷是一个可以供一个或多个容器使用的特殊目录。

可以达到以下目的:

  1. 绕过“拷贝写”系统,以达到本地磁盘 IO 的性能,(比如运行一个容器,在容器中对数据卷修改内容,会直接改变宿主机上的数据卷中的内容,所以是本地磁盘IO的性能,而不是先在容器中写一份,最后还要将容器中的修改的内容拷贝出来进行同步。)
  2. 绕过“拷贝写”系统,有些文件不需要在 docker commit 打包进镜像文件。
  3. 在多个容器间共享目录。
  4. 在宿主和容器间共享目录。
  5. 在宿主和容器间共享一个文件。
我们可以创建两个tomcat容器进行测试,看看他们的页面或数据是否共享(肯定不会共享)在没有创建数据卷的时候数据就会丢失

创建数据卷(要把相关的tomcat的所有容器停掉和删除掉)

为什么要创建数据卷:是因为当我们停止容器,或重启容器,或关机后所有的东西将被销毁,因为容器其实就是对象一样的东西当释放资源后所有的东西都会被回收
在cd usr/local/docker目录下创建tomcat文件夹,在tomcat文件夹创建share文件夹,在share文件夹创建webapps文件夹, 此时我的想法是我启动的tomcat容器与我刚刚创建在宿主机上的webapps进行共享,这样我们的宿主机就能访问到同一个webapps了,就能请求相同的内容了
要创建数据卷首先拿到要进入到tomcat容器内部拿到项目部署的目录/usr/local/tomcat/webapps/
然后我们进入到我们刚刚创建的文件/usr/local/docker/tomcat/share中进行创建数据卷的操作注意该share文件夹中也包含了一个文件webapps,然后我们使用命令
具体的命令为:docker run --name tomcat1 -d -p 8080:8080 -v /usr/local/docker/tomcat/share/webapps/:/usr/local/tomcat/webapps/ tomcat
那么注意现在我们访问同步后的share文件夹下的webapps的时候你会发现空空如也,因为我们在同步容器的的时候那个tomcat的webapps里面就什么也没有,所以我们通过网络访问时404,那么现在我们可以对share下的webapps进行设置,比如我们进入到share/webapps目录下创建个文件夹ROOT,使用vi index.html创建一个html的页面,那么我们就可以通过8080端口访问到当前的index.html文件里面的内容了,   同时他也会在内部容器tomcat中的webapps文件夹下为我自动的创建一个ROOT目录并自动的创建一个文件index.html实现了同步的操作;
那么基于以上操作我们可以再来创建一个数据卷:比如(但是要注意一定时在webapps文件夹下来创建)
   
docker run --name tomcat2 -d -p 8081:8080 -v $PWD:/usr/local/tomcat/webapps/ tomcat
    $PWD表示: /usr/local/docker/tomcat/share/webapps/当前这个目录
    这样就完成了数据卷的共享操作,只要创建了数据卷,那么那么我们就可以通过数据卷来创建多个tomcat容器了
那么综上所述,我们创建数据卷后数据将会保留到宿主机中不会随着容器的停止或销毁而销毁,如果我们再去通过数据卷来创建其他容器的时候也依然会共享数据
 
 

备份数据卷

这其实是利用 tar 命令来执行的。

备份的原理:使用 tar -zcvf 对数据卷打包压缩

创建一个 MySQL 容器:

docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

进入 /usr/local/docker/mysql 目录(这里是数据卷的目录),使用 

tar -zcvf 201810212224backup.tar.gz  . 

进行对mysql里面的内容记性打包操作 注意这里面"."表示打包到当前目录

恢复数据卷

解压缩备份数据压缩包

tar -zxvf backup.tar.gz

重新启动一个新的容器并将数据卷指向需要还原的数据卷目录

docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

原文地址:https://www.cnblogs.com/chuanqi1995/p/11393341.html