文章目录
- Docker入门
- Docker运行底层原理
- 1、帮助命令
- 2、镜像命令
- 3、容器命令
- Docker镜像是什么
- Docker镜像的特点
- Docker镜像commit操作
- 容器数据卷概念
- 数据卷
- 数据卷容器
- DockerFile是什么?
- DockerFile构建过程解析
- DockerFile体系结构
- 案例
- 总结
- 1. 安装Tomcat
- 2. 安装MySQL
- 3. 安装redis
- 4. 安装Zookeeper
- 5. 安装kafka
- 6. 安装RabbitMQ
- 7. 安装Elasticsearch
- 8.安装Kibana
- 本地镜像发布到阿里云流程
- 镜像的生成方法
- 将本地镜像推送到阿里云
- 将阿里云上的镜像下载到本地
- 本地镜像发布到阿里云流程
- 镜像的生成方法
- 将本地镜像推送到阿里云
- 将阿里云上的镜像下载到本地
Docker入门
Docker CE 安装
通过阿里ECS安装
-
安装必要的一些系统工具
$ yum install -y yum-utils device-mapper-persistent-data lvm2
-
添加软件源信息
$ sudo yum-config-manager \ --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新并安装Docker CE
$ yum makeache fast $ yum install docker-ce docker-ce-cli containerd.io
-
开启Docker服务
# CentOS <7 $ service docker start #CentOS >=7 $ systemctl start docker -
安装校验
[root@MiWiFi-R4A-srv docker]# docker version Client: Docker Engine - Community Version: 19.03.12 API version: 1.40 Go version: go1.13.10 Git commit: 48a66213fe Built: Mon Jun 22 15:46:54 2020 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.12 API version: 1.40 (minimum version 1.12) Go version: go1.13.10 Git commit: 48a66213fe Built: Mon Jun 22 15:45:28 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.13 GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683 -
更改阿里云镜像加速
https://4kfm6u95.mirror.aliyuncs.com --> 账号专属的加速器地址

$ cd /etc/docker $ tee /etc/docker/daemon.json <<-'EOF' >{"registry-mirrors":["https://4kfm6u95.mirror.aliyuncs.com"]} >EOF # 重新加载 $ systemctl daemon-reload # 重启docker $ systemctl restart docker -
通过运行hello-world 映像验证是否正确安装了Docker Engine-Community
$ docker run hello-world
Docker卸载
systemctl stop dockeryum -y remove docker-cerm -rf /var/lib/docker
Docker 图解


run之后Docker做了什么

Docker运行底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器
容器:是一个运行时环境,就是一个一个的虚拟系统(鲸鱼上的集装箱)

为什么Docker比VM快
- Docker有着比虚拟机更少的抽象层。由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上Docker将会在效率上有明显优势
- Docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的。而Docker由于直接利用宿主机的操作系统,则省略了繁琐过程,因此新建一个Docker容器只需要几秒钟。

1、帮助命令
$ docker version
$ docker info
$ docker --help
2、镜像命令

列出主机上的镜像
docker images
列出主机上镜像

各个选项说明:
| 选项 | 说明 |
|---|---|
| REPOSITOR | 标识镜像的仓库源 |
| TAG | 镜像的标签 |
| IMAGE ID | 镜像ID |
| CREATED | 镜像创建时间 |
| SIZE | 镜像大小 |
同一仓库源可以有多个TAG,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG 来定义不同的镜像,如果你不指定一个镜像的版本标签,例如你只使用Ubuntu,Docker将默认使用Ubuntu:latest
docker images的常见参数说明:
| 参数 | 说明 |
|---|---|
| -a | 列出本地所有的镜像(含中间映射层) |
| -q | 只显示镜像ID |
| –digests | 显示镜像的摘要信息,类似于备注 |
| –no-trunc | 显示完整的镜像信息 |
示例
-
docker images -a
-
docker images -q
-
docker images --digests
-
docker --no-trunc
从仓库中查找镜像
docker search
到仓库查找镜像,如果配置了阿里云镜像,查找依然在官方仓库查找,但是下载会去阿里云上下载

常见参数说明:
| 参数 | 说明 |
|---|---|
| –no-trunc | 显示完整的镜像描述 |
| -s | 列出收藏数不小于指定值的镜像 |
| –automated | 只列出 automated build (自动构建) 类型的镜像 |
示例
-
docker search -s 30 tomact
-
docker search -s 30 --no-trunc tomcat
-
docker search -s 30 --automated tomcat
下载镜像
docker pull
docker pull:[TAG]
docker pull tomcat 等价于 docker pull tomcat:latest
docker pull tomcat:3.2.2 相当于拉取指定版本的tomcat
示例
docker pull tomcat

通过查看本机镜像,可以看到下载好的镜像docker images

删除镜像
docker rmidocker rmi hello-world 相当于
docker rmi hello-world:latest
删除单个
docker rmi -f 镜像ID/唯一镜像名
如果镜像使用过或者正在使用,会提示删除失败

此时可以通过-f参数强制删除:docker rmi -f hello-world。也会将该镜像所依赖(中间映射)镜像删除掉。如下图,有两个被删除了

删除多个
docker rmi -f 镜像名 镜像名 ...

删除全部
docker rmi -f $(docker images -q)
3、容器命令
有镜像才能创建容器,这是根本前提(以CentOS镜像演示)
docker pull centos

