docker深入浅出

docker深入浅出_第1张图片

1 Docker介绍

1.1 Docker产生背景

Docker 是云时代的产物,它的诞生是一种必然。
对于云计算\云服务的相关概念,本文不会去阐述。不过如果想了解 Docker, 那么必须对云服务的一些运营模式有所了解。

云服务的运营模式:

IaaS(基础设施即服务):经营的是基础设施,比如阿里云服务器(只安装操作系统)

PaaS(平台即服务):经营的是平台,比如 MySQL 开发平台(安装在 linux里面现成的平台)、redis 开发平台、nginx。

SaaS(软件即服务):经营的是软件,比如公司的 OA 系统(部署到远程服务器中的 OA 软件

Docker 就是伴随着 PaaS 产生的

1.2 docker是什么

Docker 就是一种虚拟化容器技术。

通过 Docker 这种虚拟化容器技术,我们可以对物理机的资源进行更加合理有效的利用,可以将一台物理机器虚拟化出很多个拥有完整操作系统,并且相互独立的“虚拟计算机”。

不过,对于虚拟化技术的理解,我们要更加深入一些!

那么,什么是虚拟化呢?

在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来, 打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应 用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。

在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件。

docker深入浅出_第2张图片

虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化、桌面虚拟化、服务虚拟化、虚拟机等等。

最常用的虚拟化技术有:全虚拟化和操作系统(OS)虚拟化。

*比如,*VMware workstation 就是全虚拟化的实现。

比如,我们要讲的 Docker*,就是基于操作系统虚拟化技术的一种实现。*

docker深入浅出_第3张图片

基于操作系统创建出一些相互独立的、功能虚拟化技术有多种实现方式,有基于硬件进行虚拟化的技术,而 Docker 只是针对操作系统进行虚拟化,对于硬件资源的使用率更低。

相对于VMware这种虚拟化技术,Docker拥有着显著的优势:

docker深入浅出_第4张图片

启动速度快,Docker 容器启动操作系统在秒级就可以完成,而 VMware 却是达到分钟级。

系统资源消耗低,一台 Linux 服务器可以运行成千上百个 Docker 容器,而VMware 大概只能同时运行 10 个左右。

更轻松的迁移和扩展,由于 Docker 容器比 VMware 占用更少的硬盘空间, 在需要搭建几套软件环境的情况下,对安装好的 Docker 容器进行迁移会更快捷,更方便。而且 Docker 容器几乎可以在任意的平台上运行,包括虚拟机、物理机、公有云,私有云,个人电脑等,这种兼容性,可以让用户将一个应用程序从一个平台直接迁移到另一个平台。

1.3 Docker能做什么

Docker 是一门神奇的技术!

(1)上手快

用户只需要几分钟,就可以把自己的程序“Docker化”。Docker 依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改”的境界。

随后,就可以创建容器来运行应用程序了。大多数 Docker 容器只需要不到 1 秒中即可启动。由于去除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。

(2)项目职责的逻辑分类

使用 Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正常的,上线后出了问题就归结为肯定是运维的问题)”

(3)快速高效的开发生命周期

Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker 就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件件的取。)

(4)鼓励使用面向服务的架构(自动化部署)

Docker 还鼓励面向服务的体系结构和微服务架构。Docker 推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下, 应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程序)

当然,Docker的强大远远不至于此,而作为软件开发人员的我们,更关注的是如何利用它来搭建一套统一的软件开发环境

接下来,我们将会一步一步的揭开 Docker 的神秘面纱!

1.4 Docker核心概念

docker 包含四个基本概念:

镜像(Image)

容器(Container)

仓库注册中心(Registry)

仓库(Repository)

理解了这四个概念,就理解了 docker 的整个生命周期了!

docker深入浅出_第5张图片

1.4.1 镜像

Docker 镜像(Image)就是一个只读的模板。

Docker 镜像可以用来创建 Docker 容器。

Docker 镜像和 Docker 容器的关系,类似于 java class 类与对象之间的关系。

Docker 提供了一个很简单的机制来创建镜像或者更新已有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

1.4.2 容器

Docker 利用容器(Container)来运行应用。

容器是镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看成是一个简易版的 Linux 环境(包括 ROOT 用户权限、进程空间、用户空间、网络等)和运行在其中的应用程序。

1.4.3 Registry

