(1)基本介绍
Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。
Docker可以让开发者打包他们的应用以及依赖到一个轻量级、可移植的容器中,然后发布到任何流行的Linuc机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app),更重要的是容器性能开销极低。
Docker从17.3版本之后分为CE(Community Edition :社区版)和EE (Enterprise Edition:企业版),我们用社区版就可以了。官网:https://docs.docker.com/
(2)应用场景
- Web应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其它的后台应用
- 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
(3)Docker的优势
Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使你能够将应用程序与基础架构分开,从而可以快速交付软件。借助Docker,你可以与管理应用程序相同方式来管理基础架构。通过利用Docker的方法来快速交付、测试和部署代码,你可以大大减少编写代码和生产环境中运行代码之间的延迟。
**1、快速,一致地交付你的应用程序。**Docker允许开发人员使用你提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续继承和持续交付(CI / CD)工作流程,请考虑一下示例方案:
你的开发人员在本地编写代码,并使用Docker容器与同事共享他们的工作。
他们使用Docker将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker是基于容器的平台,允许高度可移植的工作负载。Docker容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker的可移植性和轻量级的特性,还可以使你轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此你可以利用更多的计算能力来实现业务目标。Docker非常适合于高密度环境以及中小型部署,而你可以用更少的资源做更多的事情。
2.虚拟化技术和容器化技术虚拟化技术特点:
- 资源占用多
- 冗余步骤多
- 启动很慢
容器化技术:容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机的不同:
- 传统虚拟机,虚拟出硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
- Docker容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件。
- 每个容器都是相互隔离的,每个容器都有属于自己的文件系统,互不影响。
容器化带来的好处:
3.Docker的基本组成Docker的基本组成图如下:
说明:
**镜像(image):**docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像==> run ==> tomcat01(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或项目运行就是在容器中的)。
**容器(container):**Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
启动,停止,删除,基本命令!
目前就可以把这个容器理解为就是一个简易的linux系统
仓库(repository):
仓库就是存放镜像的地方
仓库分为共有仓库和私有仓库!
Docker Hub(默认是国外的)
4.Docker的安装查看系统的内核:
uname -r
系统内核版本为3.10.0
[root@VM-0-5-centos ~]# uname -r 3.10.0-1160.11.1.el7.x86_64
查看系统配置
cat /etc/os-release
[root@VM-0-5-centos ~]# 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"
Docker的安装步骤:
(1)卸载旧版本
[root@VM-0-5-centos ~]# yum remove docker
(2)下载需要的安装包
[root@VM-0-5-centos ~]#yum-config-manager
(3)设置镜像的仓库
[root@VM-0-5-centos ~]#
yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo #国外的地址
# 设置阿里云的Docker镜像仓库
yum-config-manager
--add-repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #国外的地址
(4)更新yum软件包索引
[root@VM-0-5-centos ~]# yum makecache fast
(5)安装docker相关的配置
docker-ce是社区版,docker-ee企业版
[root@VM-0-5-centos ~]# yum install docker-ce docker-ce-cli containerd.io
(6)启动Docker
[root@VM-0-5-centos ~]# systemctl start docker [root@VM-0-5-centos ~]# docker version [root@VM-0-5-centos ~]# systemctl enable docker
结果:
下载hello-wold镜像进行测试
[root@VM-0-5-centos ~]# docker run hello-world
查看下载的hello world镜像
[root@VM-0-5-centos ~]# docker images5.Docker的卸载
# 1. 卸载依赖 yum remove docker-ce docker-ce-cli containerd.io # 2. 删除资源 . /var/lib/docker是docker的默认工作路径 rm -rf /var/lib/docker6.配置阿里云镜像加速
(1)进入阿里云官网,搜索容器镜像服务
(2)依次执行官方的这四条命令
[root@VM-0-5-centos ~]# sudo mkdir -p /etc/docker
[root@VM-0-5-centos ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
> }
> EOF
{
"registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
}
[root@VM-0-5-centos ~]# sudo systemctl daemon-reload
[root@VM-0-5-centos ~]# sudo systemctl restart docker
7.Docker容器运行流程
启动一个容器,Docker的运行流程如下图:
8.底层原理Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问!Docker Server接收到Docker-Client的指令,就会执行这个指令!
Docker为什么比VM Ware快?
1、Docker比虚拟机更少的抽象层
2、Docker利用宿主机的内核,VM需要的是Guest OS
Docker新建一个容器的时候,不需要像虚拟机一样重新加载一个操作系统内核,直接利用宿主机的操作系统,而虚拟机是需要加载Guest OS。Docker和VM的对比如下:
9.Docker常用命令 9.1基础命令[root@VM-0-5-centos ~]# docker version #查看docker的版本信息 [root@VM-0-5-centos ~]# docker info # 查看docker的系统信息,包括镜像和容器的数量 [root@VM-0-5-centos ~]# docker 命令 --help #帮助命令(可查看可选的参数)9.2 镜像命令
- docker images查看本地主机的所有镜像
[root@VM-0-5-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 2 weeks ago 13.3kB #解释 1.REPOSITORY 镜像的仓库源 2.TAG 镜像的标签 3.IMAGE ID 镜像的id 4.CREATED 镜像的创建时间 4.SIZE 镜像的大小 # 可选参数 -a/ --all 列出所有镜像 -q/ --quiet 只显示镜像的id
- docker search 搜索镜像
[root@VM-0-5-centos ~]# docker search mysql
NAME DEscriptION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11530 [OK]
mariadb MariaDB Server is a high performing open sou… 4378 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 852 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 342 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 91
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 88
centurylink/mysql Image containing mysql. Optimized to be link… 59 [OK]
# 可选参数
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
#搜索收藏数大于3000的镜像
[root@VM-0-5-centos ~]# docker search mysql --filter=STARS=3000
NAME DEscriptION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11530 [OK]
mariadb MariaDB Server is a high performing open sou… 4378 [OK]
- docker pull 镜像名[:tag]下载镜像
[root@VM-0-5-centos ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql b380bbd43752: Pull complete f23cbf2ecc5d: Pull complete 30cfc6c29c0a: Pull complete b38609286cbe: Pull complete 8211d9e66cd6: Pull complete 2313f9eeca4a: Pull complete 7eb487d00da0: Pull complete a5d2b117a938: Pull complete 1f6cb474cd1c: Pull complete 896b3fd2ab07: Pull complete 532e67ebb376: Pull complete 233c7958b33f: Pull complete Digest: sha256:5d52dc010398db422949f079c76e98f6b62230e5b59c0bf7582409d2c85abacb Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #下载来源的真实地址 #docker pull mysql等价于docker pull docker.io/library/mysql:latest
指定版本下载
[root@VM-0-5-centos ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql b380bbd43752: Already exists f23cbf2ecc5d: Already exists 30cfc6c29c0a: Already exists b38609286cbe: Already exists 8211d9e66cd6: Already exists 2313f9eeca4a: Already exists 7eb487d00da0: Already exists bb9cc5c700e7: Pull complete 88676eb32344: Pull complete 8fea0b38a348: Pull complete 3dc585bfc693: Pull complete Digest: sha256:b8814059bbd9c80b78fe4b2b0b70cd70fe3772b3c5d8ee1edfa46791db3224f9 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7
- docker rmi删除镜像
#1.删除指定的镜像id [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id #2.删除多个镜像id [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id 镜像id 镜像id #3.删除全部的镜像id [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f $(docker images -aq) ———————————————— 版权声明:本文为CSDN博主「Code0cean」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/huangjhai/article/details/1188547339.3 容器命令
如拉取一个centos容器
docker pull centos
运行容器
[root@VM-0-5-centos ~]# docker run centos docker run [可选参数] image #参数说明 --name="名字" 指定容器名字 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 ( -p ip:主机端口:容器端口 配置主机端口映射到容器端口 -p 主机端口:容器端口 -p 容器端口 ) -P 随机指定端口(大写的P)
进入容器
[root@VM-0-5-centos ~]# docker run -it centos /bin/bash [root@0a1221061097 /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr
退出容器
#exit 停止并退出容器(后台方式运行则仅退出) #Ctrl+P+Q 不停止容器退出 [root@0a1221061097 /]# exit exit
列出运行过的容器
#docker ps
# 列出当前正在运行的容器
-a # 列出所有容器的运行记录
-n=? # 显示最近创建的n个容器
-q # 只显示容器的编号
[root@VM-0-5-centos ~]# docker ps
ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@VM-0-5-centos ~]# docker ps -a
ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a1221061097 centos "/bin/bash" 5 minutes ago Exited (0) about a minute ago compassionate_hertz
3a825bd1d5b5 centos "/bin/bash" 8 minutes ago Exited (0) 8 minutes ago blissful_nightingale
d8f137721f4d feb5d9fea6a5 "image" 9 minutes ago Created modest_burnell
665bf85d2624 hello-world "/hello" 9 hours ago Exited (0) 9 hours ago busy_taussig
[root@VM-0-5-centos ~]#
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f 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 #强制停止当前容器9.4其它常用命令
- 日志的查看:
[root@VM-0-5-centos /]# docker logs --help
Usage: docker logs [OPTIONS] ConTAINER
Fetch the logs of a container
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g.
2013-01-02T13:23:37Z) or relative (e.g. 42m for
42 minutes)
-n, --tail string Number of lines to show from the end of the logs
(default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g.
2013-01-02T13:23:37Z) or relative (e.g. 42m for
42 minutes)
常用:
docker logs -tf 容器id
docker logs --tail number 容器id #num 为要显示的日志条数
#docker容器后台运行,必须要有一个前台的进行,否则会自动停止
#编写shell脚本循环执行,使得centos容器保持运行状态
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;done"
c703b5b1911ff84d584390263a35707b6024816e1f46542b61918a6327a570dc
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c703b5b1911f centos "/bin/sh -c 'while t…" 13 seconds ago Up 10 seconds pedantic_banach
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs -tf --tail 10 c703b5b1911f
2020-12-27T03:34:07.255599560Z hi
2020-12-27T03:34:12.257641517Z hi
2020-12-27T03:34:17.259706294Z hi
2020-12-27T03:34:22.261693707Z hi
2020-12-27T03:34:27.262609289Z hi
2020-12-27T03:34:32.267862677Z hi
2020-12-27T03:34:37.270382873Z hi
2020-12-27T03:34:42.272414182Z hi
2020-12-27T03:34:47.274823243Z hi
2020-12-27T03:34:52.277419274Z hi
- 查看容器中进行信息
[root@VM-0-5-centos ~]# docker top 3107e7ac9133 UID PID PPID C STIME TTY TIME CMD root 26099 26081 0 18:08 ? 00:00:00 /bin/bash
- 查看容器的元数据
[root@VM-0-5-centos ~]# docker inspect 3107e7ac9133
- 进入当前正在运行的容器
因为通常我们的容器都是使用后台方式来运行的,有时需要进入容器修改配置
方式一:
[root@VM-0-5-centos ~]# docker exec -it 3107e7ac9133 /bin/bash [root@3107e7ac9133 /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr [root@3107e7ac9133 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:08 pts/0 00:00:00 /bin/bash root 16 0 0 10:16 pts/1 00:00:00 /bin/bash root 31 16 0 10:16 pts/1 00:00:00 ps -ef
方式二:
[root@VM-0-5-centos ~]# docker attach c703b5b1911f
docker exec进入容器后开启一个新的终端,可以在里面操作
docker attach进入容器正在执行的终端,不会启动新的进程
拷贝容器的文件到主机中
docker cp 容器id:容器内路径 目的主机路径
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it c703b5b1911f /bin/bash [root@c703b5b1911f /]# cd home [root@c703b5b1911f home]# ls #touch 新建文件 [root@c703b5b1911f home]# touch test.java [root@c703b5b1911f home]# ls test.java [root@c703b5b1911f home]# exit exit [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c703b5b1911f centos "/bin/sh -c 'while t…" 35 minutes ago Up 35 minutes pedantic_banach [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker cp c703b5b1911f:/home/test.java /home [root@iZwz99sm8v95sckz8bd2c4Z ~]# ls /home hai pan test.java9.5小结 10.图形化管理工具Portainer安装 可视化
- 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再用)
Docker图形化界面管理工具! 提供一个后台面板供我们操作!
[root@VM-0-5-centos /]# 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 129bf7a2596f6ca138f03b822187cc3fcced8397a3ffe26631e1dac65e18639d
访问测试:http://ip:8088/(需要开启8088安全组)
通过它来访问了:
第一次设置账号密码
选择本地的
进入之后的面板
可视化面板我们平时不ui使用,玩玩就好
11.Docker镜像详解 11.1什么是镜像镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库、环境变量和配置文件。
所有应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像
- 从远程仓库下载
- 别人拷贝给你
- 自己制作一个镜像DockerFile
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统是UnionFS联合文件系统。
**UnionFS(联合文件系统):**Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可将不同目录挂载到同一个虚拟机文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
**特性:**一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
**bootfs(boot file system)**主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs之上。包含的就是典型的Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以共用bootfs。
11.3分层理解我们可以去下载一个镜像,注意观察下载的日志输出,可以看到一层层的下载
思考:为什么Docker镜像要采用这种分层的结构呢?
最大的好处,我觉得莫过于资源共享了!比如有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层的方式可以通过docker image inspect命令
➜ / docker image inspect redis
[
{
"Id": "sha256:f9b9909726890b00d2098081642edf32e5211b7ab53563929a47f250bcdc1d7c",
"RepoTags": [
"redis:latest"
],
"RepoDigests": [
"redis@sha256:399a9b17b8522e24fbe2fd3b42474d4bb668d3994153c4b5d38c3dafd5903e32"
],
"Parent": "",
"Comment": "",
"Created": "2020-05-02T01:40:19.112130797Z",
"Container": "d30c0bcea88561bc5139821227d2199bb027eeba9083f90c701891b4affce3bc",
"ContainerConfig": {
"Hostname": "d30c0bcea885",
"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.0.1",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.0.1.tar.gz",
"REDIS_DOWNLOAD_SHA=b8756e430479edc162ba9c44dc89ac394316cd482f2dc6b91bcd5fe12593f273"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD ["redis-server"]"
],
"ArgsEscaped": true,
"Image": "sha256:704c602fa36f41a6d2d08e49bd2319ccd6915418f545c838416318b3c29811e0",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "18.09.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.0.1",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.0.1.tar.gz",
"REDIS_DOWNLOAD_SHA=b8756e430479edc162ba9c44dc89ac394316cd482f2dc6b91bcd5fe12593f273"
],
"Cmd": [
"redis-server"
],
"ArgsEscaped": true,
"Image": "sha256:704c602fa36f41a6d2d08e49bd2319ccd6915418f545c838416318b3c29811e0",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 104101893,
"VirtualSize": 104101893,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/adea96bbe6518657dc2d4c6331a807eea70567144abda686588ef6c3bb0d778a/diff:/var/lib/docker/overlay2/66abd822d34dc6446e6bebe73721dfd1dc497c2c8063c43ffb8cf8140e2caeb6/diff:/var/lib/docker/overlay2/d19d24fb6a24801c5fa639c1d979d19f3f17196b3c6dde96d3b69cd2ad07ba8a/diff:/var/lib/docker/overlay2/a1e95aae5e09ca6df4f71b542c86c677b884f5280c1d3e3a1111b13644b221f9/diff:/var/lib/docker/overlay2/cd90f7a9cd0227c1db29ea992e889e4e6af057d9ab2835dd18a67a019c18bab4/diff",
"MergedDir": "/var/lib/docker/overlay2/afa1de233453b60686a3847854624ef191d7bc317fb01e015b4f06671139fb11/merged",
"UpperDir": "/var/lib/docker/overlay2/afa1de233453b60686a3847854624ef191d7bc317fb01e015b4f06671139fb11/diff",
"WorkDir": "/var/lib/docker/overlay2/afa1de233453b60686a3847854624ef191d7bc317fb01e015b4f06671139fb11/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:c2adabaecedbda0af72b153c6499a0555f3a769d52370469d8f6bd6328af9b13",
"sha256:744315296a49be711c312dfa1b3a80516116f78c437367ff0bc678da1123e990",
"sha256:379ef5d5cb402a5538413d7285b21aa58a560882d15f1f553f7868dc4b66afa8",
"sha256:d00fd460effb7b066760f97447c071492d471c5176d05b8af1751806a1f905f8",
"sha256:4d0c196331523cfed7bf5bafd616ecb3855256838d850b6f3d5fba911f6c4123",
"sha256:98b4a6242af2536383425ba2d6de033a510e049d9ca07ff501b95052da76e894"
]
},
"metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
理解:
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举个简单的例子,假如基于Ubuntu Linux16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层,该向当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点。
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的个文件。
上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版。
文中情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者快设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfilter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW。
下图展示了与系统显示相同的三层镜像。所有镜像层堆并合并,对外提供统一的视图。
特点:
Docker镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!
11.4提交镜像commit镜像
docker commit 提交容器成为一个新的副本 # 命令和git原理类似 docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[版本TAG]
实战测试
# 1、启动一个默认的tomcat [root@VM-0-5-centos /]# docker run -d -p 8080:8080 tomcat de57d0ace5716d27d0e3a7341503d07ed4695ffc266aef78e0a855b270c4064e # 2、发现这个默认的tomcat 是没有webapps应用,官方的镜像默认webapps下面是没有文件的! #docker exec -it 容器id /bin/bash [root@VM-0-5-centos /]# docker exec -it de57d0ace571 /bin/bash root@VM-0-5-centos:/usr/local/tomcat# # 3、从webapps.dist拷贝文件进去webapp root@VM-0-5-centos:/usr/local/tomcat# cp -r webapps.dist/* webapps root@VM-0-5-centos:/usr/local/tomcat# cd webapps root@VM-0-5-centos:/usr/local/tomcat/webapps# ls ROOT docs examples host-manager manager # 4、将操作过的容器通过commit调教为一个镜像!我们以后就使用我们修改过的镜像即可,而不需要每次都重新拷贝webapps.dist下的文件到webapps了,这就是我们自己的一个修改的镜像。 docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG] docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0 [root@VM-0-5-centos /]# docker commit -a="csp提交的" -m="add webapps app" de57d0ace571 tomcat02.1.0 sha256:d5f28a0bb0d0b6522fdcb56f100d11298377b2b7c51b9a9e621379b01cf1487e [root@VM-0-5-centos /]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat02.1.0 latest d5f28a0bb0d0 14 seconds ago 652MB tomcat latest 1b6b1fe7261e 5 days ago 647MB nginx latest 9beeba249f3e 5 days ago 127MB mysql 5.7 b84d68d0a7db 5 days ago 448MB elasticsearch 7.6.2 f29a1ee41030 8 weeks ago 791MB portainer/portainer latest 2869fc110bf7 2 months ago 78.6MB centos latest 470671670cac 4 months ago 237MB hello-world latest bf756fb1ae65 4 months ago 13.3kB
学习方式说明:理解概念,但是一定要实践,最后实践和理论相结合一次搞定这个知识
如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像。
到这里才算是入门Docker!
12常用容器部署 12.1 Nginx部署(1)搜索并下载镜像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker search nginx NAME DEscriptION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 14207 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1932 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 797 [OK] linuxserver/nginx An Nginx container, brought to you by LinuxS… 137 jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 123 tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 107 [OK] [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx 6ec7b7d162b2: Already exists cb420a90068e: Pull complete 2766c0bf2b07: Pull complete e05167b6a99d: Pull complete 70ac9d795e79: Pull complete Digest: sha256:4cf620a5c81390ee209398ecc18e5fb9dd0f5155cd82adcbae532fec94006fb9 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker images; REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 f07dfa83b528 5 days ago 448MB nginx latest ae2feff98a0c 11 days ago 133MB centos latest 300e315adb2f 2 weeks ago 209MB
可以到dockerhub官网查看Nginx的详细版本信息:https://hub.docker.com/_/nginx
(2)运行测试
docker run -d --name nginx01 -p 3334:80 nginx -d 后台运行 --name 给容器命名 -p 3334:80 将宿主机的端口3334映射到该容器的80端口
运行结果:
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it nginx01 /bin/bash Error: No such container: nginx01 [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d --name nginx01 -p 3334:80 nginx 20c896637ff5de8be835797109d62ee2465e28d9d716be5a8d550ef7d547fcf5 [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 20c896637ff5 nginx "/docker-entrypoint.…" 7 seconds ago Up 5 seconds 0.0.0.0:3334->80/tcp nginx01
端口暴露的概念:
(3)配置文件
进入容器,自定义配置文件
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it nginx01 /bin/bash root@20c896637ff5:/# whereis nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx root@20c896637ff5:/# cd /etc/nginx root@20c896637ff5:/etc/nginx# ls conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf root@20c896637ff5:/# cd /etc/nginx root@20c896637ff5:/etc/nginx# ls conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
(4)访问测试
本地主机访问测试,curl命令发起请求,如果使用阿里云服务器需要设置安全组。
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 20c896637ff5 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:3334->80/tcp nginx01 [root@iZwz99sm8v95sckz8bd2c4Z ~]# curl localhost:333412.2Tomcat部署Welcome 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.
(1)下载并运行
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull tomcat Using default tag: latest latest: Pulling from library/tomcat 6c33745f49b4: Pull complete ef072fc32a84: Pull complete c0afb8e68e0b: Pull complete d599c07d28e6: Pull complete e8a829023b97: Pull complete d04be46a31d1: Pull complete db6007c69c35: Pull complete e4ad4c894bce: Pull complete 248895fda357: Pull complete 277059b4cba2: Pull complete Digest: sha256:57dae7dfb9b62a413cde65334c8a18893795cac70afc3be589c8336d8244655d Status: Downloaded newer image for tomcat:latest docker.io/library/tomcat:latest [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -p 3335:8080 --name tomcat01 tomcat 7136295a6082cb0f805b025a1471bde02ead4864be3e2c9dcd337b1dde0a3113
(2)进入容器
1、容器中的命令是少了
2、阿里云镜像默认下载的是最小的镜像,保证最小的运行环境。
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it tomcat01 /bin/bash root@7136295a6082:/usr/local/tomcat# ls BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work root@7136295a6082:/usr/local/tomcat# cd webapps.dist root@7136295a6082:/usr/local/tomcat/webapps.dist# ls ROOT docs examples host-manager manager root@7136295a6082:/usr/local/tomcat/webapps.dist# cd ROOT root@7136295a6082:/usr/local/tomcat/webapps.dist/ROOT# ls RELEASE-NOTES.txt WEB-INF asf-logo-wide.svg bg-button.png bg-middle.png bg-nav.png bg-upper.png favicon.ico index.jsp tomcat.css tomcat.svg root@7136295a6082:/usr/local/tomcat/webapps.dist/ROOT# cd ../../ root@7136295a6082:/usr/local/tomcat# cd webapps root@7136295a6082:/usr/local/tomcat/webapps# ls root@7136295a6082:/usr/local/tomcat/webapps# cp -r /usr/local/tomcat.webapps.dist/* /usr/local/tomcat/webapps/ root@7136295a6082:/usr/local/tomcat/webapps# ls ROOT docs examples host-manager manager root@7136295a6082:/usr/local/tomcat/webapps# exit exit
(3)访问测试
[root@iZwz99sm8v95sckz8bd2c4Z ~]# curl localhost:3335
Apache Tomcat/9.0.41
12.3ElasticSearch部署
添加-e ES_JAVA_OPTS=“-Xms128m -Xmx512m"配置ElasticSearch的虚拟机占用的内存大小。docker stats 查看资源占用情况
# es 暴露的端口很多!
# es 十分的耗内存
# es 的数据一般需要放置到安全目录! 挂载
# --net somenetwork ? 网络配置
# 启动 elasticsearch
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 启动了 linux就卡住了 docker stats 查看 cpu的状态
# es 是十分耗内存的 1.xG 1核2G!
# 测试一下es是成功了
[root@iZwz99sm8v95sckz8bd2c4Z ~]# curl localhost:9200
# 赶紧关闭,增加内存的限制
# 赶紧关闭,增加内存的限制, 修改配置文件 -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
# 查看
docker stats
使用kibana连接es,思考网络如何才能连接过去



