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快?
-
Docker有着比虚拟机更少的抽象层
-
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镜像的文件(命令参数脚本)
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub 阿里云镜像仓库)
DockerFile 构建过程
基础知识:
- 每个保留关键字(指令)都是必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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镜像
- 准备镜像文件Tomcat压缩包,Jdk的压缩包
- 编写dockerfile文件,官方命名
Dockerfile
,build会自动寻找这个文件,就不需要./指定了 - 构建镜像
- 启动镜像
- 访问测试
- 发布项目(优于做了卷挂载,我们直接在本地编写项目就可以发布了)
发布自己的镜像
DockerHub
- 地址hub.docker.com 注册自己的账户
- 确定这个账户可以登录
- 在我们服务器上提交自己的镜像
[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
- 登录完毕后就可以提交镜像了,就说一步 docker push
小结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JAt7oI12-1619158554547)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210401212335392.png)]