Docker

Docker

docker:

是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

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

  • 传统虚拟机:虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
  • 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件
  • 每个容器间是互相隔离的,每个容器内都有一个属于自己的文件系统,互不影响

DevOps:

应用更快速的交付和部署

传统:帮助文档 Docker:打包镜像发布测试,一键运行

更便捷的升级和扩缩容

项目打包为一个镜像,扩展

更简单的系统运维

在容器化之后,我们的开发和测试环境都是高度一致的

更高效的计算资源利用

Docker是内核级别的虚拟化,可以在一个物理机上可以运行更多的容器实例,服务器的性能可以被压榨到极致

Docker的基本组成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fLk5Mbg4-1619158554523)(https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fidig8.com%2Fwp-content%2Fuploads%2F2019%2F06%2F11223715-84d39f17b34aa40f.png&refer=http%3A%2F%2Fidig8.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1619703445&t=074e6432a7877d375d7acd04f4c6fee5)]

镜像(Image):

docker镜像就好比是一个模型,可以通过这个模型来创建容器服务,tomcat镜像=>run=>tomcat01容器(提供服务器),通过这个镜像可以创建多个容器,最终服务运行或者项目运行就是在容器中的。

容器(counter):

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

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

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

仓库(Repository):

仓库就是存放镜像的地方,仓库分为公有仓库和私有仓库

Docker Hub(默认是国外的)

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

Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。Docker容器通过Docker镜像来创建,容器与镜像的关系类似于面向对象编程中的对象与类

启动Docker:

systemctl start docker

查看docker是否启动成功:

docker version

下载镜像,查看镜像:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WKf86lHY-1619158554531)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210331104455560.png)]

run的运行流程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AyGa9BWt-1619158554533)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210331110535905.png)]

底层原理

Docker是怎么工作?

Docker是一个Client-Server结构的系统,Docker的守护进程进行运行在主机上,通过Docker客户端访问!

DockerServer接收Docker.Client的指令,就会执行这个命令!

Docker为什么比VM快?

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

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eQuZci6I-1619158554536)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210331112038647.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AONuKMwe-1619158554538)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210331112426077.png)]

Docker的常用命令

帮助命令:

docker version #显示docker的版本信息
docker info #显示docker的系统信息
docker 命令 --help #万能命令

镜像命令:

docker images 查看所有本地的主机上的镜像

[root@localhost /]# docker images
REPOSITORY      TAG          IMAGE ID       CREATED         SIZE
rabbitmq        management   e2d949b43dc1   5 days ago      187MB
mysql           5.7          a70d36bc331a   2 months ago    449MB
redis           latest       621ceef7494a   2 months ago    104MB
hello-world     latest       bf756fb1ae65   15 months ago   13.3kB
kibana          7.4.2        230d3ded1abc   17 months ago   1.1GB
elasticsearch   7.4.2        b1179d41a7b4   17 months ago   855MB
nginx           1.10         0346349a1a64   4 years ago     182MB

REPOSITORY 镜像的仓库源 TAG 镜像的标签

IMAGE ID 镜像的ID CREATED 镜像的创建时间 SIZE 镜像的大小

可选项:

-a, --all 列出所有的镜像 -q --quest 只显示镜像的id

docker search 搜素镜像

[root@localhost /]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10676     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   4010      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   780                  

可选项:

–filter=STARS=3000 搜索出的镜像就是STARS大于3000

docker pull 下载镜像

分层下载

docker rmi 删除镜像

docker rmi -f 容器id #删除指定的镜像
docker rmi -f ${docker images -aq} #删除所有镜像

容器的基本命令

说明:我们有了镜像才可以创建容器,Linux下载一个centos镜像来测试学习

docker pull centos

新建容器并启动

docker run [可选参数] images

#参数说明
--name="name"  容器名字 tomcat01 tomcat02 用来区分容器
-d			   后台方式运行
-i			   使用交互方式运行,进入容器查看内容
-p  		   指定容器的端口  -p 8080:8080
	-p 主机端口:容器端口(常用)
	-p 容器端口
	容器端口