Registry 是集中存放镜像文件的场所。
Repository 是对于其中的镜像进行分类管理。
一个 Registry 中会有多个 Repository
Registry 分为公有(public)和私有(private)两种形式。
最大的公有 Registry 是Docker Hub,存放了数量庞大的镜像供用户下载使用。
国内的公开 Registry 包括 USTC、网易云、DaoCloud、AliCloud 等,可以供大陆用户更稳当快捷的访问。
用户可以在本地创建一个私有 Registry。
用户创建了自己的镜像之后就可以使用 push 命令将它上传的公有 Registry 或者私有 Registry 中,这样下次在另一台机器上使用这个镜像的时候,只需要从Registry 上pull 下来运行就可以了。

1.4.4 Repository

Repository 仓库可看成一个代码控制中心,用来保存镜像。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
一个 Repository *中会有多个不同tagImage
比如名称为 centos 的 Repository 仓库下,有 tag 为 6 或者 7 的 Image 镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

2Docker安装

官方默认的操作系统是安装到 Ubuntu

官方网站上有各种环境下的安装指南,比如:CentOS、Ubuntu 和 Debian 系列的安装。

而我们现在主要讲解的是基于 CentOS 7.x 上面的安装。

一切完毕之后,只需要执行以下命令即可完成 Docker 的安装:

安装之前可以先卸载

yum -y remove docker

安装:

yum install -y docker

启动:

systemctl start docker #systemctl start docker.service

img
img
More Actionsdocker深入浅出_第6张图片

3Docker镜像

3.1 列出镜像

docker images

img
Repository:镜像所在仓库名称Tag:镜像版本*

Image ID:镜像* ID

Created:镜像创建时间*

Size:镜像大小*

3.2搜索镜像

如果你需要从网络中查找需要的镜像,可以通过以下命令搜索
img
docker深入浅出_第7张图片

NAME:仓库名称

DESCRIPTION:镜像描述

STARS:用户评价,反应一个镜像的受欢迎程度

OFFICIAL:是否官方

AUTOMATED:自动构建,表示该镜像由 Docker Hub 自动构建流程创建的

3.3 拉取镜像

我们可以使用命令从一些公用仓库中拉取镜像到本地,下面就列举一些常用的公用仓库拉取镜像的方式!

3.3.1 从docker hub拉取

Docker Hub 的网址:https://hub.docker.com/

需求:从*Docker Hub仓库下载一个 CentOS 7 版本的操作系统镜像。

命令如下:

docker pull centos:7

Docker Hub 是 docker 默认的公用 Registry,不过缺点是国内下载会比较慢。
img

3.3.2从ustc 拉取(建议使用)

在宿主机器编辑文件(centos7 不支持 vim 命令,但是支持 vi 命令):

vi /etc/docker/daemon.json

请在该配置文件中加入(没有该文件的话,请先建一个):

img

最后,需要重启 docker 服务

systemctl restart docker

之后再使用 pull 命令拉取镜像,这时候是从 ustc 获取镜像,而且速度杠杠的。

docker pull centos:7

img

3.4 删除镜像

删除指定镜像

docker rmi repository:tag docker rmi imageID

删除所有镜像

docker rmi $(docker images -q)

img

注意

***删除时,如果镜像的image id一致,则需要按照一定顺序进行删除,因为镜像之间有关联

3.5 导入导出镜像(镜像迁移)

导出镜像:

docker save repository:tag/imageId > /root/xx.tar.gz 

docker save -o mynginx.tar mynginx

-o 输出到的文件

执行后,运行 ls 命令即可看到打成的 tar 包

导入镜像:

docker load < /root/xx.tar.gz

docker load -i mynginx.tar

-i 输入的文件

执行后再次查看镜像,可以看到镜像已经恢复

4.docker容器

4.1 创建并运行容器

创建容器命令:docker run

创建容器常用的参数说明:

-i:表示运行容器

-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

–name :为创建的容器命名。

-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

-d:在 run 后面加上-d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。

-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p

做多个端口映射

以交互方式运行容器:

docker run -i -t --name 容器名称 repository:tag /bin/bash 

docker run -it --name 容器名称 imageID /bin/bash

以守护进程方式运行容器:

docker run -di --name 容器名称 repository:tag 
docker run -di --name 容器名称 imageID

注意:通过 run 创建并进入容器之后,如果使用 exit 命令退出容器,则容器停止。再次进入该容器,先使用 start 启动容器,再使用 exec/attach 命令进入容器。

4.2 启动容器

docker start 容器名称或者容器 ID

4.3 进入容器**

进入正在运行的容器的命令如下:

docker exec -it 容器名称或者容器ID /bin/bash

docker attach 容器名称或者容器ID
 

两者之间的区别:

attach 进入容器之后,如果使用 exit 退出容器,则容器停止。

