Docker学习
1.1 什么是虚拟化
虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构件的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,
透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟
化、虚拟机等等。
1.2 什么是Docker
Docker是一个开源环境,诞生于2013年,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推
出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
为什么选择Docker
- 上手快:用户只需要几分钟,就可以把自己的程序“Docker化”。
- 职责的逻辑分类:使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。
- 快速高效的开发生命周期:Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将
该大盒子拿走,而不需要从该盒子中一件件的取。) - 鼓励面向微服务架构:Docker还鼓励面向服务的体系结构和微服务架构。
1.3 容器与虚拟栈比较
容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统;
而传统方式则是在硬件层面实现。
与传统的虚拟机相比,Docker启动速度快、占用体积小。
1.4 Docker组件
1.4.1 Docker服务端和客户端
Docker是一个 客户端-服务器(C/S) 架构程序。
Docker的客户端向Docker服务器或者守护进程发出请求,服务器或者守护进程完成所有工作并返回结果。
Docker提供了一个命令行工具Docker以及一整套RESTful API。
Docker的客户端和服务端可以再同台主机,也可以在不同台主机上。不在同一台主机上的客户端可以连接到运行在另一台主机上的Docker服务端和守护进程。
1.4.2 Docker镜像和容器
镜像是构建Docker的基石。用户基于镜像运行自己的容器。
镜像是一种逻辑结构,对应着宿主机的文件,将这些文件组织起来。
镜像是基于联合文件系统的一种层式结构,由一系列指令一步步构建。
Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件。和集装箱一样,Docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去。
(镜像可以被看做是一个模板,容器可以看做是根据模板创建的一台服务器。一台服务器上可以有许多的容器,容器之间是相互隔离的,安全性较高)镜像运行时的实体 。容器类似于一个沙箱,docker利用容器来运行和隔离应用。
一个镜像可以创建多个容器,在创建容器时docker会在镜像的最上层创建一个可读可写层,每个容器都有各自的读写层,镜像本身保持不变。
1.4.3 注册中心(Registy)
Registry分为公共(Docker Hub)和私有两种。
公共的注册中心 Docker Hub
,用户可以在其中注册账号,并分享自己的镜像(但是在 Docker Hub
下载镜像很慢,可以构建私有的注册中心“Registy”)
网址:官网.
2.Docker安装与启动
2.1 安装Docker
Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。
可在 CentO7.X以上版本进行安装(在CentOS6.X 中,安装前需要很多其他的环境要求并且很多的Docker不定不支持更新)
安装步骤:
(1) yum包更新到最新
sudo yum update
(2) 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
(3) 设置yum源为阿里云
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo
(4)安装docker(ce是社区版,ee是收费企业版)
sudo yum install docker-ce
使用以上命令的时候,远程服务器(使用的腾讯云-CentOS7镜像)一直显示差找不到“docker ce”这个包,删除 “-ce” 后安装成功
(5)安装后查看docker版本
docker -v
2.2 设置 ustc 的镜像
ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度
很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
网址:Docker 镜像使用帮助.
编辑文件:
vi /etc/docker/daemon.json
刚安装好是一下内容:
在文件中输入内容如下:
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
2.3 Docker 的启动与停止
systemctl
命令时系统服务管理器指令:
启动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
一系列的参数命令细节:
3. 常用命令
3.1 镜像相关命令
3.1.1 查看镜像
docker images
查找出的参数:
REPOSITORY: 镜像名称
TAG: 镜像标签
IMAGE ID: 镜像ID
CREATED: 镜像的创建日期(不是获取该镜像的日期)
SIZE: 镜像大小
镜像一般都是存储在 Docker 宿主机下的 /var/lib/docker
目录下
3.1.2 搜索镜像
在网络中查找需要的镜像
docker search [镜像名称]
查找出的参数:
NAME: 仓库名称
DESCRIPTION: 镜像描述
STARS: 用户评价,反应一个镜像的受欢迎程度
OFFICIAL: 是否官方
AUTOMATED: 自动构建,表示该镜像是由 Docker Hub
自动创建流程创建的
3.1.3 拉取镜像
从中央仓库下载到本地
docker pull [镜像名称]
//下载centos7镜像
docker pull centos:7
3.1.4 删除镜像
按照ID删除镜像
docker rmi [镜像ID]
删除所有镜像
docker rmi 'docker images -q'
//上面的单引号不是英文半角的 单引号,是键盘上ESC下面的那个键的符号
相关参数:
-f :
通过 SIGKILL 信号强制删除一个运行中的容器。
-l :
移除容器间的网络连接,而非容器本身。
-v :
删除与容器关联的卷
3.2 容器相关命令
3.2.1 查看容器
查看正在运行的容器
docker ps
查看所有容器
docker ps -a
查看最后一次运行的容器
docker pa -l
查看停止的容器
docker ps -f status=exited
3.2.2 创建与启动容器
依赖镜像创建容器。每个容器都是“一台小电脑”,进入容器内部也是一个OS的环境,可进行相关操作
创建容器的命令 : docker run
其中相关参数:
-i :
表示运行容器
-t :
表示容器启动后会进入命令行。加入 -i
和 -t
两个参数<这两个参数是写在一起的-it
>,容器就能登录进去(即分配一个伪终端)
--name:
创建的容器命名
-v:
表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录) 可以使用多个-v
做多个目录或文件映射 注意:最好是做目录映射,在宿主机上做修改,之后共享到容器上
-d:
在 run
后面加上此参数,会创建一个守护式容器在后台运行(此种创建容器后不会自动登录容器,若是加入 -i
和 -t
两个参数<这两个参数是写在一起的-it
,也可以不写在一起-i
-t
>,创建后就会自动进入容器)
-p:
表示端口映射(前者是宿主机端口。后者是容器内的映射端口。)可以使用多个 -p
做多个 端口映射
(1) 交互式方式创建容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
执行完以上命令之后,通过 ps
命令查看(退出之前可以查看到启动状态),可以看到启动的容器,其状态为启动状态。
退出当前容器:
exit
执行 exit
之后容器停止运行 。
在执行这个命令之前,还在容器内部的时候,再创建一个会话窗口去查看容器的状态会显示该容器状态是启动状态。
使用交互式创建容器会进入到容器内部,但是在执行完 “exit” 命令之后容器会停止进行,但是容器是存在的,使用“ps”看不到,使用“ps -a”可以看到创建的容器
(2) 守护式方式创建容器
docker run -di --name=容器名称 镜像名称:标签
登录守护式创建容器
docker exec -it 容器名称(或者容器ID) /bin/bash
进入容器 :
以交互式方式创建容器,会进入容器,但是“exit” 之后容器停止运行。以守护式创建容器,不会进入到容器中,但是可以通过“exec -it”进入容器,使用 “exit” 之后也不会停止进行。
3.2.3 停止与启动容器
停止的时间要比启动的时间要长一些。
停止容器:
docker stop [容器名称或者容器ID]
启动容器:
docker start [容器名称或者容器ID]
3.2.4 文件拷贝
应用场景:
容器需要安装某些软件,容器的软件的安装包可以通过从宿主机中拷贝来获取。现将安装包文件上传到宿主机,再从宿主机中将文件拷贝到容器中。
将文件拷贝代容器内,使用 cp
命令 :
docker cp [容器内需要拷贝的文件或目录] [容器名称:容器目录]
将文件从 容器内拷贝出
docker cp [容器名称:容器目录] [容器内需要拷贝的文件或目录]
这个操作只是讲两个种类的文件目录调换一下就可以。
即使容器是关机的状态也可以使用 “cp” 命令进行文件的 拷贝操作
3.2.5 目录挂载
在创建容器的时候,将宿主机的目录与容器内的目录进行映射。由此,可以通过修改宿主机的某个目录的文件从而去影响容器(尤其是配置文件)。
在创建容器时,添加 -v
参数,其后为 宿主机目录:容器目录===》
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果共享的是多级的目录,可能会出现权限不足的提示。
这是因为 CentOS7 中的安全模块 selinux 把权限禁掉了,我们需要添加参数 --privileged=true
来解决挂载的目录没有权限的问题
3.2.6 查看容器IP地址
以下命令 可以查看容器运行的各种数据
docker inspect 容器名称(容器ID)
会出现此容器的所有信息,包括创建时间、路径、状态等。
其中字段 NetworkSettings
是IP地址信息:
也可以通过以下命令直接输出IP地址(使用 --format
来过滤想要的参数)
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
3.2.7 删除容器
删除指定容器
docker rm 容器名称(容器ID)
容器在运行中,不可以进行删除操作,需要先停止容器(根据提示,或是使用 -f
强行删除)。下方实例使用-f
进行强删:
镜像有在运行的容器,也是无法删除的(使用的是 docker rmi 镜像名称
命令):
需要把该镜像的所有容器停止或删除,才能删除该镜像。
4. 应用部署
4.1 MySQL部署
(1)拉取 mysql 镜像
docker pull centos/mysql-57-centos7
(2)创建容器
docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
-p
代表端口映射,格式为 宿主机映射端口:容器运行端口
-e
代表添加环境变量,MYSQL_ROOT_PASSWORD
是root用户的登录密码
这里宿主机的 33306 端口映射容器的 3306端口。
(3)远程登录mysql
连接宿主机的IP,指定端口为 33306
使用可视化工具连接上之后,直接执行创建命令就可以成功在容器中创建相应的数据库表。
4.2 tomcat部署
(1)拉取镜像
docker pull tomcat:7-jre7
(2)创建容器
创建容器 -p表示地址映射
docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
测试可访问 :
tomcat的目录 /webapps/ROOT
下有tomcat的 index.html
页面,其目录下的页面,只需要在 IP:端口/xxx.html
就可访问目录下面的网页
4.3 Nginx部署
(1)拉取镜像
docker pull nginx
(2)创建容器
docker run -di --name=mynginx -p 80:80 nginx
可以访问:
4.4 Redis部署
(1)拉取镜像
docker pull redis
(2)创建容器
docker run -di --name=myredis -p 6379:6379 redis
5. 迁移和备份
应用场景:
需要将一台上的镜像迁移到另一台上面。
某一台上面的镜像的一个容器,该容器 的一些配置进行了修改,现在需要基于这个容器创建新的容器,可以先将这个容器保存为一个镜像,根据新生成的镜像生成的容器就具有其本身修改过后的内容。
5.1 容器保存为镜像
将容器保存为镜像:
docker commit mynginx mynginx_i
端口 81 成功访问 nginx
5.2 镜像备份
将镜像保存为 tar
对象
docker save -o [导出文件名] [镜像名]
docker save -o mynginx.tar mynginx_i
5.3 镜像恢复与迁移
要先删除掉mynginx_img镜像 然后执行此命令进行恢复
docker load -i mynginx.tar
-i
输入的文件
执行后再次查看镜像,可以看到镜像已经恢复
6. Dockerfile
6.1 什么是Dockerfile
Dockerfile是由一系列的命令和参数构成的脚本,这些命令应用于基础镜像1并最终创建一个新的镜像。(为了更方便的构建镜像文件)
- 对于开发人员,可以为开发团队提供一个完全一致的开发环境。
- 对于测试人员,可以直接拿开发时候所构建的镜像或者通过Dockerfile文件构建一个新的镜像,就可以开始工作了。
- 对于运维人员,在部署时,可以实现无缝移植。
6.2 常用命令
定义了使用哪个基础镜像启动构建流程。根据 [image_name]
,若是本地没有,会自动拉取镜像
FROM [image_name]:[tag]
声明镜像的创建者
MAINTAINER [user_name]
设置环境变量(可以写多条)
ENV key value
是 Dockerfile
的核心部分(可以写多条)
RUN command
将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
ADD [source_dir/file] [dest_dir/file]
和ADD相似,但是如果有压缩文件并不能解压
COPY [source_dir/file] [dest_dir/file]
设置工作目录
WORKDIR [path_dir]
6.3 使用脚本创建镜像
步骤:
(1)创建目录
mkdir –p /usr/local/dockerjdk8
(2)下载jdk-8u171-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录
(3)创建文件Dockerfile vi Dockerfile
#依赖镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER ITCAST
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
(4)执行命令构建镜像
docker build -t='jdk1.8' .
注意后边的空格和点,不要省略
(5)查看镜像是否建立完成
docker images
创建完成
7.Docker私有仓库
私有仓库也是一个镜像,配置起来较为方便。
7.1 私有仓库搭建与配置
(1)拉取私有仓库镜像
docker pull registry
(2)启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
(3)打开浏览器 输入地址http://[IP地址]:5000/v2/_catalog看到 {“repositories”:[]} 表示私有仓库
搭建成功并且内容为空
(4)修改daemon.json
vi /etc/docker/daemon.json
添加以下内容,保存退出。
{"insecure-registries":["192.168.184.141:5000"]}
//添加后内容为
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries":["58.87.95.235:5000"]
}
/*
*第一行的 "registry-mirrors" 是配置的提速镜像
*第二行的是配置的 `docker` 信任的私有仓库
*/
此步用于让 docker信任私有仓库地址
(5)重启docker 服务
systemctl restart docker
7.2 镜像上传至私有仓库
(1)标记此镜像为私有仓库的镜像
docker tag jdk1.8 [IP地址]:5000/jdk1.8
(2)再次启动私服容器
docker start registry
(3)上传标记的镜像
docker push [IP地址]:5000/jdk1.8
若是在另一台服务器上
在另外一台服务器上下载上述上传到私仓的 jdk1_8
镜像。
也是同样的,另一台服务器上也必须安装Docker,需要配置 daemon.json
,使得另一台服务器信任当前含有 jdk1_8
镜像的仓库地址。配置保存后,重启 Docker 服务。执行以下命令(镜像名称指定私服的地址):
docker pull [IP地址]:5000/jdk1.8
就可以获取当前的上传到私仓的 jdk1_8
镜像。
操作系统级别的镜像(Ubuntu或者CentOS)。若是一个CentOS 镜像安装了 JDK ,微服务基于这个安装了 JDK 的镜像创建,那么这个 安装了JDK的镜像 就是微服务的基础镜像。 ↩︎