-p  		   随机指定端口
#测试:启动并进入容器
[root@localhost /]# docker run -it centos /bin/bash
[root@0c65ae3d8b3c /]# ls #查看容器的centos 基础版本 很多命令都是不完善的
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
#从容器中退回主机
[root@0c65ae3d8b3c /]# exit
exit

列出所有运行的容器

[root@localhost /]# docker ps

退出容器

exit #容器停止并退出
CTRL + P + Q #容器不停止退出 

删除容器

docker rm 容器id #删除指定容器
docker rm -f ${docker images -aq} #删除所有容器

启动和停止容器的操作

docker start 容器id  #启动容器
docker restart 容器id  #重启容器
docker stop 容器id  #停止当前正在运行的容器
docker kill 容器id   #强制停止当前容器

常用的其他命令

后台启动容器

#命令 docker run -d 容器名
[root@localhost /]# docker run -d centos

#问题 docker ps 发现 centos 停止了

#常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#naginx 容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序

使用docker ps 不能在容器内使用 要使用CTRL + P + Q 挂在后台

查看日志

[root@localhost /]# docker logs -f -t --tail 10  82ae99a6c9e4
--tail number 要显示的条数

ctrl + c 停止

查看容器中的进程信息

# 命令 docker top 容器id
[root@localhost /]# docker top 82ae99a6c9e4
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                28138               28118               0                   14:27               pts/0               00:00:00            /bin/bash

查看镜像元数据

docker inspect 容器id

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDhGYAdo-1619158554539)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210331145516057.png)]

进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的,查看进入容器,修改配置

#命令
docker exed -it 容器id bashShell

#测试
[root@localhost /]# docker exec -it 82ae99a6c9e4 /bin/bash
[root@82ae99a6c9e4 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr

#方式二
[root@localhost /]# docker attach 82ae99a6c9e4
正在执行当前代码...

#docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach #进入容器正在执行的终端,不会启动新的进程

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

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

#查看当前主机目录下
[root@7b8772ec61e0 /]# [root@localhost /]# ls
bin   dev  home  lib64  mnt     opt   root  sbin  sys  usr
boot  etc  lib   media  mydata  proc  run   srv   tmp  var
[root@localhost /]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                                                                       NAMES
7b8772ec61e0   centos                "/bin/bash"              18 seconds ago   Up 17 seconds                                                                                                                                               exciting_chatelet
#进入docker容器内部
[root@localhost /]# docker attach 7b8772ec61e0
[root@7b8772ec61e0 /]# cd /home
[root@7b8772ec61e0 home]# ls
#在容器内部新建一个文件
[root@7b8772ec61e0 home]# touch test.java 
[root@7b8772ec61e0 home]# exit
exit
[root@localhost /]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED       STATUS       PORTS                                                                                                                                       NAMES
e3a7878fad6b   rabbitmq:management   "docker-entrypoint.s…"   5 days ago    Up 5 days    0.0.0.0:4369->4369/tcp, 0.0.0.0:5671-5672->5671-5672/tcp, 0.0.0.0:15671-15672->15671-15672/tcp, 0.0.0.0:25672->25672/tcp, 15691-15692/tcp   rabbitmq
ef7c4710c33c   nginx:1.10            "nginx -g 'daemon of…"   9 days ago    Up 9 days    0.0.0.0:80->80/tcp, 443/tcp                                                                                                                 nginx
a46bfea3be86   kibana:7.4.2          "/usr/local/bin/dumb…"   10 days ago   Up 10 days   0.0.0.0:5601->5601/tcp                                                                                                                      kibana
33916eba9df0   elasticsearch:7.4.2   "/usr/local/bin/dock…"   10 days ago   Up 9 days    0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp                                                                                              elasticsearch
#将这个文件拷贝出来到主机上
[root@localhost /]# docker cp 7b8772ec61e0:/home/test.java /home
[root@localhost /]# ls
bin   dev  home  lib64  mnt     opt   root  sbin  sys  usr
boot  etc  lib   media  mydata  proc  run   srv   tmp  var
[root@localhost /]# cd home
[root@localhost home]# ls
test.java

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

配置Nginx

[root@localhost home]# curl localhost:80
<h3>nginx start</h3>
#进入容器
[root@localhost home]# docker exec -it nginx /bin/bash
root@ef7c4710c33c:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx.8.gz
root@ef7c4710c33c:/# cd /etc/nginx
root@ef7c4710c33c:/etc/nginx# ls
conf.d	fastcgi_params	koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params	uwsgi_params  win-utf

端口暴露

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iO699q5T-1619158554541)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210331194908711.png)]

