Docker入门
一、Docker简介
1.1 什么是虚拟化
计算机中,虚拟化是一种资源管理技术,将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,是使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理组态所限制,一般所指的虚拟化资源包括计算机能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而更大化的利用物理硬件对资源充分利用。
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化、桌面虚拟化、服务虚拟化、虚拟机等。
1.2 什么是Docker
一个开源项目,基于Go语言实现。
Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。
在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,是得操作更为简单。
选择Docker的理由:
1.上手快
Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序非常迅速。大所述Docker容器启动不到一秒。拥有高性能,同一台宿主机中可以运行很多的容器,是用户尽可能充分利用系统资源。
2.职责逻辑分类
使用Docker,开发人员只需要关系容器中运行的应用程序,而运维人员只需要关系如何管理容器。Docker设计的目的就是加强开发环境与程序部署的生产环境的一致性。
3.快速高效的开发生命周期
Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让应用程序具备可移植性,易于构建,并易于协作。(类比Docker为一个盒子,里面放一些物品,需要里面的这些物品就将这个盒子拿走)
4.鼓励使用面向服务的结构
Docker鼓励面向服务的体系系统和微服务架构。Docker推荐单个容器只运行一个应用程序或进程,形成一个分布式的应用程序模型,在这种模型下,应用程序或服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试都变得非常简单,提供了程序的内省性。
(也可以在一个容器中运行多个应用程序)
1.3 容器与虚拟机的比较
- 传统方式是在硬件层面实现的
- 容器是在操作系统层面实现的虚拟化,直接服用本地主机的操作系统
与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。
1.4 Docker组件
1.Docker服务器与客户端
- 服务器,我们安装的Docker软件,启动服务
- 客户端,操作Docker客户端的命令
2.Docker镜像与容器
- 镜像,就是安装好软件的一个文件
- 容器,根据镜像文件启动的一个环境
3.注册中心
- 注册中心(GitHub、maven),用来保存和下载用户构建的镜像,分为共有和私有
官网:https://hub.docker.com/
二、Docker的安装与启动
2.1 安装Docker
Docker官方建议安装的Ubuntu上,因为Docker基于Ubuntu发布的。如果使用CentOS,建议安装在CentOS7.x以上的版本中,低版本需要安装很多其他环境。
采用镜像CentOS7.x
1.yum包更新到最新
1 sudo yum update
2.安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
1 sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3.设置yum源为阿里云
1 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.安装Docker
1 sudo yum install docker-ce
5.查看Docker版本
1 docker -v
2.2 设置ustc的镜像
-- 为了下载镜像更快,直接连国外站点下载超慢
1.编辑文件
1 vi /etc/docker/daemon.json
2.修改内容
1 { 2 "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] 3 }
2.3 Docker的启动与停止
1 **systemcl**命令是系统服务管理器指令 2 3 启动Docker 4 systemctl start docker 5 6 停止docker 7 systemctl stop docker 8 9 重启docker 10 systemctl restart docker 11 12 查看docker状态 13 systemctl status docker 14 15 开机启动 16 systemctl enable docker 17 18 查看docker概要信息 19 docker info 20 21 查看docker帮助文档 22 docker --help
三、常用命令
3.1 镜像相关命令
1.查看镜像
1 docker images 2 3 REPOSITORY:镜像名称 4 5 TAG:镜像标签 6 7 IMAGE ID:镜像ID 8 9 CREATED:镜像的创建日期(不是获取该镜像的日期) 10 11 SIZE:镜像大小 12 13 这些镜像都是存储在Docker宿主机的/var/lib/docker目录下
2.搜索镜像
搜索的是网上的镜像
1 docker search 镜像名称 2 3 NAME:仓库名称 4 5 DESCRIPTION:镜像描述 6 7 STARS:用户评价,反应一个镜像的受欢迎程度 8 9 OFFICIAL:是否官方 10 11 AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
3.拉取镜像
拉取镜像就是从中央仓库中下载镜像到本地
1 docker pull 镜像名称 2 3 例:下载CentOS:7的镜像 4 5 docker pull centos:7
4.删除镜像
1 按镜像ID删除镜像 2 3 docker rmi 镜像ID 4 5 删除所有镜像 6 7 docker rmi `docker images -q`
3.2 容器相关命令
1.创建于启动容器
1 创建容器命令: 2 docker run 3 4 -i:表示运行容器 5 6 -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分布一个伪终端。 7 8 --name:为创建的容器命名 9 10 -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好是做目录映射,在宿主机上做修改,然后共享到容器上。 11 12 -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会进去容器)。 13 14 -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
(1)交互式方式创建容器
1 docker run -it --name=容器名称 镜像名称:标签 /bin/bash
这是我们通过ps命令查看,发现可以看到启动的容器,状态为启动状态
退出当前容器:
1 exit
(2)守护式方式创建容器
1 docker run -di --name=容器名称 镜像名称:标签
登录守护式容器方式
1 docker exec -it 容器名称(或容器ID) /bin/bash
2.查看容器
1 查看正在运行的容器 2 3 docker ps 4 5 查看所有容器 6 7 docker ps -a 8 9 查看最后一次运行的容器 10 11 docker ps -l #这里是字母l,不要写成数字1 12 13 查看停止的容器 14 15 docker ps -f status=existd
3.停止与启动容器
1 停止容器: 2 3 docker stop 容器名称(或容器ID) 4 5 启动容器: 6 7 docker start 容器名称(或容器ID)
4.文件拷贝
1 将文件拷贝到容器内 2 3 docker cp 需要拷贝的文件或目录 容器名称:容器目录 4 5 将文件从容器内拷贝出来 6 7 docker cp 容器名称:容器目录 需要拷贝的文件或目录
5.目录挂载
我们在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件而去影响容器。
创建容器,添加-v参数,后面为:宿主机目录:容器目录
1 docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果你共享的是多级目录,可能或出现权限不足的提示,这是因为CentOS7中的安全模块把权限禁掉了,需要添加参数--privileged=true,来解决挂载的目录没有权限的问题。
6.查看容器内的数据
1 通过以下命令查看容器中的各种数据 2 3 docker inspect 容器名称(容器ID) 4 5 查看IP地址 6 7 docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID) 8 9 同理可以通过获取IP地址的形式获取其他数据
7.删除容器
-- 运行期的容器默认是不能被删除的
1 docker rm 容器名称(容器ID)
四、应用部署
4.1 MySQL部署
1.拉取mysql镜像
1 docker pull centos/mysql - 57 -centos7
2.创建容器
1 docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=root mysql
-p 代表端口映射,格式:宿主机映射端口:容器运行端口
-e 代表添加环境变量,MYSQL_ROOT_PASSWORD,是root用户的登录密码
3.远程登录mysql
连接宿主机的IP,指定端口为33306
4.2 Tomcat部署
1.拉取镜像
1 docker pull tomcat:7-jre7
2.创建容器 -p表示地址映射
1 docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
4.3 Nginx部署
1.拉取镜像
1 docker pull nginx
2.创建Nginx容器
1 docker run -di --name=mynginx -p 80:80 nginx
4.4 Redis部署
1.拉取镜像
1 docker pull redis
2.创建容器
1 docker run -di --name=myredis -p 6379:6379 redis
五、迁移与备份
5.1 容器保存为镜像
通过下面的命令将容器保存为镜像
1 docker commit mynginx mynginx_i
5.2 镜像备份
通过下面命令将镜像保存为tar文件
docker save -o mynginx.tar mynginx_i
5.3 镜像恢复与迁移
首先删除mynginx_img镜像,然后执行命令恢复
1 docker load -i mynginx.tar
-i 输入的文件
执行后再次查看镜像,可以看到镜像已经恢复
六、Dockerfile
6.1 什么是Dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像工作
- 对于运维人员:在部署时,可以实现应用的无缝移植
6.2 常用命令
1 | 命令 | 作用 2 | ---------------------------------- | ---------------------------------- 3 | FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 4 | MAINTAINER user_name | 声明镜像的创建者 5 | ENV key value | 设置环境变量 (可以写多条) 6 | RUN command | 是Dockerfile的核心部分(可以写多条) 7 | ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 8 | COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 9 | WORKDIR path_dir | 设置工作目录
6.3 使用脚本创建镜像
步骤:
1.创建目录
1 mkdir –p /usr/local/dockerjdk8
2.下载jdk-8u171-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录
3.创建文件Dockerfile
1 `vi Dockerfile` 2 3 #依赖镜像名称和ID 4 FROM centos:7 5 #指定镜像创建者信息 6 MAINTAINER ITCAST 7 #切换工作目录 8 WORKDIR /usr 9 RUN mkdir /usr/local/java 10 #ADD 是相对路径jar,把java添加到容器中 11 ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/ 12 13 #配置java环境变量 14 ENV JAVA_HOME /usr/local/java/jdk1.8.0_171 15 ENV JRE_HOME $JAVA_HOME/jre 16 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH 17 ENV PATH $JAVA_HOME/bin:$PATH
4.执行命令构建镜像
1 docker build -t='jdk1.8' .
5.查看镜像是否建立完成
1 docker images
七、Docker私有仓库
7.1 私有仓库搭建与配置
1.拉取私有仓库镜像(略)
1 docker pull registry
2.启动私有仓库容器
1 docker run -di --name=registry -p 5000:5000 registry
3. 打开浏览器 输入地址http://192.168.184.141:5000/v2/_catalog看到`{"repositories":[]}` 表示私有仓库搭建成功并且内容为空
4.修改daemon.json
1 vi /etc/docker/daemon.json 2 3 添加以下内容,保存退出。 4 5 json 6 {"insecure-registries":["192.168.184.141:5000"]}
此步用于让docker信任私有仓库地址
5.重启docker服务
1 systemctl restart docker
7.2 镜像上传至私有仓库
1.标记此镜像为私有仓库的镜像
1 docker tag jdk1.8 192.168.184.141:5000/jdk1.8
2.启动私服容器(如果私服仓库没有启动,则执行下面命令)
1 docker start registry
3.上传标记的镜像(要确保私服仓库的容器要启动)
1 docker push 192.168.184.141:5000/jdk1.8
7.3 私服仓库上镜像下载
。。。。。。。。。。。。