Docker超详细学习笔记

Docker概述

Docker文档中心: Docker Documentation | Docker Documentation

Docker商店: Docker Hub

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值