Docker实战(详细版本)

一、Docker 简介:

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

  • 1.1 容器与虚拟机比较:

在这里插入图片描述

  • 1.2 什么是Docker

在这里插入图片描述

  • 1.3 Docker特点:

(1)上手快。
用户只需要几分钟,就可以把自己的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改”的境界。
随后,就可以创建容器来运行应用程序了。大多数Docker容器只需要不到1秒中即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。

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

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

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

  • 1.4 Docker组件:

Docker客户端和服务器

Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
在这里插入图片描述

  • ##1.5 Docker镜像

镜像是构建Docker的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如:
添加一个文件;
执行一个命令;
打开一个窗口。
也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。

  • 1.6 Registry(注册中心)

Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。

扫描二维码关注公众号,回复: 6220335 查看本文章
  • 1.7 Docker容器

Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。
在这里插入图片描述
所以Docker容器就是:
一个镜像格式;
一些列标准操作;
一个执行环境。
Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件。
和集装箱一样,Docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去。
Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且尽量通用。
使用Docker,我们可以快速的构建一个应用程序服务器、一个消息总线、一套实用工具、一个持续集成(CI)测试环境或者任意一种应用程序、服务或工具。我们可以在本地构建一个完整的测试环境,也可以为生产或开发快速复制一套复杂的应用程序栈。

二、Docker安装与启动

  • 2.1安装环境说明

Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。
由于我们学习的环境都使用的是CentOS,因此这里我们将Docker安装到CentOS上。注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境而且Docker很多补丁不支持更新。

  • 2.2在VMware Workstation中安装CentOS7

资料已经准备了安装好的镜像,直接挂载即可。
挂载后,使用ip addr命令查看本地IP
在这里插入图片描述

  • 2.3安装Docker

使用yum命令在线安装

yum install docker

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2.4安装后查看Docker版本
  • 在这里插入图片描述
  • 2.5启动与停止Docker
    前提:docker是一个C/S架构,操作docker必须先启动docker 服务端
    systemctl命令是系统服务管理器指令,它是 service 和 chkconfig 两个命令组合。
  • 启动docker:
systemctl start docker

在这里插入图片描述

  • 停止docker:
systemctl stop docker

在这里插入图片描述

  • 重启docker:
systemctl restart docker

在这里插入图片描述

  • 查看docker状态:
systemctl status docker

在这里插入图片描述

  • 开机启动:
systemctl enable docker

在这里插入图片描述

  • 查看docker概要信息:
docker info
  • 查看docker帮助文档:
docker –help

在这里插入图片描述

三、Docker镜像操作

  • 3.1什么是Docker镜像
    Docker镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引导系统,即bootfs,这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系统则会被卸载,以留出更多的内存供磁盘镜像使用。Docker容器启动是需要的一些文件,而这些文件就可以称为Docker镜像。
    在这里插入图片描述
  • 3.2列出镜像
    列出docker下的所有镜像:
docker images

在这里插入图片描述

  • REPOSITORY:镜像所在的仓库名称
  • TAG:镜像标签
  • IMAGE ID:镜像ID
  • CREATED:镜像的创建日期(不是获取该镜像的日期)
  • SIZE:镜像大小
  • 这些镜像都是存储在Docker宿主机的/var/lib/docker目录下
    在这里插入图片描述
    为了区分同一个仓库下的不同镜像,Docker提供了一种称为标签(Tag)的功能。每个镜像在列出来时都带有一个标签,例如12.10、12.04等等。每个标签对组成特定镜像的一些镜像层进行标记(比如,标签12.04就是对所有Ubuntu12.04镜像层的标记)。这种机制使得同一个仓库中可以存储多个镜像。— 版本号
    我们在运行同一个仓库中的不同镜像时,可以通过在仓库名后面加上一个冒号和标签名来指定该仓库中的某一具体的镜像,例如docker run --name custom_container_name –i –t docker.io/ubunto:12.04 /bin/bash,表明从镜像Ubuntu:12.04启动一个容器,而这个镜像的操作系统就是Ubuntu:12.04。在构建容器时指定仓库的标签也是一个好习惯。
  • 3.3搜索镜像
    如果你需要从网络中查找需要的镜像,可以通过以下命令搜索
docker search 镜像名称

