Docker使用教程笔记
Posted 小吴吃肉啦~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker使用教程笔记相关的知识,希望对你有一定的参考价值。
Docker
Docker出现的原因
环境配置十分的麻烦,每一个机器都要部署环境(eg:集群Redis Es Hadoop) 是非常的麻烦
为了解决上述的麻烦, 在项目jar包中 将环境也配置在jar包中,进行打包–>简称:镜像,我们将镜像放在 Docker仓库中 (好比是一个商店),我们运行项目直接在商店下载—直接运行即可!
Docker的思想来源于集装箱
就是打包装箱,每个箱子都是互相隔离的
Docker和虚拟机的对比
虚拟机的缺点:
-
资源占用十分多
-
沉余步骤多
-
启动慢
如下是虚拟就的图,每一个app启动都需要调用Lib ,启动慢
容器化技术:
容器化技术不是你的一个完整的操纵系统
每一个app + lib 就是一个容器,而且每个箱子都是隔离的
每一个容器直接操纵在系统上充分的利用系统资源
Docker和 虚拟机的不同:
- 传统虚拟机,虚拟出一个硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在 宿主机的内容 容器没有自己的内核,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离的,每个容器内都有一个属于自己的文件系统,互补影响
Docker的基本组成
**镜像(image):**docker镜像 就好比有一个模板,可以通过这模板来创建容器服务,比如说我们有个 tomcat镜像 -->(将他运行起来) run----> 就变成了 tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行or 项目运行就是在容器中的)
容器(container): Docker利用容器技术,独立运行一个 或者 一组应用,通过镜像来创建
他有 启动 停止 删除 等基本命令
可以把他看成一个简单的linux的系统
仓库(repository): 仓库就是存放镜像的地方 仓库分为 公有仓库和私有仓库
Docker hub (默认是国外的)
Docker安装
https://blog.csdn.net/u014644574/article/details/112494541?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165767551216782248536919%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165767551216782248536919&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-112494541-null-null.142v32experiment_2_v1,185v2control&utm_term=centos7&spm=1018.2226.3001.4187
安装命令
#1.安装所需的软件包
yum install -y yum-utils
#2.设置镜像的仓库。 -----阿里云的镜像库
yum-config-manager \\
--add-repo \\
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#3.更新yum软件包索引
yum makecache fast
#4.安装docker的引擎 docker-ce---> 社区版 ee是企业版
yum install docker-ce docker-ce-cli containerd.io
#5. 启动docker
systemctl start docker
#6. 查看docker版本号
systemctl start docker
测试
)]
查看镜像
docker images
阿里云镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
"registry-mirrors": ["https://zto7rr04.mirror.aliyuncs.com"]
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker run 的运行流程图
底层原理
Docker是怎么工作的?
Docker 是一个Client-Server 结构的系统,Docker的守护进程(Docker daemon)运行在主机上,通过Socket从客户端访问
Docker-Server 接收到 Docker-Client 的指令,就会执行这个命令
Docker 为什么比虚拟机快?
Docker 有着比虚拟机更少的抽象层
Docker 利用的是宿主机的内核,VM 需要的是Guest OS(需要再搭建一个系统环境)
因此,新建一个容器的时候,Docker 不需要像虚拟机那样重新加载一个操作系统的内核,避免一些引导性的操作,虚拟机是加载 Guest OS,是分钟级别的,Docker 是利用宿主机的操作系统,省略了这个复杂的过程,所以是秒级的启动。
Docker常用命令
docker version
docker info # docker系统信息
https://docs.docker.com/engine/reference/run/ #docker官网 地址
镜像命令
docker images 查看所有本地主机上的镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 7 months ago 13.3kB
# 解释
REPOSITORY # 镜像的仓库
TAG # 镜像的标签
IMAGE ID # 镜像的ID
CREATED # 镜像的创建时间
SIZE # 镜像的大小
# 可选项
--all , -a # 列出所有镜像
--quiet , -q # 只显示镜像的id
docker search 查找镜像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9822 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3586 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 719 [OK]
# 可选项
--filter=STARS=3000 # 搜素出来的镜像就是STARS大于3000的
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9822 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3586 [OK]
docker pull 下拉镜像
# 下载镜像,docker pull 镜像名[:tag]
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker pull mysql
Using default tag: latest # 如果不写tag,默认就是latest
latest: Pulling from library/mysql
bf5952930446: Pull complete # 分层下载,dockerimages的核心,联合文件系统
8254623a9871: Pull complete
938e3e06dac4: Pull complete
ea28ebf28884: Pull complete
f3cef38785c2: Pull complete
894f9792565a: Pull complete
1d8a57523420: Pull complete
6c676912929f: Pull complete
ff39fdb566b4: Pull complete
fff872988aba: Pull complete
4d34e365ae68: Pull complete
7886ee20621e: Pull complete
Digest: sha256:c358e72e100ab493a0304bda35e6f239db2ec8c9bb836d8a427ac34307d074ed # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# 等价于
docker pull mysql
docker pull docker.io/library/mysql:latest
# 指定版本下载
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
bf5952930446: Already exists
8254623a9871: Already exists
938e3e06dac4: Already exists
ea28ebf28884: Already exists
f3cef38785c2: Already exists
894f9792565a: Already exists
1d8a57523420: Already exists
5f09bf1d31c1: Pull complete
1b6ff254abe7: Pull complete
74310a0bf42d: Pull complete
d398726627fd: Pull complete
Digest: sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
# 查看本地镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 718a6da099d8 6 days ago 448MB
mysql latest 0d64f46acfd1 6 days ago 544MB
hello-world latest bf756fb1ae65 7 months ago 13.3kB
docker rmi 删除镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f IMAGE ID # 删除指定镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f IMAGE ID1 IMAGE ID2 IMAGE ID3 # 删除多个镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker rmi -f $(docker images -aq) # 删除所有镜像
容器命令
**新建容器并启动 **
推出的话直接 exit
docker run [可选参数] image
# 参数说明
--name=“Name” 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-p 随机指定端口
# 测试,启动并进入容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -it centos /bin/bash
[root@74e82b7980e7 /]# ls # 查看容器内的centos,基础版本,很多命令是不完善的
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
# 从容器中退回主机
[root@77969f5dcbf9 /]# exit
exit
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# ls
bin dev fanfan lib lost+found mnt proc run srv tmp var
boot etc home lib64 media opt root sbin sys usr
列出所有的运行的容器
# docker ps 命令列出当前正在运行的容器
-a # 列出正在运行的容器包括历史容器
-n=? # 显示最近创建的容器
-q # 只显示当前容器的编号
[root@centos01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d698397d8c02 centos "/bin/bash" 25 seconds ago Up 24 seconds angry_tesla
0c36bf3210c0 centos "/bin/bash" About a minute ago Up About a minute zealous_bohr
11660c546d93 centos "/bin/bash" 17 hours ago Up 17 hours relaxed_mirzakhani
fa106b942c56 centos "/bin/bash" 18 hours ago Up 18 hours pensive_nobel
[root@centos01 ~]# docker ps -qa
d698397d8c02
0c36bf3210c0
01a6c96eafb1
11660c546d93
fa106b942c56
f5a7173e0c09
93ac52e6f2ca
528f3dc27cc0
d1fcb7d7cdc7
966d18cf3158
退出容器
exit # 直接退出容器并关闭
Ctrl + P + Q # 容器不关闭退出
删除容器
docker rm -f 容器id # 删除指定容器
docker rm -f $(docker ps -aq) # 删除所有容器
docker ps -a -q|xargs docker rm -f # 删除所有的容器
启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前的容器
常用其他命令
查看日志
docker logs -tf --tail number 容器id
# 显示日志
-tf # 显示日志
--tail number # 显示日志条数
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker logs -tf --tail 10 a0d580a21251
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker logs -tf --tail 1 8d1621e09bff
2020-08-11T10:53:15.987702897Z [root@8d1621e09bff /]# exit # 日志输出
# 自己编写一段shell脚本
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker run -d centos /bin/sh -c "while true;do echo xiaofan;sleep 1;done"
a0d580a21251da97bc050763cf2d5692a455c228fa2a711c3609872008e654c2
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0d580a21251 centos "/bin/sh -c 'while t…" 3 seconds ago Up 1 second lucid_black
查看容器中进程信息ps
# 命令 docker top 容器id
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker top df358bc06b17
UID PID PPID C STIME TTY
root 28498 28482 0 19:38 ?
查看镜像的元数据 inspect
# 命令
docker inspect 容器id
进入当前正在运行的容器
# 我们通常容器使用后台方式运行的, 需要进入容器,修改一些配置
# 命令
docker exec -it 容器id /bin/bash
# 测试
[root@centos01 ~]# docker exec -it d698397d8c02 /bin/bash
[root@d698397d8c02 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:20 pts/0 00:00:00 /bin/bash
root 15 0 0 01:27 pts/1 00:00:00 /bin/bash
root 29 15 0 01:27 pts/1 00:00:00 ps -ef
[root@d698397d8c02 /]#
# 方式二
docker attach 容器id
# docker exec # 进入容器后开启一个新的终端,可以在里面操作
# docker attach # 进入容器正在执行的终端,不会启动新的进程
从容器中拷贝文件到主机
docker cp 容器id:容器内路径 目的地主机路径
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker cp 7af535f807e0:/home/Test.java /home
问题
-
在 docker run -d centos 发现docker ps, 发现centos停止了
- 原因是:docker 容器使用后台运行, 就必须要有一个前台进程,docker发现没有应用,就会自动停止centos , 容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了
- 解决方式 需要通过 -it 的启动
-
在tomcat中 下载好镜像 是缩减版的 所以它的 webapps 里面是空的 在外部访问 会直接 404,
- 解决方式 : 通过 ls 命令 查询到 webapps.dist , 把 webapps.dist 文件夹里的内容复制到 webapp中 就可以启动
- *cp -r webapps.dist/ webapps ** (-r 的意思是:递归处理,将指定目录下的文件与子目录一并处理。)
-
想要删除之前 --name 的名字 需要通过 需要通过 docker ps -a 的命令 才能查询到 --name 的字段, 查看到id后,docker rm -f id名
- 在下面kibana 中由于run 好几个 而且每个 --name 都不一样 ,在 docker ps 没有查询到, 需要通过 docker ps -a 的命令 才能查询到 --name 的字段
-
es + kibana 启动时,先启动es 在启动kibana 在es启动时 --name 一定要牢记,后面kibana --link (链接是 需要es的 --name )
- 解决方式:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SoWb8tUO-1659508930665)
Docker部署
Docker部署nginx
第一步先搜索 nignx (seacher)
[root@centos01 ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 17090 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 169
bitnami/nginx Bitnami nginx Docker Image 136 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 52
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 19 [OK]
rancher/nginx-ingress-controller 10
ibmcom/nginx-ingress-controller Docker Image for IBM Cloud Private-CE (Commu… 4
bitnami/nginx-ldap-auth-daemon 3
rancher/nginx 2
circleci/nginx This image is for internal use 2
bitnami/nginx-exporter 2
rancher/nginx-ingress-controller-defaultbackend 2
vmware/nginx 2
rapidfort/nginx RapidFort optimized, hardened image for NGINX 2
vmware/nginx-photon 1
bitnami/nginx-intel 1
kasmweb/nginx An Nginx image based off nginx:alpine and in… 1
wallarm/nginx-ingress-controller Kubernetes Ingress Controller with Wallarm e… 1
rancher/nginx-ssl 0
rancher/nginx-conf 0
continuumio/nginx-ingress-ws 0
rancher/nginx-ingress-controller-amd64 0
ibmcom/nginx-ingress-controller-ppc64le Docker Image for IBM Cloud Private-CE (Commu… 0
ibmcom/nginx-ppc64le Docker image for nginx-ppc64le 0
rancher/nginx-proxy 0
[root@centos01 ~]#
第二步:下载镜像 pull
[root@centos01 ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
第三步:查询镜像 是否下载下来
docker images
第四步: 启动 (我这边想挂在后台 所以用 -d, 并命名 --name,在给端口好 -p 3344:80)
-p 宿主机端口(外部访问):容器内部端口
# docker run -d --name nginx01 -p 3344:80 nginx
d2f3d9b925fc076365a564b4bf2b1499ff318b9f8c18605f709dbec920a4853d
[root@centos01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d2f3d9b925fc nginx "/docker-entrypoint.…" 9 seconds ago Up 6 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
d698397d8c02 centos "/bin/bash" 2 hours ago Up 2 hours angry_tesla
0c36bf3210c0 centos "/bin/bash" 2 hours ago Up 2 hours zealous_bohr
11660c546d93 centos "/bin/bash" 19 hours ago Up 19 hours relaxed_mirzakhani
fa106b942c56 centos "/bin/bash" 20 hours ago Up 20 hours pensive_nobel
第五步:测试 先在本机测试 (发送请求 curl (后面跟端口号 是上面3344) )
[root@centos01 ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html color-scheme: light dark;
body width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
第六步: 进入容器
[root@centos01 ~]# docker exec -it nginx01 /bin/bash
root@d2f3d9b925fc:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@d2f3d9b925fc:/# cd /etc/nginx
root@d2f3d9b925fc:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@d2f3d9b925fc:/etc/nginx#
Docker部署Tomcat
第一步: 查询 是否有tomcat
第二步: 进行下载tomcat 镜像 docker pull tomcat 或者 直接 运行 (也可以下载) docker run -it tomcat /bin/bash
第三步: 启动tomcat 端口的设置 和 并给命名 **docker run -d -p 3355:8080 --name tomcat01 ** tomcat
第四步: 测试 测试访问没有问题 但外部访问有问题
第五步: 进入 容器 docker exec -it tomcat01 /bin/bash
查看 ls -al 看目录权限
发现问题 :1.linux命令少了,2、没有webapps 阿里云镜像的原因,默认是最小的镜像所有不必要的镜像都删除掉了 ,会导致我们在浏览器访问 出现404
第六步: 解决上述问题
将webapps.dist 复制到 webapps cp -r webapps.dist/ webapps*
-r 递归处理,将指定目录下的文件与子目录一并处理。
Docker部署es + kibana
es:暴露端口特比多
es 十分耗内存
es 的数据一般需要放置到安全目录 ! 挂载
第一步:下载 启动 es
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
由于es非常耗内存 建议!!! 把没用的镜像关闭
**第二步: ** 测试 curl localhost:9200
第三步: 查看内存 由于es 耗内存 docker stats 在通过 -e 修改环境内存
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
Kibana
第一步: 下载镜像 启动
docker run -it --name="kibana02" -p 5602:5601 --link elasticsearch02:elasticsearch kibana:7.6.2
==注意事项: 在这启动kibana 首先启动ela 查看ela --name 是什么 ==,然后再启动 kibana 中 --link 第一个ela的(–name 要和 ela --name 名字要一致),才能启动,否则会报错
Portainer可视化面板安装
他是docker图形化界面
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
镜像
镜像是什么?
镜像是轻量级、独立运行软件包,用来打包软件的运行环境和运行环境开发的软件,它包含一个软件的:代码、库、环境变量和配置文件,直接打包docker镜像,这种打包叫做:其实镜像实际上是由一层一层的文件系统组成,这个文件系统就是**联合文件系统(UnionFS)**就可以直接运行起来
咋们在下载的镜像的时候都是一层
Docker镜像加载原理
UnionFS(联合文件系统)
docker的镜像实际上是由**一层一层的文件系统组成,好比盖房子一样 一层一层的变高,**这个层级的文件系统叫UnionFS
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
docker的镜像实际上由一层一层的文件系统组成,这种层级文件系统就是上述的UnionFS。接着,在内部又分为2部分:
bootfs(boot file system):docker镜像的最底层是bootfs,主要包含bootloader(加载器)和kernel(内核)。
bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统。这一层与典型的linux/Unix系统一样,包含bootloader和kernel。当boot加载完成后,整个内核就在内存中了**,此时内存的使用权已由bootfs转交给了内核**,此时系统也会卸载bootfs。
这里的加载,可以理解为,我们windows电脑开机时候,从黑屏到进入操作系统的过程。
rootfs(root file system):在bootfs之上,包含的就是典型linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。
rootfs就是各种不同的操作系统发行版,比如Ubuntu、Centos等等。
特性:
Docker镜像都是只读的,当容器启动时,一个新的可写成被加载到镜像的顶部
这一层就是我们通常函数与董鄂容器曾,容器之下的都叫镜像曾
运行流程图下:
run 之后,所有的操作都在容器层进行,而镜像曾tomcat 是不会改变原始的数据,只会在容器层,增加数据
Commit镜像
提交自己的镜像
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a=“作者” 容器id 目标镜像名:[TAG]
测试:由于tommat 不能直接访问 需要将webapps.dist 中的所有文件进行copy到webapps中 完成后,将新的tomcat进行 commit镜像 成为一个新的tomcat 副本
[root@centos01 ~]# docker commit -a="zhkj" -m="add webapps app" ba44baf4d118 tomcat02:1.0
sha256:d024ea4659b262a38bbbfdae474d2078473eaffadc50eef761372aac71136d94
[root@centos01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba44baf4d118 tomcat "catalina.sh run" 14 minutes ago Up 14 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp blissful_dubinsky
1c38bd303c3c centos "/bin/bash" 2 hours ago Up 2 hours happy_haibt
f9e77915bccd portainer/portainer "/portainer" 43 hours ago Up About a minute 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp gracious_poitras
[root@centos01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 d024ea4659b2 2 minutes ago 684MB
nginx latest 605c77e624dd 6 months ago 141MB
tomcat latest fb5657adc892 6 months ago 680MB
[root@centos01 ~]#
容器数据卷
什么是容器数据卷
Docker 是应用和环境打包成一个镜像,
如果数据都在容器中,那我们容器删除,就会丢失数据 (mysql ,容器删除 就等于删库跑路)
为了解决上述问题:
容器之间可以有一个数据共享技术,docker容器中生产的数据,同步到本地! —>这既是卷技术,目录的挂载,将我们内容的目录,挂载到linux什上面
特征:持久化和同步操作,容器间也是可以数据共享
使用数据卷
方式一:直接使用命令挂载 -v
docker run -it -v
#查看挂载 位置
docker inspect 容器id
测试
好处: 以后修改文件内容,直接在本地修改,不需要在容器内修该
匿名和具名挂载
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 随机指定端口
# 查看所有volume的情况
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径!
# 具名挂载
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26da1ec7d499 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:32769->80/tcp nginx02
486de1da03cb nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp nginx01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
local juming-nginx
# 通过-v 卷名:容器内的路径
# 查看一下这个卷
# docker volume inspect juming-nginx
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx
[
"CreatedAt": "2020-08-12T18:15:21+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
]
所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载
##如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /主机路径:容器内路径 # 指定路径挂载
# 通过 -v 容器内容路径 ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作
Dockerfile
dockerfile就是用来构建docker镜像的构建文件,通过这个脚本可以生产镜像,镜像是一层一层的,每个命令也是一层一层的
# 创建一个dockerfile文件, 名字可以随机
# 文件的内容 指定(大写) 参数
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "----end----"
CMD /bin/bash
# 这里的每一个命令都是镜像的一层!
#注意点 : 这里推出 先按esc 咋输入 :wq
数据卷容器
可以同步多个容器中的数据
#
--volumes from 要继承的数据卷
结论: 容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用位置
DockerFile
Dockerfile是面向开发的,我们以后发布项目,做镜像,就需要写dockerfile文件,同时dockerfile也逐渐成为企业 交付项目的标准
是用来构建docker镜像命名
Dockerfile:构建文件,定义了一切的步骤,源代码
DockerImages: 通过DockerFile构建生产的镜像,最终发布和运行的产品
Docker容器: 容器就是镜像运行起来的提供服务器
构建步骤:
- 编写一个dockerfile文件
- docker build构建一个镜像
- docker run运行镜像
- docker push 发布镜像(可以发布在DockerHub、阿里云镜像仓库)
查看官网是如何制作镜像
Docker构建过程
基础知识:
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下的顺序
- #- 表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交
DockerFile的指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY # 类似ADD, 将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
DockerFile实战(自己构建镜像)
Docker Hub 中99%的镜像都是这个基础镜像过来的FROM scratch,然后配置需要的软件和配置进行构建
创建自己的centos镜像
首先mkdir 位置
在 vi docker
FROM centos
MAINTAINER wushentian<wushentian@unittec.com>
ENV MYPATH /user/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
- mkdir 创建 自己想要的位置
- vi 自己定义的脚本名字
- **在 vi 中编写 脚本 **
- cat 自己定义的脚本名称
- build
- -f 路径名 要跟 vi 后面的名称一致
- -t 是指命名当前镜像叫什么 后面也可以跟版本号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lDTzEN3a-1659508930670)(C:\\Users\\Administrator\\AppData\\Roaming\\Typora\\typora-user-images!在这里插入图片描述
)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6rfnITv-1659508930671)(C:\\Users\\Administrator\\AppData\\Roaming\\Typora\\typora-user-images!在这里插入图片描述
)]
流程
为什么使用Rancher
它支持集中化认证、权限控制、监控和管理所有Kubernetes集群
同时给开发者提供了一个可视化的工具
他能解决什么问题?
针对多机房、跨区域的容器调度,部署多套集群
行 ONBUILD 的指令,触发指令
COPY # 类似ADD, 将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
[外链图片转存中...(img-xBp0ugRj-1659508930670)]
### DockerFile实战(自己构建镜像)
> Docker Hub 中99%的镜像都是这个基础镜像过来的FROM scratch,然后配置需要的软件和配置进行构建
**创建自己的centos镜像**
以上是关于Docker使用教程笔记的主要内容,如果未能解决你的问题,请参考以下文章