Docker
docker仓库地址:https://hub.docker.com/
docker命令文档地址:https://docs.docker.com/reference/
虚拟器技术缺点:
1.资源占用十分多
2.冗余步骤多
3.启动很慢
容器化技术
容器化技术不是模拟的一个完整的操作系统
比较docker和虚拟机技术的不同
传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所有就轻便了。
每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
DevOps(开发、运维)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序。
Docker:打包镜像发布测试,一键运行。
更便捷的升级和扩缩容
使用了Docker之后,我们部署应用就和搭积木一样。
项目打包为一个镜像,扩展服务器A!服务器B
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。‘
更高效的计算资源利用:
Docker是内核级别的的虚拟化,可以在一个物理机上运行很多实例!服务器的性能可以被压榨到极致。
Docker安装
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像==》run ==>tomcat1容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
启动,停止,删除,基本命令!
目前就可以把这个容器理解为就是一个简易的linux系统
仓库(repository):
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub(默认是国外的)
阿里云….都有容器服务器(配置镜像加速)
安装Docker
[root@iZbp151pi15pfb733a7a0dZ ~]# uname -r
3.10.0-1062.18.1.el7.x86_64 #系统内核3.10以上
#系统环境
[root@iZbp151pi15pfb733a7a0dZ ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安装
第一步:卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
第二步:安装新的安装包
yum install -y yum-utils
第三步:设置镜像仓库
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
#第四步:安装docker docker-ce 社区 ee企业版
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
第五步:启动docker
systemctl start docker
检测是否安装成功
docker version
第六步运行hello-world
docker run hello-world
第七步:查看一下下载的这个hello-world镜像
docker images
# 了解 卸载docker
1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
2.删除资源
rm -rf /var/lib/docker
# /var/lib/docker docker的默认工作路径
启动docker
systemctl start docker
查看镜像
docker images
阿里云镜像加速
1.登录阿里云,找到容器服务
2.找到镜像加速地址
3.镜像工具里面的镜像加速器
4.配置使用
1.sudo mkdir -p /etc/docker
2.sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://v6xry2a2.mirror.aliyuncs.com"]
}
EOF
3.sudo systemctl daemon-reload
4.sudo systemctl restart docker
docker run的流程分析图:
底层原理
docker是怎么工作的?
docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会去执行这个命令!
Docker为什么比虚拟机快?
vm安全性最高。
1.Docker有着比虚拟机更少的抽象层
2.Docker利用的是宿主机的内核,vm需要是Guest OS.
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级!
docker常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
镜像命令
[root@iZbp151pi15pfb733a7a0dZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq management 6c3c2a225947 6 months ago 253MB
hello-world latest feb5d9fea6a5 8 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
可选项
-a, --all #列出所有镜像
-q, --quite #只显示镜像的id
搜索镜像 docker search
[root@iZbp151pi15pfb733a7a0dZ ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12745 [OK]
mariadb MariaDB Server is a high performing open sou… 4893 [OK]
#可选项,通过搜索来过滤
--filter=STARS=3000 #搜索出来的镜像就是STARS大于3000的
[root@iZbp151pi15pfb733a7a0dZ ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12745 [OK]
mariadb MariaDB Server is a high performing open sou… 4893 [OK]
[root@iZbp151pi15pfb733a7a0dZ ~]# docker search mysql --filter=STARS=5000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12745 [OK]
下载镜像 docker pull
# 下载镜像 docker pull 镜像名[:tag]
[root@iZbp151pi15pfb733a7a0dZ ~]# docker pull mysql
Using default tag: latest #如果不写tag,默认就是latest,最新版本
latest: Pulling from library/mysql
72a69066d2fe: Pull complete #分层下载,docker image的核心 联合文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest:sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709#签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
#命令等价
docker pull mysql
docker pull docker.io/library/mysql:latest
#指定版本下载,下载版本必须为docker文档里面所有的版本
[root@iZbp151pi15pfb733a7a0dZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
删除镜像 docker rmi
# docker rmi -f 镜像id #删除指定的镜像
# docker rmi -f 镜像id 镜像id #删除多个镜像
# docker rmi -f $(docker images -aq) #删除全部的镜像
容器命令
说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
docker pull centos
新建容器并启动
docker run [可选参数] image
#参数说明
--name="Name" 容器名字 tomcat01 tomcat02,用来区分容器
-d 后台方式的运行
-p 指定容器的端口 -p 8080:8080
-p 主机端口:容器端口 (常用)
-p ip:主机端口:容器端口
-p 容器端口
-p 随机指定端口
#测试,启动并进入容器
[root@iZbp151pi15pfb733a7a0dZ ~]# docker run -it centos /bin/bash
[root@85c129bccffb /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#从容器中退回主机
exit
启动进入容器
docker run -it centos /bin/bash
列出所有的运行的容器
#docker ps 命令
# 列出当前正在运行的容器
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
-q # 只显示容器的编号
-aq #显示所有当前容器的编号
[root@iZbp151pi15pfb733a7a0dZ /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85c129bccffb centos "/bin/bash" 2 minutes ago Exited (0) About a minute ago vigorous_northcutt
5c25c2801811 rabbitmq:management "docker-entrypoint.s…" 24 hours ago Up 24 hours 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
7ff672b2ca67 feb5d9fea6a5 "/hello" 35 hours ago Exited (0) 35 hours ago bold_montalcini
退出容器
exit #直接容器停止并退出
Ctrl + p + q #容器不停止退出
[root@iZbp151pi15pfb733a7a0dZ /]# docker run -it centos /bin/bash
[root@0f92d0005998 /]# [root@iZbp151pi15pfb733a7a0dZ /]#
删除容器
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 run -d centos
#问题docker ps, 发现centos 停止了
#常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#nginx,容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了。
查看日志命令
#显示日志
-tf #显示日志
--tail number #要显示日志条数
查看容器中进程信息
#命令 docker top 容器id
[root@iZbp151pi15pfb733a7a0dZ /]# docker top 0f92d0005998
UID PID PPID C STIME TTY TIME CMD
root 3023 3002 0
查看镜像源数据
#命令
docker inspect 容器id
[root@iZbp151pi15pfb733a7a0dZ /]# docker inspect 0f92d0005998
[
{
"Id": "0f92d0005998c3e180afb94ef9fb25b57b3317bf77e3ea73d2092e255127ac01",
"Created": "2022-06-20T01:38:42.48966518Z",
"Path": "/bin/bash",
"Args": [],
进入当前正在运行的容器
# 我们通常容器是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it 容器id bin/bash
[root@iZbp151pi15pfb733a7a0dZ /]# docker exec -it 0f92d0005998 /bin/bash
[root@0f92d0005998 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@0f92d0005998 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:38 pts/0 00:00:00 /bin/bash
root 15 0 0 02:37 pts/1 00:00:00 /bin/bash
root 30 15 0 02:38 pts/1 00:00:00 ps -ef
#方式二
docker attach 容器id
[root@iZbp151pi15pfb733a7a0dZ /]# docker attach 0f92d0005998
正在执行当前的代码...
#docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach #进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径
[root@iZbp151pi15pfb733a7a0dZ ~]# docker run -it centos /bin/bash
[root@1dae4d793eec /]# docker ps
bash: docker: command not found
[root@1dae4d793eec /]# [root@iZbp151pi15pfb733a7a0dZ ~]# docker ps ##Ctrl+p+q
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1dae4d793eec centos "/bin/bash" 20 seconds ago Up 19 seconds tender_mayer
5c25c2801811 rabbitmq:management "docker-entrypoint.s…" 25 hours ago Up 25 hours 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
[root@iZbp151pi15pfb733a7a0dZ ~]# cd /home
#查看当前主机目录下
[root@iZbp151pi15pfb733a7a0dZ home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1dae4d793eec centos "/bin/bash" 38 seconds ago Up 37 seconds tender_mayer
5c25c2801811 rabbitmq:management "docker-entrypoint.s…" 25 hours ago Up 25 hours 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
#进入docker容器内部
[root@iZbp151pi15pfb733a7a0dZ home]# docker attach 1dae4d793eec
[root@1dae4d793eec /]# cd /home
[root@1dae4d793eec home]# ls
#在容器内新建一个文件
[root@1dae4d793eec home]# touch test.java
[root@1dae4d793eec home]# exit
exit
[root@iZbp151pi15pfb733a7a0dZ home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c25c2801811 rabbitmq:management "docker-entrypoint.s…" 25 hours ago Up 25 hours 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
#将1dae4d793eec容器下边的home目录的test.java文件拷贝到服务器home目录下
[root@iZbp151pi15pfb733a7a0dZ home]# docker cp 1dae4d793eec:/home/test.java /home
[root@iZbp151pi15pfb733a7a0dZ home]# ls
test.java www
#拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现
命令小结
attach Attach to a running container #当前shell下attach连接指定运行镜像
build Build an image from a Dockerfile #通过Dockerfile定制镜像
commit Create a new image from a container's changes #提交当前容器为新的镜像
cp Copy files/folders from a container to a HOSTDIR or to STDOUT #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container #创建一个新的容器,同run 但不启动容器
diff Inspect changes on a container's filesystem #查看docker容器变化
events Get real time events from the server#从docker服务获取容器实时事件
exec Run a command in a running container#在已存在的容器上运行命令
export Export a container's filesystem as a tar archive #导出容器的内容流作为一个tar归档文件(对应import)
history Show the history of an image #展示一个镜像形成历史
images List images #列出系统当前镜像
import Import the contents from a tarball to create a filesystem image #从tar包中的内容创建一个新的文件系统映像(对应export)
info Display system-wide information #显示系统相关信息
inspect Return low-level information on a container or image #查看容器详细信息
kill Kill a running container #kill指定docker容器
load Load an image from a tar archive or STDIN #从一个tar包中加载一个镜像(对应save)
login Register or log in to a Docker registry#注册或者登陆一个docker源服务器
logout Log out from a Docker registry #从当前Docker registry退出
logs Fetch the logs of a container #输出当前容器日志信息
pause Pause all processes within a container#暂停容器
port List port mappings or a specific mapping for the CONTAINER #查看映射端口对应的容器内部源端口
ps List containers #列出容器列表
pull Pull an image or a repository from a registry #从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to a registry #推送指定镜像或者库镜像至docker源服务器
rename Rename a container #重命名容器
restart Restart a running container #重启运行的容器
rm Remove one or more containers #移除一个或者多个容器
rmi Remove one or more images #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
run Run a command in a new container #创建一个新的容器并运行一个命令
save Save an image(s) to a tar archive#保存一个镜像为一个tar包(对应load)
search Search the Docker Hub for images #在docker
hub中搜索镜像
start Start one or more stopped containers#启动容器
stats Display a live stream of container(s) resource usage statistics #统计容器使用资源
stop Stop a running container #停止容器
tag Tag an image into a repository #给源中镜像打标签
top Display the running processes of a container #查看容器中运行的进程信息
unpause Unpause all processes within a container #取消暂停容器
version Show the Docker version information#查看容器版本号
wait Block until a container stops, then print its exit code #截取容器停止时的退出状态值
下载镜像
#1.搜索镜像 docker search nginx 最好去官网地址搜索
#2.下载镜像 docker pull nginx
#3.运行测试
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口,容器内部端口
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d --name nginx02 -p 8082:80 nginx
7ed90c7034f2de7bb34fc670d332e5b4c8a586ce6a11a29e039ae3ae33713124
[root@iZbp151pi15pfb733a7a0dZ home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ed90c7034f2 nginx "/docker-entrypoint.…" 25 seconds ago Up 25 seconds 0.0.0.0:8082->80/tcp nginx02
5c25c2801811 rabbitmq:management "docker-entrypoint.s…" 29 hours ago Up 29 hours 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
[root@iZbp151pi15pfb733a7a0dZ home]# curl localhost:8082
端口暴露概念图:
思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分的麻烦,我要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改? -v 数据卷!
#官方的使用
docker run -it --rm tomcat:9.0
#我们之前的启动都是后台,停止了容器之后,容器还是可以查到 docker run -it --rm 一般以用来测试,用完就删除
# 下载在启动
docker pull tomcat
#启动运行
docker run -d -p 8082:8080 --name tomcat01 tomcat
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0
6a6997f89edf02351e4543f214cb67eb420806c8ec68be7d5d384f2395f124fd
#测试访问没有问题
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0
#进入容器
[root@iZbp151pi15pfb733a7a0dZ home]# docker exec -it tomcat01 /bin/bash
root@6a6997f89edf:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@6a6997f89edf:/usr/local/tomcat# ls -al
total 172
drwxr-xr-x 1 root root 4096 Dec 22 17:16 .
drwxr-xr-x 1 root root 4096 Dec 22 17:00 ..
-rw-r--r-- 1 root root 18970 Dec 2 2021 BUILDING.txt
-rw-r--r-- 1 root root 6210 Dec 2 2021 CONTRIBUTING.md
-rw-r--r-- 1 root root 57092 Dec 2 2021 LICENSE
-rw-r--r-- 1 root root 2333 Dec 2 2021 NOTICE
-rw-r--r-- 1 root root 3378 Dec 2 2021 README.md
-rw-r--r-- 1 root root 6898 Dec 2 2021 RELEASE-NOTES
-rw-r--r-- 1 root root 16507 Dec 2 2021 RUNNING.txt
drwxr-xr-x 2 root root 4096 Dec 22 17:16 bin
drwxr-xr-x 1 root root 4096 Jun 20 08:16 conf
drwxr-xr-x 2 root root 4096 Dec 22 17:16 lib
drwxrwxrwx 1 root root 4096 Jun 20 08:16 logs
drwxr-xr-x 2 root root 4096 Dec 22 17:16 native-jni-lib
drwxrwxrwx 2 root root 4096 Dec 22 17:16 temp
drwxr-xr-x 2 root root 4096 Dec 22 17:16 webapps
drwxr-xr-x 7 root root 4096 Dec 2 2021 webapps.dist
drwxrwxrwx 2 root root 4096 Dec 2 2021 work
#发现为题:1.linux命令少了,2.没有webapps。阿里云镜像的原因。默认是最小的镜像,所有不必要的都剔除掉。
#保证最小的环境
解决办法:
#将webapps.list的所有文件放在webapps目录下
root@6a6997f89edf:/usr/local/tomcat# cd webapps
root@6a6997f89edf:/usr/local/tomcat/webapps# ls
root@6a6997f89edf:/usr/local/tomcat/webapps# cd ..
root@6a6997f89edf:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@6a6997f89edf:/usr/local/tomcat# cd webapps.dist/
root@6a6997f89edf:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
root@6a6997f89edf:/usr/local/tomcat/webapps.dist# cd ..
root@6a6997f89edf:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@6a6997f89edf:/usr/local/tomcat#
思考问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?
我要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了
部署 es+kibana
# es 暴露的端口很多
# es十分的耗内存
# es的数据一般需要放置到安全目录! 挂载
# --net somenetwork 网络配置
#启动elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#docker stats 查看 cpu的状态
[root@iZbp151pi15pfb733a7a0dZ home]# curl localhost:9200
{
"name" : "45e5d07a0f70",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "Pjy_3HfVRL--mverC2eetQ",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
#服务器很小,启动就会十分卡,最好先关闭一些进程。
解决办法
#赶紧关闭,增加内存的限制,修改配置文件 -e 环境配置修改
#node 后面加 -e ES_JAVA_OPS="-Xms64m -Xmx512m"
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPS="-Xms64m -Xmx512m" elasticsearch:7.6.2
使用kibana连接es?思考网络如何才能连接过去?
可视化
portainer(先用这个)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Rancher(CI/CD在用)
什么是portainer?
Docker图形化界面管理工具!提供一个后台面板供我们操作
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试:http://ip:8088/ 阿里云地址
Docker镜像讲解
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像
1.从远程仓库下载
2.朋友拷贝给你
3.自己制作一个镜像dockerFile
Docker镜像加载原理
平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,roofs会有差别,因此不同的发行版可以公用bootfs。
虚拟机是分钟级,容器是秒级。
分层理解
特点:Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!、
如何提交一个自己的镜像
commit镜像
docker commit 提交容器成为一个新的副本
#命令和git原理类似
docker commit -m"提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
实战测试
# 1. 启动一个默认的tomcat
docker run -it -p 8082:8080 tomcat:9.0
# 2. 发现这个默认的tomcat是没有webapps应用,镜像的原因,官方的镜像默认webapps下面是没有文件的!
root@541a11be8902:/usr/local/tomcat/webapps# ls
# 3.我自己拷贝进去了基本的文件
root@541a11be8902:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@541a11be8902:/usr/local/tomcat# exit
[root@iZbp151pi15pfb733a7a0dZ ~]# docker ps
# 4. 将我们操作过的容器通过commit提交为一个镜像!我们以后就可以使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像
docker commit -a="super" -m ="add webapps app" 541a11be8902 tomcat02:1.0
如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像,就好比我们以前学习vm时候,快照。
容器数据卷
什么是容器数据卷
docker的理念回顾
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
mysql,容器删了,删库跑路,需求:mysql数据可以存储在本地
容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地!
这就是卷的技术!目录的挂载,将我们容器内的目录,挂载到linux上面!
总结为一句话:容器的持久化和同步操作!容器间也是可以数据共享的
使用数据卷
直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
#测试
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash
#启动起来的时候我们可以通过docker inspect 容器id 查看卷信息
docker inspect 556ffcee0777
测试文件的同步
好处:我们以后修改只需要在本地修改即可,容器内会自动同步
实战测试:安装mysql
思考:mysql的数据持久化的问题
#获取镜像
[root@iZbp151pi15pfb733a7a0dZ home]# docker pull mysql:5.7
#运行容器,需要做数据挂载! #安装启动mysql,需要配置密码的,这是要注意点!
#官方测试: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my=secret-pw -d mysql:tag
#启动我们的
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -p 8082:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
23bebc1a1c4f901a10ae5468b99a75c96f56c8e64cf18d4edaf90764bafe3500
#启动成功后,我们在本地使用sqlyog来测试一下
#sqlyog -连接到服务器的8082和容器内的3306映射,这个时候我们就可以连接上了!
#在本地测试创建一个数据库,查看一下我们映射的路径是否ok!
假设我们将容器删除,但是发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。
具名和匿名挂载
匿名挂载
#匿名挂载
-v 容器内路径!
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有卷的情况
[root@iZbp151pi15pfb733a7a0dZ home]# docker volume ls
DRIVER VOLUME NAME
local 6f30f6587c1f5f518531ad7b0f77f50b0412348c79ccc1180c09930eeb2ebb1a
#这里发现,这种就是匿名挂载,我们在-v 只写了容器内的路径,没有写容器外的路径。
具名挂载
#通过 -v 卷名:容器内路径
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
8c2d457d79689c03c0af7fe3c14f4128997b945a0e089cb7acb2006eccd1370a
[root@iZbp151pi15pfb733a7a0dZ home]# docker volume ls
DRIVER VOLUME NAME
local 6f30f6587c1f5f518531ad7b0f77f50b0412348c79ccc1180c09930eeb2ebb1a
local 70b8a46ae4d936dc8d1c86ef2ec227c14d74bf26efb4eda1afdc8753bfa4169a
local juming-nginx
#查看卷信息
[root@iZbp151pi15pfb733a7a0dZ home]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-06-26T08:09: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/xxx/_data`中
[root@iZbp151pi15pfb733a7a0dZ home]# cd /var/lib/docker
[root@iZbp151pi15pfb733a7a0dZ docker]# ls
buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
[root@iZbp151pi15pfb733a7a0dZ docker]# cd volumes
[root@iZbp151pi15pfb733a7a0dZ volumes]# ls
6f30f6587c1f5f518531ad7b0f77f50b0412348c79ccc1180c09930eeb2ebb1a backingFsBlockDev metadata.db
70b8a46ae4d936dc8d1c86ef2ec227c14d74bf26efb4eda1afdc8753bfa4169a juming-nginx
[root@iZbp151pi15pfb733a7a0dZ volumes]# cd juming-nginx
[root@iZbp151pi15pfb733a7a0dZ juming-nginx]# ls
_data
[root@iZbp151pi15pfb733a7a0dZ juming-nginx]# cd _data
[root@iZbp151pi15pfb733a7a0dZ _data]# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载
拓展:
#通过 -v 容器内路径: ro rw 改变读写权限
ro readonly #只读
rw readwrite #可读可写
#一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
DockerFile
DockerFile 就是用来构建docker镜像的构建文件!命令脚本。
通过这个脚本可以生成镜像,镜像是一层层的,脚本一个个的命令,每一个命令都是一层。
#1.创建一个dockerfile文件,名字可以随机 建议 Dockerfile
#2.文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
#这里每个命令,就是镜像的一层。
3.启动自己的容器
这个卷和外部一定有一个同步的目录
测试一下刚才的文件是否同步出去了。
[root@iZbp151pi15pfb733a7a0dZ ~]# cd /var/lib/docker/volumes/32885e77e94774a0c813df8ca0f6eb2d6f51886c8954537fa04f8a99c948db73/_data
[root@iZbp151pi15pfb733a7a0dZ _data]# ls
container.txt
这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时间没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径。
数据卷容器
多个mysql同步数据!
启动三个容器,通过我们刚才自己写的镜像启动。
[root@iZbp151pi15pfb733a7a0dZ ~]# docker run -it --name docker01 superbrother/centos:1.0
[root@iZbp151pi15pfb733a7a0dZ ~]# docker run -it --name docker02 --volumes-from docker01 superbrother/centos:1.0
共享卷是一种拷贝的概念。
只要通过 - - volume- form 就可以实现数据共享了。
多个mysql实现数据共享
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -p 8082:3306 -v/etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@iZbp151pi15pfb733a7a0dZ home]# docker run -d -p 8082:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-form mysql01 mysql:5.7
#这个时候,可以实现两个容器数据同步
结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的。
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1.编写一个dockerfile文件
2.docker bulid 构建成为一个镜像
3.docker run 运行镜像
- docker push 发布镜像(DockerHub\ 阿里云镜像仓库!)
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以。
DockerFile构建过程
基础知识:
1.每个保留关键字(指令)都是必须是大写字母
2.执行从上到下的顺序执行
3.#表示注释
4,每一个指令都会创建提交一个新的镜像层,并提交。
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
docker镜像逐渐成为企业交付的标准,必须要掌握。
步骤:开发,部署,运维。。。缺一不可。
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供服务器。
DockerFile的指令
FROM #基础镜像,一切从这里构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #保留端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被代替,不能追加命令。
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承DockerFile这个时候就会运行ONBUILD 的指令。触发指令。
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量!
Docker Hub中99%镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建。
实战测试
创建自己的centos
#1.编写dockerfile的文件
[root@iZbp151pi15pfb733a7a0dZ dockerfile]# vim mydockerfile-docker
#查看这个文件内容
[root@iZbp151pi15pfb733a7a0dZ dockerfile]# cat mydockerfile-docker
FROM centos:7 #一定要加版本号,更新之后不加版本号,下载会失败
MAINTAINER superbrother<1542010896@qq.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
#2.通过这个文件构建镜像
#命令: docker build -f mydockerfile(-f后面指文件路径) -t mycentos:0.1 .(-t后面指镜像名,一定注意还有一个 .) .
[root@iZbp151pi15pfb733a7a0dZ dockerfile]# docker build -f mydockerfile-docker -t mycentos:0.1 .
#构建成功信息
Successfully built f7922b622ac7
Successfully tagged mycentos:0.1
#测试运行
[root@iZbp151pi15pfb733a7a0dZ dockerfile]# docker run -it mycentos:0.1
[root@03bf86fe9483 local]# pwd
/usr/local
对比:之前的原生centos,很多基础命令都没有,如:pwd,ifconfig。我们增加之后都有了。
我们可以列出本地进行的变更历史,拿到一个镜像就可以知道它是怎么做的。
[root@iZbp151pi15pfb733a7a0dZ dockerfile]# docker history f7922b622ac7
CMD 和 ENTRYPOINT 的区别:
如何vim编写的镜像,是cmd,则运行的时候,是不可以追加命令的,而entrypoint是可以追加命令的。
实战:tomcat镜像
1.准备镜像文件tomcat压缩包,jdk的压缩包!
利用xftp将压缩包上传到服务器。
2.编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要-f指定了!
vim Dockerfile
FROM centos:7
MAINTAINET superbrother
COPY readme.txt /usr/local/readme.txt
ADD jdk-8ull-linux-x64.tar.gz /usr/local
ADD appache-tomcat-9.0.22.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jkd1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATAINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.22/bin/logs/catalina.out
3.构建镜像
#docker build -t diytoomcat .
4.启动镜像
docker run -d -p 9090:8080 --name superbrothertomcat -v /home/superbrother/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/superbrother/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs diytomcat
5.访问测试
6.发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
发布自己的镜像
发布DockerHub上
1.在docker仓库注册自己的账号
2.确定这个账号可以登录 我的账号是:superbroo
3.在我们服务器上提交自己的镜像。
[root@iZbp151pi15pfb733a7a0dZ /]# 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
3.登录docker账号
[root@iZbp151pi15pfb733a7a0dZ /]# docker login -u superbroo
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
4.登录成功后,就可以提交镜像了
#增加一个tag 解决,push镜像问题。
[root@iZbp151pi15pfb733a7a0dZ /]# docker tag f7922b622ac7 superbroo/mycentos:0.1
[root@iZbp151pi15pfb733a7a0dZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 f7922b622ac7 7 hours ago 601MB
superbroo/mycentos 0.1 f7922b622ac7 7 hours ago 601MB
<none> <none> c6f7205d65ac 7 hours ago 231MB
superbrother/centos 1.0 f6879539b44c 31 hours ago 231MB
nginx latest 605c77e624dd 5 months ago 141MB
mysql 5.7 c20987f18b13 6 months ago 448MB
rabbitmq management 6c3c2a225947 6 months ago 253MB
centos 7 eeb6ee3f44bd 9 months ago 204MB
centos latest 5d0da3dc9764 9 months ago 231MB
portainer/portainer latest 580c0e4e98b0 15 months ago 79.1MB
# docker push上去即可,自己发布的镜像,带上版本号
[root@iZbp151pi15pfb733a7a0dZ /]# docker push superbroo/mycentos:0.1
The push refers to repository [docker.io/superbroo/mycentos]
9543277ac0b1: Pushing 34.5MB/171.2MB
96ebc4bc2c88: Pushing 42.36MB/226.2MB
174f56854903: Mounted from library/centos
发布到阿里云服务上
1.登录阿里云
2.找到容器镜像服务
3.创建命名空间
4.创建容器
5.浏览阿里云
Docker网络
实战部署redis集群
springboot微服务打包Docker镜像
1.构建springboot项目
2.打包应用
3.编写dockerfile
4.构建镜像
5.发布运行
https://blog.csdn.net/weixin_40496191/article/details/122714245 部署步骤
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!