美文网首页
Docker超详细学习笔记

Docker超详细学习笔记

作者: java时光 | 来源:发表于2021-10-17 19:23 被阅读0次

    Docker概述

    Docker文档中心: https://docs.docker.com/

    Docker商店: https://hub.docker.com/

    Docker为什么出现?

    • 一款产品:开发-上线 两套环境,各不相同,维护麻烦!

    • 开发--运维 开发在自己的电脑上运行良好,然后把项目打成jar包或是war包,丢给运维,运维需要配置各种环境,各种集群,压力超大,而且还很有可能失败!

    • 版本更新,导致服务不可用!

    • Docker可以把项目和它所依赖的环境整合打包,非常方便!

    • Docker的思想就来自于集装箱,应用之间相互隔离,隔离的思想

    • Docker通过隔离机制,将服务器利用到极致

    Docker安装步骤

     #1、卸载旧的版本
     $ sudo yum remove docker \
                       docker-client \
                       docker-client-latest \
                       docker-common \
                       docker-latest \
                       docker-latest-logrotate \
                       docker-logrotate \
                       docker-engine
     #2、需要安装包
     yum install -y yum-utils
     #3、设置镜像地址
     官方地址:
     yum-config-manager \
         --add-repo \
         https://download.docker.com/linux/centos/docker-ce.repo
     阿里云镜像地址(推荐):
     yum-config-manager \
         --add-repo \
         http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
     
     #更新yum软件包索引
     yum makecache fast
     
     #4、安装docker相关的
     yum install docker-ce docker-ce-cli containerd.io
     #5、启动docker
         systemctl start docker
     #6、判断Docker是否启动成功
     docker version
     #7、测试DOcker
     docker run hello-world
     #8、查看镜像
     docker images
     #9、配置 阿里云docker 镜像加速(要配置你自己的)
     sudo mkdir -p /etc/docker
     
     sudo tee /etc/docker/daemon.json <<-'EOF'
     {
       "registry-mirrors": ["https://5mybeny2.mirror.aliyuncs.com"]
     }
     EOF
     
     sudo systemctl daemon-reload
     
     sudo systemctl restart docker

    登录你自己的阿里云账号,找到自己的镜像加速如下图:

    卸载

     #1、卸载Docker Engine,CLI和Containerd软件包:
     $ sudo yum remove docker-ce docker-ce-cli containerd.io
     #2、主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷:
     $ sudo rm -rf /var/lib/docker

    Docker流程

    Docker组成

    Docker运行流程图

    Docker底层原理

    Docker是怎么工作的

    Docker是server-client结构的系统,Docker的守护进程运行在主机上,通过socket从客户端访问

    Docker-server接收到Docker-client的指令,就会去执行这个指令

    Docker为什么比虚拟机快

    1.Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。

    2.Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。

    Docker的常用命令

    帮助命令

     docker version #查看docker版本信息
     docker info    #查看docker系统信息
     docker --help  #查看docker帮助命令

    镜像命令

    查询本地已有镜像

     docker images -qa #一般用这个,其中q表示显示id,a显示所有

    查询商店中相关软件: docker search

     docker search mysql

    下载镜像

     docker pull 镜像名[:tag]

    删除镜像

     docker rmi -f 镜像id1 镜像id2 #删除多个镜像
     docker rmi -f $(docker images -qa) #删除全部镜像

    容器命令

    ps:我们有了镜像才能创建容器,下载一个centos镜像来学习

     docker pull centos

    新建容器并启动

     docker run [可选参数] image
     #参数说明
     --name="Name" 容器名字
     -d  以后台方式运行
     -it 使用交互方式运行,进入容器查看
     -p(小p) 指定容器的端口
      -p 主机端口:容器端口
      -p 容器端口
     -P(大p) 随机指定端口
     例子:docker run -it centos /bin/bash

    列出所有正在运行的容器

     docker ps
      没有参数查看正在运行的容器
     -a  查看曾经运行过的
     -n=? 显示最近创建的容器
     -q  只显示容器的编号

    退出容器

     exit 直接容器停止并退出
     ctrl+p+q  容器不停止退出

    删除容器

     docker rm 容器id  删除指定的容器,容器正在运行则不能删除
     docker rm -f $(docker ps -aq) 删除所有容器
     docker ps -a -q|xargs docker rm 删除所有容器

    启动和停止容器的操作

     docker start 容器id  #启动容器
     docker restart 容器id #重启容器
     docker stop 容器id #停掉容器
     docker kill 容器id #杀掉容器

    其他命令

    后台启动容器

     docker run -d 镜像名
     #docker ps,发现centos停止了
     #常见的坑,docker容器使用后台启动,就必须有一个前台进程,docker发现没有应用,就会自动停止
     #解决办法,以这个命令启动:docker run -d -it centos /bin/bash

    查看日志

     docker logs -tf --tail 10 容器id
     -tf 显示全部的
     --tail number 显示指定条数

    查看容器中进程信息

     docker top 容器id

    查看镜像元数据

     docker inspect 容器id

    进入当前正在运行的容器

     #方式一,进入容器开启一个新终端
     docker exec -it 容器id /bin/bash
     #方式二,进入容器正在执行的终端
     docker attach 容器id

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

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

    Docker操作详细图解

    作业练习

    Docker安装nginx

     #1、搜索镜像
     docker search nginx
     #2、拉取镜像
     docker pull nginx
     #3、启动容器
     docker run -d --name nginx01 -p 3304:80 nginx
     ps:3304是主机端口,暴露给外部访问,80是容器内部的端口

    端口暴露的概念:

    思考问题:我们每次改动nginx配置文件,都要进入容器内部?十分的麻烦,我们可以在容器外提供一个映射路径,达到在容器外修改,容器内就能修改? -v  数据卷

    Docker安装tomcat

     #官方使用
     docker run -it --rm tomcat:9.0
     --rm:用完之后立即删掉
     #docker启动的tomcat发现以下问题:1、Linux命令少了;2、没有webapps 3、阿里云镜像默认是最小得镜像,所有不必要的都剔除掉,保证最小的可运行环境

    部署es+kibana

     #es暴露的端口很多,十分耗内存
     #数据一般要放到安全目录,挂载
     #1、拉取镜像
     docker pull elasticsearch:7.14.2
     #2、创建用户自定义网络
     docker network create hahanetwork
     #3、运行es:
     docker run --name elasticsearch --net hahanetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" -d elasticsearch:7.14.2
     #ps:这个启动之后超级卡,linux终端都卡住了
     #docker stats 查看状态

    思考:kibana连接es?思考网络如何才能连接过去!

    Docker镜像

    镜像是什么

    • 镜像是一层一层的,我们从商店中pull一个应用到本地,它是一层一层下载的,镜像就是这种有很多层叠加而来的

    • 镜像不但包含了软件包本身,还包含了其所需运行环境,各种配置,所以镜像只需要启动就可以使用了,免去了以前安装软件时,各种安装依赖、修改配置等繁琐的工作

    Docker镜像加载原理

    1. 加载boot层,也就是引导层

    2. 加载root层,也就是/root ,/user这些linux目录

    3. 加载容器层,也就是docker本身相关的东西

     #1、docker加载的底层层级能共用的就共用,比如tomcat和mysql共用了boot层
     #2、docker之所以快,一是因为它的每一层都尽量精简,也就是阉割版;二是因为它不需要每次都去加载boot层,boot层加载时间是分钟级别的,容器层加载时秒级别的
    • Docker镜像都是只读的,当容器启动时,一个新的可写层被加入到镜像的顶部!

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

    commit镜像

    commit镜像的意思是说把一个容器生成为一个本地镜像,并没有上传到docker商店

     #命令和git原理类似
     docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
     #commit镜像类似于虚拟机的快照

    容器数据卷

    什么是容器数据卷

    docker理念回顾

    • 将应用和环境打包成一个镜像!

    • 数据?如果数据在容器中,那么我们删除容器,数据就会丢失!需求:数据可以持久化

    • mysql,容器删了,删库跑路!需求:mysql数据可以本地存储

    • 容器之间可以有一个数据共享的技术!Docker容器产生的数据,同步到本地!

    • 这就是卷技术!目录的挂载,将我们容器内的目录,挂载到linux上面!

    总结:容器的持久化和同步操作,容器间的数据也是可以共享的!(可以和vue的双向绑定类比)

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

    使用数据卷

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

     docker run -it -v 本机目录:容器目录  镜像id /bin/bash

    实战:同步mysql数据

     #1、下载mysql
     [root@localhost dockerfile]# docker pull mysql:5.7
     
     #2、启动mysql容器
     -d 后台运行
     -p 端口映射
     -v 卷挂载
     -e 环境配置
     --name 指定容器名字
     [root@localhost dockerfile]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mysql01 mysql:5.7
     
     #3、在本地用navicat连接mysql,新建一个数据库test,可以在linux中和mysql容器中查看到test
     [root@localhost dockerfile]# cd /home/mysql/data/
     [root@localhost data]# ls
     auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
     ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
     ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem  test
     [root@localhost data]# docker exec -it b9ff5c7b7ce7 /bin/bash
     root@b9ff5c7b7ce7:/# cd /var/lib/mysql
     root@b9ff5c7b7ce7:/var/lib/mysql# ls
     auto.cnf    client-cert.pem  ib_logfile0  ibtmp1              private_key.pem  server-key.pem
     ca-key.pem  client-key.pem   ib_logfile1  mysql               public_key.pem   sys
     ca.pem      ib_buffer_pool   ibdata1      performance_schema  server-cert.pem  test

    具名挂载和匿名挂载

     docker run -d -P --name nginx01 -v [卷名:]/etc/nginx[:ro|rw] nginx
     #解释:只写容器内路径,不指定本地路径,是匿名挂载,写了卷名是具名挂载,
     #ro表示在容器内部只读,但在外面可以修改
     #rw表示可读可写
     #配置文件建议rw,数据库文件建议ro
     docker volume ls
     docker volume inspect 卷名
    • 所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volume/xxx/_data

    • 我们可以通过具名挂载方便地找到我们的一个卷,大多数情况下使用具名挂载

     #如何确定是具名挂载还是匿名挂载,还是指定路径挂载
     -v 容器内路径  #匿名挂载
     -v 卷名:容器内路径  #具名挂载
     -v /宿主机路径:容器内路径 #指定路径挂载

    方式二:使用Dockerfile

    Dockerfile就是用来构建docker镜像的构建文件,是一段命令脚本

    实验:编写一个Dockerfile

    生成镜像命令:

     docker build -f /home/docker/dockerfile01 -t 镜像名 .
     #ps:最后有一个"."

    数据卷容器

    多个mysql同步数据!

    --volumes-from

    案例:多个mysql实现数据共享

     [root@localhost dockerfile]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mysql01 mysql:5.7
     
     [root@localhost dockerfile]# docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=admin --name mysql02 mysql:5.7 --volumes-from mysql01

    结论:

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

    DockerFile

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

    构建步骤:

    1. 编写一个dockerfile文件

    2. docker  build构建一个镜像

    3. docker run运行镜像

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

    Dockerfile构建过程

    基础知识:

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

    2. 执行从上到下执行

    3. #表示注释

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

    dockerfile是面向开发的,我们以后要发布项目,做镜像,就要编写dockerfile文件,发布项目镜像给下游!

    Docker镜像逐渐成为企业交付的标准,必须要掌握!

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

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

    DockerImage:通过Dockerfile构建生成的镜像,最终发布和运行的产品(以前是jar和war包)

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

    Dockerfile构建指令:

    实战测试

    实战1:创建自己的centos:

    1、原始的centos没有vim和ifconfig

     
     [root@localhost dockerfile]# docker images
     REPOSITORY      TAG       IMAGE ID       CREATED       SIZE
     hello-world     latest    feb5d9fea6a5   3 weeks ago   13.3kB
     centos          latest    5d0da3dc9764   4 weeks ago   231MB
     elasticsearch   7.14.2    2abd5342ace0   4 weeks ago   1.04GB
     [root@localhost dockerfile]# docker run -it centos
     [root@7a61c7e92b9f /]# pwd
     /
     [root@7a61c7e92b9f /]# vim
     bash: vim: command not found
     [root@7a61c7e92b9f /]# ifconfig
     bash: ifconfig: command not found
     [root@7a61c7e92b9f /]# ifconfig
     bash: ifconfig: command not found

    2、构建dockerfile文件

     [root@localhost dockerfile]# vi mydockerfile.centos
     [root@localhost dockerfile]# cat mydockerfile.centos
     FROM centos
     MAINTAINER whw<353538982@qq.com>
     
     ENV MYPATH /usr/local
     WORKDIR $MYPATH
     
     RUN yum -y install vim
     RUN yum -y install net-tools
     
     EXPOSE 80
     
     ENTRYPOINT echo $MYPATH
     ENTRYPOINT echo "---END---"
     ENTRYPOINT /bin/bash

    3、构建镜像

     [root@localhost dockerfile]# docker build -f mydockerfile.centos -t mycentos:0.1 .

    4、运行容器并验证

     [root@localhost dockerfile]# docker images
     REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
     mycentos        0.1       93cdc922f14e   43 seconds ago   336MB
     hello-world     latest    feb5d9fea6a5   3 weeks ago      13.3kB
     centos          latest    5d0da3dc9764   4 weeks ago      231MB
     elasticsearch   7.14.2    2abd5342ace0   4 weeks ago      1.04GB
     [root@localhost dockerfile]# docker run -it mycentos:0.1 /bin/bash
     [root@c8f0ff352c8a local]# pwd
     /usr/local
     [root@c8f0ff352c8a local]# ifconfig
     eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
             inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
             ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
             RX packets 8  bytes 656 (656.0 B)
             RX errors 0  dropped 0  overruns 0  frame 0
             TX packets 0  bytes 0 (0.0 B)
             TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
     
     lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
             inet 127.0.0.1  netmask 255.0.0.0
             loop  txqueuelen 1000  (Local Loopback)
             RX packets 0  bytes 0 (0.0 B)
             RX errors 0  dropped 0  overruns 0  frame 0
             TX packets 0  bytes 0 (0.0 B)
             TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
     

    实战2:创建自己的tomcat镜像

    1、准备镜像文件tomcat压缩包、jdk压缩包

     [root@localhost dockerfile]# ll
     total 153428
     -rw-r--r--. 1 root root  11576317 Oct 17 01:52 apache-tomcat-9.0.54.tar.gz
     -rw-r--r--. 1 root root 145520298 Oct 17 01:52 jdk-8u301-linux-x64.tar.gz
     -rw-r--r--. 1 root root       201 Oct 16 15:02 mydockerfile.centos
     -rw-r--r--. 1 root root       550 Oct 17 02:10 mydockerfile.tomcat
     

    2、编写Dockerfile文件

     [root@localhost dockerfile]# cat mydockerfile.tomcat
     #基础镜像
     FROM centos
     
     #作者
     MAINTAINER whw<353538982@qq.com>
     
     #设置工作目录
     ENV MYPATH /usr/local
     WORKDIR $MYPATH
     
     #复制文件
     COPY readme.txt $MYPATH/readme.txt
     
     #添加jdk和tomcat到容器
     ADD apache-tomcat-9.0.54.tar.gz $MYPATH
     ADD jdk-8u301-linux-x64.tar.gz $MYPATH
     
     #安装vim
     RUN yum -y install vim
     
     #设置环境变量
     
     ENV JAVA_HOME $MYPATH/jdk1.8.0_301
     ENV PATH $PATH:$JAVA_HOME/bin
     
     #暴露端口
     EXPOSE 8080
     
     #启动tomcat(注意:这里CMD建议用ENTRYPOINT代替,否则启动容器时如果后面加了命令如/bin/bash很可能不会启动tomcat)
     CMD ["/usr/local/apache-tomcat-9.0.54/bin/catalina.sh","run"]

    3、构建镜像

     [root@localhost dockerfile]# docker build -f mydockerfile.tomcat -t mytomcat:1.0 .

    4、运行镜像并验证

     docker run -it -p 9090:8080 --name diytomcat mytomcat:1.0

    原创不易,拒绝白嫖,请点赞和关注,微信公众号:java时光

    相关文章

      网友评论

          本文标题:Docker超详细学习笔记

          本文链接:https://www.haomeiwen.com/subject/kmmwoltx.html