Docker超详细学习笔记

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时光


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容

  • 深入浅出Docker学习笔记 Docker引擎 Docker引擎:用来运行和管理容器的核心文件模块化(基于开放容器...
    yuq329阅读 822评论 0 4
  • 目录 [TOC] 1. 简介 Docker是GO语言实现的开源项目,基于Linux容器技术,主要目标是一次封装,到...
    水煮鱼又失败了阅读 272评论 0 2
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,505评论 0 120
  • 1 Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub:...
    小波同学阅读 498评论 0 3
  • 镜像命令 docker images docker images: 查看本地的所有镜像 后面可以跟的常用参数有 :...
    xiaoshengMar阅读 234评论 0 0