exec 进入容器之后,使用 exit 退出容器,容器依然处于运行状态。

4.4 查看容器

docker ps :查看正在运行的容器

docker ps* *-*a:查看历史运行过的容器

docker ps -l*:查看最近运行过的容器

4.5 停止容器

docker stop 容器名称或者容器 ID

4.6 删除容器

删除指定容器:

docker rm 容器名称或者容器 ID

删除所有容器:

docker rm ‘docker ps -a -q’

4.7 复制容器

docker cp 源文件 目标文件

比如:

docker cp /root/boot.war	my-centos:/usr/local/

说明:

/root/boot.war 是宿主机器的路径

my-centos 是容器的名称

*/usr/local/*是容器内的路径

注意:源文件可以是宿主机器也可以是容器中的文件,同样,目标文件可以是容器也可以是宿主机器的文件。

5 Docker应用

5.1 Mysql部署

5.1.1 拉取 MySQL 镜像

 docker pull mysql:5.6	

查看镜像

docker images

5.1.2 创建MySQL容器

 docker run -di --name ztq_mysql -*p* 33306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.6	

-p 代表端口映射,格式为 宿主机映射端口:容器运行端口

-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是 root 用户的登陆密码

5.1.3 进入MySQL容器登录 MySQL

进入 mysql 容器

 docker exec -it ztq_mysql /bin/bash

登录 mysql

mysql -u root -p	

5.1.4 远程登录MySQL

我们在我们本机的电脑上去连接虚拟机 Centos 中的 Docker 容器, 这里

docker深入浅出_第8张图片

192.168.247.130 是虚拟机操作系统的 IP

5.1.5 查看容器 IP地址

我们可以通过以下命令查看容器运行的各种数据

 docker inspect mysql	
docker深入浅出_第9张图片

运行效果如下:

我们可以看到我们的数据库服务器的 IP 是 172.17.0.1

5.2 tomcat部署

5.2.1 拉取tomcat镜像

docker pull tomcat:7-jre7

5.2.2 创建tomcat容器

创建容器 -p 表示地址映射

 docker run -di --name=my_tomcat -p 9000:8080 tomcat:7-jre7	

5.3 nginx部署

5.3.1 拉取 Nginx 镜像

docker pull nginx	

5.3.2 创建 Nginx 容器

 docker run -di --name=my_nginx -p 9080:80 nginx /bin/bash

/usr/sbin/nginx

5.3.3 测试 Nginx

docker深入浅出_第10张图片

浏览器地址栏输入: http://192.168.247.135

5.4 redis部署

5.4.1 拉取 redis 镜像

docker pull redis	

5.4.2 创建 redis 容器

docker run -di --name=my_redis -p 16379:6379 redis

5.4.3 客户端测试

在你的本地电脑命令提示符下,用 window 版本 redis 测试

redis-cli -h 192.168.247.135

5.5 搭建Tomcat服务并部署web应用

docker run -di --name my-tomcat -v /root/webapps: /usr/local/tomcat/webapps -p 8888:8080 imageID


docker run -ti --name my-tomcat -v /opt/webapps:/opt/tomcat/webapps -p 8888:8080 imageID /bin/bash

容器内的 tomcat 目录:/usr/local/tomcat/webapps

docker run -di --name my-tomcat -v /webapps:/usr/local/tomcat/webapps -p 8888:8080 --privileged=true tomcat:7-jre7

说明

–name:该参数的作用是给容器起一个名字,名字要唯一。

-v:该参数的作用是进行目录映射,具体指的是宿主机器和容器之间的目录映射。

/opt/webapps:宿主机器的目录*

/opt/tomcat/webapps*:容器中的目录*

-p:该参数的作用是进行端口映射,具体指的是宿主机器和容器之间的端口映射。

8888 端口是宿主机的端口

8080 端口是容器内的端口

img docker深入浅出_第11张图片 |
1、将 war 包上传到宿主机器的/opt/webapps/目录下。

2、tomat 会自动热部署,直接访问 web 应用的路径即可。

6 制作镜像

6.1 纯手工制作镜像

需求:制作一个 tomcat 镜像。

步骤:

1、下载基础镜像(centos7)

docker pull centos:7

2、安装 64 位 jdk(注意:jdk 要和 os 的位数一致)

vi /etc/profile

export JAVA_HOME=/opt/jdk

export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile

3、安装 tomcat

4、生成新的镜像

docker commit 容器名称或者容器 ID 新镜像名称

你可能感兴趣的:(架构,docker,容器,运维)