Docker

Docker概述

Docker为什么会出现

一款产品的开发上线需要两套环境:应用环境,应用配置。

环境配置十分麻烦,每一台机器都要部署环境(集群Redis、ES、Hadoop)费事费力。

Docker给以上问题,提出了方案。

隔离:Docker核心思想,打包装箱,每个箱子是相互隔离的。

文档地址:https://docs.docker.com/ 

仓库地址:https://hub.docker.com/

虚拟机缺点:

        资源占用很多

        冗余步骤多

        启动很慢

容器化技术:

容器化技术不是模拟的一个完整的操作系统

比较docker和虚拟机技术的不同:

        传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件

        容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件

        每个容器间互相隔离,每个容器内都有一个属于自己的文件系统,互不影响

DevOps(开发、运维)

        应用更快速的交付和部署

        更便捷的升级和扩缩容

        更简单的系统运维

        更高效的计算资源利用

Docker安装

Docker的基本组成

镜像(image):

        docker镜像好比是一个模板,可以通过这个模板来创建容器服务,可以创建多个容器,(最终服务运行或项目运行就是在容器中)

容器(container):

        Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的,

        启动、停止、删除、基本命令

        目前就可以把这个容器理解为就是一个简易的Linux系统

仓库(repository): 

        存放镜像的地方,有本地仓库和云上仓库,

        Docker hub(默认是国外的)

        阿里云。。都有容器服务器(配置镜像加速)

安装Docker

1、删除旧版docker
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
2、需要的一些安装包
 sudo yum install -y yum-utils
3、设置阿里云镜像仓库
 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、更新索引
yum makecache fast
5、安装docker相关的
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
6、启动docker,使用version测试是否安装成功
systemctl start docker
docker version

卸载docker
sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
rm -rf /var/lib/docker

阿里云镜像加速

登录阿里云,找到镜像加速器

针对Docker客户端版本大于 1.10.0 的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://exuw07w8.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

回顾hello-world流程 

底层原理

Docker是怎么工作的?

docker是一个c/s结构系统,docker的守护进程运行在主机上。通过socket从客户端访问。

dockerserver接收到dockerclient的指令,就会执行这个命令。

Docker为什么比vm块?

1.docker有着比虚拟机更少的抽象层。

vm

docker 

 2.docker利用的是宿主机的内核,vm需要Guest OS。

        所以说,新建一个容器时,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载GUest Os,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级别的。

Docker常用命令

帮助命令

docker version

docker info

docker --help

镜像命令

docker images 

#解释

REPOSITORY        镜像仓库源

TAG                         镜像标签

IMAGE ID                镜像ID

CREATED               镜像创建的时间

SIZE                        镜像的大小

#可选项

-a:列出所有

-q:只显示镜像id

docker search 

#可选项

--filter=STARS=5000         搜索STARS大于5000的

docker pull 【镜像】: 下载镜像

#可选

:tag:版本。如果不写tag,默认最新。

docker pull mysql 等价于

docker pull docker.io/library/mysql:latest

docker rmi :删除镜像

docker rmi -f 镜像id。。。

容器命令

新建容器并启动

        docker run 【参数】 image

#参数

--name=“NAME”        容器名

-d                                后台运行

-it                                使用交互方式进行,进入容器查看内容

-p                                指定容器的端口 -p 8080:8080

        -p 主机端口:容器端口(常用)

        -p 容器端口

        容器端口

        -p ip:主机端口:容器端口

-P                                随机指定端口

列出所有运行的容器

        docker ps

        -a列出当前正在运行的容器+带出历史运行过的容器

        -n=? 显示最近创建的容器

        -q 只显示容器的编号

退出容器

        exit 容器停止退出

        ctrl +P+Q 容器不停止退出

删除容器

        docker rm 容器id                                  删除指定容器,不能删除正在运行的容器,要强制-f

        docker rm -f $(docker ps -aq)          删除所有容器

启停容器

        start、restart、stop、kill

常用其他命令

后台启动容器

        通过-d后台启动容器,ps时发现容器停止了。其实是docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志

        docker logs

        -tf:显示全部

        --tail number : 要显示的日志条数