新建并启动容器
命令:docker run [OPTIONS] IMAGE [COMMAND][TAG…]
OPTIONS说明(常用):
| 参数 | 说明 |
|---|---|
| –name | 为容器指定一个名称 |
| -d | 后台运行容器,并返回容器ID,也即启动守护式容器 |
| -i | 以交互式模式运行容器,通常与-t同时使用 |
| -t | 为容器重新分配一个伪输入终端,通常与-i同时使用 |
| -P | 随机端口映射 |
| -p | 指定端口映射,有以下四种格式: ip:hostPort:containerPort ip::containerPort hostPort:containerPort containerPort |
示例
-
先查看本机所有镜像:
docker images
-
创建并启动容器:
docker run -it --name centos02 0d120b6ccaa8
列出当前所有正在运行的容器
命令:docker ps [OPTIONS]
需要在宿主机上执行该命令
参数说明:
| 参数 | 说明 |
|---|---|
| -a | 列出当前所有正在运行的容器+历史上运行过的 |
| -l*(注:小写l)* | 显示最近创建的容器 |
| -n | 显示最近n个创建的容器 |
| -q | 静默模式,只显示容器编号 |
| –no-trunc | 不截断输 |
示例
-
重新打开一个命令终端
-
输入命令,查看正在运行的容器:
docker ps
-
查看所有运行过和正在运行的容器:
docker ps -a
-
之查看容器编号:
docker ps -aq
退出容器
有两种退出方式
-
容器停止退出:exit

通过
docker ps查看正在运行容器,会发现容器已经停止
通过
docker ps -l查看运行过的容器
-
容器不停止退出:Ctrl+P+Q
通过
docker ps查看正在运行的容器,会发现容器依然在运行
启动容器
命令:docker start 容器ID/容器名
启动成功后会返回容器ID
示例
-
查看所有容器:
docker ps -a
-
启动上次停止的容器:
docker start xxxxxx
重启容器
命令:docker restart 容器ID/容器名
重启成功后,会返回容器编号
示例
-
查看所有启动的容器:
docker ps
-
重启容器:
docker restart xxxxx
停止容器
命令:docker stop 容器ID/容器名
正常停止,比较慢
示例
-
查看所有容器:
docker ps
-
停止一个容器:
docker stop xxxxx
强制停止容器
命令:docker kill 容器ID/容器名
强制停止,会马上停止该容器
示例
-
查看所有容器:
docker ps
-
强制停止一个容器:
docker kill xxxxxx
删除已停止的容器
命令:
- 一次删除一个容器:docker rm 容器ID
- 一次删除多个容器:docker rm -f $(docker ps -a -q) 或者 docker ps -a -q | xargs docker rm
与删除镜像区分:
docker rmi xxx
重要的命令
启动守护式容器
命令:docker run -d 容器ID/容器名
启动成功后,会返回一个ID,但是通过
docker ps查不到,因为容器已经退出
很重要的一点:Docker容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如top,tail),就是自动退出的。
这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如:service nginx start
但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀,因为他觉得他没事可做了。所以,最佳的解决方案是:将要运行的程序以前台进程的形式运行
查看容器日志
命令:docker logs -f -t --tail 容器ID
参数说明:
| 参数 | 说明 |
|---|---|
| -t | 显示时间戳 |
| -f | 动态打印最新的日志 |
| –tail 数字 | 显示最后多少条记录 |
-
启动一个守护式容器,通过打印输出,不让容器自动退出
$ docker run -d centos /bin/sh -c "while true;do echo hello sxh;sleep 2;done"
-
通过
docker ps查看正在运行的容器$ docker ps
-
查看守护容器的日志,发现有打印输出的内容
$ docker logs -t -f 容器ID
查看容器内运行的进程
命令:docker top 容器ID
Linux命令:
top查看Linxu进程

查看容器内部细节
命令:docker inspect 容器ID
会返回一个JSON串,包含了所有内容
[root@sxh ~]# docker inspect 0ef7f7403889
[
{
"Id": "0ef7f74038896e554865ca25ea28efb3a854df5bd97b8f07e7a45e6f910d0ec9",
"Created": "2020-08-31T13:16:31.915460343Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo hello sxh;sleep 2;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2493,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-08-31T13:16:32.25137072Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
"ResolvConfPath": "/var/lib/docker/containers/0ef7f74038896e554865ca25ea28efb3a854df5bd97b8f07e7a45e6f910d0ec9/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/0ef7f74038896e554865ca25ea28efb3a854df5bd97b8f07e7a45e6f910d0ec9/hostname",
"HostsPath": "/var/lib/docker/containers/0ef7f74038896e554865ca25ea28efb3a854df5bd97b8f07e7a45e6f910d0ec9/hosts",
"LogPath": "/var/lib/docker/containers/0ef7f74038896e554865ca25ea28efb3a854df5bd97b8f07e7a45e6f910d0ec9/0ef7f74038896e554865ca25ea28efb3a854df5bd97b8f07e7a45e6f910d0ec9-json.log",
"Name": "/centos_shouhu",
"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,
"Capabilities": null,
"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/a374a6ae2abce4acb8436c0e519fa3917efd2b191fa9d304033682b3747c77c9-init/diff:/var/lib/docker/overlay2/51b67829e9dbf4d7daf851f9ce50a4134b3fab6dd6a5749bb13b9a3f8c85e28d/diff",
"MergedDir": "/var/lib/docker/overlay2/a374a6ae2abce4acb8436c0e519fa3917efd2b191fa9d304033682b3747c77c9/merged",
"UpperDir": "/var/lib/docker/overlay2/a374a6ae2abce4acb8436c0e519fa3917efd2b191fa9d304033682b3747c77c9/diff",
"WorkDir": "/var/lib/docker/overlay2/a374a6ae2abce4acb8436c0e519fa3917efd2b191fa9d304033682b3747c77c9/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "0ef7f7403889",
"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 sxh;sleep 2;done"
],
"Image": "0d120b6ccaa8",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200809",
"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": "66444b7cc32692d6581e321b23e39fa5fdeca140c2385d734db342624c7d302d",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/66444b7cc326",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "b60d120d3a8fea831ea9a7272a25b7701202ff002628604c50270a7be0379736",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "16c781d3b2b7ec5fa445a4d1e418102b9c61f856a04837a516912bace70b9ab9",
"EndpointID": "b60d120d3a8fea831ea9a7272a25b7701202ff002628604c50270a7be0379736",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
}
}
]
进入正在运行的容器并以命令行交互
-
在宿主机上操作容器
docker exec -it 容器ID bashShell在宿主机上查看容器中
/tmp目录下的内容
也可重新进入容器

