您现在的位置是:首页 >学无止境 >为什么需要使用Docker网站首页学无止境

为什么需要使用Docker

一只奈良森屿 2023-07-18 00:00:03
简介为什么需要使用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项目

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。