学习资料:
【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili
文章目录- Docker快速入门
- 1、Docker概述
- 1.1 Docker 为什么会出现
- 1.2 Docker的概述
- 1、基本介绍
- 2、应用场景
- 3、Docker 的优势
- (1) 快速,一致地交付您的应用程序。
- (2) 响应式部署和扩展
- (3) 在同一硬件上运行更多工作负载
- 2、 虚拟化技术和容器化技术
- 3、 Docker的基本组成
- 4、 Docker的安装
- 4.1、查看系统的内核:`uname -r`
- 4.2、查看系统配置`cat /etc/os-release`
- 4.3、开始安装
- 4.3.1、下载需要的安装包
- 4.3.2、设置阿里云的Docker镜像仓库
- 4.3.3、更新yum软件包索引
- 4.3.4、安装docker相关的配置
- 4.3.5、启动Docker
- 4.4、hello-world镜像测试
- 4.5、查看下载的hello-world镜像
- 5、配置阿里云镜像加速
- 6、Docker原理
- 6.1、Docker容器运行流程
- 6.2、底层原理
- 7、Docker常用命令
- 7.1、全部命令
- 7.2、基础命令
- 7.3、镜像命令
- 7.3.1、查看所有镜像
- 7.3.2、docker搜索镜像
- 7.3.3、docker pull 下载镜像
- 7.3.4、删除镜像
- 7.4、容器命令
- 7.5、其他常用命令
- 8、docker练习
- 8.1、部署Nginx
- 8.2、部署Tomcat
- 8.3、部署 ElasticSearch+Kibana
- 8.3.1、部署 ElasticSearch
- 9、图形化管理工具Portaniner安装
- 9.1、什么是Portaniner
- 10、Docker镜像详解
- 10.1 什么是镜像
- 11、Commit,提交自己镜像
一款产品上线:面临问题:
-
问题1:开发 和 上线 俩套环境
-
问题2:开发人员 和 运维人员 ,开发测试可运行,上线就运行不了
-
问题3:环境配置十分麻烦,每个机器都要部署环境(集群 Redis、ES、Hadoop 等等)
-
问题4: 发布 jar包 时 又要 部署(Mysql、ES、Redis、jdk 等等)费时的环境,希望jar + 环境一起发布
-
问题5:部署的环境不能跨平台 windows 与 Linux
Docker 给以上问题提出了解决方案
-
传统:开发打jar包 给运维来部署
-
现在:开发即负责打包又负责部署,全栈开发
-
开发人员 打jar包带上环境(这里的环境称为镜像) – Docker 仓库(商店) – 运维人员下载 镜像 可直接运行
-
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
-
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
-
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
-
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
官网:https://www.docker.com/
文档地址: https://docs.docker.com/ (Docker官网文档)
仓库地址:https://hub.docker.com/
2、应用场景-
Web 应用的自动化打包和发布。
-
自动化测试和持续集成、发布。
-
在服务型环境中部署和调整数据库或其他的后台应用。
-
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
(1) 快速,一致地交付您的应用程序。Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
(2) 响应式部署和扩展Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
(3) 在同一硬件上运行更多工作负载Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
2、 虚拟化技术和容器化技术虚拟化技术特点:
- 资源占用多
- 冗余步骤多
- 启动很慢
容器化技术:容器化技术不是模拟的一个完整的操作系统
虚拟机非常笨重,而docker十分小巧。
比较Docker和虚拟机的不同:
-
传统虚拟机:
虚拟出硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。 -
Docker容器 :
Docker容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件。每个容器都是相互隔离的,每个容器都有属于自己的文件系统,互不影响。
DevOps (Dev:开发,Ops:运维)
-
容器化带来的好处:
- 应用更快速的交付和部署
-
传统
- 一堆帮助文档,安装程序
-
Docker :
- 打包镜像发布测试,一键运行
- 更便捷的升级和扩缩容
- 使用了Docker之后,我们部署应用就和搭积木一样!
- 项目打包为一个镜像,扩展服务器A !服务器B
- 更简单的系统运维
- 在容器化之后,我们的开发,测试环境都是高度一致的.
- 更高效的计算资源利用:
- Docker是内核级别的虚拟化,可以再一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。
Docker的基本组成图如下:
Client:客户端
DOCKER_HOST:docker的主机(服务器)
Registry: 远程仓库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G7J81aZA-1652100236779)(https://docs.docker.com/engine/images/architecture.svg)]
镜像(image ):
- docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像==> run ==> tomcatOI容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的). 开发人员 打jar包带上环境(这里的环境称为镜像)
容器(container ):
- Docker用容器技术,独立运行Y或者一个组应用,通过镜像来创建的。启动,停止,删除,基本命令!目前就可以把这个容器理解为就是一个简易的linux系统镜像启动后出现容器(镜像相当于类,容器相当于实例。一个镜像可以创建多个容器)
仓库(repository ):
- 仓库就是存放镜像的地方!仓库分为公有仓库和私有仓库!Docker Hub (默认是国外的)
在 CentOS | 上安装 Docker 引擎Docker 文档
4.1、查看系统的内核:uname -r环境准备 Linux CentOS7
系统内核版本为3.10.0
[root@Agustletmen ~]# uname -r 3.10.0-1160.53.1.el7.x86_644.2、查看系统配置cat /etc/os-release
[root@Agustletmen ~]# 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"
卸载旧版本 https://docs.docker.com/engine/install/centos/
旧版本的 Docker 被称为 或 .如果已安装这些项,请将其以及关联的依赖项一起卸载。
[root@ecs-218164 /]# sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
4.3、开始安装
4.3.1、下载需要的安装包Docker的安装步骤
yum install -y yum-utils4.3.2、设置阿里云的Docker镜像仓库
yum-config-manager
--add-repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.3.3、更新yum软件包索引
yum makecache fast4.3.4、安装docker相关的配置
docker-ce 是社区版,docker-ee 企业版
yum install docker-ce docker-ce-cli containerd.io
出现了completed(或 完毕!)即安装成功。
4.3.5、启动Docker# 启动Docker systemctl start docker # 查看当前版本号,是否启动成功 docker version # 设置开机自启动 systemctl enable docker4.4、hello-world镜像测试
1、下载hello-world镜像进行测试
docker run hello-world
[root@Agustletmen ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
4.5、查看下载的hello-world镜像
[root@Agustletmen ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 7 months ago 13.3kB
Docker的卸载
1、卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
2、删除资源 ./var/lib/docker是docker的默认工作路径
rm -rf /var/lib/docker5、配置阿里云镜像加速
本地机器无法使用
1、进入阿里云官网,搜索容器镜像服务
2、同时执行官方的命令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["加速器地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
6、Docker原理
6.1、Docker容器运行流程
启动一个容器,docker run的运行流程如下图:
6.2、底层原理 Docker是一个Client-Server(客户端-服务器)结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问!Docker Server(服务器)接收到Docker-Client(客户端)的指令,就会执行这个指令!
Docker为什么比VMWare(虚拟机)快?
- Docker比虚拟机更少的抽象层
- docker利用宿主机的内核,而VM需要的是Guest OS(虚拟机操作系统)
Docker新建一个容器的时候,不需要像虚拟机一样重新加载一个操作系统内核,直接利用宿主机的操作系统,而虚拟机是需要加载Guest OS(虚拟机操作系统)。Docker和VM的对比如下:
7、Docker常用命令命令的帮助文档地址:https://docs.docker.com/reference/
7.1、全部命令docker --help
[root@Agustletmen ~]]# docker --help
Usage: docker [OPTIONS] COMMAND
// docker [选项] 命令
A self-sufficient runtime for containers //翻译:容器的自给自足运行时
Options:【选项】
--config string //客户端配置文件的位置 (default "/root/.docker")
-c, --context string //用于连接到守护进程的上下文的名称(覆盖DOCKER_HOST env变量和默认上下文设置 "docker context use")
-D, --debug //启用调试模式
-H, --host list //守护进程 socket(s) 连接
-l, --log-level string //设置日志级别 ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--tls //使用 TLS; 隐含 --tlsverify
--tlscacert string //仅由此CA签名的信任证书(default "/root/.docker/ca.pem")
--tlscert string //TLS证书文件路径 (default "/root/.docker/cert.pem")
--tlskey string //TLS密钥文件的路径 (default "/root/.docker/key.pem")
--tlsverify //使用TLS并验证远端
-v, --version //打印版本信息并退出
Management Commands:【管理命令】
app* Docker App (Docker Inc., v0.9.1-beta3)
builder Manage(管理) builds
buildx* Docker Buildx (Docker Inc., v0.7.1-docker)
config Manage Docker configs
container Manage containers //containers:容器
context Manage contexts
image Manage images
manifest Manage Docker image manifests and manifest lists //管理Docker镜像清单和清单列表
network Manage networks
node Manage Swarm nodes //群节点
plugin Manage plugins //插件
scan* Docker Scan (Docker Inc., v0.12.0) //Scan:扫描
secret Manage Docker secrets //密码
service Manage services
stack Manage Docker stacks
swarm Manage Swarm //群
system Manage Docker
trust Manage trust on Docker images // trust:信任
volume Manage volumes //卷
Commands:【命令】
attach //将本地标准输入、输出和错误流附加到运行的容器 attach:附加
build //从Dockerfile构建一个映像
commit //根据容器的更改创建一个新镜像
cp //在容器和本地文件系统之间复制文件/文件夹
create //创建一个新容器
diff //检查容器文件系统中文件或目录的更改
events //从服务器获取实时事件 events:事件
exec //在运行的容器中运行命令 exec:执行
export //将容器的文件系统导出为tar存档文件 export:导出
history //显示一个镜像的历史
images //镜像的列表
import //从tarball文件中导入内容以创建文件系统映像
info //显示整个系统的信息
inspect //返回Docker对象的底层信息 inspect:检查
kill //杀死一个或多个正在运行的容器
load //从tar存档文件或STDIN加载镜像
login //登录到Docker注册表
logout //从Docker注册表注销
logs //获取容器的日志
pause //暂停一个或多个容器中的所有进程 pause:暂停
port //列出容器的端口映射或特定映射
ps //容器的列表
pull //从仓库(registry)中拉取镜像或存储库
push //将镜像或存储库推送到仓库(registry)
rename //重命名一个容器
restart //重新启动一个或多个容器
rm //移除一个或多个容器
rmi //移除一个或多个镜像
run //在新容器中运行命令
save //将一个或多个镜像保存到tar存档文件(默认情况下流到STDOUT)
search //在Docker Hub搜索镜像
start //启动一个或多个停止的容器
stats //显示容器资源使用统计的实时流
stop //停止一个或多个正在运行的容器
tag //创建引用SOURCE_IMAGE的标记TARGET_IMAGE
top //显示容器的运行进程
unpause //取消暂停一个或多个容器中的所有进程 unpause:不暂停
update //更新一个或多个容器的配置
version //查看Docker版本信息
wait //阻塞直到一个或多个容器停止,然后打印它们的退出代码
Run 'docker COMMAND --help' for more information on a command.
7.2、基础命令
docker version #显示docker的版本信息 docker info #显示docker的系统信息,包括镜像和容器的数量 docker 命令 --help #帮助命令(可查看可选的参数) docker COMMAND --help docker --help #列出所有命令7.3、镜像命令 7.3.1、查看所有镜像
docker images
[root@Agustletmen ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 7 months ago 13.3kB # REPOSITORY 镜像的仓库源 # TAG 镜像的标签 # IMAGE ID 镜像的id # CREATED 镜像的创建时间 # SIZE 镜像的大小
[root@Agustletmen ~]# docker images --help Usage: docker images [OPTIONS] [REPOSITORY[:TAG]] List images Options: -a, --all # 列出所有的镜像 -q, --quiet # 只显示镜像的id
docker images -a
[root@Agustletmen ~]# docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 7 months ago 13.3kB [root@Agustletmen ~]# docker images -q feb5d9fea6a57.3.2、docker搜索镜像
在仓库搜索 https://hub.docker.com/search?q=mysql
命令:
[root@Agustletmen ~]# docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
# 通过搜索过滤
--filter=STARS=3000 搜索出来的镜像就是STARS大于3000
[root@Agustletmen ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12525 [OK]
mariadb MariaDB Server is a high performing open sou… 4817 [OK]
docker search mysql
[root@Agustletmen ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 12525 [OK] mariadb MariaDB Server is a high performing open sou… 4817 [OK] percona Percona Server is a fork of the MySQL relati… 575 [OK] phpmyadmin phpMyAdmin - A web interface for MySQL and M… 526 [OK] bitnami/mysql Bitnami MySQL Docker Image 70 [OK] linuxserver/mysql-workbench 36 linuxserver/mysql A Mysql container, brought to you by LinuxSe… 35 ubuntu/mysql MySQL open source fast, stable, multi-thread… 31 circleci/mysql MySQL is a widely used, open-source relation… 25 google/mysql MySQL server for Google Compute Engine 21 [OK] vmware/harbor-db Mysql container for Harbor 10 bitnami/mysqld-exporter 3 ibmcom/mysql-s390x Docker image for mysql-s390x 2 vitess/mysqlctld vitess/mysqlctld 1 [OK] nasqueron/mysql 1 [OK] newrelic/mysql-plugin New Relic Plugin for monitoring MySQL databa… 1 [OK] docksal/mysql MySQL service images for Docksal - https://d… 0 mirantis/mysql 0 drud/mysql-local-57 ddev mysql local container 0 drud/mysql-docker-local-57 This repo has been deprecated, new tags are … 0 drud/mysql 0 drud/mysql-docker-local docker containers for local womysql rk 0 [OK] cimg/mysql 0 drud/mysqld-exporter 0 silintl/mysql-backup-restore Simple docker image to perform mysql backups… 0 [OK]7.3.3、docker pull 下载镜像
[root@Agustletmen ~]# docker pull --help
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Pull an image or a repository from a registry
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
--platform string Set platform if server is multi-platform capable
-q, --quiet Suppress verbose output
拉取(下载)一个镜像
# 下载镜像 docker pull 镜像[:tag] tag:版本(版本默认最新) docker pull mysql -------------------------------------------------------------------- [root@Agustletmen ~]# docker pull mysql Using default tag: latest # 如果不写tag 默认就是latest latest: Pulling from library/mysql 72a69066d2fe: Pull complete # 分层下载 docker images的核心 联合文件系统 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 # 签名3 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest # 真实地址 # 以下两个命令是等价的 docker pull mysql docker pull mysql docker.io/library/mysql:latest -------------------------------------------------------------------- # 指定版本 docker pull mysql:5.7 [root@Agustletmen ~]# 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.77.3.4、删除镜像
docker rmi -f 【镜像id】 [root@Agustletmen ~]# docker rmi -f c20987f18b13 Untagged: mysql:5.7 Untagged: mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94 Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76 Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989 Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40f Deleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150 Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92
删除多个镜像
docker rmi -f 【镜像id】 【镜像id】 【镜像id】 ...
删除所有镜像
docker rmi -f $(docker images -aq) [root@Agustletmen ~]# docker rmi -f $(docker images -aq) Untagged: mysql:latest Untagged: mysql@sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 Deleted: sha256:3218b38490cec8d31976a40b92e09d61377359eab878db49f025e5d464367f3b Deleted: sha256:aa81ca46575069829fe1b3c654d9e8feb43b4373932159fe2cad1ac13524a2f5 Deleted: sha256:0558823b9fbe967ea6d7174999be3cc9250b3423036370dc1a6888168cbd224d Deleted: sha256:a46013db1d31231a0e1bac7eeda5ad4786dea0b1773927b45f92ea352a6d7ff9 Deleted: sha256:af161a47bb22852e9e3caf39f1dcd590b64bb8fae54315f9c2e7dc35b025e4e3 Deleted: sha256:feff1495e6982a7e91edc59b96ea74fd80e03674d92c7ec8a502b417268822ff Deleted: sha256:8805862fcb6ef9deb32d4218e9e6377f35fb351a8be7abafdf1da358b2b287ba Deleted: sha256:872d2f24c4c64a6795e86958fde075a273c35c82815f0a5025cce41edfef50c7 Deleted: sha256:6fdb3143b79e1be7181d32748dd9d4a845056dfe16ee4c827410e0edef5ad3da Deleted: sha256:b0527c827c82a8f8f37f706fcb86c420819bb7d707a8de7b664b9ca491c96838 Deleted: sha256:75147f61f29796d6528486d8b1f9fb5d122709ea35620f8ffcea0e0ad2ab0cd0 Deleted: sha256:2938c71ddf01643685879bf182b626f0a53b1356138ef73c40496182e84548aa Deleted: sha256:ad6b69b549193f81b039a1d478bc896f6e460c77c1849a4374ab95f9a3d2cea2 Untagged: hello-world:latest Untagged: hello-world@sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67 Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b34127.4、容器命令
- 镜像相当于类,容器相当于实例。一个镜像可以创建多个容器
- 镜像相当于你安装系统时下载的镜像文件,而容器呢就相当于你安装好的系统
拉取一个centos镜像
docker pull centos
[root@Agustletmen ~]# docker pull centos Using default tag: latest latest: Pulling from library/centos a1d0c7532777: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Status: Downloaded newer image for centos:latest docker.io/library/centos:latest [root@Agustletmen ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 7 months ago 231MB
新建容器并启动
# image:镜像名字或id
docker run [可选参数] image
//参数说明
--name="名字" # 指定容器名字 tomcat01 tomcat02 用来区分容器
-d # 后台方式运行 若没有提供服务则自动退出(停止)
-it # 使用交互方式运行,进入容器查看内容
-p # 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口 # 配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口
-P # 随机指定端口(大写的P)
# 测试:启动并进去容器
[root@Agustletmen ~]# docker run -it centos /bin/bash
[root@29773b9ed577 /]#
[root@29773b9ed577 /]# ls # 查看容器内的centos
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
# 从容器退回主机
[root@29773b9ed577 /]# exit
exit
列出所有的运行的容器
# docker ps 命令 #列出当前正在运行的容器 -a # 列出当前正在运行的容器+带出历史运行的容器 -n # 显示最近创建的容器 -q # 只显示容器的编号 -aq # 只显示容器的编号 [root@Agustletmen /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@Agustletmen /]# [root@Agustletmen /]# [root@Agustletmen /]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 29773b9ed577 centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago dreamy_wescoff 8308fcb2e85a feb5d9fea6a5 "/hello" About an hour ago Exited (0) About an hour ago blissful_shannon [root@Agustletmen /]#
退出容器
exit # 直接容器停止并退出 Ctrl+P+Q # 容器不停止退出
删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器 docker rm -f 容器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 #强制停止当前容器7.5、其他常用命令
后台启动容器
# 命令 docker run -d 镜像名 [root@Agustletmen /]# docker run -d centos # 问题:docker ps 发现centos停止了 # 常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止 # nginx,容器启动后,发现自己没有提供服务,就会立刻停止,没有程序了
查看日志
[root@Agustletmen /]# docker logs --help
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--details # 显示提供给日志的额外细节
-f, --follow # 跟踪日志输出
--since string # 显示自定义时间戳以来的日志
-n, --tail string # 从日志的末尾显示的行数
-t, --timestamps # 显示时间戳
--until string # 在时间戳之前显示日志.
# 常用:
docker logs -tf 【容器id】
docker logs --tail number 【容器id】 # num为要显示的日志条数
#docker容器后台运行,必须要有一个前台的进程,否则会自动停止 #编写shell脚本循环执行,使得centos容器保持运行状态 [root@Agustletmen /]# docker run -d centos /bin/sh -c "while true;do echo hello;sleep 5;done" 2b8ed9e4dcb655547b3c2aa28cd849179190ec03ecca2aabf9c7a44155b13097 [root@Agustletmen /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7c5b733f8cb4 centos "/bin/sh -c 'while t…" 9 seconds ago Up 8 seconds nervous_feynman [root@Agustletmen /]# docker logs -tf --tail 10 7c5b733f8cb4 2022-05-07T08:24:51.241805792Z hello 2022-05-07T08:24:56.244030643Z hello 2022-05-07T08:25:01.246287643Z hello 2022-05-07T08:25:06.253803057Z hello 2022-05-07T08:25:11.255971530Z hello 2022-05-07T08:25:16.258153987Z hello 2022-05-07T08:25:21.260314005Z hello 2022-05-07T08:25:26.262483300Z hello 2022-05-07T08:25:31.267317028Z hello 2022-05-07T08:25:36.269456458Z hello # Ctrl + Shift + c 退出
查看容器中进程信息
docker top 容器id
# 命令 docker top 容器id [root@Agustletmen /]# docker top 7c5b733f8cb4 UID PID PPID C STIME TTY TIME CMD root 2162 2145 0 16:24 ? 00:00:00 /bin/sh -c while true;do echo hello;sleep 5;done root 2681 2162 0 16:30 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
查看容器的元数据
docker inspect 容器id
[root@Agustletmen ~]# docker inspect 7c5b733f8cb4
[
{
"Id": "7c5b733f8cb48f142d5f8312e52478de4c2c98304d50427ff324a00df2a57f59",
"Created": "2022-05-07T08:24:00.90681843Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo hello;sleep 5;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2162,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-05-07T08:24:01.222178134Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/7c5b733f8cb48f142d5f8312e52478de4c2c98304d50427ff324a00df2a57f59/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/7c5b733f8cb48f142d5f8312e52478de4c2c98304d50427ff324a00df2a57f59/hostname",
"HostsPath": "/var/lib/docker/containers/7c5b733f8cb48f142d5f8312e52478de4c2c98304d50427ff324a00df2a57f59/hosts",
"LogPath": "/var/lib/docker/containers/7c5b733f8cb48f142d5f8312e52478de4c2c98304d50427ff324a00df2a57f59/7c5b733f8cb48f142d5f8312e52478de4c2c98304d50427ff324a00df2a57f59-json.log",
"Name": "/nervous_feynman",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/cb476917c01a9b160bfbdd8c8aa9be43510a1f63a7fa08aba58388821e1d732a-init/diff:/var/lib/docker/overlay2/16f636a1e3bba372354d0795ec915bca5cd42d3efdd470e4b479772f23aa21fd/diff",
"MergedDir": "/var/lib/docker/overlay2/cb476917c01a9b160bfbdd8c8aa9be43510a1f63a7fa08aba58388821e1d732a/merged",
"UpperDir": "/var/lib/docker/overlay2/cb476917c01a9b160bfbdd8c8aa9be43510a1f63a7fa08aba58388821e1d732a/diff",
"WorkDir": "/var/lib/docker/overlay2/cb476917c01a9b160bfbdd8c8aa9be43510a1f63a7fa08aba58388821e1d732a/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "7c5b733f8cb4",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"while true;do echo hello;sleep 5;done"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20210915",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "8e9b88dbc4de9164ea42b4cb0452ba036c5d23cb294be4eab303efb141980bdf",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/8e9b88dbc4de",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "60a2014ed0d2703e6f941111be297927ce3ce51c50694232376a48bcd14ef0f4",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "6d0816089196c296f302b56d13004aaaa38f2d495727bb6e00481e53725711af",
"EndpointID": "60a2014ed0d2703e6f941111be297927ce3ce51c50694232376a48bcd14ef0f4",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
进入当前正在运行的容器
因为通常我们的容器都是使用后台方式来运行的,有时需要进入容器修改配置
# 方式一 docker exec -it 【容器id】 /bin/bash [root@Agustletmen ~]# docker exec -it 7c5b733f8cb4 /bin/bash [root@7c5b733f8cb4 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@7c5b733f8cb4 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 08:24 ? 00:00:00 /bin/sh -c while true;do echo hello;sleep 5;done root 245 0 0 08:43 pts/0 00:00:00 /bin/bash root 262 1 0 08:44 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5 root 263 245 0 08:44 pts/0 00:00:00 ps -ef --------------------------------------------------------- # 方式二 docker attach 【容器id】 [root@Agustletmen ~]# docker attach 7c5b733f8cb4 hello hello ... # docker exec 进行容器后开启一个新的终端,可以在里边操作 # docker attach 进行容器正常执行的终端,不会启动新的进程
拷贝操作(从容器中拷贝到主机)
# 将容器的文件拷贝到主机中 docker cp 容器id:容器内路径 目的主机路径 # 进去容器的home目录,新建test.java文件 # 退出容器来到主机,进去主机的home目录 # 将这文件拷贝到主机上 [root@Agustletmen home]# docker cp 260071cc62e4:/home/test.java /home [root@Agustletmen home]# ls kk.java test test.java www # 将宿主机的文件拷贝到容器中 docker cp 目的主机路径 容器id:容器内路径8、docker练习 8.1、部署Nginx
1、搜索nginx
[root@Agustletmen ~]# docker search nginx
2、拉取nginx
[root@Agustletmen ~]# docker pull nginx Using default tag: latest 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
3、运行测试
[root@Agustletmen ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 4 months ago 141MB centos latest 5d0da3dc9764 7 months ago 231MB ------------------------------------------------------------------------------ # -d 后台运行 # -name 给容器命名 # -p 宿主机端口,容器内部端口 # -p 3344:80通过端口映射将 主机的3344端口 与 容器的80端口连通,从而暴露容器的80端口 [root@Agustletmen ~]# docker run -d --name nginx01 -p 3344:80 nginx 777b9c7dc93e8d30aa542954fd991a77859ff6f6d2cf773b500a686df22a8744 ------------------------------------------------------------------------------ [root@Agustletmen ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 777b9c7dc93e nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01 ------------------------------------------------------------------------------ [root@Agustletmen ~]# curl localhost:33448.2、部署TomcatWelcome to nginx! Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.Thank you for using nginx.
------------------------------------------------------------------------------ # 进入容器 [root@Agustletmen ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 777b9c7dc93e nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01 [root@Agustletmen ~]# docker exec -it nginx01 /bin/bash root@777b9c7dc93e:/# whereis ngnix ngnix: root@777b9c7dc93e:/# whereis nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx root@777b9c7dc93e:/# cd /etc/nginx root@777b9c7dc93e:/etc/nginx# ls conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params ------------------------------------------------------------------------------ # 停止nginx [root@Agustletmen ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 777b9c7dc93e nginx "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01 ------------------------------------------------------------------------------ [root@Agustletmen ~]# docker stop 777b9c7dc93e 777b9c7dc93e ------------------------------------------------------------------------------ [root@Agustletmen ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1、拉取tomcat
[root@Agustletmen ~]# docker pull tomcat Using default tag: latest latest: Pulling from library/tomcat 0e29546d541c: Pull complete 9b829c73b52b: Pull complete cb5b7ae36172: Pull complete 6494e4811622: Pull complete 668f6fcc5fa5: Pull complete dc120c3e0290: Pull complete 8f7c0eebb7b1: Pull complete 77b694f83996: Pull complete 0f611256ec3a: Pull complete 4f25def12f23: Pull complete Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324 Status: Downloaded newer image for tomcat:latest docker.io/library/tomcat:latest
2、运行测试
[root@Agustletmen ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 4 months ago 141MB tomcat latest fb5657adc892 4 months ago 680MB centos latest 5d0da3dc9764 7 months ago 231MB ------------------------------------------------------------------------------------------ [root@Agustletmen ~]# docker run -d -p 3355:8080 --name tomcat00 tomcat 689afec94608c32cb6fc9e24b07b1a14ec6dee89be716f67828c9506b9ec0fcf # 进入容器 # 发现问题:linux命令减少,没有webapps 阿里云镜像的原因,默认是最小的镜像,所有不必要的都剔除掉. # 保证最小可运行的环境 # 若要使用webapps可以使用 [root@Agustletmen ~]# cp /webapps.dish/* webapps8.3、部署 ElasticSearch+Kibana
部署难点
-
ElasticSearch是 智能搜索,分布式的搜索引擎
-
ElasticSearch暴露的端口多、十分耗内存、数据一定要放安全目录
-
ElasticSearch是一个日志切割管理的工具
正常安装ElasticSearch后太消耗内存,导致Linux太卡了,需要添加 -e ES_JAVA_OPTS="-Xms128m -Xmx512m" 配置ElasticSearch的虚拟机占用的内存大小。
1、安装并启动
docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx512m" elasticsearch:7.6.2
2、测试连接ElasticSearch
[root@Agustletmen ~]# curl localhost:9200
{
"name" : "4359032cd00e",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "XUbDiqG5SdyRy3ejD2L6Hg",
"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"
}
3、查看资源占用情况
docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O 4359032cd00e elasticsearch01 0.93% 424.1MiB / 1.795GiB 23.08% 1.18kB / 942B BLOCK I/O PIDS 5.34MB / 729kB 43
# 增加内存限制,修改配置文件 -e 环境配置修改 docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
[root@Agustletmen ~]# docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
a37e88e0fdbe5d080fdbcca67a1ae904391497ce6f91bafd8ba27a465f4c913c
----------------------------------------------------------------------------
[root@Agustletmen ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a37e88e0fdbe elasticsearch:7.6.2 "/usr/local/bin/dock…" About a minute ago Up About a minute 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp elasticsearch02
----------------------------------------------------------------------------
[root@Agustletmen ~]# docker stats a37e88e0fdbe
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a37e88e0fdbe elasticsearch02 0.26% 344.8MiB / 1.795GiB 18.76% 656B / 0B 0B / 696kB 42
----------------------------------------------------------------------------
[root@Agustletmen ~]# curl localhost:9200
{
"name" : "a37e88e0fdbe",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "cc-uA8AiS5erK1JgDZifag",
"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"
}
9、图形化管理工具Portaniner安装
9.1、什么是Portaniner
- Portaniner是Docker的图形化管理工具,类似的工具还有Rancher(CI/CD再用)
1、下载运行Portaniner镜像并运行,设置本机映射端口为8088
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
[root@Agustletmen ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer Unable to find image 'portainer/portainer:latest' locally latest: Pulling from portainer/portainer 94cfa856b2b1: Pull complete 49d59ee0881a: Pull complete a2300fd28637: Pull complete Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f Status: Downloaded newer image for portainer/portainer:latest fea5d6617501a77a03157e83d0f9d7c5abea5e634369594c9097fc3ed8d45173 [root@Agustletmen ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a37e88e0fdbe elasticsearch:7.6.2 "/usr/local/bin/dock…" 7 minutes ago Up 7 minutes 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp elasticsearch02 [root@Agustletmen ~]#
2、windows(外网)访问成功
(1) 第一次登录设置admin用户的密码 (测试中为了好记可以设置成12345678)
(2) 选择Local(本地)
(3) 查看镜像列表
10、Docker镜像详解 10.1 什么是镜像镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。
所以应用直接打包镜像,就可以用于运行
获得镜像的途径:
- 自己制作镜像DockerFile - 远程仓库下载 - 别人copy给你
UnionFS(联合文件系统)
- 联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
- 特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
镜像加载原理
Docker的镜像实际由一层一层的文件系统组成:
- bootfs(boot file system)主要包含bootloader和kernel。bootloader主要是引导加载kernel,完成后整个内核就都在内存中了。此时内存的使用权已由bootfs转交给内核,系统卸载bootfs。可以被不同的Linux发行版公用。
- rootfs(root file system),包含典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同操作系统发行版(Ubuntu,Centos等)。因为底层直接用Host的kernel,rootfs只包含最基本的命令,工具和程序就可以了。
- 分层理解
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的容器层。
容器在启动时会在镜像最外层上建立一层可读写的容器层(R/W),而镜像层是只读的(R/O)。
最大的好处,莫过于是资源共享了 !比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只高要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享.
查看镜像分层的方式可以通过docker image inspect命令!
docker image inspect redis
[
{
"Id": "sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631",
"RepoTags": [
"redis:latest"
],
"RepoDigests": [
"redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339"
],
"Parent": "",
"Comment": "",
"Created": "2021-12-21T12:42:49.755107412Z",
"Container": "13d25f53410417c5220c8dfe8bd49f06abdbcd69faa62a9b877de02464bb04a3",
"ContainerConfig": {
"Hostname": "13d25f534104",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.2.6",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz",
"REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD ["redis-server"]"
],
"Image": "sha256:e093f59d716c95cfce82c676f099b960cc700432ab531388fcedf79932fc81ec",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "20.10.7",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.2.6",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz",
"REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab"
],
"Cmd": [
"redis-server"
],
"Image": "sha256:e093f59d716c95cfce82c676f099b960cc700432ab531388fcedf79932fc81ec",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 112691373,
"VirtualSize": 112691373,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/57d3c0eb7048f87b54d81a3717346ddb8095febdae47ab6c4eb2265965a1c944/diff:/var/lib/docker/overlay2/68c8c443b76c8e37418c18162ed1fdd6ceacfd28fe104505c550c48a9a933377/diff:/var/lib/docker/overlay2/6dea30e46e388d168f432029c750022695e21935882bd406124dc9399fc42675/diff:/var/lib/docker/overlay2/888233e0e1ceebefcbc81ce311bda44623f44075efb3f8cfc5b4a1ba126b91d6/diff:/var/lib/docker/overlay2/adb39c36e594adf3d39d13f50d0bc9fa560dea422a50ffcf1d8f872e7e8f4e2e/diff",
"MergedDir": "/var/lib/docker/overlay2/ee4a3bf0a9185e917033bf5f566fff3971480a34385fb1e3f03584fa5ae349b4/merged",
"UpperDir": "/var/lib/docker/overlay2/ee4a3bf0a9185e917033bf5f566fff3971480a34385fb1e3f03584fa5ae349b4/diff",
"WorkDir": "/var/lib/docker/overlay2/ee4a3bf0a9185e917033bf5f566fff3971480a34385fb1e3f03584fa5ae349b4/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
"sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb",
"sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1",
"sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372",
"sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed",
"sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层.
举一个简单的例子,假如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,
就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子).
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常里要.下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件.
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux上可用的存储引擎有AUFS、Overlay2. Device hopper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的
文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfilter 一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[ 1] 0
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!这一层就是我们通常说的容器层,容器之下的都叫镜像层!
11、Commit,提交自己镜像使用docker commit命令提交容器成为一个新的版本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
由于默认的Tomcat镜像的webapps文件夹中没有任何内容,需要从webapps.dist中拷贝文件到webapps文件夹。下面自行制作镜像:就是从webapps.dist中拷贝文件到webapps文件夹下,并提交该镜像作为一个新的镜像。使得该镜像默认的webapps文件夹下就有文件。具体步骤如下:
1、启动Tomcat
[root@Agustletmen ~]# clear [root@Agustletmen ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 4 months ago 141MB tomcat latest fb5657adc892 4 months ago 680MB redis latest 7614ae9453d1 4 months ago 113MB centos latest 5d0da3dc9764 7 months ago 231MB portainer/portainer latest 580c0e4e98b0 13 months ago 79.1MB elasticsearch 7.6.2 f29a1ee41030 2 years ago 791MB [root@Agustletmen ~]# docker run -it -p 8080:8080 tomcat ...
实战测试
# 1.启动默认的tomcat # 2.发现默认的tomcat是没有webapps应用的,是因为镜像的原因,官方默认的webapps下面是没有文件的 # 3.自己拷贝进去基本文件 # 4.将我们操作过的容器通过commit提交为一个镜像,以后就使用我们修改过的镜像即可,这就是我们自己修改过的镜像
[root@Agustletmen ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6b47f8aa8239 tomcat "catalina.sh run" 5 minutes ago Up 5 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp gallant_hellman [root@Agustletmen ~]# docker commit -a="qx" -m="add webapps app" 6b47f8aa8239 tomcat02:1.0 sha256:3167bc871f7e9f176f9a278133e49d3bdbb7cf554d1e8cddf3470a00da82f4b9 [root@Agustletmen ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat02 1.0 3167bc871f7e 12 seconds ago 684MB nginx latest 605c77e624dd 4 months ago 141MB tomcat latest fb5657adc892 4 months ago 680MB redis latest 7614ae9453d1 4 months ago 113MB centos latest 5d0da3dc9764 7 months ago 231MB portainer/portainer latest 580c0e4e98b0 13 months ago 79.1MB elasticsearch 7.6.2 f29a1ee41030 2 years ago 791MB [root@Agustletmen ~]#
4 months ago 141MB
tomcat latest fb5657adc892 4 months ago 680MB
redis latest 7614ae9453d1 4 months ago 113MB
centos latest 5d0da3dc9764 7 months ago 231MB
portainer/portainer latest 580c0e4e98b0 13 months ago 79.1MB
elasticsearch 7.6.2 f29a1ee41030 2 years ago 791MB
[root@Agustletmen ~]# docker run -it -p 8080:8080 tomcat
…
``实战测试`` ```shell # 1.启动默认的tomcat # 2.发现默认的tomcat是没有webapps应用的,是因为镜像的原因,官方默认的webapps下面是没有文件的 # 3.自己拷贝进去基本文件 # 4.将我们操作过的容器通过commit提交为一个镜像,以后就使用我们修改过的镜像即可,这就是我们自己修改过的镜像
[root@Agustletmen ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6b47f8aa8239 tomcat "catalina.sh run" 5 minutes ago Up 5 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp gallant_hellman [root@Agustletmen ~]# docker commit -a="qx" -m="add webapps app" 6b47f8aa8239 tomcat02:1.0 sha256:3167bc871f7e9f176f9a278133e49d3bdbb7cf554d1e8cddf3470a00da82f4b9 [root@Agustletmen ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat02 1.0 3167bc871f7e 12 seconds ago 684MB nginx latest 605c77e624dd 4 months ago 141MB tomcat latest fb5657adc892 4 months ago 680MB redis latest 7614ae9453d1 4 months ago 113MB centos latest 5d0da3dc9764 7 months ago 231MB portainer/portainer latest 580c0e4e98b0 13 months ago 79.1MB elasticsearch 7.6.2 f29a1ee41030 2 years ago 791MB [root@Agustletmen ~]#
Docker快速入门进阶