查看容器中进程信息

        docker top 【容器id】

查看镜像的元数据

        docker inspect 【容器id】

进入当前正在运行的容器

        我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置

        1.docker exec -it 【容器id】 bashshell

        2.docker attach 【容器id】

        两个的区别,前者进入容器后开启一个新的终端,可以在里面操作(常用);后者进入容器正在执行的终端,不会启动新的进程。

从容器内拷贝文件到主机上

        docker cp 容器id:容器内路径   目的的主机路径

        拷贝是一个手动过程,未来我们使用-v卷的技术,可以实现,自动同步。

练习安装tomcat

发现问题:1、linux命令变少了,2、没有webapps。阿里云镜像的原因。默认是最小镜像,所有不必要的都剔除掉。保证最小可运行环境!

本应在webapps中的文件都在webapps.dist中。

我们以后要部署项目,每次进去很麻烦,我们要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了!

修改配置文件 -e 环境配置修改

-e  ES_JAVA_OPTS="-Xms64m -Xmx512m"

可视化

        portainer(先用这个)

                docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

        Rancher(CI/CD再用)

       什么是portainer?

        docker图形化界面管理工具!提供后台面板提供我们操作!

        docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

        可视化面板不太用,了解即可

镜像        

docker镜像

        特点:docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!

                这一层就是我们通常说的容器层,容器之下的都叫镜像层!

commit镜像

        docker commit 提交容器成为一个新的副本

        docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名:[TAG]

容器镜像卷

什么是

        如果数据存在容器中,那么容器删除,数据也就丢失了!我们需要数据可以持久化,如MySQL。docker容器产生的数据同步到本地,这就是卷技术,将我们的容器的目录挂载到Linux上面!一句话,容器的持久化和同步操作!容器间也是可以数据共享的!

使用数据卷

        方式一:直接使用命令来挂载  -v

                docker run -it -v 主机目录:容器内目录

                我们可以通过 docker inspect id 查看是否挂载到

        好处:我们以后修改只需要本地修改即可,容器会自动同步!

实战 MYSQL

        注意安装mysql要配置密码!

-e MYSQL_ROOT_PASSWORD=XXXXX

具名和匿名挂载 

匿名

        -v 容器内路径!

        docker run -d -P --name nginx01 -v /etc/nginx iginx 

        docker volum ls

        这里可以发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径!

具名

        -v 卷名:容器内路径

如何确定:

        -v 容器内路径                                        匿名挂载

        -v 卷名:容器内路径                             具名挂载

        -v /宿主机路径:容器内路径                 指定路径挂载

拓展:

        通过-v 容器内路径:ro rw 改变读写权限

        ro: read only

        rw:readwrite

        只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的!

初识Dockerfile

        dockerfile就是用来构建docker镜像的构建文件!命令脚本!先体验一下!

        通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!

        1.创建一个dockerfile文件,名字可以随机 建议 dockerfile

        2.文件中的内容 指令(大写) 参数

        这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像,假设构建镜像时没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!

数据卷容器(--volumes-from)

多个mysql同步数据!

结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

        但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

Dockerfile

dockerfile介绍

dockerfile是用来构建docker镜像的文件!命令参数脚本!

构建步骤:

        1.编写一个dockerfile文件

        2.docker build 构建成为一个镜像        

        3.docker run 运行镜像

        4.docker push 发布镜像(DockerHub、阿里云镜像仓库)

很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!官方既然可以制作镜像,那我们也可以!

Dockerfile的构建过程

基础知识:

1.每个保留关键字(指令)都必须是大写字母

2.执行从上至下顺序执行

3.#表示注释

4.每一个指令都会创建提交一个新的镜像层,并提交!

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!docker镜像逐渐成为企业交付的标准,必须要掌握!

步骤:开发,部署,运维。。。缺一不可!

dockerfile:构建文件,定义了一切的步骤,源代码

dockerimages:通过dockerfile构建生成的镜像,最终发布和运行的产品!