-
重新进入
docker attach 容器ID
上述两个的区别:
- exec:是在容器中打开新的终端,并且可以启动新的进程
- attach:直接进入容器启动命令的终端,不会启动新的进程
从容器内拷贝文件到主机上
命令:docker cp 容器ID:容器内路径 目的主机路径

将容器/tmp下的文件拷贝到宿主机的/home下
$ docker cp 737ec2108c0b:/tmp/ks-script-2n9owwnh /home/

Docker镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件
UnionFS(联合文件系统)
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统是UnionFS
- 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里的Centos才200MB?

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,以为底层直接用Host和Kernel,自己只需要提供rootfs就行了。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
分层的镜像
以docker pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载

图解tomcat为什么镜像特别大(镜像是分层的)


Tomcat需要jdk8,需要运行在Centos上,需要Linux内核等等,一层一层的加起来,组成了一个镜像,提供使用
为什么Docker镜像要采用这种分层结构?
最大的一个好处就是:共享资源
比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
Docker镜像的特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”
Docker镜像commit操作
提交容器副本,使之成为一个新的镜像
命令:docker commit
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
案例演示
-
从Hub上下载tomcat镜像到本地并成功运行
docker run -it -p 8080:8080 tomcat参数说明:
参数 说明 -p 主机端口:docker容器端口 -P 随机分配端口 -i 交互式启动 -t 打开终端 docker run -it -P tomcat
-
删除上一步镜像生产tomcat容器中的文档(doc)
-
docker ps
-
docker exec -it xxxxx /bin/bash
-
ls -l
-
rm -rf docs
-
-
也即当前的tomcat运行实例是一个没有文档内容的容器,以它为模板commit一个没有doc的tomcat新镜像sxh/tomcat02,指定版本1.2
docker commit -a="sxh" -m="tomcat without docs" xxxx sxh/tomcat:1.2
commit成功后,会返回新镜像的ID
-
启动我们的新增镜像并和原来的对比
-
启动
sxh/tomcat02:1.2,他没有docs文档docker run -it -p 7777:8080 sxh/tomcat02:1.2
-
启动原来pull下来的tomcat,有docs文档
docker run -it -p 7788:8080 tomcat
-
容器数据卷概念
是什么?
一句话:有点类似Redis里面的rdb和aof文件
Docker的理念:
- 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
- 容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保证数据在docker中我们使用卷
能干嘛?
- 容器的持久化
- 容器间继承+共享数据
- 宿主机和容器之间的数据共享
卷就是目录或文件,存在于一个或多个容器中,由docker挂在到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持久存储或共享数据的特性;
卷的设计目的就是数据的持久化,完全独立于容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
数据卷也可以完成 宿主机->容器;容器->宿主机 之间的文件拷贝
数据卷
容器内添加
直接命令添加
命令(不带权限)
docker run -it -v /宿主机绝对路径:/容器目录 镜像名
$ docker run -it --name centos03 -v /myDataValue:/dataValue centos

-
查看数据卷是否挂在成功
先通过
docker ps找到当前容器ID通过
docker inspect 307887ae9dfa查看细节,发现数据卷已绑定
-
容器和宿主机之间数据共享
在宿主机中的数据卷中,创建一个文件
再到容器中的数据卷中,会发现,容器已经同步下来这个文件

在容器中更新host.txt,再创建一个文件
回到宿主机,可以看到host.txt更新的内容,也可以看到新新创建的文件

-
容器停止退出后,主机修改后数据是否通同步
容器停止
exit后,更新数据卷目录:/myDataValue;然后重启容器,进入数据卷目录:/dataValue,会发现,依然可以同步更新
命令(带权限)
docker run -it -v /宿主机绝对路径:/容器内目录:ro 镜像名ro:read only——只读
$ docker run -it --name centos04 -v /myDataValue:/dataValue:ro centos
-
在宿主机创建文件
$ touch host.txt $ echo "host update 01" >> host.txt -
在容器中查看,并修改,发现无法修改
$ cd /dataValue $ vi host.txt进入vi后,编辑时,会提示:
readonly file
通过
ls -s查看文件详细信息,发现没有写权限
-
在容器中进入数据卷目录,新建文件
$ touch coantainer.txt touch: cannot touch 'coantainer.txt': Read-only file system会发现也是无法创建文件,提示:
Read-only file system -
在宿主机查看容器细节:
docker inspect 9c4dedc736e0“Mode”:“ro” — 模式:只读
"Mounts": [ { "Type": "bind", "Source": "/myDataValue", "Destination": "/dataValue", "Mode": "ro", "RW": false, "Propagation": "rprivate" } ]
DockerFile添加
相当于Linux中的shell脚本,DockerFile是Docker的脚本
-
根目录下新建mydocker文件夹进入
$ cd / $ mkdir /mydocker $ cd /mydocker -
可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]说明:出于可移植和分享的考虑,用
-v 主机目录:容器目录这种方法不能够直接在DockerFile中实现。由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。 -
File构建
$ vim Dockerfile # volume test FROM centos VOLUME ["/dataVolumeContainer","/dataVolumeContainer2"] CMD echo "finished,-----------------success1" CMD /bin/bash -
Build后生成镜像
获得一个新的镜像
$ docker build -f /mydocker/Dockerfile -t sxh/centos .
通过
docker images可以查看生成的镜像
-
run容器
$ docker run -it --name myselt_centos sxh/centos启动后,在容器的根目录下就已经存在了2个数据卷目录了

-
通过上述步骤,容器内的卷目录地址已经知道。对应的主机目录地址在哪?
通过查看容器的细节信息,可以发现docker默认生成了主机端的数据卷