配置tomcat:

#下载tomcat
docker pull tomcat

#启动
docker run -d -p 3355:8080 --name tomcat01 tomcat

#进入容器
[root@localhost home]# docker exec -it tomcat01 /bin/bash

可视化

  • portainer 是Docker图形化界面管理工具,提供一个后台面板供我们操作

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

    通过 ip地址:8088可以进去可视化面板

  • Rancher(CI/CD再用)

Docker镜像讲解

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件

所有的应用,直接打包Docker镜像,就可以直接用

如何得到镜像:

  • 从远程仓库下载
  • 朋友拷贝
  • 自己制作一个镜像DockerFile

Docker镜像加载原理

UnionFS(联合文件系统)

UnionFS:Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改。作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统包含所有底层的文件和目录

Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS

bootfs主要包含Bootloader和kernal bootloader主要是引导加载kernal。Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层bootfs。这一层与我们典型的Linux/Unix系统是一样的。包含boot加载器和内核。当boot加载完成之后整个内核就在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统会卸载bootfs

对于一个镜像的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以,因为底层原理直接用host和Kernal,自己只需要提供rootfs就可以了,由此可见对于不同的linux发行版,bootfs基本上是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs

特点

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就是我们常说的容器层,容器之下的都叫镜像层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sfpf07AU-1619158554542)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210401142625262.png)]

commit镜像

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

# 命令与git命令类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG
#实战测试
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                                                                                                                       NAMES
92a64d46f957   tomcat                   "catalina.sh run"        46 minutes ago   Up 46 minutes   0.0.0.0:8080->8080/tcp  
#发现默认的tomcat没有webapps应用,自己拷贝了基本的文件后提交镜像
[root@localhost ~]# docker commit -a="yutou" -m="add webapps app" 92a64d46f957 tomcat:1.0
sha256:d84a37dfc3108781df35f195c80fa96812b287ee329b0217c04bf9448075a39f
#将镜像提交
[root@localhost ~]# docker images 
REPOSITORY               TAG          IMAGE ID       CREATED          SIZE
tomcat                   1.0          d84a37dfc310   53 seconds ago   653MB

容器数据卷

什么是容器数据集

docker的理念问题

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

容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地,这就是卷技术。

目录的挂载,将我们容器内的目录,挂载到Linux上面

容器的持久化和同步操作,容器间也是可以数据共享的

使用数据卷

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