docker容器:容器就是镜像运行起来提供服务器

dockerfile指令

FROM                                基础镜像,一切从这里开始构建  centos

MAINTAINER                     镜像是谁写的,姓名+邮箱

RUN                                   镜像构建的时候需要运行的命令

ADD                                   步骤:tomcat镜像,这个tomcat压缩包!添加内容

WORKDIR                         镜像的工作目录

VOLUME                           挂载的目录

EXPOSE                           暴露端口配置

CMD                                  指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

ENTRYPOINT                   指定这个容器启动的时候要运行的命令,可以追加命令

ONBUILD                          当构建一个被继承Dockerfile这个时候就会运行ONBUILD的指令。触发指令。

COPY                                类似ADD,将我们文件拷贝到镜像中

ENV                                   构建的时候设置环境变量!

CMD和ENTRYPOINT的区别

        在run镜像的时候,如果想在CMD已经有命令的情况下,加命令,比如加参数-l,无法生效,因为CMD只有最后一个命令生效,而-l不是正确的命令,故必须编写完整的命令。而ENTRYPOINT可以追加。

dockerfile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们然后测试效果。

实战 Tomcat

1.准备镜像文件,tomcat压缩包,jdk的压缩包!

2.编写dockfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要-f指定了

FROM centos

MAINTAINER lituo<2793064043@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u371-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.34.tar.gz /usr/local/

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.34
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.34
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.34/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.34/bin/logs/catalina.out
 

3.构建镜像

4.启动镜像

5.访问测试

6.发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)

发布自己的镜像

dockerhub或者阿里云

1.地址 http://hub.docker.com/注册自己的账户!

2.确定账户可登录

3.在我们的服务器上提交自己的镜像

4.登录完毕后就可以提交镜像了,就是一步 docker push

阿里云镜像服务

1.登录阿里云

2.找到容器镜像服务

3.创建命名空间

4.创建容器镜像

阿里云容器镜像的就参考官方地址!

Docker网络

理解Docker网络

清空所有环境

测试

        ip addr:本地回环地址、阿里云内网地址、docker0地址

三个网络

问题:docker是如何处理容器网络访问的?比如tomcat如何访问mysql

原理:

       1.我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!

        2.再启动一个容器测试,发现又多了一对网卡!

        我们发现这个容器带来网卡,都是一对对的。evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的。OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术。

        3.我们测试下两个容器之间是否可以ping通?可以ping通

        结论:容器和容器之间是可以互相ping通的;两个容器是公用的一个路由器,docker0;所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP。

        小结:docker使用的是Linux的桥接,宿主机中是一个docker容器的网桥docker0。docker中的所有的网络接口都是虚拟的。虚拟的转发效率高!只要容器删除,对应网桥一对就没了!

--link

思考:我们编写了一个微服务,database url=ip:,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以通过名字来进行访问容器。

如何解决:

docker run -d -P --name tomcat03 --link tomcat02 tomcat

这样3就可以ping通2,但是2并不一定能ping通3。

在查看容器的hosts中能找到配置172.17.0.3    tomcat02 ,所以能直接用名字ping通。

我们现在玩Docker已经不这样使用--link了。

自定义网络!不适用docker0!

docker0问题:他不支持容器名连接访问!

自定义网络

网络模式

        bridge:桥接,在docker上搭桥(默认)。自己创建也使用桥接模式。

        none:不配置网络。

        host:和宿主机共享网络。

        container:容器网络连通!(用的少!局限很大)。

docker0的特点:默认,域名不能访问,--link可以打通连接!

我们可以自定义一个网络!

 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

这时候在运行镜像时,将--net 设置成我们自己创建的网络 mynet,接下来,在此网络下的所有容器可以相互使用容器名来ping通。推荐我们平时这样使用网络!

好处:

        不同的集群使用不同的网络,保证集群是安全和健康的

网络连通

connect命令:Connect a container to a network

连通之后,就是将其加入到自定义的网络下。一个容器两个ip地址。

结论:假设要跨网络操作别人,就需要使用docker network connect 连通!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值