-
主机对应默认地址
/var/lib/docker/volumes/ -
备注:
Docker挂载主机目录Docker访问出现:cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个
--privileged=true参数即可
数据卷容器
是什么?
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为:数据卷容器
演示+介绍
上一步创建了一个数据卷镜像
sxh/centos,已经具备了容器卷:
/dataVolumeContainer1/dataVolumeContainer2以它为模板并运行容器:
dc01,dc02,dc03
容器间传递共享:--volumes-from
-
先启动一个父容器
dc01,在/dataVolumeContainer2中添加内容$ docker run -it --name dc01 sxh/centos -
dc02,dc03继承自dc01$ docker run -it --name dc02 --volume-from dc01 sxh/centos $ docker run -it --name dc03 --volume-from dc01 sxh/centos分别在两个容器的数据卷
/dataVolumeContainer2中添加内容 -
回到
dc01可以看到dc02,dc03各自添加的内容 -
删除
dc01容器,dc02容器中的数据卷修改后,dc03容器中的数据卷依然可以同步内容 -
删除
dc02容器,dc03容器的数据卷依然可以使用 -
新建
dc04容器,继承dc03,再删除dc03,dc04容器的数据卷依然可用
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
DockerFile是什么?
-
Dockerfile 是用来构建Docker镜像的构建文件,是由一系列命令和参数构建成的脚本
-
构建三步骤:
- 编写Dockerfile文件
- docker build
- docker run
-
文件什么样?
以centos为例
FROM scratch # 相当于Java中的Object ADD centos-7-x86_64-docker.tar.xz / LABEL \ # 标签,说明的意思 org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20200809" \ org.opencontainers.image.title="CentOS Base Image" \ org.opencontainers.image.vendor="CentOS" \ org.opencontainers.image.licenses="GPL-2.0-only" \ org.opencontainers.image.created="2020-08-09 00:00:00+01:00" CMD ["/bin/bash"]
DockerFile构建过程解析
Dockerfile 内容基础知识
- 每条 保留字指令 都必须为大写字母,且后面跟随至少一个参数
- 指令按照从上到下,顺序执行
#表示注释- 每条指令都会创建一个新的镜像层,并对镜像进行提交
Docker执行Dockerfile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似
docker commit的操作提交一个新的镜像层 - docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有的指令都执行完成
总结
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段
- Dockerfile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行态
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石

-
Dockerfile
需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务,和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
-
Docker镜像
在用Dockerfile定义一个文件之后,docker build 会产生一个Dockers镜像,当运行Docker镜像时,会真正开始提供服务
-
Docker容器
容器是直接提供服务的
DockerFile体系结构
保留字指令
-
FROM
基础镜像,当前新镜像是基于哪个镜像的
-
MAINTAINER
镜像维护者的姓名和邮箱地址
-
RUN
容器构建的时候需要运行的命令
-
EXPOSE
当前容器对外暴露出的端口
-
WORKDIR
指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点
-
ENV
用来在构建镜像过程中设置环境变量
ENV MY_PATH /usr/mytest这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其他指令中直接使用这些环境变量
WORKDIR $MY_PATH -
ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
-
COPY
类似于
ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置COPY src destCOPY ["src","dest"] -
VLUME
容器数据卷,用于数据保存和持久化工作
-
CMD
指定一个容器启动时要运行的指令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被 docke run 之后的参数替换
CMD指令的格式和RUN相似,有两种格式:shell格式:CMD <指令>exec格式:CMD ["可执行文件","参数1","参数2"...]- 参数列表格式:
CMD ["参数1","参数2",...],在指定了ENTRYPOINT指令后,用CMD指定具体的参数
-
ENTRYPOINT
指定一个容器启动时要运行的指令
ENTRYPONIT的目的和CMD一样,都是在指定容器启动程序及参数 -
ONBUILD
当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后,父镜像的
onbuild被触发
总结
| BUILD | Both | RUN |
|---|---|---|
| FORM | WORKDIR | CMD |
| MAINTAINER | USER | ENV |
| COYP | EXPOSE | |
| ADD | VOLUMN | |
| RUN | ENTRYPOINT | |
| ONBUILD | ||
| .dockerignore |
案例
4.1、Base镜像 - scratch
Docker Hub 中99%的镜像都是通过在 base镜像中安装和配置需要的软件构建出来的

4.2、自定义镜像 - mycentos
编写
-
Hub默认CentOS镜像登录后的情况