[root@localhost home]# docker run -it -v /home/cash1:/home centos /bin/bash
[root@localhost home]# docker inspect 8a35aa382555
"Mounts": [
            {
                "Type": "bind",
                "Source": "/home/cash1", #主机内地址
                "Destination": "/home", #docker容器内的地址
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
#测试文件的同步
[root@localhost home]# ls
cash1  test.java
[root@localhost home]# touch test1.java
[root@localhost home]# ls
cash1  test1.java  test.java
[root@localhost ~]# cd /home
[root@localhost home]# ls
cash1  test1.java  test.java

挂载mysql的文件

#-d 后台运行 -p 端口映射 -v 挂载 -e 环境配置 --name:容器名字
[root@localhost home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/bin/lib/mysql -e MYSQL_ROOT_PASSWORD=1234566 --name mysql01 mysql:5.7
0b71c1f198eb06d044ae6f4793e8063d4c2b9f2980a8caf270b2f3395c347c6a

具名和匿名挂载

#匿名挂载
[root@localhost home]# docker run -d -P --name nginx01 -v /etc/nginx nginx

#查看所有的volume的情况
[root@localhost home]# docker volume ls
DRIVER    VOLUME NAME
local     a5376162bf9c74a11881569dae2590a0d4ef68a3fdd63b82baae0f24a13c93ac
local     aba4c2022776cd52f9a96e83aacbe04ebb5fbcabe2fa88e6f2550dc5c30ea9c6
local     c30547c36d63562f5a5960b08067488440642d6d1ccfe0af4edd3bf1b940bfb8
local     c53463911a1a4b93e693e466bb79b15e33fe5a5bcfbfec4d0ba101f275e0b05e
local     de34f86d335b27ff77d629f34ed932d3541264c06a0b0706b768f3bb67523ecd
local     f69d2d7d95261d4311914187d8b2e04c451ebc30fdeeaaf0728ac35fddc0ccec

#具名挂载
[root@localhost home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
6e16ae194c41d635c583abab0c33f73397900299ff53acf473df38e5ed802108
[root@localhost home]# docker volume ls
DRIVER    VOLUME NAME
local     a5376162bf9c74a11881569dae2590a0d4ef68a3fdd63b82baae0f24a13c93ac
local     aba4c2022776cd52f9a96e83aacbe04ebb5fbcabe2fa88e6f2550dc5c30ea9c6
local     c30547c36d63562f5a5960b08067488440642d6d1ccfe0af4edd3bf1b940bfb8
local     c53463911a1a4b93e693e466bb79b15e33fe5a5bcfbfec4d0ba101f275e0b05e
local     de34f86d335b27ff77d629f34ed932d3541264c06a0b0706b768f3bb67523ecd
local     f69d2d7d95261d4311914187d8b2e04c451ebc30fdeeaaf0728ac35fddc0ccec
local     juming-nginx

#所有的docker容器内的卷,没有指定目录的情况下都在:/var/lib/docker/volumes/xxx
[root@localhost home]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2021-04-01T16:46:57+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

我们通过具名挂载可以方便的找到我们的一个卷,大多数时候使用具名挂载

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

扩展:

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

#一旦设置了这个容器权限,容器对我们挂载出来的内容就有限制了
[root@localhost home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx

[root@localhost home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

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

Dockerfile

Dockerfile就是用来构建docker镜像的构建文件(命令脚本)

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

#编写dockerfile文件,名字可以随机 建议dockfile
# 文件中的内容 指令(大写) 参数
FROM centos


VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash

[root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t yutou/centos .
Sending build context to Docker daemon  14.85kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 48108ba02cad
Removing intermediate container 48108ba02cad
 ---> 682349519b20
Step 3/4 : CMD echo "----end----"
 ---> Running in 67b58123f253
Removing intermediate container 67b58123f253
 ---> 5c0024570615
Step 4/4 : CMD /bin/bash
 ---> Running in b69c991792eb
Removing intermediate container b69c991792eb
 ---> dcd5cd189ffc
Successfully built dcd5cd189ffc
Successfully tagged yutou/centos:latest
[root@localhost docker-test-volume]# docker images
REPOSITORY               TAG          IMAGE ID       CREATED         SIZE
yutou/centos             latest       dcd5cd189ffc   6 minutes ago   209MB
[root@d26da605b68f /]# ls -t
dev   volume01	etc  root  tmp	usr	    bin   lib	 media	opt   srv
proc  volume02	sys  run   var	lost+found  home  lib64  mnt	sbin

这个卷和外部一定有一个同步的目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1in85AVz-1619158554543)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210401172656343.png)]

假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径

数据集容器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sintNNTI-1619158554544)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210401174253694.png)]

[root@localhost docker-test-volume]# docker run -it --name docker01 yutou/centos
[root@2d74b92cd524 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var	   volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01
[root@2d74b92cd524 /]# ls -t
dev   volume01	etc  root  tmp	usr	    bin   lib	 media	opt   srv
proc  volume02	sys  run   var	lost+found  home  lib64  mnt	sbin

#volume01新建文件
[root@c3578c62a385 /]# cd volume01
[root@c3578c62a385 volume01]# ls
[root@c3578c62a385 volume01]# touch docker01
[root@c3578c62a385 volume01]# ls
docker01

#volume03中的volume01也有docker01
[root@localhost docker-test-volume]# docker run -it --name docker03 --volumes-from docker01 yutou/centos
[root@9f36584a5707 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var	   volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01
[root@9f36584a5707 /]# cd volume01
[root@9f36584a5707 volume01]# ls
docker01
[root@9f36584a5707 volume01]# 

多个mysql同步数据:

[root@localhost docker-test-volume]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

[root@localhost docker-test-volume]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

#这个时候可以实现两个容器数据同步

结论:

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

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

DockerFile

Dockerfile介绍

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

构建步骤:

  1. 编写一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub 阿里云镜像仓库)

DockerFile 构建过程

基础知识:

  1. 每个保留关键字(指令)都是必须是大写字母
  2. 执行从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IViVpITI-1619158554545)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210401195230049.png)]

