1. 学习步骤
Docker
简介Docker
中的基本概念Docker
安装- 设置
Docker
Docker
的应用操作Docker
搭建PHP
开发环境
2. Docker
介绍
2.1. Docker
是什么
Docker
是一个开源的应用容器引擎,基于Go
语言开发实现,属于操作系统层面的虚拟化技术。Docker
可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何安装有Docker
的电脑(windows
和Linux
)上。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone
的app
),更重要的是容器性能开销极低。f703738da977391281957edbf0198618377ae2dd.jpg
2.2. Docker
能够做什么
Docker
可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于电脑资源要求过高而无法解决的问题。
虚拟机和Docker
虚拟化的不同之处:docker.jpg
2.3. 为什么使用 Docker
1、更快速的交付和部署:
对开发和运维员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
例如:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker
容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
节约安装各种开发环境的软件的时间。
解决开发环境和生产环境不一致的问题。
2、更轻松的迁移和扩展:Docker
容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
3、更高的资源利用率:Docker
对系统资源的利用率很高,一台主机上可以同时运行数千个Docker
容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker
只需要启动 10 个隔离的应用容器即可。
总结:Docker
背后的想法是创建软件程序可移植的轻量级容器,让其可以在任何安装了Docker
的机器上运行,并不用关心底层操作系统,就像野心勃勃的造船者们成功创建了集装箱而不需要考虑装在哪种船舶上一样。
只有一个共同目标:简化部署流程,提高生产力!
2.4. Docker
项目架构
Docker
使用C/S
架构,通过docker
客户端连接到Docker
服务器上从而管理Docker
服务器里面的镜像和容器,类似于git
的架构。docker.jpg
2.5. Docker
的基本概念
2.5.1. 镜像(
Image
)Docker
镜像(Image
)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了Apache
或用户需要的其它应用程序。镜像可以用来创建Docker
容器,一个镜像可以创建很多容器。Docker
提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
2.5.2. 容器(
Container
)Docker
利用容器(Container
)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的Linux
环境(包括root
用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
文件系统隔离技术使得Docker
成为了一个非常有潜力的虚拟化技术。在容器中可以对文件进行修改、删除、创建。
2.5.3. 仓库(
Registry
)
仓库(Repository
)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry
)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag
)。
仓库分为公开仓库(Public
)和私有仓库(Private
)两种形式。最大的公开仓库是Docker Hub
,存放了数量庞大的镜像供用户下载。国内的公开仓库包括 时速云 、网易云 等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用push
命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull
下来就可以了。Docker
仓库的概念跟Git
类似,注册服务器可以理解为GitHub
这样的托管服务。
3. Windows 10
下安装 Docker
3.1. 系统要求
一、64bit Windows 10 Build 10586 以上专业版或者企业版本,电脑支持虚拟化。
二、开启Hyper-V。
三、win7、win8 等需要利用 docker toolbox 来安装。
3.1.1. 查看系统版本和版本号
查看系统信息:
docker.jpg
查看版本号:
win+R 输入cmd
进入 dos 系统就可以看到docker.jpg
3.1.2. 电脑支持虚拟化
对于
windows10
系统来说,你可以在 任务管理器->性能 中查看到你的电脑是否开启了虚拟化docker.jpg
在BIOS下开启虚拟化虚拟化:
docker.jpg
3.1.3. 开启Hyper-V
windows设置 -> 应用 -> 应用和功能 -> 程序和功能 -> 启用和关闭Windows功能 -> 选中Hyber-V -> 重启
选中Hyper-V后确定重启电脑docker.jpg
注意:Hyper-V
是与 VMware
是冲突的,两者不能并存,只能择其一,如果你必须要使用虚拟机的话,比如 Vagrant
之类的工具,亦可在虚拟机内运行一个 Linux
系统,然后根据 Linux
系统 的安装流程处理,在虚拟机内运行 Docker
作为开发环境。
3.2. 安装Docker for Windows
3.2.1. 下载Docker for Windows
https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe
3.2.2. 安装
双击下载的
Docker for Windows Installer.exe
安装完毕即可。
3.2.3. 启动
启动之后会在电脑的右下角查看到
docker
的图标docker.jpg
4. 简单使用 Docker
4.1. 使用Docker
的前提
必须通过 dos命令 行来操作
Docker
。win+R 输入cmd
进入 dos 系统
4.2. Docker
命令初体验
docker info
#查看docker信息docker version
#查看docker版本docker run hello-world
#运行第一个容器
5. 设置Docker
5.1. 切换到Linux
容器下
docker for windows
默认使用linxu
容器。如有需要可切换到win
容器下。
右键点击docker
图标:docker.jpg
5.2. 镜像加速
鉴于国内网络问题,后续拉取
Docker
镜像十分缓慢,强烈建议安装Docker
之后配置 国内镜像加速。
5.2.1. 获取阿里云加速器地址
- 登录阿里云进入后台
docker.jpg
5.2.2. 配置docker
加速器
对于使用
Windows 10
的系统,在系统右下角托盘Docker
图标内右键菜单选择Settings
,打开配置窗口后左侧导航菜单选择Daemon
。在Registry mirrors
一栏中填写加速器地址你的专属加速器地址,之后点击Apply
保存后Docker
就会重启并应用配置的镜像地址了。docker.jpg
5.2.3. 检查加速器是否生效
手动检查加速器配置是否生效,在命令行执行
docker info
,如果从结果中看到了如下内容,说明配置成功。docker.jpg
6. Docker
镜像操作
6.1. 获取镜像(下载镜像到本地)
Docker Hub 上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像。
从
Docker
镜像仓库获取镜像的命令是docker pull
。其命令格式为:docker pull
[选项] [Docker Registry
地址 [:端口号] /] 镜像名 [:标签]
具体的选项可以通过 docker pull --help
Docker
镜像仓库地址:地址的格式一般是<域名/IP>[:端口号]。默认地址是 Docker Hub
,但我们已经将其修改为阿里云的加速器。
例如:
docker pull training/webapp
docker pull busybox
docker pull centos
备注:↓training/webapp
:python
的app
busybox
:是一个集成了三百多个最常用Linux
命令和工具的软件,简化的Linux
系统centos
:centos
系统容器
6.2. 列出本地镜像
要想列出已经下载下来的镜像,可以使用
docker image ls
命令。docker.jpg
列表包含了 镜像名、版本、镜像 ID、创建时间 以及所占用的空间。
6.3. 删除本地镜像
如果要删除本地的镜像,可以使用
docker image rm
命令,其格式为:docker image rm
[选项] <镜像1> [<镜像2> ...]
备注:
用 ID、镜像名、摘要删除镜像
其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要。
我们可以用镜像的完整 ID,也称为 长 ID,来删除镜像。使用脚本的时候可能会用长 ID,但是人工输入就太累了,所以更多的时候是用 短 ID 来删除镜像。docker image ls 默认列出的就已经是短 ID 了,一般取前3个字符以上,只要足够区分于别的镜像就可以了。
例如:docker image rm training/webapp
7. Docker
容器操作
7.1. 说在前面
/bin/bash
是linux
的命令行工具,类似于window
的cmd
进入dos
系统
7.2. 查看容器
docker ps
#查看启动的容器docker ps -a
#查看所有容器,包含没有启动的容器
7.3. 启动容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。
因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。
语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
COMMAND
: 容器启动后进入容器中要执行的命令.OPTIONS
(常用选项)-d
:让Docker
在后台运行而不是直接把执行命令的结果输出在当前宿主机下-t
:选项让Docker
分配一个伪终端(pseudo-tty
)并绑定到容器的标准输入上-i
:则让容器的标准输入保持打开。--name
:为容器命名-v
:创建数据卷-p
:绑定端口
7.3.1. 基于镜像新建一个容器并启动
docker run
例如:
docker run -p 8000:5000 –-name web training/webapp
实际操作举例:
启动
python
的app
:training/webapp
,并绑定本机端口8000映射到容器5000端口docker.jpg
访问本机
docker.jpg
7.3.2. 后台运行
更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现。
docker run -d CONTAINER [CONTAINER...]
例如:docker run –d –p 8000:5000 training/webapp
7.3.3. 交互运行
启动一个
bash
终端,允许用户进行交互。docker run -t -i CONTAINER [CONTAINER...] /bin/bash
-t
选项让Docker
分配一个伪终端(pseudo-tty
)并绑定到容器的 标准输入 上-i
则让容器的 标准输入 保持打开。
在交互模式下,用户可以通过所创建的终端来输入linux命令
例如:
docker run -i -t centos /bin/bash
创建centos容器并且进入centos容器中docker.jpg
7.4. 终止容器docker stop CONTAINER [CONTAINER...]
例:
docker.jpg
7.5. 启动一个停止的容器docker start CONTAINER [CONTAINER...]
例:
docker.jpg
7.6. 重启容器docker restart CONTAINER [CONTAINER...]
例:
docker.jpg
7.7. 删除容器docker rm CONTAINER [CONTAINER...]
注意:删除容器前 先关闭容器
例:
docker.jpg
7.8. 获取容器的输出信息docker logs [OPTIONS] CONTAINER
options:
--details 显示更多的信息
-f, --follow 跟踪实时日志
--since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳
--until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
例:
docker.jpg
查看指定时间后的日志,只显示最后100行:
docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
查看最近30分钟的日志:
docker logs --since 30m CONTAINER_ID
查看某时间之后的日志:
docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID
查看某时间段日志:
docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID
7.9. 进入容器docker exec –i –t CONTAINER /bin/bash
例:
docker.jpg
7.10. 主机和容器间拷贝文件
7.10.1. 容器拷贝到主机docker cp CONTAINER:/opt/webapp/app.py d:/www
备注:
/opt/webapp/app.py: 容器中的文件
d:/www: 主机文件夹
例:
docker.jpg
docker.jpg
7.10.2. 主机拷贝到容器docker cp f:/docker_test/文件 CONTAINER:/目标路径
例:
docker.jpg
docker.jpg
8. 数据卷
8.1. 什么是数据卷
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷 可以在容器之间共享和重用
- 对 数据卷 的修改会立马生效
- 对 数据卷 的更新,不会影响镜像
- 数据卷 默认会一直存在,即使容器被删除
理解:
1.数据卷 的使用,类似于 Linux
下对目录或文件进行 mount
,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
2.相当于将容器中的目录 和 本机目录映射起来,在本机目录中修改代码,增加文件等,会实时反映在容器目录中
8.2. 为什么要使用数据卷
方便将本地主机中的代码运行在docker
容器中
8.3. 挂载数据卷的前提
授权本地磁盘
docker.jpg
注意:点击Apply的时候,会验证本机账户,没有设置密码的话,去设置一个吧。
8.4. 挂载一个主机目录作为数据卷docker run -d -P 8000:5000 --name web -v f:/docker:/opt/webapp training/webapp
9. Docker应用-搭建PHP开发环境
9.1. 下载阿里云的lamp镜像
docker pull registry.cn-hangzhou.aliyuncs.com/itsource/centos-lamp:[镜像版本号]
镜像版本号就是TAG的值
9.2. 创建lamp容器并且运行docker run -itd -p 80:80 -p 3306:3306 --name lamp --privileged=true -v D:/www/default:/data/wwwroot/default ec258725b54b /usr/sbin/init
-i选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
-t 则让容器的标准输入保持打开。
-d 则让容器在后台运行。
--name lamp为容器起名为lamp
--privileged=true 让container内的root拥有真正的root权限。
-v 创建数据卷,将本地主机目录挂着到容器的指定目录中
10. 制作阿里云镜像
10.1. 制作本地镜像docker commit -a "itsource.com" -m "this is image" 容器ID 镜像名字:版本
OPTIONS说明:
· **-a :**提交的镜像作者;
· **-m :**提交时的说明文字;
· **-p :**在commit时,将容器暂停。
10.2. 上传阿里云
进入阿里云演示
10.3. 导出镜像到本地
docker save d2b9f203546d -o d:/www/centos-lamp-v2.tar
10.4. 加载本地镜像文件
docker load -i d:/www/centos-lamp-v2.tar
安装wget
yum install wget –y
备份yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
阿里云yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo [<u>http://mirrors.aliyun.com/repo/Centos-7.repo</u>](http://mirrors.aliyun.com/repo/Centos-7.repo)
解决bash: service: command not found
yum install initscripts.x86_64 –y
yum install net-tools
docker run -it -p 80:80 --name lamp2 --privileged=true itsource/centos-lamp /usr/sbin/init
docker run -itd -p 80:80 --name lamp3 --privileged=true -v /data/wwwroot/[www.baidu.com:/data/wwwroot/www.baidu.com](http://www.baidu.com:/data/wwwroot/www.baidu.com) itsource/centos-lamp /usr/sbin/init
docker rm $(docker ps -a -q)
本文同步分享在 博客“吟风者”(JianShu)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。