自定义mycentos目的是我们自己的镜像具备如下:
- 登陆后的默认路径
- vim编辑器
- 支持ifconfig查看网路配置
-
准备编写DockerFile文件
FROM centos MAINTAINER sxh<531845606@qq.com> #作者和邮箱 ENV MYPATH /usr/local # 登陆后的默认路径 WORKDIR $MYPATH RUN yum -y install vim # vim编辑器 RUN yum -y install net-tools # 支持ifconfig查看网路配置 EXPOSE 80 CMD echo $MYPATH CMD echo "success-------ok" CMD /bin/bash
构建
$ docker build -f /mydocker/Dockerfile2 -t 新镜像名字:TAG .
[root@localhost mydocker]# docker build -f ./Dockerfile2 -t mycentos:1.3 .
Sending build context to Docker daemon 3.072kB
Step 1/10 : FROM centos
---> 0d120b6ccaa8
Step 2/10 : MAINTAINER sxh<531845606@qq.com>
---> Running in 0fd32f7a31c4
Removing intermediate container 0fd32f7a31c4
---> b311790e7a85
Step 3/10 : ENV MYPATH /usr/local
---> Running in 733bfa5f3296
Removing intermediate container 733bfa5f3296
---> 3c016b010ebc
Step 4/10 : WORKDIR $MYPATH
---> Running in 1ff1692956dc
Removing intermediate container 1ff1692956dc
---> 88161cb60504
Step 5/10 : RUN yum -y install vim
---> Running in 97684139364c
CentOS-8 - AppStream 24 kB/s | 5.8 MB 04:08
CentOS-8 - Base 52 kB/s | 2.2 MB 00:43
CentOS-8 - Extras 898 B/s | 7.3 kB 00:08
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-13.el8 AppStream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-15.el8 AppStream 39 k
vim-common x86_64 2:8.0.1763-13.el8 AppStream 6.3 M
vim-filesystem noarch 2:8.0.1763-13.el8 AppStream 48 k
which x86_64 2.21-12.el8 BaseOS 49 k
Transaction Summary
================================================================================
Install 5 Packages
Total download size: 7.8 M
Installed size: 31 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm 54 kB/s | 39 kB 00:00
(2/5): vim-filesystem-8.0.1763-13.el8.noarch.rp 59 kB/s | 48 kB 00:00
(3/5): which-2.21-12.el8.x86_64.rpm 5.8 kB/s | 49 kB 00:08
(4/5): vim-enhanced-8.0.1763-13.el8.x86_64.rpm 42 kB/s | 1.4 MB 00:32
(5/5): vim-common-8.0.1763-13.el8.x86_64.rpm 81 kB/s | 6.3 MB 01:19
--------------------------------------------------------------------------------
Total 98 kB/s | 7.8 MB 01:21
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - AppStream 1.6 MB/s | 1.6 kB 00:00
Importing GPG key 0x8483C65D:
Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : which-2.21-12.el8.x86_64 1/5
Installing : vim-filesystem-2:8.0.1763-13.el8.noarch 2/5
Installing : vim-common-2:8.0.1763-13.el8.x86_64 3/5
Installing : gpm-libs-1.20.7-15.el8.x86_64 4/5
Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64 4/5
Installing : vim-enhanced-2:8.0.1763-13.el8.x86_64 5/5
Running scriptlet: vim-enhanced-2:8.0.1763-13.el8.x86_64 5/5
Running scriptlet: vim-common-2:8.0.1763-13.el8.x86_64 5/5
Verifying : gpm-libs-1.20.7-15.el8.x86_64 1/5
Verifying : vim-common-2:8.0.1763-13.el8.x86_64 2/5
Verifying : vim-enhanced-2:8.0.1763-13.el8.x86_64 3/5
Verifying : vim-filesystem-2:8.0.1763-13.el8.noarch 4/5
Verifying : which-2.21-12.el8.x86_64 5/5
Installed:
gpm-libs-1.20.7-15.el8.x86_64 vim-common-2:8.0.1763-13.el8.x86_64
vim-enhanced-2:8.0.1763-13.el8.x86_64 vim-filesystem-2:8.0.1763-13.el8.noarch
which-2.21-12.el8.x86_64
Complete!
Removing intermediate container 97684139364c
---> 44c28a25439d
Step 6/10 : RUN yum -y install net-tools
---> Running in f5d9d8013e9c
Last metadata expiration check: 0:01:29 ago on Thu Sep 3 08:15:11 2020.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
net-tools x86_64 2.0-0.51.20160912git.el8 BaseOS 323 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 323 k
Installed size: 1.0 M
Downloading Packages:
net-tools-2.0-0.51.20160912git.el8.x86_64.rpm 149 kB/s | 323 kB 00:02
--------------------------------------------------------------------------------
Total 107 kB/s | 323 kB 00:03
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : net-tools-2.0-0.51.20160912git.el8.x86_64 1/1
Running scriptlet: net-tools-2.0-0.51.20160912git.el8.x86_64 1/1
Verifying : net-tools-2.0-0.51.20160912git.el8.x86_64 1/1
Installed:
net-tools-2.0-0.51.20160912git.el8.x86_64
Complete!
Removing intermediate container f5d9d8013e9c
---> 9b10c1b8667e
Step 7/10 : EXPOSE 80
---> Running in bec70264a12b
Removing intermediate container bec70264a12b
---> e367619dad3e
Step 8/10 : CMD echo $MYPATH
---> Running in 74ebce4ef90c
Removing intermediate container 74ebce4ef90c
---> d460d3cdf975
Step 9/10 : CMD echo "success-------ok"
---> Running in cdda4b72f619
Removing intermediate container cdda4b72f619
---> a1c0a32fbb20
Step 10/10 : CMD /bin/bash
---> Running in 27e58865de53
Removing intermediate container 27e58865de53
---> 3514d9a87493
Successfully built 3514d9a87493
Successfully tagged mycentos:1.3
[root@localhost mydocker]#
通过
docker images查看新构建的镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.3 b2075ccbe763 23 minutes ago 295MB
运行
自定义的镜像生成的容器时可以用vim和ifconfig的
[root@localhost mydocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.3 3514d9a87493 15 minutes ago 295MB
sxh/centos latest f8735d5423d9 47 hours ago 215MB
centos latest 0d120b6ccaa8 3 weeks ago 215MB
hello-world latest bf756fb1ae65 8 months ago 13.3kB
[root@localhost mydocker]# docker run -it mycentos:1.3
[root@3dc13d133545 local]# pwd
/usr/local
[root@3dc13d133545 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@3dc13d133545 local]#
列出镜像的变更历史
docker history 镜像名/镜像ID示例:
docker history mycentos:1.3
[root@localhost mydocker]# docker history mycentos:1.3
IMAGE CREATED CREATED BY SIZE COMMENT
3514d9a87493 24 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
a1c0a32fbb20 24 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
d460d3cdf975 24 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
e367619dad3e 24 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
9b10c1b8667e 24 minutes ago /bin/sh -c yum -y install net-tools 22.8MB
44c28a25439d 24 minutes ago /bin/sh -c yum -y install vim 57.2MB
88161cb60504 30 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
3c016b010ebc 30 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
b311790e7a85 30 minutes ago /bin/sh -c #(nop) MAINTAINER sxh<531845606@… 0B
0d120b6ccaa8 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB
[root@localhost mydocker]#
ONBUILD指令
当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后,父镜像的
onbuild被触发
-
自定义一个Dockerfile(名字:Dockerfile4),编写DockerFile
FROM centos RUN yum install -y curl ENTRYPOINT ["curl","-s","http://ip.cn"] ONBUILD RUN echo "father image onbuild ---------- 886"当该DockerFile构建成镜像后,会打印
father image onbuild ---------- 886[root@localhost mydocker]# docker build -f ./Dockerfile4 -t myip_father . Sending build context to Docker daemon 4.096kB Step 1/4 : FROM centos ---> 0d120b6ccaa8 Step 2/4 : RUN yum install -y curl ---> Running in a164d5d0c457 CentOS-8 - AppStream 38 kB/s | 5.8 MB 02:37 CentOS-8 - Base 101 kB/s | 2.2 MB 00:22 CentOS-8 - Extras 6.8 kB/s | 7.3 kB 00:01 Package curl-7.61.1-12.el8.x86_64 is already installed. Dependencies resolved. Nothing to do. Complete! Removing intermediate container a164d5d0c457 ---> 009ca3aa8436 Step 3/4 : ENTRYPOINT ["curl","-s","http://ip.cn"] ---> Running in 99cf55fd29e0 Removing intermediate container 99cf55fd29e0 ---> 9c74d924725c Step 4/4 : ONBUILD RUN echo "father image onbuild ---------- 886" ---> Running in 18d86df9387e Removing intermediate container 18d86df9387e ---> 95f0500abf68 Successfully built 95f0500abf68 Successfully tagged myip_father:latest -
再新建一个Dockerfile(名字:Dockerfile5),继承上一个自定义的镜像
FROM myip_father RUN yum install -y curl ENTRYPOINT ["curl","-s","http://ip.cn"]当构建该镜像时,会触发父类的触发器(第6行)
[root@localhost mydocker]# docker build -f ./Dockerfile5 -t myip_son . Sending build context to Docker daemon 5.12kB Step 1/3 : FROM myip_father # Executing 1 build trigger ---> Running in 31753d859012 father image onbuild ---------- 886 Removing intermediate container 31753d859012 ---> 12d8678b6ae1 Step 2/3 : RUN yum install -y curl ---> Running in 687b977586ca Last metadata expiration check: 0:25:45 ago on Thu Sep 3 08:54:32 2020. Package curl-7.61.1-12.el8.x86_64 is already installed. Dependencies resolved. Nothing to do. Complete! Removing intermediate container 687b977586ca ---> 0a237da8aa96 Step 3/3 : ENTRYPOINT ["curl","-s","http://ip.cn"] ---> Running in 89e6ac3c96fb Removing intermediate container 89e6ac3c96fb ---> 587201037dcd Successfully built 587201037dcd Successfully tagged myip_son:latest [root@localhost mydocker]#
~CMD/ENTRYPOINT 镜像案例~~
自定义镜像 Tomcat 9
-
mkdir -p /sxh/mydockerfile/tomcat9 -
在目录下创建文件
$ touch c.txt -
将jdk和tomcat安装的压缩包拷贝到目录中
- apache-tomcat-9.0.8.tar.gz
- jdk-8u171-linux-x64.tar.gz
-
在
/sxh/mydockerfile/tomcat9目录下新建Dockerfile文件FROM centos MAINTAINER sxh<531845606@qq.com> # 把宿主机当前上下文的c.txt拷贝到容器/usr/local路径下 COPY c.txt /usr/local/cincontainer.txt # 把tomcat添加到容器中 ADD apache-tomcat-9.0.37.tar.gz /usr/local/ ADD jdk-8u171-linux-x64.tar.gz /usr/local/ # 安装vim编辑器 RUN yum -y install vim # 设置工作访问时候的WORKDIR路径,登录落脚点 ENV MYPATH /usr/local WORKDIR $MYPATH # 配置Java与tomcat环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0.171 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.37 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin # 容器运行时监听的端口 EXPOSE 8080 # 启动时运行tomcat CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/bin/logs/catalina.out -
构建
在当前目录下,执行镜像的构建
docker build -t sxhtomcat9—>以前有-f /Dockerfile,不写的话,会自动在当前目录下查找Dockerfile$ docker build -t sxhtomcat9 .
-
run
通过构建出来的镜像,运行一个tomcat容器
$ docker run -d -p 8080:8080 --name mytom9 \ -v /sxh/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.37/webapps/test \ -v /sxh/mydockerfile/tomcat9/tomcat9logs/:/usr/loacl/apache-tomcat-9.0.37/logs \ --privileged=true sxhtomcat9 -
验证
-
在宿主机的数据卷的logs文件中查看日志,查看是否启动成功

-
通过网页访问
ip:port看是否能访问成功
-
-
结合容器卷测试web服务发布
总结

总体步骤
- 搜索镜像
- 拉取镜像
- 查看镜像
- 启动镜像
- 停止容器
- 移除容器
1. 安装Tomcat
-
docker hub 上查找tomcat镜像
$ docker search tomcat -
从docker hub 上拉取tomcat镜像到本地
$ docker pull tomcat -
docker images 查看是否有拉取到的tomcat
$ docker images -
使用tomcat镜像创建容器(也叫运行镜像)
$ docker run -it -p 8080:8080 tomcat
2. 安装MySQL
2.1 x86
-
docker hub 上面查找镜像

-
从docker hub 上拉取MySQL镜像到本地,标签:5.6
-
使用mysql5.6镜像创建容器(也叫运行镜像)
$ docker run -p 12345:3306 --name mysql \ -v /sxh/mysql/conf:/etc/mysql/conf.d \ -v /sxh/mysql/logs:/logs \ -v /sxh/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.6命令说明:
-e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码
进入docker的mysql中,创建库表,插入数据
$ docker exec -it xxxxx /bin/bash $ mysql -u root -p > 123456 > create database db01; > use db01; > create table t_book (id int not null primary key,book_name varchar(20)); > insert into t_book values(1,'java');

通过Windows10,使用navicat连接docker中的mysql

-
通过Docker进行mysql数据备份
$ docker exec 容器ID sh -c 'exec mysqldump --all-databases -uroot -p"123456"' \ > /sxh/all-databases.sql
2.2 arm64
# 拉取镜像
$ docker pull mysql/mysql-server:latest
# 启动
$ docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server
# 连接mysql
docker exec -it mysql bash
mysql -u root -p
# 授权
use mysql;
update user set host='%' where user='root';
grant all privileges on *.* to 'root'@'%' ;
# 刷新权限
flush privileges;
3. 安装redis
-
从docker hub上拉去redis镜像到本地,标签为:3.2
$ docker pull redis:3.2 -
使用redis3.2 镜像创建容器(也叫运行镜像)
-
使用镜像
$ docker run -p 6379:6379 \ -v /sxh/myredis/data:/data/ \ -v /sxh/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf \ -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf \ --appendonly yesdocker run -d --name redis -p 6979:6379 redis:latest redis-server --appendonly yes --requirepass "你的密码" -
在主机
/sxh/myredis/conf/redis.conf目录下新建redis.conf文件$ vim /sxh/myredis/conf/redis.conf/redis.conf -
测试redis-cli连接
$ docker exec -it 5bea98c63b48 redis-cli 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> set k2 v2 OK 127.0.0.1:6379> set k3 v3 OK 127.0.0.1:6379>
-
测试持久化文件生成
进入
/sxh/myredis/data下,会发现appendonly.aof持久化文件
-
4. 安装Zookeeper
-
查看镜像
docker search zookeeper -
拉取镜像
docker pull zookeeper -
启动容器
docker run -it -p 2181:2181
5. 安装kafka
启动命令
docker run
-d --name kafka -p 9092:9092
-e KAFKA_BROKER_ID=0
-e KAFKA_ZOOKEEPER_CONNECT=10.9.44.11:2181
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.9.44.11:9092
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
-t wurstmeister/kafka
KAFKA_ZOOKEEPER_CONNECT: 配置zookeeper管理kafka的路径
KAFKA_ADVERTISED_LISTENERS:把kafka的地址端口注册给zookeeper
KAFKA_LISTENERS=PLAINTEXT: 配置kafka的监听端口 0.0.0.0 表示本机
安装管理页面
#1. 拉取
docker pull sheepkiller/kafka-manager
#2. 启动
docker run -d --name kfk-manager \
--restart always -p 9000:9000 \
-e ZK_HOSTS=<这里换成你的zookeeper地址和端口> \
sheepkiller/kafka-manager
#3. 配置
进入web页面点击cluster配置节点名称即可看到
6. 安装RabbitMQ
-
docker search rabbitmq[root@localhost ~]# docker search rabbitmq NAME DESCRIPTION STARS OFFICIAL AUTOMATED rabbitmq RabbitMQ is an open source multi-protocol me… 4023 [OK] tutum/rabbitmq Base docker image to run a RabbitMQ server 22 kbudde/rabbitmq-exporter rabbitmq_exporter for prometheus 17 [OK] frodenas/rabbitmq A Docker Image for RabbitMQ 12 [OK] cyrilix/rabbitmq-mqtt RabbitMQ MQTT Adapter 9 [OK] arm64v8/rabbitmq RabbitMQ is an open source multi-protocol me… 8 arm32v7/rabbitmq RabbitMQ is an open source multi-protocol me… 7 gonkulatorlabs/rabbitmq DEPRECATED: See maryville/rabbitmq 5 [OK] heidiks/rabbitmq-delayed-message-exchange RabbitMQ with the compatible version of the … 4 [OK] pivotalrabbitmq/rabbitmq-server-buildenv Image used to build and test RabbitMQ server… 4 pivotalrabbitmq/rabbitmq-autocluster RabbitMQ with the rabbitmq-autocluster plugi… 3 deadtrickster/rabbitmq_prometheus RabbitMQ + Prometheus RabbitMQ Exporter plug… 2 riftbit/rabbitmq RabbitMQ 3.x Container based on Alpine Linux… 2 henrylv206/rabbitmq-autocluster RabbitMQ Cluster 2 [OK] foxylion/rabbitmq Preconfigured RabbitMQ docker image with sup… 1 [OK] rabbitmqoperator/cluster-operator The RabbitMQ Cluster Operator Docker Image 1 i386/rabbitmq RabbitMQ is an open source multi-protocol me… 1 activatedgeek/rabbitmqadmin A rabbitmqadmin docker image for administrat… 1 [OK] amd64/rabbitmq RabbitMQ is an open source multi-protocol me… 1 ekesken/rabbitmq docker image for rabbitmq that is configurab… 1 [OK] webhostingcoopteam/rabbitmq-conf RabbitMQ Configurator for Rancher 1 [OK] s390x/rabbitmq RabbitMQ is an open source multi-protocol me… 0 ppc64le/rabbitmq RabbitMQ is an open source multi-protocol me… 0 pdffiller/rabbitmq Rabbitmq 3.7.3 with delayed_message plugin,c… 0 dubc/rabbitmq-alpine-all-plugins Additions are that the following plugins are… 0 [OK] -
docker pull rabbitmq:management -
创建容器并启动
docker run -d \ --name rabbitmq \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=admin \ -p 15672:15672 -p 5672:5672RABBITMQ_DEFAULT_USER/PASS:RabbitMQ登录账号/密码
15672:web管理端端口
5672:服务端口
-
进入rabbitmq开始管理页面权限(如果pull的不是management才需要这一步)
docker exec -it xxxxrabbitmq-plugins enable rabbitmq_managementroot@068122284c43:/# rabbitmq-plugins enable rabbitmq_management Enabling plugins on node rabbit@068122284c43: rabbitmq_management The following plugins have been configured: rabbitmq_management rabbitmq_management_agent rabbitmq_prometheus rabbitmq_web_dispatch Applying plugin configuration to rabbit@068122284c43... The following plugins have been enabled: rabbitmq_management started 1 plugins.
7. 安装Elasticsearch
-
docker search elasticsearch -
docker pull elasticsearch:xxx如果下载指定版本的在
:后写对应版本即可;如果不写版本docker pull elasticsearch默认下载最新的 -
配置环境
mkdir -p /myfile/elasticsearch/config mkdir -p /myfile/elasticsearch/data chmod -R 777 /myfile/elasticsearch/ echo "http.host: 0.0.0.0" >> /myfile/elasticsearch/config/elasticsearch.yml -
启动
docker run \ --name elasticsearch \ -p 9200:9200 -p 9300:9300 \ -e "discovey.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ -v /myfile/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/confg/elasticsearch.yml \ -v /myfile/elasticsearch/data:/usr/share/elasticsearch/data \ -v /myfile/elasticsearch/plugins:/usr/share/elascitsearch/plugins \ -d elasticsearch:2.4.0
8.安装Kibana
ElasticSearch 前端管理页面
-
查找
$ docker search kibana -
拉取
$ docker pull kibana不写版本好默认拉取最新版本
-
配置
$ mkdir -p /myfile/kibana $ chmod 777 /myfile/kibana $ echo "server.host: 0.0.0.0" >> /myfile/kibana/kibana.yml $ echo "elasticsearch.hosts: http://esip:9200" >> /myfile/kibana/kibana.yml* esip 换为es服务ip即可,端口改为es服务端口
-
启动
$ docker run --name kibana \ -v /myfile/kibana/kibana.yml:/usr/share/kibana/config/kinana.yml \ -p 5601:5601 -d kibana
可以省略配置步骤(3),在启动的时候指定es服务也可以:
$ docker run --name kibana \
-p 5601:5601 \
--link elasticsearch -e "elasticsearch_url=172.10.6.37:9200" \
-d kibana
本地镜像发布到阿里云流程

镜像的生成方法
-
前面的DockerFile
-
从容器创建一个新的镜像
docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]参数说明:
参数 说明 -a 提交的镜像作者 -m 提交时的说明文字 示例:
docker commit -a sxh -m "new mycentos 1.4 from 1.3" 容器ID mycentos:1.4
将本地镜像推送到阿里云
本地镜像素材原型

