1 基本认识
1.0 what is docker
Docker 是一个 开放源代码 软件项目,让应用程序部署在 软件货柜 下的工作可以自动化进行,借此在 Linux 操作系统上,提供一个额外的软件 抽象层 ,以及 操作系统层虚拟化 的自动管理机制 [1] 。
Docker利用 Linux核心 中的资源分离机制,例如 cgroups ,以及Linux核心 名字空间 (英语: Linux namespaces )(namespaces),来创建独立的 容器 (containers)。这可以在单一Linux实体下运作,避免启动一个 虚拟机 造成的额外负担 [2] 。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、 网络 、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括 CPU 、 存储器 、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由 libvirt 的 LXC 与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,
依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。” [3] 。 -------来自于维基百科
1.1 docker安装
centos7为例
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
1.2 why use docker
传统虚拟化的缺点:
- 启动速度慢
- 比较消耗资源(操作系统本身需要占用很多资源)
- 兼容性比较差(不同的虚拟化平台,虚拟机不便迁移)
docker虚拟化的优势
- 更高效利用系统资源
- 更快速的启动时间
- 一致性的运行环境
- 持续交付和部署
- 更轻松的迁移
- 更轻松的维护和扩展
1.3 传统虚拟化与docker对比
1.4 常见术语
镜像(Image)
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资
源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境
变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
是一个特殊的文件系统,
容器(Container)
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中
的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被
创建、启动、停止、删除、暂停等。
每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,
任何保存于容器存储层的信息都会随容器删除而丢失。
镜像以及容器的关系,可以用java面向对象的思想来理解,镜像就是一个类,容器就是这个类new出来的。
仓库(Repository)
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服
务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务
供用户管理私有镜像。
数据卷(volume)
Docker的镜像是由一系列的只读层组合而来,当启动一个容器的时候,Docker加载镜像的所有只读层,并在最上层加入一个读写层。这个设计使得Docker可以提高镜像构建、存储和分发的效率,节省了时间和存储空间,然而也存在如下问题。
(1)容器中的文件在宿主机上存在形式复杂,不能在宿主机上很方便的对容器中的文件进行访问
(2)多个容器之间的数据无法共享
(3)当删除容器时,容器产生的数据将丢失
Docker中的数据可以存储在类似于虚拟机磁盘的介质中。在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。
简而言之:不用数据卷,数据无法持久化。所有的数据都在最上层的读写层,容器删除后这个读写层自己销毁了,数据也就丢了。
1.5 容器,仓库,镜像运行关系图
2 镜像基本操作
2.1 镜像搜索
docker search # 在docker index中搜索image
--automated=false 仅显示自动创建的镜像
--no-trunc=false 输出信息不截断显示
-s 0 指定仅显示评价为指定星级的镜像
2.2 镜像下载
docker pull # 从docker registry server 中下拉image
还可通过指定标签下载某镜像
docker pull [:TAG]
docker pull centos:7
2.3 镜像查看/删除
docker images: # 列出images
docker images -a # 列出所有的images(包含历史)
docker ps -a #列出本机所有容器
docker rmi : # 删除一个或多个image
2.4 镜像导入导出
存出本地镜像文件为.tar
docker save -o ubuntu_14.04.tar ubuntu:14.04
导入镜像到本地镜像库
docker load --input ubuntu_14.04.tar或者
docker load < ubuntu_14.04.tar
2.5 上传镜像
用户在dockerhub网站注册后,即可上传自制的镜像。
docker push NAME[:TAG]
3 容器基本操作
容器是镜像的一个运行实例,不同的是它带有额外的可写层。
可认为docker容器就是独立运行的一个或一组应用,以及它们所运行的必需环境。
3.1 运行容器
# 创建(使用镜像创建容器):
首先得查看镜像的REPOSITORY和TAG
docker run -i -t REPOSITORY:TAG
(等价于先执行docker create 再执行docker start 命令)
其中-t选项让docker分配一个伪终端并绑定到容器的标准输入上,
-i则让容器的标准输入保持打开。
若要在后台以守护态(daemonized)形式运行,可加参数-d
在执行 docker run来创建并启动容器 时,后台运行的过程包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
- 从宿主机配置的网桥接口中桥接一个虚拟接口到容器
- 从地址池配置一个ip地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
docker start/stop/restart #:开启/停止/重启container
操作容器可以通过容器名称,容器ID进行,
可以通过docker ps 查看对应的名称或是ID
3.2 进入容器
docker attach [container_id] #连接一个正在运行的container实例
(即实例须为start状态,可以多个 窗口同时attach 一个container实例),
但当某个窗口因命令阻塞时,其它窗口也无法执行了。
exec可直接在容器内运行的命令。
docker exec -ti [container_id] /bin/bash
如:
[root@uirb-test ~]# docker exec -it trs-uirb bash
3.3 删除容器
docker rm #:删除一个或多个container
docker rm `docker ps -a -q` #:删除所有的container
docker ps -a -q | xargs docker rm #:同上, 删除所有的container
docker -rm
-f 强制中止并运行的容器
-l 删除容器的连接,但保留容器
-v 删除容器挂载的数据卷
3.4 修改容器
docker commit [repo:tag] #
将一个container固化为一个新的image,后面的repo:tag可选。
3.5 容器导入导出
导出到一个文件,不管是否处于运行状态。
docker export CONTAINER > test.tar
导入为镜像:
cat test.tar | docker import - centos:latest
3.6 容器使用数据卷
docker run -d -it --rm --name test -v /xxx:/xxx centos:v1
#其中冒号前面是物理机的位置,冒号后面是容器的位置。
docker run -d -it --rm --name test -v /xxx:/xxx:rw centos:v1
数据卷默认可读可写挂载,不写就是rw。
docker run -d -it --rm --name test -v /xxx:/xxx:ro centos:v1
3.7 怎么访问容器
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或
-p 参数来指定端口映射。
当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开
放的网络端口。
docker run -d -P nginx
docker run -d -p 88:80 nginx #指定映射端口
3.8 使用docker搭建wordpress
具体很多环境变量信息可以看官方仓库,有详细说明
容器直接通信可以使用link
3.8.1 运行mysql容器
docker run -dit --restart=always --name db -v /data/k8s/db:/var/lib/mysql -e MYSQL_DATABASE=blog -e MYSQL_ROOT_PASSWORD=redhat mysql:5.7
3.8.2 运行wordpress容器
docker run -dit --restart=always --link db:db -e WORDPRESS_DB_HOST=db -e WORDPRESS_DB_NAME=blog -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=redhat --name=blog -v /data/k8s/blog:/var/www/html -p 88:80 wordpress
4 docker-compose
Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集
群中部署分布式应用。
服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器
实例。
项目(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-
compose.yml 文件中定义。
4.1 docker-compose安装
以centos7为例
yum -y install epel-release
yum install python-pip
pip install --upgrade pip
pip install docker-compose
docker-compose --version
4.2 docker-compose部署rabbitmq实战
创建rabbitmq启动文件的目录
mkdir -p /TRS/APP/rabbitmq
创建启动的compose文件
vim /TRS/APP/rabbitmq/docker-compose.yml
version : '2'
networks:
default:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.1.0.1/16
services:
mq:
container_name : mq
hostname: trsmq
image : rabbitmq:3-management
environment:
- RABBITMQ_DEFAULT_USER=admin #用户
- RABBITMQ_DEFAULT_PASS=trs@admin123 #用户的密码
- RABBITMQ_DEFAULT_VHOST=gov #创建的vhost名称
volumes :
- /TRS/APP/rabbitmq/rabbitmq-data:/var/lib/rabbitmq
- /etc/localtime:/etc/localtime:ro
ports :
- 5672:5672 #端口映射关系
- 15672:15672
启动cd /TRS/APP/rabbitmq && docker-compose up -d
启动命令docker-compose up -d (会根据compose文件写的关系依次启动)
关闭命令docker-compose down -v
此时已经可以访问rabbitmq
访问url:http://ip:15672
对应的参数已经通过配置文件环境变量设置完成,启动完成后可以直接使用rabbitmq。