为什么需要使用Docker
简介与概述
1.介绍
Docker是一个开源的应用容器引擎,基于Go语言开发的,并且遵从Apache2.0协议开源。
Docker可以让开发者打包他们的应用以及依赖,打包到轻量级、可移植的容器中,然后发布到任何一个流行的Linux服务器上,也可以实现虚拟化。
2.Docekr的主要目的是‘build , ship and run any app , anywhere’,也就是说打包了之后,可以做到将用户的app及其运行环境实现‘一次封装,到处运行’。
3.作用
4.优势
Docker三大要素
1.仓库
仓库就相当于手机自带的应用商店(存放镜像文件),你可以在里面下载app,docker的网站也是一样的
https://hub.docker.com/
2.镜像
里面的app就相当于镜像,也就是安装包,下一步下一步安装即可
要么自己做一个,比如springboot项目
要么去第三方仓库下载
3.容器
Docker的核心架构原理
注:如果要下载Nginx,首先Docker-Client会发一个请求 (docker pull),然后后台会单独开启一个进程去查看本地是否有Nginx的镜像文件,如果没有他就会去仓库(第三方--Dockerhub)里面下载并且缓存到本地(类似Maven)
docker-run 他会在运行前查看本地是否有相关的镜像缓存,如果没有就去下载一个,然后再交给容器进行运行
容器和虚拟机的区别
注:一个系统可以运行上千个容器,但是一个虚拟机(一台电脑)运行几十个就很不错的了
CentOS7安装Docker
1.首先Docker会要求CentOS7的版本在3.10以上
通过 cat /etc/redhat-release 查看centos版本
通过 uname -a 可以查看Linux的版本和多少位
通过 uname -r 查看当前的Linux内核版本(centos)和多少位
2.使用root权限登录CentOS,确保yum包更新到最新
yum -y update
3.卸载旧版本(如果下载过旧版本的话)
yum remove docker docker-common docker-selinux docker-engine
4.yum install -y yum-utils
yum install -y yum-utils
5.设置yum源
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
6.可以查看所有仓库中的所有docker版本,并且可以选择指定版本安装
yum install docker-ce-18.06.3.ce
7.安装docker
sudo yum intall-y doker-ce
#由于repo中的默认只开启stable仓库,所有这里安装的是最新稳定版 18.03.1
8.设置启动并且开机启动
systemctl start docker
systemctl enable docker
9.验证是否安装成功(有client 和service 两部分表示docker安装启动都成功了),或者查看是否有进程
docker version
ps aux | grep 'docker'
10.正在运行的容器
docker ps
Docker配置阿里云加速器镜像
1.阿里云服务器镜像加速器地址:
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
2.如何仓库加速器镜像安装成功
docker info
注:可以下载一个tomcat试试
Docker-images使用原理
1.docker seach mysql
http://hub.docker.com/
2.latest是什么意思(最新版本)
3.下载的时候默认就是最新版本与删除镜像
注:docker rmi 镜像id或名称
如果提示镜像被使用,需要先停止某个ID的容器,那么要先删除容器再删除镜像,如需强行删除可以使用-f参数,例如:docker rmi -f tomcat:6
4.为什么原生的tomcat就是50多mb,但是images查看的时候事五六百mb
注:因为这里面包括了运行时环境,jdk,服务器
5.如何下载指定tomcat的版本(八点几版本),以及获取镜像id
获取版本 docekr pull tomcat:8
获取镜像id docker images -q
显示镜像的摘要信息 docker images --digests
显示完整的镜像信息 docker images --no-trunc
Docker-run的常见问题
1.tomcat可以会多个容器运行,如果不规定名称,你们每次运行都会开启一个tomcat进程,而且id也不同
2.如果是使用stop停止docker运行,但是容器并没有停止,并且是可以使用docker ps-a进行查看
3.指定名称运行tomcat,并且使用容器外部(Linux虚拟机)进行连接(curl 127.0.0.1:8080)
注:拒绝连接的解决方法就是改为后台启动
因为没有项目运行,所以会404
4.前台启动和后台启动的区别
注:如果是后台启动了,但就是不能访问,防火墙也关闭了,那肯定是报错了,
这样就可以换到前台启动看看日志信息,再切换后台
Docker-commit的作用
注:将镜像打包成一个文件(war包)
注:这也是为什么运行的时候出现404的原因,因为没有任何项目
1.如何进入webapps中创建一个html,并且写入内容,并且使用8081访问
2.根据当前容器作为模板做成一个镜像文件,然后运行的时候就自带项目了
docker run -p 8088:8080 tomcat:1.0
Docker数据卷的作用
1.概念
2.添加方式 (挂载)
注:指定一个 -v 的指令
注:左边是容器外部,右边是内部,容器外部的文件用的内部文件夹做一个共享
也就是说把html文件放到data/nginx/html目录下面(宿主机上的数据卷路径),然后输入 :/usr/share/nginx/html# ls 也可以查看(容器中要挂载的数据卷路径)
3.添加流程
3.1.创建/data/nginx/html文件夹:
3.2.然后运行并且现在nginx
3.3.查看文件夹目录
3.4.吧文件拷贝到html目录下面,然后进入进入文件夹查看文件,并且输入81端口号可以访问
4.添加方式 (卷共享)
docker run -d --name host_data1 -v /path/to/host/data1:/var/lib/docker/containers/container1_data1 -v /path/to/host/data2:/var/lib/docker/containers/container2_data2 container_image
卷共享:将多个容器的数据卷共享,实现数据的复制。例如,宿主机上有两个数据卷 data1 和 data2,要将它们共享,可以使用以下命令:
5.添加方式
DockerFile的作用
1概念
注:再dockerfile里面把所以的环境依赖下载,然后打包成一个镜像,再容器运行
2. Dockerfile的基本组成
dockerfile有一系列指令和参数组成,每条指令都必须为大写,执行时按顺序从上到下执行,所以应该根据需要合理安排指令的顺序。
Dockerfile的基本组成及说明:
组成 | 说明 |
基础镜像信息 | FROM |
维护者信息 | MAINTAINER |
镜像操作指令 | RUN、(COPY/ADD)、EXPOSE、WORKDIR、ONBUILD、USER、、VOLUME等 |
容器启动时执行指令 | CMD、ENTRYPOINT |
2.1 FROM
指定基础镜像,如:
FROM ubuntu:18.04
2.2 MAINTAINER
指定该镜像的作者及电子邮件等信息
MAINTAINER lisen "xxxxx@163.com"
2.3 RUN
在镜像内部执行的指令,如安装软件,配置基础环境等,可用\进行换行
RUN echo 'hello' > /usr/local/file.txt
也可以使用exec格式,RUN ["命令", "参数1","参数2"], 如:
RUN ["apt-get", "install", "-y", "ubuntu"]
2.4 COPY
将主机的文件复制到镜像中,如果目的目录不存在,docker会自动创建所需目录结构。注意:该命令只是单纯的复制,并不会做文件的提取解压工作。
COPY file.txt /usr/local
注:需复制的文件或目录必须要放在Dockerfile文件的同级目录下。
2.5 ADD
将宿主机文件复制到镜像,该命令与COPY命令作用和用法是一样的,但ADD命令会对压缩文件做解压和提取操作(tar,gzip等)
2.6 EXPOSE
暴露镜像的端口供主机做端口映射,运行镜像时使用-P参数将镜像端口与宿主机随机端口或指定端口做映射。
示例:
EXPOSE 8080
可以通过docker port查看到端口的映射情况。
2.7 WORKDIR
WORKDIR指令用来在从镜像创建一个新容器时,在容器内部设置一个工作目录,ENTRYPOINT和/或CMD指定的程序会在这个目录下执行。
我们可以使用该指令为Dockerfile中后续的一系列指令设置工作目录,也可以为最终的容器设置工作目录。
示例:
WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT [ "rackup" ]
这里,我们将工作目录切换为/opt/webapp/db后运行了bundle install命令,之后又将工作目录设置为/opt/webapp,最后设置了ENTRYPOINT指令来启动rackup命令。
可以通过-w标志在运行时覆盖工作目录,如代码清单4-57所示。
代码清单4-57 覆盖工作目录
$ sudo docker run -ti -w /var/log ubuntu pwd
/var/log
该命令会将容器内的工作目录设置为/var/log。
2.8 ONBUILD
当一个包含ONBUILD命令的镜像被用作其他镜像的基本镜像时,ONBUILD指令将执行。
例如:base-image
FROM ubuntu
ONBUILD ADD . /var/www
......
当使用base-image作基础镜像创建imageA时,
FROM base-image
......
则base-image基础镜像的 ONBUILD指令会执行
2.9 USER
指定镜像以什么用户执行
USER user01
2.10 VOLUME
向基于镜像创建的容器添加卷。一个卷是可以存在于一个或者多个容器内的特定的目录,这个目录可以绕过联合文件系统,并提供如下共享数据或者对数据进行持久化的功能。
示例:
#使用VOLUME 指令向容器添加volume
VOLUME /data
#可以添加多个
VOLUME ["/data1","/data2"] #添加多个
注意:VOLUME指令不能挂载宿主机中指定的目录,这是为了保证Dockerfile的可移植性,因为不能保证所有的宿主机都有对应的目录。
2.11 CMD
CMD指令用于指定一个容器启动时要运行的命令,这有点儿类似于RUN指令,只是RUN指令是指定镜像被构建时要运行的命令,而CMD是指定容器被启动时要运行的命令。
例如:
$ sudo docker run -i -t jamtur01/static_web /bin/true
在Dockerfile中以下的CMD指令是等效的
CMD ["/bin/true"]
可以为要运行的命令指定参数,以下代码清单
CMD ["/bin/bash", "-l"]
这里我们将-l参数传递给了/bin/bash命令。
需要注意的是使用docker run命令可以覆盖CMD指令,如果我们在Dockerfile里指定了CMD指令,而同时在docker run命令行中也指定了要运行的命令,命令行中指定的命令会覆盖Dockerfile中的CMD指令。
2.12 ENTRYPOINT
ENTRYPOINT指令与CMD指令很相似,它们的区别在于ENTRYPOINT指令提供的命令不容易在启动容器时被覆盖,docker run命令行中指定的任何参数都会当作参数再次传给ENTRYPOINT命令。
ENTRYPOINT命令的一个示例:
ENTRYPOINT ["/usr/sbin/nginx"]
与CMD命令相似,ENTRYPOINT命令可以使用数组形式指定参数,如以下代码清单:
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
若我们构建镜像,并将ENTRYPOINT设置为ENTRYPOINT["/usr/sbin/nginx"],用docker build构建镜像,代码清单如下:
$ sudo docker build -t="jamtur01/static_web" .
然后用如下命令启动容器:
sudo docker run –t -i jamtur01/static_web -g "daemon off;"
则命令行参数-g "daemon off;"会传递给ENTRYPOINT指定的命令。在这里该命令为/usr/sbin/nginx -g "daemon off;"。该命令会以前台运行的方式启动Nginx守护进程,此时这个容器就会作为一台Web服务器来运行
3.编写规范
4.为什么使用run执行centos之后他就会自动进入,不需要bash
注:因为他会默认执行
5为什么docker不能使用vim插件语法
yum -y install vim
注:因为docker是一个轻量级的容器,不是所有的都会下载,需要手动下载
6.Dockerfile文件如下
#0.vi Dockerfile进入编辑模式
#1.指定基础镜像,并且必须是第一条指令
FROM ubuntu:latest
#2.指明该镜像的作者和其电子邮件
MAINTAINER zs "zs@qq.com"
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/java
#4.一个复制命令,把jdk安装文件复制到镜像中,语法:ADD <src>... <dest>,注意:jdk*.tar.gz使用的是相对路径
ADD jdk-8u151-linux-x64.tar.gz /usr/local/java/
#5.配置环境变量
ENV JAVA_HOME=/usr/local/java/jdk1.8.0_151
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
#容器启动时需要执行的命令
#CMD ["java","-version"]
docker-compose的作用
注:可以给定一个顺序,比如按顺序运行依赖,先运行mysql,reids,nginx,最后再运行springboot项目