阿里云开发者平台
https://cr.console.aliyun.com/cn-hangzhou/instances/namespaces
创建仓库镜像
-
命名空间

-
仓库名称


将仓库推送到registry

$ sudo docker login --username=橙汁儿drk registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:[镜像版本号]
-
登录
$ sudo docker login --username=橙汁儿drk registry.cn-hangzhou.aliyuncs.com
-
设置推送的镜像和版本号

$ sudo docker tag dafeebe539bf registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:1.4.1 -
开始推送到阿里云
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:1.4.1

公有云可以查询到
可以在阿里云中搜索上传的镜像

查看详情

将阿里云上的镜像下载到本地
docker pull 镜像详情中的地址:版本号
/esip:9200" >> /myfile/kibana/kibana.yml
\* esip 换为es服务ip即可,端口改为es服务端口
4. 启动
```shell
$ docker run --name kibana \
-v /myfile/kibana/kibana.yml:/usr/share/kibana/config/kinana.yml \
-p 5601:5601 -d kibana
可以省略配置步骤(3),在启动的时候指定es服务也可以:
$ docker run --name kibana \
-p 5601:5601 \
--link elasticsearch -e "elasticsearch_url=172.10.6.37:9200" \
-d kibana
本地镜像发布到阿里云流程
[外链图片转存中…(img-S3sOkW1l-1677034910739)]
镜像的生成方法
-
前面的DockerFile
-
从容器创建一个新的镜像
docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]参数说明:
参数 说明 -a 提交的镜像作者 -m 提交时的说明文字 示例:
docker commit -a sxh -m "new mycentos 1.4 from 1.3" 容器ID mycentos:1.4[外链图片转存中…(img-kTcvd355-1677034910739)]
将本地镜像推送到阿里云
本地镜像素材原型
[外链图片转存中…(img-fIhwjeiK-1677034910739)]
阿里云开发者平台
https://cr.console.aliyun.com/cn-hangzhou/instances/namespaces
创建仓库镜像
-
命名空间
[外链图片转存中…(img-tVG6rkA9-1677034910739)]
-
仓库名称
[外链图片转存中…(img-tJlOFORZ-1677034910740)]
[外链图片转存中…(img-1bmpXGui-1677034910740)]
将仓库推送到registry
[外链图片转存中…(img-WyyUUDYQ-1677034910740)]
$ sudo docker login --username=橙汁儿drk registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:[镜像版本号]
-
登录
$ sudo docker login --username=橙汁儿drk registry.cn-hangzhou.aliyuncs.com[外链图片转存中…(img-6NrBv6KI-1677034910741)]
-
设置推送的镜像和版本号
[外链图片转存中…(img-qgDy8RgT-1677034910741)]
$ sudo docker tag dafeebe539bf registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:1.4.1 -
开始推送到阿里云
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:1.4.1[外链图片转存中…(img-SPlPGvk9-1677034910741)]
[外链图片转存中…(img-O8mneL9l-1677034910741)]
公有云可以查询到
可以在阿里云中搜索上传的镜像
[外链图片转存中…(img-BRcrXaMK-1677034910741)]
查看详情
[外链图片转存中…(img-8heR8QIY-1677034910741)]
将阿里云上的镜像下载到本地
docker pull 镜像详情中的地址:版本号

395

被折叠的 条评论
为什么被折叠?



