1.Docker 入门
1.1.Docker概述
Docker为什么出现?
-
一款产品: 开发–上线 两套环境 应用环境 应用配置!
-
开发 — 运维 问题:我在我的电脑上可以运行
-
版本更新 导致服务不可用 对于运维来说考验十分大
-
环境配置是十分的麻烦 每一个及其都要部署环境(集群Redis、ES、Hadoop…) 费事费力
-
发布一个项目( jar + (Redis MySQL JDK ES) ) 项目能不能带上环境安装打包
-
服务器配置一个应用的环境 Redis MySQL JDK ES Hadoop 配置超麻烦了 不能够跨平台
-
开发环境Windows 最后发布到Linux
-
传统:开发jar 运维来做
-
现在:开发打包部署上线 一套流程做完
-
安卓流程:java — apk —发布(应用商店)一 张三使用apk一安装即可用!
-
docker流程: java-jar(环境) — 打包项目帯上环境(镜像) — ( Docker仓库:商店)
-
Docker给以上的问题,提出了解决方案
Docker的思想就来自于集装箱
-
JRE – 多个应用(端口冲突) – 原来都是交叉的隔离
-
Docker核心思想 打包装箱 每个箱子是互相隔离的
-
Docker通过隔离机制 可以将服务器利用到极致
-
本质:所有的技术都是因为出现了一些问题 我们需要去解决 才去学习
1.2.Docker历史
-
2010年 几个的年轻人 就在美国成立了一家公司 dotcloud
-
做一些pass的云计算服务!LXC(Linux Container容器)有关的容器技术
-
Linux Container容器是一种内核虚拟化技术 可以提供轻量级的虚拟化 以便隔离进程和资源
-
他们将自己的技术(容器化技术)命名就是 Docker
-
Docker刚刚延生的时候 没有引起行业的注意 dotCloud 就活不下去 所以就开源
开源
- 2013年 Docker开源
- 越来越多的人发现docker的优点 火了
- Docker每个月都会更新一个版本
- 2014年4月9日,Docker1.0发布
docker为什么这么火
-
十分的轻巧
-
在容器技术出来之前 我们都是使用虚拟机技术
-
虚拟机:在window中装一个VMware 通过这个软件我们可以虚拟出来一台或者多台电脑 笨重
-
虚拟机也属于虚拟化技术 Docker容器技术 也是一种虚拟化技术
VMware : linux centos 原生镜像(一个电脑!) 隔离、需要开启多个虚拟机! 几个G 几分钟
docker: 隔离,镜像(最核心的环境 4m + jdk + mysql)十分的小巧,运行镜像就可以了!小巧! 几个M 秒级启动!
聊聊Docker
Docker基于Go语言开发的!开源项目!
docker官网:https://www.docker.com/
文档:https://docs.docker.com/ Docker的文档是超级详细的
1.3.Docker能干嘛
之前的虚拟机技术
虚拟机技术缺点:
-
资源占用十分多
-
冗余步骤多
-
3启动很慢
容器化技术
容器化技术不是模拟一个完整的操作系统
比较Docker和虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
DevOps(开发、运维)
应用更快速的交付和部署
-
传统:一对帮助文档 安装程序。
-
Docker:打包镜像发布测试一键运行
更便捷的升级和扩缩容
-
使用了 Docker之后 我们部署应用就和搭积木一样
-
项目打包为一个镜像 扩展服务器A 服务器B更简单的系统运维
-
在容器化之后,我们的开发 测试环境都是高度一致的
更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。
2.Docker安装
2.1.Docker的基本组成
镜像(image):
- docker镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat镜像>run>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)
容器(container):
-
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的
-
启动,停止,删除,基本命令
-
目前就可以把这个容器理解为就是一个简易的 Linux系统
仓库(repository):
-
仓库就是存放镜像的地方
-
仓库分为公有仓库和私有仓库 (很类似git)
-
Docker Hub是国外的
-
阿里云…都有容器服务器(配置镜像加速!)
2.2.安装Docker
环境准备
1.Linux要求内核3.0以上
2.CentOS 7
# 系统内核
[root@localhost /]# uname -r
3.10.0-1160.76.1.el7.x86_64 # 要求3.0以上
# 系统版本
[root@localhost /]# 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
帮助文档:https://docs.docker.com/engine/install/
卸载与安装
#1.卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2.需要的安装包
yum install -y yum-utils
#3.设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#上述方法默认是从国外的,不推荐
#推荐使用国内的
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#4.安装docker相关的 docker-ce 社区版 docker-ee 企业版
yum install docker-ce docker-ce-cli containerd.io # 这里我们使用社区版即可
#5.启动docker
systemctl start docker
#6. 使用docker version查看是否按照成功
docker version
#7. 测试
docker run hello-world
#8.查看已经下载的镜像(从这里可以查看已有镜像的id)
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 11 months ago 13.3kB
卸载docker
#1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2. 删除资源
rm -rf /var/lib/docker
# /var/lib/docker 是docker的默认工作路径!
阿里云镜像加速
1.1.登录阿里云找到容器服务
1.2.找到镜像加速器
1.3.配置使用
#1.创建一个目录
sudo mkdir -p /etc/docker
#2.编写配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://oltiqh2r.mirror.aliyuncs.com"]
}
EOF
#3.重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
2.3.回顾HelloWorld流程
docker run 流程图
底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
Docker-Server接收到Docker-Client的指令,就会执行这个命令!
为什么Docker比Vm快
1.docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
2.docker利用的是宿主机的内核,而不需要Guest OS。
GuestOS: VM(虚拟机)里的的系统(OS)
HostOS:物理机里的系统(OS)
因此,当新建一个 容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引导、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此新建一个docker容器只需要几秒钟。
3.Docker的常用命令
3.1.帮助命令
docker version #显示docker的版本信息。
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
帮助文档的地址:https://docs.docker.com/engine/reference/commandline/build/
3.2.镜像命令
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替
docker search #搜索镜像
docker pull #下载镜像 docker image pull
docker rmi #删除镜像 docker image rm
docker images查看所有本地的主机上的镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 11 months ago 13.3kB
# 解释
#REPOSITORY # 镜像的仓库源
#TAG # 镜像的标签(版本) ---lastest 表示最新版本
#IMAGE ID # 镜像的id
#CREATED # 镜像的创建时间
#SIZE # 镜像的大小
# 可选项
Options:
-a, --all # 列出所有镜像
-q, --quiet # 只显示镜像的id
# 列出所有镜像详细信息
[root@localhost ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 11 months ago 13.3kB
# docker images -aq #列出所有镜像的id
[root@localhost ~]# docker images -q
feb5d9fea6a5
docker search 搜索镜像
[root@localhost ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13123 [OK]
mariadb MariaDB Server is a high performing open sou… 5017 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 621 [OK]
percona Percona Server is a fork of the MySQL relati… 584 [OK]
# 可选项 docker search --help
[root@localhost ~]# docker search --help
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
# 过滤 搜索出来的镜像收藏STARS数量大于9000的 docker search mysql --filter=STARS=9000
[root@localhost ~]# docker search mysql --filter=STARS=9000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13123 [OK]
docker pull 下载镜像
# 下载镜像 docker pull 镜像名[:tag(版本)]
[root@localhost ~]# docker pull mysql
Using default tag: latest # 如果不写tag(版本) 默认就是latest(最新的)
latest: Pulling from library/mysql
72a69066d2fe: Pull complete # 分层下载:docker image 的核心 联合文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
#等价于
docker pull mysql
docker pull docker.io/library/mysql:latest
# 指定版本下载
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists # 以前下载过了 可以共用的
93619dbc5b36: Already exists
99da31dd6142: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 删除镜像
# docker rmi 批量删除镜像 根据id指定删除镜像
[root@localhost ~]# docker rmi -f c20987f18b13 镜像id 删除指定的镜像
docker rmi -f $(docker images -aq) # $(docker images -aq) 查出所有的镜像id 然后根据镜像id批量删除
[root@localhost~]# docker stop $(docker ps -a -q)
3.3.容器命令
说明:我们有了镜像才可以创建容器 Linux 下载centos镜像来学习
镜像下载
# docker中下载centos
docker pull centos
docker run 镜像id # 新建容器并启动
docker ps 列出所有运行的容器 docker container list
docker rm 容器id # 删除指定容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
[root@localhost~]# docker container list #h和docker ps相同
新建容器并启动
docker run [可选参数] image | docker container run [可选参数] image
#参书说明
--name ="Name" # 给容器赋值名字 用来区分
-d # 后台方式运行 跟nohup相似
-i # 使用交互方式运行
-t # 进入容器查看内容
-p # 指定容器的端口 -p 8080(宿主机):8080(容器)
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P(大写) 随机指定端口
# 测试、启动并进入容器 主机名称有区别就可以看出进没进容器 主机名字就是镜像Id
[root@localhost /]# docker run -it centos /bin/bash # 后面的/bin/bash的作用是表示载入容器后运行bash
# docker中必须要保持一个进程的运行
# 要不然整个容器启动后就会马上kill itself
# 这样当你使用docker ps 查看启动的容器时
# 就会发现你刚刚创建的那个容器并不在已启动的容器队列中
# 这个/bin/bash就表示启动容器后启动bash
[root@e3e1a08cff7a /]# ls 查看容器内的Centos 基础版本 很多命令都是不完善的
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@e3e1a08cff7a /]# exit #从容器退回主机
exit
列出所有运行的容器
docker ps 命令 # 列出当前正在运行的容器
-a, --all # 列出当前正在运行的容器 + 带出历史运行过的容器
-n=?, --last int # 列出最近创建的?个容器 ?为1则只列出最近创建的一个容器,为2则列出2个
-q, --quiet # 只列出容器的编号
退出容器
exit # 容器直接退出
ctrl +P +Q # 容器不停止退出 ---注意:这个很有用的操作
删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
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 # 强制停止当前容器
3.4.常用其他命令
后台启动命令
# 命令 docker run -d 镜像名
[root@localhost~]# docker run -d centos
a8f922c255859622ac45ce3a535b7a0e8253329be4756ed6e32265d2dd2fac6c
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 问题docker ps. 发现centos 停止了
# 常见的坑,docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
# 查看关于日志的信息以及怎么使用
docker logs --help
# 自己编写一个小脚本让他有日志信息否则运行时没有日志信息
docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #模拟日志
# 显示日志
-tf --tail number # 显示日志信息 -t是显示时间 -f持续更新显示 --tail number 显示number条日志
# 查看n行日志
docker logs -t --tail n 容器id
# 显示全部日志信息 并且持续更新
docker logs -tf 容器id
查看容器中进程信息ps
# 命令 docker top 容器id 查看容器中的进程
docker top 2e01b3333cbc
查看镜像的元数据(容器的内部信息)
# 命令
docker inspect 容器id
#测试
docker inspect 55321bcae33d
[root@localhost ~]# docker inspect c109c4603669
[
{
"Id": "c109c4603669d78a269a0fea6f0e4f5333e6067ec64a7120b0e6990f4e2bd9db", # 容器id
"Created": "2022-09-05T14:20:09.367362185Z",
"Path": "/bin/sh", # 开启一个shell终端
"Args": [
"-c", # 容器执行脚本
"while true;do echo 6666;sleep 1;done"
],
"State": {
"Status": "running", # 容器的状态
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 76269,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-09-05T14:20:09.607130704Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/c109c4603669d78a269a0fea6f0e4f5333e6067ec64a7120b0e6990f4e2bd9db/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/c109c4603669d78a269a0fea6f0e4f5333e6067ec64a7120b0e6990f4e2bd9db/hostname",
"HostsPath": "/var/lib/docker/containers/c109c4603669d78a269a0fea6f0e4f5333e6067ec64a7120b0e6990f4e2bd9db/hosts",
"LogPath": "/var/lib/docker/containers/c109c4603669d78a269a0fea6f0e4f5333e6067ec64a7120b0e6990f4e2bd9db/c109c4603669d78a269a0fea6f0e4f5333e6067ec64a7120b0e6990f4e2bd9db-json.log",
"Name": "/amazing_swartz",
"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/dc5afe1a107eb52814a2aa197dab799b3520fadf45c5c325840524658b816412-init/diff:/var/lib/docker/overlay2/1df4d2ed45f644912e8bbb015da6068ce2dc4f149d0ce20c44586acc773fc61a/diff",
"MergedDir": "/var/lib/docker/overlay2/dc5afe1a107eb52814a2aa197dab799b3520fadf45c5c325840524658b816412/merged",
"UpperDir": "/var/lib/docker/overlay2/dc5afe1a107eb52814a2aa197dab799b3520fadf45c5c325840524658b816412/diff",
"WorkDir": "/var/lib/docker/overlay2/dc5afe1a107eb52814a2aa197dab799b3520fadf45c5c325840524658b816412/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "c109c4603669",
"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 6666;sleep 1;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": "662462c192e051bb49eb3df2b13fc33a0429f288ab2bb44df5ad3e1b33c7426f",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/662462c192e0",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "234ee1328ec1c365cb6b7f0171c49bf40f8457a1eb517436cc4fff2caae51e74",
"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": "6057227c558119251707b6c0db6330684e5a254cf2946c6f8b2924c7776200c7",
"EndpointID": "234ee1328ec1c365cb6b7f0171c49bf40f8457a1eb517436cc4fff2caae51e74",
"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
}
}
}
}
]
进入当前正在运行的容器
# 我们通常容器都是在后台运行,需要进入容器,修改一些配置
# 方式一 开启一个新的bash或shell终端窗口
# 命令
docker exec -it 容器id bashshell
[sh-4.4# ~]# docker ps
[sh-4.4# ~]# ps -ef
# 方式二 不开启新的终端窗口
dcoker attach 容器id
# 测试
[root@localhost ~]# docker attach dce7bshk8oou7
正在执行当前的代码...
# 区别
docker exec #进入容器后开启一个新的终端
docker attach # 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
# 运行容器并且进入交互模式
[root@localhost /]# docker run -it centos /bin/bash
[root@a9525c9c9393 /]# cd home
[root@a9525c9c9393 home]# ls
# 在容器内部进行创建文件
[root@a9525c9c9393 home]# touch test.java
[root@a9525c9c9393 home]# ls
test.java
# 退出容器并且不结束容器运行 查看正在运行的容器id
[root@a9525c9c9393 home]# [root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9525c9c9393 centos "/bin/bash" 30 seconds ago Up 29 seconds beautiful_ritchie
# 进入容器
[root@localhost /]# docker attach a9525c9c9393
# 退出容器并且结束容器
[root@a9525c9c9393 home]# exit
exit
# 从容器中拷贝到本机
[root@localhost /]# docker cp a9525c9c9393:/home/test.java /home
[root@localhost /]# cd home
# 查看是否拷贝成功
[root@localhost home]# ls
test.java
[root@localhost home]#
# 拷贝是一个手动过程,未来我们可以使用-v卷的技术,可以实现自动同步 /home /home
3.5.小结
docker中镜像和容器的区别:
1.镜像是包含了各种环境或者服务的一个模板 而容器是镜像的一个实例
2.镜像是不能运行的 是静态的 而容器是可以运行的 是动态的
命令大全
attach Attach to a running container # 当前shell下attach连接指定运行镜像
build Build an image from a Dockerfile # 通过Dockerfile定制镜像
commit Create a new image from a containers changes # 提交当前容器为新的镜像
cp Copy files/folders from a container to a HOSTDIR or to STDOUT # 从容器中拷贝指定文件或者目录到宿主机中
create Create a new container # 创建一个新的容器,同run 但不启动容器
diff Inspect changes on a containers filesystem # 查看docker容器变化
events Get real time events from the server # 从docker服务获取容器实时事件
exec Run a command in a running container # 在已存在的容器上运行命令
export Export a containers filesystem as a tar archive# 导出容器的内容流作为一个tar归档文件(对应import)
history Show the history of an image # 展示一个镜像形成历史
images List images # 列出系统当前镜像
import Import the contents from a tarball to create a filesystem image # 从tar包中的内容创建一个新的文件系统映像(对应export)
info Display system-wide information # 显示系统相关信息
inspect Return low-level information on a container or image # 查看容器详细信息
kill Kill a running container # kill指定docker容器
load Load an image from a tar archive or STDIN # 从一个tar包中加载一个镜像(对应save)
login Register or log in to a Docker registry # 注册或者登陆一个docker源服务器
logout Log out from a Docker registry # 从当前Docker registry退出
logs Fetch the logs of a container # 输出当前容器日志信息
pause Pause all processes within a container # 暂停容器
port List port mappings or a specific mapping for the CONTAINER # 查看映射端口对应的容器内部源端口
ps List containers # 列出容器列表
pull Pull an image or a repository from a registry # 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to a registry # 推送指定镜像或者库镜像至docker源服务器
rename Rename a container # 重命名容器
restart Restart a running container # 重启运行的容器
rm Remove one or more containers # 移除一个或者多个容器
rmi Remove one or more images # 移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
run Run a command in a new container # 创建一个新的容器并运行一个命令
save Save an image(s) to a tar archive # 保存一个镜像为一个tar包(对应load)
search Search the Docker Hub for images # 在docker
hub中搜索镜像
start Start one or more stopped containers # 启动容器
stats Display a live stream of container(s) resource usage statistics # 统计容器使用资源
stop Stop a running container # 停止容器
tag Tag an image into a repository # 给源中镜像打标签
top Display the running processes of a container # 查看容器中运行的进程信息
unpause Unpause all processes within a container # 取消暂停容器
version Show the Docker version information # 查看容器版本号
wait Block until a container stops, then print its exit code # 截取容器停止时的退出状态值
3.6.作业练习(安装)
作业一:Docker 安装Nginx
# 1.搜索镜像
[root@localhost ~]# docker search nginx
# 2.拉取镜像
[root@localhost ~]# docker pull nginx
# 3.查看镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 8 months ago 141MB
mysql latest 3218b38490ce 8 months ago 516MB
hello-world latest feb5d9fea6a5 11 months ago 13.3kB
centos latest 5d0da3dc9764 11 months ago 231MB
# 4.启动运行
[root@localhost ~]# docker run -d --name nginx01 -p 3344:80 nginx
66f84ea1a1679cc5f062e4c7aab26f051d30df710e23e7685597257933eb7d61
# -d 后台运行
# --name 给容器起名字
# -p 宿主机端口:容器内部端口
# 5.查看运行情况
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d320470acea6 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
# 6.本机自测运行情况
[root@localhost ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
# 成功访问nginx80 端口
外部也可以访问到
# 7.进入容器,修改配置
[root@localhost ~]# docker exec -it nginx01 /bin/bash
root@d320470acea6:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@d320470acea6:/# cd /etc/nginx
root@d320470acea6:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@d320470acea6:/etc/nginx#
端口暴露的概念
思考问题:我们每次都需要改动nginx配置,都需要进入容器内部?十分的麻烦,我们要是可以在容器外部提供一个映射路径,达到可以在容器外部修改文件名,容器内部就可以进行自动修改?-数据卷
作业二:用docker 来装一个tomcat
# 1.搜索镜像
[root@localhost ~]# docker search tomcat
# 2.拉取镜像
[root@localhost ~]# docker pull tomcat
# 3.查看镜像
[root@localhost ~]# docker images
# 4.启动运行
[root@localhost ~]# docker run -d --name tomcat01 -p 3355:8080 tomcat
360c1575e51593850917c7835c6b3e9b02d5cb54f3630f4c493dcb1d108b8581
# -d 后台运行
# --name 给容器起名字
# -p 宿主机端口:容器内部端口
# 5.测试访问没有问题
# 5.1.发现问题
# 但是我们发现了一个问题 这个tomcat不完整
# linux命令少了 webapps目录为空
# 原因:阿里云镜像默认是最小的 把所有不必要的都剔除掉
# 保证最小可运行的环境
# 5.2.解决方法
# 方式一:将webapps.dist下的文件都拷贝到webapps下即可
# 方式二:将webapps.dist改名成webapps即可
# 这样docker部署tomcat就可以访问了
# 扩展
# 下载 tomcat9.0
# 之前的启动都是后台,停止了容器,容器还是可以查到, docker run -it --rm 镜像名 一般是用来测试,用完就删除
[root@localhost ~]# docker run -it --rm tomcat:9.0
# 扩展
# 已经运行了tomcat 我们把它停止看一下是否删除了 并没有已经删除了
问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?要是可以在容器外部提供一个映射路径,比如webapps,我们在外部放置项目,就自动同步内部就好了!
作业三:部署elasticsearch+kibana
# Elasticsearch 暴露的端口很多
# Elasticsearch 十分耗内存
# Elasticsearch 的数据一般需要放置到安全目录!挂载
# --net somenetwork ? 网络配置
# 启动Elasticsearch
[root@localhost ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 测试一下启动Elasticsearch是否成功启动
[root@localhost ~]# curl localhost:9200
{
"name" : "f93e12029746",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "TQ35zd5tRaKE7tYkcQXm3w",
"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"
}
# 测试成功就关掉Elasticsearch 防止耗内存
[root@localhost ~]# docker stop f93e12029746
f93e12029746
# 查看docker容器使用内存情况
[root@localhost ~]# docker stats
# 测试成功就关掉Elasticsearch 增加内存的限制 修改配置文件 -e 环境配置修改
[root@localhost ~]#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 3553281f0124
# 访问成功
[root@localhost ~]# curl localhost:9200
{
"name" : "3553281f0124",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "ADbhVlrORX-900UonZqA_w",
"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"
}
作业三:使用kibana连接es (elasticSearch)?思考网络如何才能连接
Portainer 可视化面板安装
- portainer(先用这个)
docker run -d -p 8080:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
- Rancher(CI/CD再用)
什么是portainer?
Docker图形化界面管理工具!提供一个后台面板供我们操作!
# 安装命令
[root@localhost home]# docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 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
b7213da870de3fb291a30d24471b689306b0109faf5b28aca19d697f01c6cf7f
- 测试访问: 外网:9000 :http://192.168.0.130:9000/
-
设置密码登录上去选择本地
-
进入之后的面板
4.镜像原理之联合文件系统
4.1.镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来
如何得到镜像:
- 从远处仓库下载
- 朋友拷贝给你
- 自己制作一个镜像DockerFile
4.2.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。
虚拟机是分钟级别的,容器是秒级别的。
4.3.分层的镜像
我们去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载!
思考:为什么要采用这种分层的结构呢?
最大的好处,我觉得莫过于是资源共享了,比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存中只需要加载一份base镜像,这样就可以为多有的容器服务了,而且每一层都可以被共享
查看镜像分层的方式可以通过docker image inspect 命令
[root@localhost ~]# docker image inspect redis:latest
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d",
"sha256:89ce1a07a7e4574d724ea605b4877f8a73542cf6abd3c8cbbd2668d911fa5353",
"sha256:9eef6e3cc2937e452b2325b227ca28120a70481be25404ed9aad27fa81219fd0",
"sha256:ee748697d275b904f1d5604345d70b647a8c145b9f05aeb5ca667e1f256e43d8",
"sha256:f1f7964d40afa49c6ef63ab11af91044e518a2539f567783ce997d3cea9ce8f6",
"sha256:3d9fda8ff875e549d54e9d7504ce17d27423fe27dafbb92127c603dddad7fa13"
]
},
理解:
所有的 Docker|镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于 Ubuntu Linux 16.04 创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加 Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含 3 个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。
在添加额外的镜像层的同时,镜像始终是保持当前所有镜像的组合,理解这一点是非常重要的。下图拒了一个简单的例子,每个镜像包含三个文件,而镜像包含了来自两个镜像层的6个文件。
上图中的镜像层和之前的图中略有区别,主要目的是便于展示文件
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层的文件7是文件5的一个更新版
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。 Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系統。 Linux 上可用的存储引擎有 AUFS、Overlay2、Device Mapper、Btrfs 以及 ZFS。顾名思义,每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker 在 Windows 上仅支持 windowsfiter一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分层和 CoW[1]。
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合井,对外提供统一的视图。
特点
Docker镜像都是只读的 当容器启动时 一个新的可写层被加载到镜像顶部
这一层就是我们通常说的容器层 容器之下的都叫镜像层
4.4.commit镜像
docker commit # 提交容器成为一个新的副本
docker commit -m # "提交的描述信息" -a="作者" 容器id 目标镜像名:[tag] 命令和git原理类似
实战测试
# 1.启动一个默认的tomcat
# 2.发现这个默认的tomcat是没有webapps应用的 镜像的原因:官方镜像默认webapps下面没有文件的
# 3.我自己拷贝进去了基本的文件
# 4.将我们自己操作过后的容器通过commit提交为一个镜像 我们以后就可以使用自己修改过的镜像 这就是我们自己的一个修改过的镜像
[root@localhost ~]# docker commit -a="xiao" -m="add webapps app" a0d539971acd tomcat02:1.0
sha256:ab7aa3ba7a164203e1f9a5bd8d8f633a64a2e184cdd82301c3ee6a6e49cb8f3a
# 5.查看我们提交的镜像
docker images
如果你想要保存当前的状态 就通过commit提交 获得一个镜像 就好比我们以前学习VM时候 快照
5. 容器数据卷
5.1.什么是容器数据卷
docker的理念回顾
-
将应用环境打包成一个镜像
-
数据问题 如果数据都在容器中 那么我们容器删除 数据就会丢失 需求:数据可以持久化
-
MySQL 容器删除了 删库跑路 需求:MySQL的数据可以存储在本地
-
容器之间可以有一个数据共享的技术 docker容器中产生的数据 同步到本地
这就是卷技术,目录的挂载,将容器内的目录挂载在Linux上面
总结一句话:容器的持久化和同步操作 容器间也是可以数据共享的
5.2.使用命令来挂载
docker run -it -v 主机目录:容器的目录
# 测试
[root@localhost home]# docker run -it -v /home/ceshi:/home centos /bin/bash
# 容器启动的时候我们可以通过docker inspect 容器id 去查看容器相信信息
测试文件的同步
再来测试
-
停止容器
-
宿主机上修改文件
-
启动容器
-
容器内的数据依旧是同步的
优点:我们以后修改只需要在本地进行修改即可 容器内部会自动进行同步
实战:安装MySQL
# 获取镜像
[root@localhost ~]# docker pull mysql:5.7
# 运行容器,需要做数据挂载 安装MySQL需要配置密码 下面是官方命令
[root@localhost ~]#docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动我们的-d后台运行 -p端口映射 -v数据卷挂载 -e环境配置 --name容器名字
[root@localhost /]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123.com --name mysql01 mysql
# 启动成功后 我们在本地使用Navict来测试连接一下
# Navict连接到服务器3310后 3310和容器内部的3306进行映射 这个时候就可以连接上了
# 本地测试新建数据库 查看映射的路径是否可以同步数据
假设我们把容器删除
5.3.具名和匿名挂载
# 匿名挂载 -v只指定了容器内的路径 没有指定容器外的路径
[root@localhost /]# docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的volume的情况
[root@localhost /]# docker volume ls
# 具名挂载 -v指定了容器外的路径 也指定卷名 # -v /juming-nginx 这个是指定路径 juming-nginx 这个是卷名
[root@localhost ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx
# 查看所有的volume的情况
[root@localhost /]# docker volume ls
# 通过查看volume就可以看到 卷名:容器内路径
[root@localhost /]# docker volume inspect juming-nginx
# 进入这个路径 查看一下
[root@localhost /]# cd /var/lib/docker/volumes/juming-nginx/_data/
# 查看一下是否有nginx的配置文件
[root@localhost _data]# ls
# 看到了nginx的配置文件 证明拿到了nginx的配置文件 没有错
所有的docker容器内的卷,在没有指定路径的情况下都是在/var/lib/docker/volumes/xxx/_data
我们通过具名挂载可以方便找到我们的一个卷,大多数情况下都是使用具名挂载
# 如何确定是匿名挂载还是具名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v 宿主机路径:容器内路径 # 指定路径挂载
拓展
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦设置了这个容器权限 容器对我们挂载出来的内容就有了限制了
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v /etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
docker run -d -P --name nginx02 -v /etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作 容器内部是无法进行操作的
5.4.初识DockerFile
DockerFile就是用来构建docker镜像的构建文件 命令脚本 先体验一下
通过这个脚本可以生成一个镜像 镜像是一层层的 所以脚本是一个个的命令
# 文件中的内容 命令(大写)
# 参数:
# FROM centos # 当前构建这个镜像 以centos为基础
# VOLUME ["volume01","volume02"] # 生成的时候就挂载卷
# CMD echo "---end---" # 构建成功之后输出end
# CMD /bin/bash # 构建成功后默认走的是bash控制台
# 这里的每个命令就是镜像的一层
# 创建一个dockerfile文件 名字可以随机 建议Dockerfile
[root@localhost docker-test-volume]docker build -f /home/docker-test-volume/dockerfile1 -t xiao/centos:1.0 .
# build # 构建一个镜像
# -f # 通过-f指定的文件来构建镜像
# -t # 生成(name)镜像
# . # 当前目录下
# 查看一下是否构建镜像成功
docker images
# 启动一下自己写的容器
这个卷和外部一定有一个同步的目录
查看一下卷挂载的路径
[root@localhost data]# docker inspect fca535846c94
# 测试一下文件是否已经被同步出去了
[root@localhost _data]# cd /var/lib/docker/volumes/a15fa5acea56bd53fae7fc7b71a328cf26a6a2eb5c38b76ee7cdf5bf917dbe1e/_data
[root@localhost _data]# ls
这种方式未来的使用非常多 因为我们自己通常会构建自己的镜像
假设构建镜像的时候没有挂载 需要自己手动挂载镜像 -v 卷名:容器内路径
5.5.数据卷容器
多个MySQL同步数据
启动3个容器 通过我们刚在自己写的镜像启动
启动第一个容器
启动第二个容器
docker01的数据同步到了docker02
启动第三个容器并且也挂载docker01
# 测试 :可以删除容器dcoker01,查看docker02和docker03时候还可以访问这个文件
# 测试结果是依然可以访问到
多个MySQL实现数据共享
# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=338218 --name mysql01 mysql:5.7
# docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=338218 --name mysql02 --volumes-from mysql01 mysql:5.7# # 这个时候可以实现两个容器数据同步
结论:
容器之间配置信息的传递 数据卷容器的生命周期这一直持续到没有容器使用为止
但是一旦持久化到了本地 这个时候 本地的数据不会被删除
6.DockerFile
6.1.DockerFile介绍
dockerfile是用来构建docker镜像的文件,命令参数脚本
构建步骤:
-
编写一个dockerfile文件
-
docker build构建为一个镜像
-
docker run 运行镜像
-
docker push发布镜像(DockerHub、阿里云镜像仓库)
查看一下官方是怎么做的
很多官方的镜像都是基础包 很多功能都没有 我们通常会自己搭建自己的镜像
官方可以制作镜像 那我们也可以
6.2.DockerFile镜像的构建
基础知识:
-
每个保留关键字(指令)都是必须是大写字母
-
执行从上到下顺序执行
-
表示注释
-
每一个指令都会创建提交一个新的镜像层,并提交
-
dockerfile是面向开发的 我们以后要发布项目 做镜像 就需要编写dockerfile文件 这个文件十分简单
-
Docker镜像逐渐成为了企业交付的标准 必须要掌握
-
步骤:开发 部署,运维…缺一不可
-
DockerFile:构建文件 定义了一切的步骤 源代码
-
DockerImages:通过DockerFile构建生成的镜像 最终发布和运行的产品
-
Docker容器:容器就是镜像运行起来提供服务的
6.3.Docker指令
FROM # 基础镜像 一切从这里开始
MAINTAINER # 镜像是谁写的 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像 这个tomcat压缩包 添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置
CMD # 指定容器运行时的shell命令 只有最后一个生效 可被替代
ENTRYPOINT # 指定容器运行时的shell命令 可以追加命令
ONBUILD # 当构建一个被继承DockerFile这个还是会就会运行ONBUILD的指令 触发指令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量
6.4.实战训练
Docker Hub中99%的镜像都是从这个基础镜像过来的FROM scratch 然后配置需要的软件和配置来进行构建的
创建一个自己的centos
# 1、编写Dockerfile文件[root@localhost dockerfile]# cat mydockerfile-centos FROM centosMAINTAINER eric<[email protected]>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATHCMD echo "----end----"CMD /bin/bash# 2、通过这个文件构建镜像# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag]Successfully built dc4556607d09Successfully tagged mycentos:0.1# 3、测试运行
对比:之前原生的centos
# 1.编写 Dockerfile文件
[root@localhost dockerfile]# vim myDockerfile
[root@localhost dockerfile]# cat myDockerfile
FROM centos:7
MAINTAINER xiao<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
# 2.通过这个myDockerfile文件构建镜像
[root@localhost dockerfile]# docker build -f myDockerfile -t mycentos:0.1 .
Sending build context to Docker daemon 2.048kB
Step 1/11 : FROM centos:7
---> eeb6ee3f44bd
Step 2/11 : MAINTAINER xiao<[email protected]>
---> Using cache
---> 3bce5ca94a90
Step 3/11 : ENV MYPATH /usr/local
---> Using cache
---> d7b10d43dfd9
Step 4/11 : WORKDIR $MYPATH
---> Using cache
---> 2798b9857343
Step 5/11 : RUN yum install vim
---> Running in f9c8c6aa2670
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
* base: mirrors.huaweicloud.com
* extras: mirrors.neusoft.edu.cn
* updates: mirrors.neusoft.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package vim-enhanced.x86_64 2:7.4.629-8.el7_9 will be installed
--> Processing Dependency: vim-common = 2:7.4.629-8.el7_9 for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: which for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: perl(:MODULE_COMPAT_5.16.3) for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: libperl.so()(64bit) for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: libgpm.so.2()(64bit) for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Running transaction check
---> Package gpm-libs.x86_64 0:1.20.7-6.el7 will be installed
---> Package perl.x86_64 4:5.16.3-299.el7_9 will be installed
--> Processing Dependency: perl(Socket) >= 1.3 for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Scalar::Util) >= 1.10 for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl-macros for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(threads::shared) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(threads) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(constant) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Time::Local) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Time::HiRes) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Storable) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Socket) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Scalar::Util) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Pod::Simple::XHTML) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Pod::Simple::Search) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Getopt::Long) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Filter::Util::Call) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Temp) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Spec::Unix) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Spec::Functions) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Spec) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Path) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Exporter) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Cwd) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Carp) for package: 4:perl-5.16.3-299.el7_9.x86_64
---> Package perl-libs.x86_64 4:5.16.3-299.el7_9 will be installed
---> Package vim-common.x86_64 2:7.4.629-8.el7_9 will be installed
--> Processing Dependency: vim-filesystem for package: 2:vim-common-7.4.629-8.el7_9.x86_64
---> Package which.x86_64 0:2.20-7.el7 will be installed
--> Running transaction check
---> Package perl-Carp.noarch 0:1.26-244.el7 will be installed
---> Package perl-Exporter.noarch 0:5.68-3.el7 will be installed
---> Package perl-File-Path.noarch 0:2.09-2.el7 will be installed
---> Package perl-File-Temp.noarch 0:0.23.01-3.el7 will be installed
---> Package perl-Filter.x86_64 0:1.49-3.el7 will be installed
---> Package perl-Getopt-Long.noarch 0:2.40-3.el7 will be installed
--> Processing Dependency: perl(Pod::Usage) >= 1.14 for package: perl-Getopt-Long-2.40-3.el7.noarch
--> Processing Dependency: perl(Text::ParseWords) for package: perl-Getopt-Long-2.40-3.el7.noarch
---> Package perl-PathTools.x86_64 0:3.40-5.el7 will be installed
---> Package perl-Pod-Simple.noarch 1:3.28-4.el7 will be installed
--> Processing Dependency: perl(Pod::Escapes) >= 1.04 for package: 1:perl-Pod-Simple-3.28-4.el7.noarch
--> Processing Dependency: perl(Encode) for package: 1:perl-Pod-Simple-3.28-4.el7.noarch
---> Package perl-Scalar-List-Utils.x86_64 0:1.27-248.el7 will be installed
---> Package perl-Socket.x86_64 0:2.010-5.el7 will be installed
---> Package perl-Storable.x86_64 0:2.45-3.el7 will be installed
---> Package perl-Time-HiRes.x86_64 4:1.9725-3.el7 will be installed
---> Package perl-Time-Local.noarch 0:1.2300-2.el7 will be installed
---> Package perl-constant.noarch 0:1.27-2.el7 will be installed
---> Package perl-macros.x86_64 4:5.16.3-299.el7_9 will be installed
---> Package perl-threads.x86_64 0:1.87-4.el7 will be installed
---> Package perl-threads-shared.x86_64 0:1.43-6.el7 will be installed
---> Package vim-filesystem.x86_64 2:7.4.629-8.el7_9 will be installed
--> Running transaction check
---> Package perl-Encode.x86_64 0:2.51-7.el7 will be installed
---> Package perl-Pod-Escapes.noarch 1:1.04-299.el7_9 will be installed
---> Package perl-Pod-Usage.noarch 0:1.63-3.el7 will be installed
--> Processing Dependency: perl(Pod::Text) >= 3.15 for package: perl-Pod-Usage-1.63-3.el7.noarch
--> Processing Dependency: perl-Pod-Perldoc for package: perl-Pod-Usage-1.63-3.el7.noarch
---> Package perl-Text-ParseWords.noarch 0:3.29-4.el7 will be installed
--> Running transaction check
---> Package perl-Pod-Perldoc.noarch 0:3.20-4.el7 will be installed
--> Processing Dependency: perl(parent) for package: perl-Pod-Perldoc-3.20-4.el7.noarch
--> Processing Dependency: perl(HTTP::Tiny) for package: perl-Pod-Perldoc-3.20-4.el7.noarch
--> Processing Dependency: groff-base for package: perl-Pod-Perldoc-3.20-4.el7.noarch
---> Package perl-podlators.noarch 0:2.5.1-3.el7 will be installed
--> Running transaction check
---> Package groff-base.x86_64 0:1.22.2-8.el7 will be installed
---> Package perl-HTTP-Tiny.noarch 0:0.033-3.el7 will be installed
---> Package perl-parent.noarch 1:0.225-244.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:7.4.629-8.el7_9 updates 1.1 M
Installing for dependencies:
gpm-libs x86_64 1.20.7-6.el7 base 32 k
groff-base x86_64 1.22.2-8.el7 base 942 k
perl x86_64 4:5.16.3-299.el7_9 updates 8.0 M
perl-Carp noarch 1.26-244.el7 base 19 k
perl-Encode x86_64 2.51-7.el7 base 1.5 M
perl-Exporter noarch 5.68-3.el7 base 28 k
perl-File-Path noarch 2.09-2.el7 base 26 k
perl-File-Temp noarch 0.23.01-3.el7 base 56 k
perl-Filter x86_64 1.49-3.el7 base 76 k
perl-Getopt-Long noarch 2.40-3.el7 base 56 k
perl-HTTP-Tiny noarch 0.033-3.el7 base 38 k
perl-PathTools x86_64 3.40-5.el7 base 82 k
perl-Pod-Escapes noarch 1:1.04-299.el7_9 updates 52 k
perl-Pod-Perldoc noarch 3.20-4.el7 base 87 k
perl-Pod-Simple noarch 1:3.28-4.el7 base 216 k
perl-Pod-Usage noarch 1.63-3.el7 base 27 k
[root@localhost dockerfile]# docker build -f myDockerfile -t mycentos:0.1 .
Sending build context to Docker daemon 2.048kB
Step 1/10 : FROM centos:7
---> eeb6ee3f44bd
Step 2/10 : MAINTAINER xiao<[email protected]>
---> Using cache
---> 3bce5ca94a90
Step 3/10 : ENV MYPATH /usr/local
---> Using cache
---> d7b10d43dfd9
Step 4/10 : WORKDIR $MYPATH
---> Using cache
---> 2798b9857343
Step 5/10 : RUN yum -y install vim
---> Running in 91b1fa8ad6af
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
* base: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.bupt.edu.cn
* updates: mirrors.bupt.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package vim-enhanced.x86_64 2:7.4.629-8.el7_9 will be installed
--> Processing Dependency: vim-common = 2:7.4.629-8.el7_9 for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: which for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: perl(:MODULE_COMPAT_5.16.3) for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: libperl.so()(64bit) for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: libgpm.so.2()(64bit) for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Running transaction check
---> Package gpm-libs.x86_64 0:1.20.7-6.el7 will be installed
---> Package perl.x86_64 4:5.16.3-299.el7_9 will be installed
--> Processing Dependency: perl(Socket) >= 1.3 for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Scalar::Util) >= 1.10 for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl-macros for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(threads::shared) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(threads) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(constant) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Time::Local) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Time::HiRes) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Storable) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Socket) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Scalar::Util) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Pod::Simple::XHTML) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Pod::Simple::Search) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Getopt::Long) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Filter::Util::Call) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Temp) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Spec::Unix) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Spec::Functions) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Spec) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Path) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Exporter) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Cwd) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Carp) for package: 4:perl-5.16.3-299.el7_9.x86_64
---> Package perl-libs.x86_64 4:5.16.3-299.el7_9 will be installed
---> Package vim-common.x86_64 2:7.4.629-8.el7_9 will be installed
--> Processing Dependency: vim-filesystem for package: 2:vim-common-7.4.629-8.el7_9.x86_64
---> Package which.x86_64 0:2.20-7.el7 will be installed
--> Running transaction check
---> Package perl-Carp.noarch 0:1.26-244.el7 will be installed
---> Package perl-Exporter.noarch 0:5.68-3.el7 will be installed
---> Package perl-File-Path.noarch 0:2.09-2.el7 will be installed
---> Package perl-File-Temp.noarch 0:0.23.01-3.el7 will be installed
---> Package perl-Filter.x86_64 0:1.49-3.el7 will be installed
---> Package perl-Getopt-Long.noarch 0:2.40-3.el7 will be installed
--> Processing Dependency: perl(Pod::Usage) >= 1.14 for package: perl-Getopt-Long-2.40-3.el7.noarch
--> Processing Dependency: perl(Text::ParseWords) for package: perl-Getopt-Long-2.40-3.el7.noarch
---> Package perl-PathTools.x86_64 0:3.40-5.el7 will be installed
---> Package perl-Pod-Simple.noarch 1:3.28-4.el7 will be installed
--> Processing Dependency: perl(Pod::Escapes) >= 1.04 for package: 1:perl-Pod-Simple-3.28-4.el7.noarch
--> Processing Dependency: perl(Encode) for package: 1:perl-Pod-Simple-3.28-4.el7.noarch
---> Package perl-Scalar-List-Utils.x86_64 0:1.27-248.el7 will be installed
---> Package perl-Socket.x86_64 0:2.010-5.el7 will be installed
---> Package perl-Storable.x86_64 0:2.45-3.el7 will be installed
---> Package perl-Time-HiRes.x86_64 4:1.9725-3.el7 will be installed
---> Package perl-Time-Local.noarch 0:1.2300-2.el7 will be installed
---> Package perl-constant.noarch 0:1.27-2.el7 will be installed
---> Package perl-macros.x86_64 4:5.16.3-299.el7_9 will be installed
---> Package perl-threads.x86_64 0:1.87-4.el7 will be installed
---> Package perl-threads-shared.x86_64 0:1.43-6.el7 will be installed
---> Package vim-filesystem.x86_64 2:7.4.629-8.el7_9 will be installed
--> Running transaction check
---> Package perl-Encode.x86_64 0:2.51-7.el7 will be installed
---> Package perl-Pod-Escapes.noarch 1:1.04-299.el7_9 will be installed
---> Package perl-Pod-Usage.noarch 0:1.63-3.el7 will be installed
--> Processing Dependency: perl(Pod::Text) >= 3.15 for package: perl-Pod-Usage-1.63-3.el7.noarch
--> Processing Dependency: perl-Pod-Perldoc for package: perl-Pod-Usage-1.63-3.el7.noarch
---> Package perl-Text-ParseWords.noarch 0:3.29-4.el7 will be installed
--> Running transaction check
---> Package perl-Pod-Perldoc.noarch 0:3.20-4.el7 will be installed
--> Processing Dependency: perl(parent) for package: perl-Pod-Perldoc-3.20-4.el7.noarch
--> Processing Dependency: perl(HTTP::Tiny) for package: perl-Pod-Perldoc-3.20-4.el7.noarch
--> Processing Dependency: groff-base for package: perl-Pod-Perldoc-3.20-4.el7.noarch
---> Package perl-podlators.noarch 0:2.5.1-3.el7 will be installed
--> Running transaction check
---> Package groff-base.x86_64 0:1.22.2-8.el7 will be installed
---> Package perl-HTTP-Tiny.noarch 0:0.033-3.el7 will be installed
---> Package perl-parent.noarch 1:0.225-244.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:7.4.629-8.el7_9 updates 1.1 M
Installing for dependencies:
gpm-libs x86_64 1.20.7-6.el7 base 32 k
groff-base x86_64 1.22.2-8.el7 base 942 k
perl x86_64 4:5.16.3-299.el7_9 updates 8.0 M
perl-Carp noarch 1.26-244.el7 base 19 k
perl-Encode x86_64 2.51-7.el7 base 1.5 M
perl-Exporter noarch 5.68-3.el7 base 28 k
perl-File-Path noarch 2.09-2.el7 base 26 k
perl-File-Temp noarch 0.23.01-3.el7 base 56 k
perl-Filter x86_64 1.49-3.el7 base 76 k
perl-Getopt-Long noarch 2.40-3.el7 base 56 k
perl-HTTP-Tiny noarch 0.033-3.el7 base 38 k
perl-PathTools x86_64 3.40-5.el7 base 82 k
perl-Pod-Escapes noarch 1:1.04-299.el7_9 updates 52 k
perl-Pod-Perldoc noarch 3.20-4.el7 base 87 k
perl-Pod-Simple noarch 1:3.28-4.el7 base 216 k
perl-Pod-Usage noarch 1.63-3.el7 base 27 k
perl-Scalar-List-Utils x86_64 1.27-248.el7 base 36 k
perl-Socket x86_64 2.010-5.el7 base 49 k
perl-Storable x86_64 2.45-3.el7 base 77 k
perl-Text-ParseWords noarch 3.29-4.el7 base 14 k
perl-Time-HiRes x86_64 4:1.9725-3.el7 base 45 k
perl-Time-Local noarch 1.2300-2.el7 base 24 k
perl-constant noarch 1.27-2.el7 base 19 k
perl-libs x86_64 4:5.16.3-299.el7_9 updates 690 k
perl-macros x86_64 4:5.16.3-299.el7_9 updates 44 k
perl-parent noarch 1:0.225-244.el7 base 12 k
perl-podlators noarch 2.5.1-3.el7 base 112 k
perl-threads x86_64 1.87-4.el7 base 49 k
perl-threads-shared x86_64 1.43-6.el7 base 39 k
vim-common x86_64 2:7.4.629-8.el7_9 updates 5.9 M
vim-filesystem x86_64 2:7.4.629-8.el7_9 updates 11 k
which x86_64 2.20-7.el7 base 41 k
Transaction Summary
================================================================================
Install 1 Package (+32 Dependent packages)
Total download size: 19 M
Installed size: 63 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/base/packages/perl-Carp-1.26-244.el7.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for perl-Carp-1.26-244.el7.noarch.rpm is not installed
Public key for perl-Pod-Escapes-1.04-299.el7_9.noarch.rpm is not installed
--------------------------------------------------------------------------------
Total 1.8 MB/s | 19 MB 00:10
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <[email protected]>"
Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
Package : centos-release-7-9.2009.0.el7.centos.x86_64 (@CentOS)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : gpm-libs-1.20.7-6.el7.x86_64 1/33
Installing : 2:vim-filesystem-7.4.629-8.el7_9.x86_64 2/33
Installing : 2:vim-common-7.4.629-8.el7_9.x86_64 3/33
Installing : which-2.20-7.el7.x86_64 4/33
install-info: No such file or directory for /usr/share/info/which.info.gz
Installing : groff-base-1.22.2-8.el7.x86_64 5/33
Installing : 1:perl-parent-0.225-244.el7.noarch 6/33
Installing : perl-HTTP-Tiny-0.033-3.el7.noarch 7/33
Installing : perl-podlators-2.5.1-3.el7.noarch 8/33
Installing : perl-Pod-Perldoc-3.20-4.el7.noarch 9/33
Installing : 1:perl-Pod-Escapes-1.04-299.el7_9.noarch 10/33
Installing : perl-Encode-2.51-7.el7.x86_64 11/33
Installing : perl-Text-ParseWords-3.29-4.el7.noarch 12/33
Installing : perl-Pod-Usage-1.63-3.el7.noarch 13/33
Installing : 4:perl-macros-5.16.3-299.el7_9.x86_64 14/33
Installing : perl-Storable-2.45-3.el7.x86_64 15/33
Installing : perl-Exporter-5.68-3.el7.noarch 16/33
Installing : perl-constant-1.27-2.el7.noarch 17/33
Installing : perl-Socket-2.010-5.el7.x86_64 18/33
Installing : perl-Time-Local-1.2300-2.el7.noarch 19/33
Installing : perl-Carp-1.26-244.el7.noarch 20/33
Installing : perl-PathTools-3.40-5.el7.x86_64 21/33
Installing : perl-Scalar-List-Utils-1.27-248.el7.x86_64 22/33
Installing : 1:perl-Pod-Simple-3.28-4.el7.noarch 23/33
Installing : perl-File-Temp-0.23.01-3.el7.noarch 24/33
Installing : perl-File-Path-2.09-2.el7.noarch 25/33
Installing : perl-threads-shared-1.43-6.el7.x86_64 26/33
Installing : perl-threads-1.87-4.el7.x86_64 27/33
Installing : 4:perl-Time-HiRes-1.9725-3.el7.x86_64 28/33
Installing : perl-Filter-1.49-3.el7.x86_64 29/33
Installing : 4:perl-libs-5.16.3-299.el7_9.x86_64 30/33
Installing : perl-Getopt-Long-2.40-3.el7.noarch 31/33
Installing : 4:perl-5.16.3-299.el7_9.x86_64 32/33
Installing : 2:vim-enhanced-7.4.629-8.el7_9.x86_64 33/33
Verifying : perl-HTTP-Tiny-0.033-3.el7.noarch 1/33
Verifying : perl-threads-shared-1.43-6.el7.x86_64 2/33
Verifying : perl-Storable-2.45-3.el7.x86_64 3/33
Verifying : groff-base-1.22.2-8.el7.x86_64 4/33
Verifying : perl-Exporter-5.68-3.el7.noarch 5/33
Verifying : perl-constant-1.27-2.el7.noarch 6/33
Verifying : perl-PathTools-3.40-5.el7.x86_64 7/33
Verifying : 4:perl-macros-5.16.3-299.el7_9.x86_64 8/33
Verifying : 2:vim-enhanced-7.4.629-8.el7_9.x86_64 9/33
Verifying : 1:perl-parent-0.225-244.el7.noarch 10/33
Verifying : perl-Socket-2.010-5.el7.x86_64 11/33
Verifying : which-2.20-7.el7.x86_64 12/33
Verifying : 2:vim-filesystem-7.4.629-8.el7_9.x86_64 13/33
Verifying : perl-File-Temp-0.23.01-3.el7.noarch 14/33
Verifying : 1:perl-Pod-Simple-3.28-4.el7.noarch 15/33
Verifying : perl-Time-Local-1.2300-2.el7.noarch 16/33
Verifying : 1:perl-Pod-Escapes-1.04-299.el7_9.noarch 17/33
Verifying : perl-Carp-1.26-244.el7.noarch 18/33
Verifying : 2:vim-common-7.4.629-8.el7_9.x86_64 19/33
Verifying : perl-Scalar-List-Utils-1.27-248.el7.x86_64 20/33
Verifying : perl-Pod-Usage-1.63-3.el7.noarch 21/33
Verifying : perl-Encode-2.51-7.el7.x86_64 22/33
Verifying : perl-Pod-Perldoc-3.20-4.el7.noarch 23/33
Verifying : perl-podlators-2.5.1-3.el7.noarch 24/33
Verifying : 4:perl-5.16.3-299.el7_9.x86_64 25/33
Verifying : perl-File-Path-2.09-2.el7.noarch 26/33
Verifying : perl-threads-1.87-4.el7.x86_64 27/33
Verifying : 4:perl-Time-HiRes-1.9725-3.el7.x86_64 28/33
Verifying : gpm-libs-1.20.7-6.el7.x86_64 29/33
Verifying : perl-Filter-1.49-3.el7.x86_64 30/33
Verifying : perl-Getopt-Long-2.40-3.el7.noarch 31/33
Verifying : perl-Text-ParseWords-3.29-4.el7.noarch 32/33
Verifying : 4:perl-libs-5.16.3-299.el7_9.x86_64 33/33
Installed:
vim-enhanced.x86_64 2:7.4.629-8.el7_9
Dependency Installed:
gpm-libs.x86_64 0:1.20.7-6.el7
groff-base.x86_64 0:1.22.2-8.el7
perl.x86_64 4:5.16.3-299.el7_9
perl-Carp.noarch 0:1.26-244.el7
perl-Encode.x86_64 0:2.51-7.el7
perl-Exporter.noarch 0:5.68-3.el7
perl-File-Path.noarch 0:2.09-2.el7
perl-File-Temp.noarch 0:0.23.01-3.el7
perl-Filter.x86_64 0:1.49-3.el7
perl-Getopt-Long.noarch 0:2.40-3.el7
perl-HTTP-Tiny.noarch 0:0.033-3.el7
perl-PathTools.x86_64 0:3.40-5.el7
perl-Pod-Escapes.noarch 1:1.04-299.el7_9
perl-Pod-Perldoc.noarch 0:3.20-4.el7
perl-Pod-Simple.noarch 1:3.28-4.el7
perl-Pod-Usage.noarch 0:1.63-3.el7
perl-Scalar-List-Utils.x86_64 0:1.27-248.el7
perl-Socket.x86_64 0:2.010-5.el7
perl-Storable.x86_64 0:2.45-3.el7
perl-Text-ParseWords.noarch 0:3.29-4.el7
perl-Time-HiRes.x86_64 4:1.9725-3.el7
perl-Time-Local.noarch 0:1.2300-2.el7
perl-constant.noarch 0:1.27-2.el7
perl-libs.x86_64 4:5.16.3-299.el7_9
perl-macros.x86_64 4:5.16.3-299.el7_9
perl-parent.noarch 1:0.225-244.el7
perl-podlators.noarch 0:2.5.1-3.el7
perl-threads.x86_64 0:1.87-4.el7
perl-threads-shared.x86_64 0:1.43-6.el7
vim-common.x86_64 2:7.4.629-8.el7_9
vim-filesystem.x86_64 2:7.4.629-8.el7_9
which.x86_64 0:2.20-7.el7
Complete!
Removing intermediate container 91b1fa8ad6af
---> 3d00a2ca3556
Step 6/10 : RUN yum -y install net-tools
---> Running in a1734a3dafbd
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
* base: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.bupt.edu.cn
* updates: mirrors.bupt.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package net-tools.x86_64 0:2.0-0.25.20131004git.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
net-tools x86_64 2.0-0.25.20131004git.el7 base 306 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 306 k
Installed size: 917 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : net-tools-2.0-0.25.20131004git.el7.x86_64 1/1
Verifying : net-tools-2.0-0.25.20131004git.el7.x86_64 1/1
Installed:
net-tools.x86_64 0:2.0-0.25.20131004git.el7
Complete!
Removing intermediate container a1734a3dafbd
---> 373b9da17329
Step 7/10 : EXPOSE 80
---> Running in d3e42e4887ee
Removing intermediate container d3e42e4887ee
---> a5e76e701a21
Step 8/10 : CMD echo $MYPATH
---> Running in de14bbf2f0a8
Removing intermediate container de14bbf2f0a8
---> 2071e6abd054
Step 9/10 : CMD echo "----end----"
---> Running in 621b4c53b471
Removing intermediate container 621b4c53b471
---> c668343fed61
Step 10/10 : CMD /bin/bash
---> Running in d68e3457124e
Removing intermediate container d68e3457124e
---> 24f054918674
Successfully built 24f054918674
Successfully tagged mycentos:0.1
# 看到Successfully 就代表构建成功了
构建成功
对比之前原生的centos
我们增加之后的镜像
# 3.我们可以列出本地镜像的变更历史:docker history 镜像id
[root@localhost dockerfile]# docker history 24f054918674
IMAGE CREATED CREATED BY SIZE COMMENT
24f054918674 15 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
c668343fed61 15 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
2071e6abd054 15 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
a5e76e701a21 15 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
373b9da17329 15 minutes ago /bin/sh -c yum -y install net-tools 182MB
3d00a2ca3556 15 minutes ago /bin/sh -c yum -y install vim 237MB
2798b9857343 28 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
d7b10d43dfd9 28 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
3bce5ca94a90 28 minutes ago /bin/sh -c #(nop) MAINTAINER xiao<155956725… 0B
eeb6ee3f44bd 11 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 11 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 11 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
6.5.用实战看CMD和ENTRYPOINT的区别
CMD 和 ENTRYPOINT 区别
测试CMD
# 1.dockefile文件
FROM centos
CMD ["ls","-a"]
# 2.构建CMD镜像
[root@localhost dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : CMD ["ls","-a"]
---> Running in 0bc2d4f51b5a
Removing intermediate container 0bc2d4f51b5a
---> 822b816c7988
Successfully built 822b816c7988
Successfully tagged cmdtest:latest
# 3.启动CMD镜像 发现ls -a生效
[root@localhost dockerfile]# docker run cmdtest
.
..
.dockerenv
bin
dev
etc
home
# 4.想追加一个命令 但是却发现报错了
[root@localhost dockerfile]# docker run cmdtest -l
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
#CMD的情况下 -l 替换了 CMD ["ls","-a"]命令 -l 不是命令所以报错
测试ENTRYPOINT
# 1.dockefile文件
FROM centos
ENTRYPOINT ["ls","-a"]
# 2.构建CMD镜像
[root@localhost dockerfile]# docker build -f dockerfile-entrypoint-test -t myentrypoint .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 82fc907ae06a
Removing intermediate container 82fc907ae06a
---> 8ff38c6303ee
Successfully built 8ff38c6303ee
Successfully tagged myentrypoint:latest
# 3.启动CMD镜像 发现ls -a生效
[root@localhost dockerfile]# docker run myentrypoint
.
..
.dockerenv
bin
dev
etc
home
# 4.想追加一个命令 成功了
[root@localhost dockerfile]# docker run myentrypoint -l
total 0
drwxr-xr-x. 1 root root 6 Sep 6 18:24 .
drwxr-xr-x. 1 root root 6 Sep 6 18:24 ..
-rwxr-xr-x. 1 root root 0 Sep 6 18:24 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Sep 6 18:24 dev
drwxr-xr-x. 1 root root 66 Sep 6 18:24 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
#ENTRYPOINT的情况下 -l 追加了 ENTRYPOINT ["ls","-a"]命令 ls -al 是命令所以执行
通过测试可以看出:
- CMD和ENTRYPOINT都可以执行其中的命令
- 如果在运行的时候追加命令,CMD会报错,而ENTRYPOINT会将追加的命令拼接在其文件中的命令之后,并且会正常运行
待更
标签:x86,笔记,el7,64,镜像,docker,perl,Docker From: https://www.cnblogs.com/RetainXiao/p/16665998.html