Linux(Ubuntu):搭建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文件中使用RUN
,CMD
,FROM
,EXPOSE
,ENV
等指令。
在这里列出了一些常用的说明。
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中的RUN
,CMD
和COPY
指令设置工作目录。如果工作目录不存在,它默认将会创建。
我们可以在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 数据卷
数据卷简介
数据卷是一个可以供一个或多个容器使用的特殊目录。
可以达到以下目的:
- 绕过“拷贝写”系统,以达到本地磁盘 IO 的性能,(比如运行一个容器,在容器中对数据卷修改内容,会直接改变宿主机上的数据卷中的内容,所以是本地磁盘IO的性能,而不是先在容器中写一份,最后还要将容器中的修改的内容拷贝出来进行同步。)
- 绕过“拷贝写”系统,有些文件不需要在
docker commit
打包进镜像文件。 - 在多个容器间共享目录。
- 在宿主和容器间共享目录。
- 在宿主和容器间共享一个文件。
我们可以创建两个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