dockerfile是面向开发的,我们以后要发布项目,就需要编写dockerfile文件,这个文件十分简单

Docker镜像逐渐成为企业交付的标准

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

DockerImages:通过Dockerfile 构建生成的镜像,最终发布的运行的产品,原来是jar war

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

DockerFile的指令

FROM #基础镜像,一切从这里开始构建 centos
MAINTAINER #信息是谁写的,姓名:邮箱
RUN # 镜像运行的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包 添加内容
WORKDIR #设置工作目录
VOLUME #设置卷,挂载主机目录
EXPOSE #指定对外的端口
CMD #指定这个容器启动的时候要运行的命令 只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的命令,触发指令
COPY #类似ADD命令,将文件拷贝到镜像中
ENV #构建的时候设置环境变量

实战测试:

Docker Hub中99%的镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行的构建

创建一个自己的centos

FROM centos
MAINTAINER yutou<wyxhslhs@163.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "-----end----"
CMD /bin/bash

#通过这个文件构建信息
#命令 docker build -f dockfile文件路径 -t 镜像名:[tag]
[root@localhost dockerfile]# docker build -f mydockerfile -t mycentos:0.1 .
[root@localhost dockerfile]# docker images
REPOSITORY               TAG          IMAGE ID       CREATED          SIZE
mycentos                 0.1          5020d1aaf03b   33 seconds ago   291MB
yutou/centos             latest       dcd5cd189ffc   3 hours ago      209MB
tomcat                   1.0          d84a37dfc310   5 hours ago      653MB
rabbitmq                 management   e2d949b43dc1   6 days ago       187MB
mysql                    5.7          a70d36bc331a   2 months ago     449MB
redis                    latest       621ceef7494a   2 months ago     104MB
tomcat                   9.0          040bdb29ab37   2 months ago     649MB
tomcat                   latest       040bdb29ab37   2 months ago     649MB
nginx                    latest       f6d0b4767a6c   2 months ago     133MB
portainer/portainer-ce   latest       980323c8eb3f   2 months ago     196MB
centos                   latest       300e315adb2f   3 months ago     209MB
hello-world              latest       bf756fb1ae65   15 months ago    13.3kB
kibana                   7.4.2        230d3ded1abc   17 months ago    1.1GB
elasticsearch            7.4.2        b1179d41a7b4   17 months ago    855MB
nginx                    1.10         0346349a1a64   4 years ago      182MB
#增加之后的镜像
[root@localhost dockerfile]# docker run -it mycentos:0.1
[root@77901293c68f local]# pwd
/usr/local #工作目录

我们可以列出本地镜像历史

[root@localhost dockerfile]# docker history 5020d1aaf03b
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
5020d1aaf03b   3 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
c77a70402ca1   3 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
005fd0eda4a2   3 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
1148129ecad7   3 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
0c2dd9645d7d   3 minutes ago   /bin/sh -c yum -y install net-tools             23.4MB    
703b5bd81d07   4 minutes ago   /bin/sh -c yum -y install vim                   58.1MB    
acbe09d93bfa   6 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
e8b490116916   6 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
30948f0c0c80   6 minutes ago   /bin/sh -c #(nop)  MAINTAINER yutou<wyxhslhs…   0B        
300e315adb2f   3 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      3 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      3 months ago    /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB     

实战Tomcat镜像

  1. 准备镜像文件Tomcat压缩包,Jdk的压缩包
  2. 编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要./指定了
  3. 构建镜像
  4. 启动镜像
  5. 访问测试
  6. 发布项目(优于做了卷挂载,我们直接在本地编写项目就可以发布了)

发布自己的镜像

DockerHub

  1. 地址hub.docker.com 注册自己的账户
  2. 确定这个账户可以登录
  3. 在我们服务器上提交自己的镜像
[root@localhost dockerfile]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

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

小结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JAt7oI12-1619158554547)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210401212335392.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qtayu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值