什么是 Docker?为什么会有 Docker?Docker 的优势?
- 为什么会有 Docker?
我们知道一款产品从开发到上线,从开发环境到生成环境。作为开发和运维人员之间协作需要考虑很多问题,尤其是当我们的产品多版本迭代之后,不同环境之间的兼容就会成为一个大问题; 这时 Docker 的出现就解决了这一难题,Docker 的出现使我们开发的软件可以“带环境安装”,即安装的时候,可以把原始环境一模一样的的复制过来,不用在担心环境不一致导致“开发时可以正常运行,生成环境就会出问题”,“在我的机器上可以正常运行,在别人的机器上就不能运行”的问题了
- 什么是 Docker?
Docker 就像是一个轻量级的虚拟机,Docker是一个轻量级的容器,我们可以将环境交给 Docker 来管理,当我们需要移植我们的产品的时候,就可以将环境整个的迁移到另一台主机上,而不向虚拟机一样,迁移一台虚拟机极其资源;
Docker 是一个开源的应用容器引擎,基于 Go 语言开发。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
总之:Docker相较于虚拟机来说具有更加轻量,启动更快,效率更高,可移植性更强等优势,实现了“一次封装,到处运行”,不用在关心环境的不一致问题
- Docker 优势?
运行环境的一致性:Docker 的镜像提供了除了内核之外完整的运行环境,确保了应用运行的一致性; 更快速地启动部署:可以做到秒级,甚至毫秒级的的启动时间。大大节约了开发、测试、部署的时间; 更好的隔离性:每个服务器都是独立运行的、完全隔离的。避免公用的服务器,资源会容易受到其他用户的影响; 弹性伸缩、快速扩展:能够更好的处理集中爆发式的服务器使用压力; 迁移更加方便:“带环境安装”; 持续交付和部署:使用 Docker 可以通过定制镜像来实现持续集成,交付,部署;
Docker 的组成?
?Docker 是一个 C/S 架构程序。Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API。你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。
- 镜像:类似虚拟机镜像 , 是一个特殊的文件系统
操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。 Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。 - 容器:类似linux系统环境,运行和隔离应用。是镜像运行时的实体
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。 - 仓库:集中存放镜像文件的地方。
镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中存储、分发镜像的地方,比如后面我们要学的,Docker Registry就是这样的服务。
Docker 的安装(CentOS7)?
Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。? 由于我们学习的环境都使用的是CentOS,因此这里我们将Docker安装到CentOS上。
注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境,而且Docker很多补丁不支持更新。
- 确定你是不是 CentOS7及以上的版本:
cat /etc/redhat-release - yum 安装 gcc
检查是否安装了gcc、g++:gcc -v ,g++ -v 安装gcc、g++:yum -y install gcc ,yum -y install gcc-c++ - 安装需要的软件包:
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 软件包索引:
yum makecache fast - 安装 docker-ce(社区版),企业版收费:
yum -y install docker-ce - 启动 docker
手动启动:systemctl start docker 开机自启:systemctl enable docker - 测试
检查版本:docker version 下载运行HelloWorld:docker run hello-world - 配置镜像加速:推荐阿里云
mkdir -p /etc/docker vim /etc/docker/daemon.json
{ “registry-mirrors”: [“https://8y2y8njn.mirror.aliyuncs.com”] }
重新记载daemon,重启docker systemctl daemon-reload systemctl restart docker
- 卸载
systemctl stop docker yum -y remove docker-ce rm -rf /var/lib/docker
Docker 的常用命令?
Docker Hub 类似与 Maven 仓库,是 Docker 的远程仓库 国内的 Docker 网站 https://www.docker.com
1.启动与停止命令
命令 | 解释 |
---|
systemctl start docker | 启动 Docker | systemctl stop docker | 停止docker | systemctl restart docker | 查看docker状态 | systemctl status docker | 开机启动 | systemctl enable docker | 开机启动 | docker info | 查看docker概要信息 | docker --help | 查看docker帮助文档 |
2.镜像相关命令
命令 | 解释 |
---|
docker images | 查看本地存在的镜像 这些镜像都存储在 Docker 的 /var/lib/docker目录下 | docker search 镜像名称 | 从网络中查找需要的镜像 | docker pull 镜像名称 | 将远程镜像拉取到本地 | docker rmi [-f] 镜像ID | (强制)删除本地镜像 | docker rmi -f 镜像名1:TAG 镜像名2:TAG | 删除多个镜像 | docker rmi -f $(docker images -qa) | 删除所有镜像 |
使用: docker images docker search 镜像名字 docker pull 镜像名字
3.容器相关命令
1. 查看容器
命令 | 解释 |
---|
docker ps | 查看正在运行的容器 | docker ps -a | 查看所有容器 | docker ps -l | 查看最后一次运行的容器 | docker ps -f status=exited | 查看停止的容器 |
2. 创建与启动容器
docker run
-i:表示运行容器 -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。 -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。 -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。 -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射 –name:为创建的容器命名。
2.1.以交互的方式创建容器
以交互式方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式启动容器,如果退出容器,则容器会进入停止状态。可以理解成交互式容器是前台容器。
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
比如:docker run -it --name=mycentos centos:7 /bin/bash docker run:表示创建容器 -it:表示运行容器并进入它的命令行 –name=mycentos:给当前的容器命名 centos:7:使用该镜像创建 /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
2.2.创建后台容器
创建一个守护式容器;如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。
创建守护式容器:docker run -id --name=容器名字 centos:7 登录守护式容器:docker exec -it 容器名称 (或者容器ID) /bin/bash
2.3.停止与启动容器 docker stop 容器名称(或者容器ID) docker start 容器名称(或者容器ID)
3. 文件拷贝
将宿主机的文件拷贝的容器的指定目录下 宿主机向容器拷贝:docker cp 需要拷贝的文件或目录 容器名称:容器目录 容器向宿主机拷贝:docker cp 容器名称:容器目录 需要拷贝的文件或目录 例如: docker cp /opt/tomcat8080/conf/web.xml mycentos7_2:/usr/local/
4. 目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器并挂载:docker run -id --name=mycentos1 -v 宿主机的目录:容器的目录 centos:7
创建容器并挂载 linux 中的 /usr/local/myhtml 到,容器的 /usr/local/myhtml 目录 docker run -id --name=mycentos1 -v /usr/local/myhtml:/usr/local/myhtml centos:7 如果你共享的是多级的目录,可能会出现权限不足的提示。 这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题 docker run -id --privileged=true --name=mycentos1 -v /usr/local/myhtml:/usr/local/myhtml centos:7
5. 查看容器 IP 地址
我们可以通过 docker inspect 容器名称 来查看容器运行时的各种数据
当然我们也可以通过 docker inspect --format='{{属性的键}}' 容器名称 来查看单独某个属性
例如我们单独查看 IP 地址 docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos1
6. 删除容器
docker rm 容器名称
当我们在删除一个正在运行的容器时,会报错;需要先关闭这个容器才可删除
当然我们也可以用 docker rm -f 容器名称 来强制删除一个容器
Docker 的应用容器部署
我们不能直接访问在 Docker 上部署的应用(包括 MySQL),如果我们想要访问我们部署在 Docker 上的应用,那么我们只需要访问 Docker 上部署的应用在宿主机上的映射端口即可,例如:我们在 Docker 上部署了一个 MySQL应用(3306),在宿主机上的映射端口为 33306,我们只需要访问 33306 端口,即可访问 Docker 上的 MySQL;
1.MySQL 部署
-
拉取镜像 docker pull centos/mysql-57-centos7 -
创建容器 docker run -di --name=mysql5.7 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
选项 | 解释 |
---|
-p 宿主机端口:容器端口 | 指定端口映射 | -e … | 传递环境变量,这里表示 MySQL 的密码为 123456,账户默认为 root |
- 远程链接 MySQL
2.Tomcat 部署
-
拉取镜像 docker pull tomcat:7-jre7 -
创建容器 docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7 -
找一个 web 项目,部署到宿主机的 /usr/local/webapps 目录下,然后进入 docker 容器查看项目有没有成功部署,最后在浏览器中测试看看能不能成功访问
输入默认的用户名之后,我们成功登录,说明项目已经部署成功了
3.Nginx 部署
-
拉取镜像 docker pull nginx -
创建 Nginx 容器 docker run -di --name=mynginx -p 80:80 nginx -
测试
4.Redis 部署
-
拉取镜像 docker pull redis -
创建容器 docker run -di --name=myredis -p 6379:6379 redis -
用 redis 客户端工具链接测试
迁移与备份
保存容器为镜像:docker commit 容器名称 镜像名称 例如:docker commit mynginx mynginx_i
保存镜像为 tar 文件:docker save –o tar文件名 镜像名 docker save -o mynginx.tar mynginx_i
加载 tar 文件为镜像:docker load -i tar文件名 docker load -i mynginx.tar
Dockerfile 制作镜像
前面已经知道了,想要获得一个镜像可以从 Docker 中心仓库拉取,但是如果我们想要自己制作一个镜像,这时就需要 Dockerfile 了;
Docker 实际上就是一个文本文件,我们可以在这个文本文件里输入一些命令或参数,来定制我们需要的镜像,之后 Docker 可以通过读取 Dockerfile 文件的描述来构建镜像;
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
- 对于运维人员:在部署时,可以实现应用的无缝移植。
Dockerfile 常用的命令:
命令 | 作用 |
---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 | MAINTAINER user_name | 声明镜像的创建者 | ENV key value | 设置环境变量 (可以写多条) | RUN command | 是Dockerfile的核心部分(可以写多条) RUN 后面输入 linux 命令 | ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 | COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 | WORKDIR path_dir | 设置工作目录(进入容器之后默认的工作路径) |
下面我们以创建一个具有 jdk1.8 的 centos7 系统为例制作一个镜像
-
创建目录 mkdir –p /usr/local/dockerjdk8 -
下载 jdk-8u144-linux-x64.tar.gz 并上传到服务器(虚拟机)中的 /usr/local/dockerjdk8 目录
- 创建 Dockerfile 文件(名字固定为Dockerfile)
#依赖的镜像的名称和版本 FROM centos:7 #指定镜像创建者信息 MAINTAINER ayi #设置工作目录,进入容器之后默认的工作目录,即进入 centos7 应用容器之后默认的工作目录为 /usr WORKDIR /usr #RUN yum install -y glibc.i686 制作完镜像之后,用镜像安装的centos7可能会有问题,缺少 glibc.i686,所以这里我们可以安装一下,也可以稍后安装 #RUN 后面是我们在构建镜像时需要执行的命令,下面是创建一个文件夹 RUN mkdir /usr/local/java #ADD 是相对路径jar,把java添加到容器中 ADD jdk-8u144-linux-i586.tar.gz /usr/local/java/ #配置java环境变量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_144 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
- 执行命令构建镜像
docker build -t='jdk1.8' . 注意:这里的 . 不要拉下了,"." 的意思是指定相对目录为当前目录 -t:指定构建的镜像的名称
- 查看镜像是否构建成功
docker images
- 最后,运行容器进行测试
执行 java -version 发现报错,那么我们需要安装一下 glibc yum install -y glibc.i686 安装完成之后,就可以了
Docker 私有仓库
Docker 中心仓库中维护着私有仓库的镜像,我们需要将其拉取下来,才能搭建我们自己的私有仓库
-
拉取私有仓库 docker pull registry -
启动私有仓库容器 docker run -di --name=registry -p 5000:5000 registry -
这里我们就可以访问我们的私有仓库了 http://192.168.211.144:5000/v2/_catalog,IP 改为你们自己的宿主机 IP 即可 -
修改 daemon.json, Docker 默认我们的私有仓库是不安全的,所以我们要配置一下,就和之前配置镜像加速一样 vi /etc/docker/daemon.json "insecure-registries":["192.168.211.144:5000"] IP,改为你们自己的宿主机 IP -
重启docker 服务 systemctl restart docker
将镜像上传到私有仓库
- 先将镜像标记为私有仓库的镜像
docker tag 自己的镜像名称 宿主机IP:私有服务容器的端口/jdk1.8 docker tag jdk1.8 192.168.17.132:5000/jdk1.8 5000:是我们之前创建 registry 的时候映射的端口,是宿主机的端口
-
再次启动私服容器 docker start registry -
上传标记的镜像 docker push 192.168.211.144:5000/jdk1.8
从私有仓库拉取镜像
docker pull 192.168.211.144:5000/jdk1.8
|