在这里插入图片描述

  • NAME:仓库名称
  • DESCRIPTION:镜像描述
  • STARS:用户评价,反应一个镜像的受欢迎程度
  • OFFICIAL:是否官方
  • AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的

3.4 拉取镜像

  • 3.4.1从Docker Hub拉取

Docker镜像首页,包括官方镜像和其它公开镜像。Docker Hub上最受欢迎的10大镜像(通过Docker registry API获取不了镜像被pull的个数,只能通过镜像的stars数量,来衡量镜像的流行度。毫无疑问,拥有最高stars数量的库都是官方库)。
使用命令拉取:

docker pull centos:7

案例:
在线下载zookeeper

docker pull zookeeper

在这里插入图片描述
查看所有镜像:
在这里插入图片描述
目前国内访问docker hub速度上有点尴尬,使用docker Mirror势在必行。现有国内提供docker镜像加速服务的商家有不少,下面重点ustc镜像。
3.4.2 ustc的镜像
ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
步骤:
(1)编辑该文件:vi /etc/docker/daemon.json // 如果该文件不存在就手动创建;说明:在centos7.x下,通过vi。
在这里插入图片描述
(2)在该文件中输入如下内容:

{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

(3)注意:一定要重启docker服务,如果重启docker后无法加速,可以重新启动OS
在这里插入图片描述
然后通过docker pull命令下载镜像:速度杠杠的。

  • 3.5删除镜像

  • 删除指定镜像

    docker rmi $IMAGE_ID

在这里插入图片描述
查看zookeeper镜像是否已经删除:
在这里插入图片描述
2、删除所有镜像

docker rmi `docker images -q`

操作原理:先查询出所有镜像ID ,在进行删除
在这里插入图片描述
列出所有镜像ID

docker images -q 

在这里插入图片描述
在这里插入图片描述
4.Docker容器操作
4.1查看容器
查看正在运行容器:

docker ps

在这里插入图片描述
查看所有的容器(启动过的历史容器):
在这里插入图片描述
查看最后一次运行的容器:

docker ps –l

在这里插入图片描述
查看停止的容器

docker ps -f status=exited

4.2创建与启动容器
创建容器常用的参数说明:
创建容器命令:

docker run

-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
–name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
4.1.1交互式容器
原理:创建容器并进入容器,退出容器,服务停止。
创建一个交互式容器并取名为mycentos

docker run -it --name=mycentos centos:7 /bin/bash

注:–name=mycentos指的是容器名称 centos:7 镜像名称 执行命令完成后,就已经进入centos7容器了,和宿主机centos7一样,只不过一个是宿主机,另一个是容器而已。
复制会话,这时我们通过ps命令查看,发现可以看到启动的容器,状态为启动状态
执行命令:docker ps
在这里插入图片描述
使用exit命令 退出当前容器

然后用ps -a 命令查看发现该容器也随之停止:

4.1.2守护式容器
前提:创建容器,不进行容器,后台启动,只要不关闭容器,容器就一直处于启动状态。
创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。命令如下(容器名称不能重复):

docker run -di --name=mycentos1 centos:7

在这里插入图片描述
查看容器是否启动:
在这里插入图片描述
登录守护式容器方式:

docker exec -it container_name (或者 container_id)  /bin/bash

(exit退出时,容器不会停止)
在这里插入图片描述
退出容器:
在这里插入图片描述
查看状态:
在这里插入图片描述
从图中可以看出,exit退出容器,mycentos1容器,还是可以正常处于启动状态。
4.3停止与启动容器
停止正在运行的容器:

docker stop $CONTAINER_NAME/ID

在这里插入图片描述
执行命令容器停止后,查看容器启动状态:
在这里插入图片描述
启动已运行过的容器:docker start $CONTAINER_NAME/ID
前提:先查看那些容器启动过
查看启动过的容器

docker ps -a 

在这里插入图片描述
在这里插入图片描述
在执行启动以前启动过的容器命令:

docker start mycentos1

在这里插入图片描述
4.4文件拷贝
前提:容器服务必须启动才可以进行文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录
案例演示:
在宿主机上创建/testfile文件:
执行命令:

echo 123 > testfile

在这里插入图片描述
把宿主机testfile文件复制到mycentos1 /usr/loca目录下:
执行命令:

docker cp testfile mycentos1:/usr/local 

在这里插入图片描述
登录容器查看文件在?usr/lcoal目录下面是否存在:
登录mycentos1容器:
在这里插入图片描述
在这里插入图片描述
也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
案例演示:
先把宿主机上的testfile文件删除,在从mycentos1容器中将mycentos1 /usr/lcoal 目录下面的testfile文件复制到宿主机上。
第一步:删除宿主机上的testfile文件:
在这里插入图片描述
第二步:将mycentos1容器中将mycentos1 /usr/lcoal 目录下面的testfile文件复制到宿主机上。
执行命令:

docker cp mycentos1:/usr/local/testfile newTestfile
docker cp mycentos1:/usr/local/test2 /usr

格式:docker cp 容器名:目录下的文件/目录 文件名/目录名
在这里插入图片描述
注:后台的文件名如果不一致,代表重命名
4.5目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器 添加-v参数 后边为 宿主机目录:容器目录

docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos2 centos:7

格式1:docker run -di -v 宿主机目录:容器目录 –name=新的容器名 镜像名称:tag
格式2:docker run -di –name=新的容器名 -v 宿主机目录:容器目录 镜像名称:tag
案例演示01:
1、在宿主机/usr/local/myhtml创建目录:
在这里插入图片描述
2、创建一个新的容器与宿主机进行目录挂在,也就是目录共享,改变宿主机挂在目录下的文件,容器中的文件随之改变。
执行命令:

docker run -di --name=mycentos2 -v /usr/local/myhtml/:/usr/local/nh centos:7

格式:docker run -di --name=新的容器名 -v 宿主机目录:容器目录 镜像名称:tag
在这里插入图片描述
查看刚启动的容器:
在这里插入图片描述
登录容器,查看在/usr/lcoal容器目录下面是否存在nh目录:
在这里插入图片描述
在宿主机的/usr/local/myhtml目录下,添加index.html文件:
在这里插入图片描述
登录容器,查看在,mycentos2容器的/usr/local/nh/目录下面是否存在index.html
在这里插入图片描述
案例演示02(重点):
上传cas文件夹到宿主机挂载目录/usr/local/myhtml下面,登录容器,查看文件?
在这里插入图片描述
先查看运行的容器,登录容器,查看:
在这里插入图片描述
注:如果你共享的是多级的目录,可能会出现权限不足的提示。
解决方案:这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题

docker run -di --name=mycentos3 -v /usr/local/myhtml/:/usr/local/mh --privileged=true centos:7

在这里插入图片描述
查看容器是否启动:
在这里插入图片描述
登录容器,查看文件是否有权限:
在这里插入图片描述
可以正常查看文件!!!
在这里插入图片描述
4.6查看容器IP地址
我们可以通过以下命令查看容器运行的各种数据

docker inspect mycentos2

在这里插入图片描述
注:此命令需要在宿主机上执行,容器内部无效。
在这里插入图片描述
也可以直接执行下面的命令直接输出IP地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos2

在这里插入图片描述
4.7删除容器
删除指定的容器:

docker rm $CONTAINER_ID/NAME

在这里插入图片描述
注意,只能删除停止的容器
效果图:
在这里插入图片描述
删除所有容器:

docker rm `docker ps -a -q`

在这里插入图片描述
5.部署应用
5.1 MySQL部署
5.1.1拉取MySQL镜像

docker pull mysql

在这里插入图片描述
查看镜像
在这里插入图片描述
5.1.2创建MySQL容器

docker run -di –name=pinyougou_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

在这里插入图片描述
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密码
5.1.3进入MySQL容器,登陆MySQL
进入mysql容器

docker exec -it pinyougou_mysql /bin/bash

在这里插入图片描述
在容器中,登陆mysql

mysql -u root -p

在这里插入图片描述
在容器中,退出mysql,然后从容器中退出到宿主机:
在这里插入图片描述
查看,正在运行的容器:
在这里插入图片描述
5.1.4远程登陆MySQL
(1)我们在我们本机的电脑上去连接虚拟机Centos中的Docker容器,这里192.168.45.13是虚拟机操作系统的IP
在这里插入图片描述
(2)在本地客户端执行建库脚本
执行“资源/建库语句/pinyougoudb.sql”
在这里插入图片描述
(1)我们在我们本机的电脑上去连接虚拟机Centos中的Docker容器,这里192.168.45.142是虚拟机操作系统的IP
在这里插入图片描述

(2)在本地客户端,创建数据库病,执行建库脚本
执行“资源/建库语句/pinyougoudb.sql”

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5.1.5查看容器IP地址
我们可以通过以下命令查看容器运行的各种数据
docker inspect pinyougou_mysql
在这里插入图片描述
运行效果如下:
在这里插入图片描述
我们可以看到我们的数据库服务器的IP是172.17.0.3
5.2 tomcat部署
5.2.1拉取tomcat镜像
docker pull tomcat:7-jre7
5.2.2创建tomcat容器
创建容器用于部署单点登录系统(CAS) -p表示地址映射:
docker run -di --name=pinyougou_tomcat -v /usr/local/myhtml/:/usr/local/tomcat/webapps --privileged=true -p 9000:8080 tomcat:7-jre7

docker run -di --name=pinyougou_tomcat -v /usr/local/myhtml/:/usr/local/tomcat/webapps --privileged=true -p 9000:8080 tomcat:7-jre7

格式:
–privileged=true :权限赋予
9000:8080:端口映射
7-jre7 指:tag
在这里插入图片描述
查看tomcat容器启动状态:docker ps
在这里插入图片描述
浏览器验证:
http://192.168.45.142:9000/cas/login
在这里插入图片描述

5.2.3部署web应用
(1)修改cas系统的配置文件,修改数据库连接的url

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		p:driverClass="com.mysql.jdbc.Driver"
		p:jdbcUrl="jdbc:mysql://172.17.0.3:3306/pinyougoudb?characterEncoding=utf8"
		p:user="root"
		p:password="root" />

测试:地址栏输入:http://192.168.45.142:9000/cas/login
tomcat和mysql联通:
在这里插入图片描述
在这里插入图片描述
5.3 Nginx部署
5.3.1拉取Nginx镜像
docker pull nginx
5.3.2创建Nginx容器
docker run -di --name=pinyougou_nginx -p 80:80 nginx/bin/bash
在这里插入图片描述
在这里插入图片描述
5.3.3测试Nginx
浏览器地址栏输入: http://192.168.45.142
在这里插入图片描述
5.3.4配置反向代
官方的nginx镜像,nginx配置文件nginx.conf 在/etc/nginx/目录下。
在容器内编辑配置文件不方便,我们可以先将配置文件从容器内拷贝到宿主机,编辑修改后再拷贝回去。
(1)从容器拷贝配置文件到宿主机

docker cp pinyougou_nginx:/etc/nginx/nginx.conf nginx.conf 

在这里插入图片描述

查看容器中是否有这个文件:
在这里插入图片描述
在这里插入图片描述
(2)编辑nginx.conf,添加反向代理配置
前提:查看tomcat端口:
在这里插入图片描述

upstream tomcat-cas {
    	server 172.17.0.4:8080;
    }
    server {
    	listen 80;
    	server_name passport.pinyougou.com;
    	location / {
    		proxy_pass http://tomcat-cas;
    		index index.html index.htm;
    	}
    }

(3)将修改后的配置文件拷贝到容器

docker cp nginx.conf  pinyougou_nginx:/etc/nginx/nginx.conf

在这里插入图片描述
(4)重新启动容器

docker restart pinyougou_nginx

在这里插入图片描述
(5)设置域名指向
192.168.45.142 passport.pinyougou.com
浏览器测试:http:// passport.pinyougou.com/cas/login
在这里插入图片描述
5.4 Redis部署
5.4.1拉取Redis镜像

docker pull redis

5.4.2创建Redis容器

docker run -di --name=pinyougou_redis -p 6379:6379 redis

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

redis-cli -h 192.168.247.135

6.备份与迁移
6.1容器保存为镜像
我们可以通过以下命令将容器保存为镜像

docker commit pinyougou_nginx mynginx
  • pinyougou_nginx是容器名称
  • mynginx是新的镜像名称

此镜像的内容就是你当前容器的内容,接下来你可以用此镜像再次运行新的容器
6.2镜像备份

docker  save -o mynginx.tar mynginx

-o 输出到的文件
执行后,运行ls命令即可看到打成的tar包
6.3镜像恢复与迁移
首先我们先删除掉mynginx镜像
然后执行此命令进行恢复

docker load -i mynginx.tar

-i 输入的文件
执行后再次查看镜像,可以看到镜像已经恢复

猜你喜欢

转载自blog.csdn.net/weixin_40816738/article/details/90146914