(1)基本介绍
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)。用社区版
官网:https://docs.docker.com/
(2)应用场景
Web 应用的自动化打包和发布。自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
(3)Docker 的优势
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序。
2、响应式部署和扩展
3、在同一硬件上运行更多工作负载
2. 虚拟化技术和容器化技术
虚拟化技术特点:1.资源占用多 2.冗余步骤多 3.启动很慢
容器化技术:容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机的不同:
1.传统虚拟机,虚拟出硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
2.Docker容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件。
3.每个容器都是相互隔离的,每个容器都有属于自己的文件系统,互不影响。
容器化带来的好处:
3. Docker的基本组成
4. Docker的安装
(1)下载需要的安装包
yum install -y yum-utils
(2)设置镜像的仓库
# 设置阿里云的Docker镜像仓库
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(3)更新yum软件包索引
yum makecache fast
(4)安装docker相关的配置
yum install docker-ce docker-ce-cli containerd.io
docker-ce 是社区版,docker-ee 企业版
(5)启动Docker
systemctl start docker
# 查看当前版本号,是否启动成功
docker version
# 设置开机自启动
systemctl enable docker
(6)下载hello-world镜像进行测试

5. Docker的卸载
# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源 . /var/lib/docker是docker的默认工作路径
rm -rf /var/lib/docker
6. 配置阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
7. 底层原理
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问!Docker Server接收到Docker-Client的指令,就会执行这个指令!
Docker为什么比VM Ware快?
1、Docker比虚拟机更少的抽象层
2、docker利用宿主机的内核,VM需要的是Guest OS
8. Docker常用命令
8.1 基础命令
docker version #查看docker的版本信息
docker info #查看docker的系统信息,包括镜像和容器的数量
docker --help #帮助命令(可查看可选的参数)
8.2 镜像命令
(1)docker images 查看本地主机的所有镜像
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 weeks ago 13.3kB
#解释:
1.REPOSITORY 镜像的仓库源
2.TAG 镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小
# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id
-aq 显示所有镜像的id
(2)docker search 搜索镜像
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11653 [OK]
mariadb MariaDB Server is a high performing open sou… 4436 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 865 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 363 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 91
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 89
centurylink/mysql Image containing mysql. Optimized to be link… 59 [OK]
databack/mysql-backup Back up mysql databases to... anywhere! 52
prom/mysqld-exporter 43 [OK]
deitch/mysql-backup REPLACED! Please use http://hub.docker.com/r… 41 [OK]
tutum/mysql Base docker image to run a MySQL database se… 35
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 33
schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic backup… 31 [OK]
mysql/mysql-router MySQL Router provides transparent routing be… 23
centos/mysql-56-centos7 MySQL 5.6 SQL database server 20
arey/mysql-client Run a MySQL client from a docker container 19 [OK]
fradelg/mysql-cron-backup MySQL/MariaDB database backup using cron tas… 16 [OK]
openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image… 6
idoall/mysql MySQL is a widely used, open-source relation… 3 [OK]
devilbox/mysql Retagged MySQL, MariaDB and PerconaDB offici… 3
ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 3 [OK]
jelastic/mysql An image of the MySQL database server mainta… 2
centos/mysql-80-centos7 MySQL 8.0 SQL database server 1
widdpim/mysql-client Dockerized MySQL Client (5.7) including Curl… 1 [OK]
monasca/mysql-init A minimal decoupled init container for mysql 0
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# docker search mysql -f=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11653 [OK]
mariadb MariaDB Server is a high performing open sou… 4436 [OK]
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]#
(3)docker pull 镜像名[:tag] 下载镜像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql
Using default tag: latest #如果不写tag默认就是latest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete #分层下载,docker image的核心-联合文件系统
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
6aa3859c4789: Pull complete
1ed875d851ef: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #下载来源的真实地址 #docker pull mysql等价于docker pull docker.io/library/mysql:latest
指定版本下载
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
b380bbd43752: Already exists
f23cbf2ecc5d: Already exists
30cfc6c29c0a: Already exists
b38609286cbe: Already exists
8211d9e66cd6: Already exists
2313f9eeca4a: Already exists
7eb487d00da0: Already exists
a71aacf913e7: Pull complete
393153c555df: Pull complete
06628e2290d7: Pull complete
ff2ab8dac9ac: Pull complete
Digest: sha256:2db8bfd2656b51ded5d938abcded8d32ec6181a9eae8dfc7ddf87a656ef97e97
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
(4)docker rmi 删除镜像
#1.删除指定的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id
#2.删除多个镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id 镜像id 镜像id
#3.删除全部的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f $(docker images -aq)
8.3 容器命令
(1)如拉取一个centos容器
docker pull centos
(2)运行容器
docker run [可选参数] image
#参数说明
--name="名字" 指定容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
(
-p ip:主机端口:容器端口 配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口
)
-P 随机指定端口(大写的P)
(3)进入容器
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# docker run -it centos /bin/bash
[root@1aba95024c2f /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
(4)退出容器
#exit 停止并退出容器(后台方式运行则仅退出)
#Ctrl+P+Q 不停止容器退出
[root@bd1b8900c547 /]# exit
exit
[root@iZwz99sm8v95sckz8bd2c4Z ~]#
(5)列出运行过的容器
#docker ps
# 列出当前正在运行的容器
-a # 列出所有容器的运行记录
-n=? # 显示最近创建的n个容器
-q # 只显示容器的编号
(6)删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
(7)启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前运行的容器
docker kill 容器id #强制停止当前容器
8.4 其他常用命令
(1)日志的查看
docker logs -tf 容器id
docker logs --tail number 容器id #num为要显示的日志条数
(2)查看容器中进程信息
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# docker top dde2a5c762c2
UID PID PPID C STIME TTY TIME CMD
root 20839 20820 0 08:54 pts/0 00:00:00 /bin/bash
(3)查看容器的元数据
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# docker inspect dde2a5c762c2
[
{
"Id": "dde2a5c762c27a0bf73af4e3459b40200ee1a5cfa82c56b5b766670e5e272852",
"Created": "2021-11-08T00:54:00.493179202Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 20839,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-11-08T00:54:00.941778559Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/dde2a5c762c27a0bf73af4e3459b40200ee1a5cfa82c56b5b766670e5e272852/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/dde2a5c762c27a0bf73af4e3459b40200ee1a5cfa82c56b5b766670e5e272852/hostname",
"HostsPath": "/var/lib/docker/containers/dde2a5c762c27a0bf73af4e3459b40200ee1a5cfa82c56b5b766670e5e272852/hosts",
"LogPath": "/var/lib/docker/containers/dde2a5c762c27a0bf73af4e3459b40200ee1a5cfa82c56b5b766670e5e272852/dde2a5c762c27a0bf73af4e3459b40200ee1a5cfa82c56b5b766670e5e272852-json.log",
"Name": "/mystifying_shamir",
"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/0104d83819d331ece9f5524c23e3141e7d50023fbf8c0ddffffa0b9f4be8fc09-init/diff:/var/lib/docker/overlay2/44b1e828dca5753770183af6cc194f1b7fc2b2cf5c53e42e4d382331c9e273dd/diff",
"MergedDir": "/var/lib/docker/overlay2/0104d83819d331ece9f5524c23e3141e7d50023fbf8c0ddffffa0b9f4be8fc09/merged",
"UpperDir": "/var/lib/docker/overlay2/0104d83819d331ece9f5524c23e3141e7d50023fbf8c0ddffffa0b9f4be8fc09/diff",
"WorkDir": "/var/lib/docker/overlay2/0104d83819d331ece9f5524c23e3141e7d50023fbf8c0ddffffa0b9f4be8fc09/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "dde2a5c762c2",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"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": "5016f94a391e2e9483130c7e7f5fa5e03839e5d6ce925c91e543639bae61f37c",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/5016f94a391e",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "3719aca7550490f1cfa0757dfd2a4c6fa83ac57f6c83cfab1509faf1268331cb",
"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": "720f42cee0173d99f4b00c74574abeef1136b872132165cf31482a3b89afd084",
"EndpointID": "3719aca7550490f1cfa0757dfd2a4c6fa83ac57f6c83cfab1509faf1268331cb",
"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
}
}
}
}
]
(4)进入当前正在运行的容器
因为通常我们的容器都是使用后台方式来运行的,有时需要进入容器修改配置
方式一:
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# docker exec -it dde2a5c762c2 /bin/bash
[root@dde2a5c762c2 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@dde2a5c762c2 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 00:54 pts/0 00:00:00 /bin/bash
root 16 0 0 01:05 pts/1 00:00:00 /bin/bash
root 31 16 0 01:05 pts/1 00:00:00 ps -ef
[root@dde2a5c762c2 /]#
方式二:
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# docker attach dde2a5c762c2
[root@dde2a5c762c2 /]#
docker exec 进入容器后开启一个新的终端,可以在里面操作
docker attach 进入容器正在执行的终端,不会启动新的进程
(5)拷贝容器的文件到主机中
docker cp 容器id:容器内路径 目的主机路径
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# docker attach dde2a5c762c2
[root@dde2a5c762c2 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@dde2a5c762c2 /]# cd home
[root@dde2a5c762c2 home]# touch test.java
[root@dde2a5c762c2 home]# ls
test.java
[root@dde2a5c762c2 home]# exit
exit
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# docker cp dde2a5c762c2:/home/test.java /home
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]# ls /home
test.java www
[root@iZbp1bfgy47a5tdkyz0dxbZ ~]#
(6)总结
Docker命令参考表
docker命令选项列表
选项 | 说明 | 其他 |
---|---|---|
–config [string] | 客户端本地配置文件路径 | 默认为 ~/.docker |
-D, –debug | 启用调试模式 | |
–help | 打印用法 | |
-H, –host list | 通过socket访问指定的docker守护进程(服务端) | unix:// , fd:// , tcp:// |
-l, –log-level [string] | 设置日志级别 (debug 、info 、warn 、error 、fatal ) | 默认为 info |
–tls | 启用TLS加密 | |
–tlscacert [string] | 指定信任的CA根证书路径 | 默认为 ~/.docker/ca.pem |
–tlscert [string] | 客户端证书路径 | 默认为 ~/.docker/cert.pem |
–tlskey [string] | 客户端证书私钥路径 | 默认为 ~/.docker/key.pem |
–tlsverify | 启用TLS加密并验证客户端证书 | |
-v, –version | 打印docker客户端版本信息 |
用于管理的子命令列表
选项 | 说明 |
---|---|
container | 管理容器 |
image | 管理镜像 |
network | 管理容器网络(默认为bridge、host、none三个网络配置) |
plugin | 管理插件 |
system | 管理系统资源。其中, docker system prune 命令用于清理没有使用的镜像, 容器, 数据卷以及网络 |
volume | 管理数据卷 |
swarm | 管理Swarm模式 |
service | 管理Swarm模式下的服务 |
node | 管理Swarm模式下的docker集群中的节点 |
secret | 管理Swarm模式下的敏感数据 |
stack | Swarm模式下利用compose-file管理服务 |
基础子命令列表
选项 | 说明 |
---|---|
attach | 进入运行中的容器, 显示该容器的控制台界面。注意, 从该指令退出会导致容器关闭 |
build | 根据 Dockerfile 文件构建镜像 |
commit | 提交容器所做的改为为一个新的镜像 |
cp | 在容器和宿主机之间复制文件 |
create | 根据镜像生成一个新的容器 |
diff | 展示容器相对于构建它的镜像内容所做的改变 |
events | 实时打印服务端执行的事件 |
exec | 在已运行的容器中执行命令 |
export | 导出容器到本地快照文件 |
history | 显示镜像每层的变更内容 |
images | 列出本地所有镜像 |
import | 导入本地容器快照文件为镜像 |
info | 显示 Docker 详细的系统信息 |
inspect | 查看容器或镜像的配置信息, 默认为json数据 |
kill | -s 选项向容器发送信号, 默认为SIGKILL信号(强制关闭) |
load | 导入镜像压缩包 |
login | 登录第三方仓库 |
logout | 退出第三方仓库 |
logs | 打印容器的控制台输出内容 |
pause | 暂停容器 |
port | 容器端口映射列表 |
ps | 列出正在运行的容器, -a 选项显示所有容器 |
pull | 从镜像仓库拉取镜像 |
push | 将镜像推送到镜像仓库 |
rename | 重命名容器名 |
restart | 重启容器 |
rm | 删除已停止的容器, -f 选项可强制删除正在运行的容器 |
rmi | 删除镜像(必须先删除该镜像构建的所有容器) |
run | 根据镜像生成并进入一个新的容器 |
save | 打包本地镜像, 使用压缩包来完成迁移 |
search | 查找镜像 |
start | 启动关闭的容器 |
stats | 显示容器对资源的使用情况(内存、CPU、磁盘等) |
stop | 关闭正在运行的容器 |
tag | 修改镜像tag |
top | 显示容器中正在运行的进程(相当于容器内执行 ps -ef 命令) |
unpause | 恢复暂停的容器 |
update | 更新容器的硬件资源限制(内存、CPU等) |
version | 显示docker客户端和服务端版本信息 |
wait | 阻塞当前命令直到对应的容器被关闭, 容器关闭后打印结束代码 |
daemon | 这个子命令已过期, 将在Docker 17.12之后的版本中移出, 直接使用dockerd |
run命令常用选项
选项 | 说明 |
---|---|
-d | 后台运行容器, 并返回容器ID;不指定时, 启动后开始打印日志, Ctrl + C 退出命令同时会关闭容器 |
-i | 以交互模式运行容器, 通常与 -t 同时使用; |
-t | 为容器重新分配一个伪输入终端, 通常与 -i 同时使用 |
–name “anyesu-container” | 为容器指定一个别名, 不指定时随机生成 |
-h docker-anyesu | 设置容器的主机名, 默认随机生成 |
–dns 8.8.8.8 | 指定容器使用的DNS服务器, 默认和宿主一致 |
-e docker_host=172.17.0.1 | 设置环境变量 |
–cpuset=”0-2” or –cpuset=”0,1,2” | 绑定容器到指定CPU运行 |
-m 100M | 设置容器使用内存最大值 |
–net bridge | 指定容器的网络连接类型, 支持 bridge / host / none / container 四种类型 |
–ip 172.18.0.13 | 为容器分配固定ip(需要使用自定义网络) |
–expose 8081 –expose 8082 | 开放一个端口或一组端口, 会覆盖镜像设置中开放的端口 |
-p [宿主机端口]:[容器内端口] | 宿主机到容器的端口映射, 可指定宿主机的要监听的ip, 默认为 0.0.0.0 |
-P | 注意是大写的, 宿主机随机指定一组可用的端口映射容器 expose 的所有端口 |
-v [宿主机目录路径]:[容器内目录路径] | 挂载宿主机的指定目录(或文件)到容器内的指定目录(或文件) |
–add-host [主机名]:[ip] | 为容器hosts文件追加host, 默认会在hosts文件最后追加 [主机名]:[容器ip] |
–volumes-from [其他容器名] | 将其他容器的数据卷添加到此容器 |
–link [其他容器名]:[在该容器中的别名] | 添加链接到另一个容器, 在本容器hosts文件中加入关联容器的记录, 效果类似于 --add-host |
9.Docker镜像详解
9.1 什么是镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。
9.2 Docker镜像加载原理
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统是UnionFS联合文件系统。
9.3 分层理解
9.4 提交镜像
使用docker commit 命令提交容器成为一个新的版本
docker commit -m=“提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG]
1. 数据卷介绍
Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷。|
卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
数据卷的特点:
数据卷可在容器之间共享或重用数据
卷中的更改可以直接生效
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
2. 简单使用
运行容器,指定挂载数据卷命令:
docker run -it -v 主机目录:容器目录
将主机目录/home/test和容器/home建立数据卷,首先在容器目录下创建test.java文件,再去主机目录下查看是否有该文件。
查看容器对应元数据docker inspect 容器id,可以在Mounts节点查看建立的数据卷信息。
即使容器停止运行或者容器删除,仍然可以实现数据同步,本地的数据卷不会丢失。
3. MySQL容器建立数据卷同步数据
在Linux下的MySQL默认的数据文档存储目录为/var/lib/mysql,默认的配置文件的位置/etc/mysql/conf.d,为了确保MySQL镜像或容器删除后,造成的数据丢失,下面建立数据卷保存MySQL的数据和文件。
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker images;
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 f189aac861de About an hour ago 653MB
mysql 5.7 f07dfa83b528 6 days ago 448MB
tomcat latest feba8d001e3f 10 days ago 649MB
nginx latest ae2feff98a0c 12 days ago 133MB
centos latest 300e315adb2f 2 weeks ago 209MB
portainer/portainer latest 62771b0b9b09 5 months ago 79.1MB
elasticsearch 7.6.2 f29a1ee41030 9 months ago 791MB
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
72efdb845471b6bd19077b596af51122baa982c01211c39f989afaca556b149f
[root@iZwz99sm8v95sckz8bd2c4Z home]# cd /home
[root@iZwz99sm8v95sckz8bd2c4Z home]# ls
hai mysql pan test test.java
[root@iZwz99sm8v95sckz8bd2c4Z home]# cd mysql/conf
[root@iZwz99sm8v95sckz8bd2c4Z conf]# ls
[root@iZwz99sm8v95sckz8bd2c4Z conf]# cd /home/mysql/data
[root@iZwz99sm8v95sckz8bd2c4Z data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem
[root@iZwz99sm8v95sckz8bd2c4Z data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem test
4. 常用命令
(1)创建数据卷
docker volume create my-vol
(2)查看所有的数据卷
docker volume ls
(3)查看指定数据卷的信息
docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
(4)删除数据卷 docker volume rm ...
docker volume rm my-vol
(5)删除容器之时删除相关的卷
docker rm -v ...
数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。
5. 具名挂载和匿名挂载
5.1 匿名挂载
匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹。
[root@iZbp1bfgy47a5tdkyz0dxbZ /]# docker run -d -P --name nginx01 -v /etc/nginx nginx
b1a3992966d8c21124d8778fcef803b6917e1f237c87ee8330d6ba2be002c584
[root@iZbp1bfgy47a5tdkyz0dxbZ /]# docker volume ls
DRIVER VOLUME NAME
local 0b45f8b7fc8fdc71f429180dcef2585a3df7950e385b778a944bd57685c678e2
local cababf2cdfdbec2d09d1d05da3ea2cd6cdd63085086ca86faadd4f0533bcfb48
查看所有的数据卷volume的情况, VOLUME NAME这里的值是真实存在的目录。
[root@iZbp1bfgy47a5tdkyz0dxbZ /]# docker volume ls
DRIVER VOLUME NAME
local 0b45f8b7fc8fdc71f429180dcef2585a3df7950e385b778a944bd57685c678e2
[root@iZbp1bfgy47a5tdkyz0dxbZ /]#
5.2 具名挂载
具名挂载,就是指定文件夹名称,区别于指定路径挂载,这里的指定文件夹名称是在Docker指定的默认数据卷路径下的。通过docker volume ls
命令可以查看当前数据卷的目录情况。
[root@iZbp1bfgy47a5tdkyz0dxbZ /]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
ebfe7c03efcf996cddee8d735a5ae65d60a36a620f59c42d9f23cb140b8139fb
[root@iZbp1bfgy47a5tdkyz0dxbZ /]# docker volume ls
DRIVER VOLUME NAME
local 0b45f8b7fc8fdc71f429180dcef2585a3df7950e385b778a944bd57685c678e2
local cababf2cdfdbec2d09d1d05da3ea2cd6cdd63085086ca86faadd4f0533bcfb48
local juming-nginx
可以看到主机数据卷挂载在/var/lib/docker/volumes/juming-nginx/_data上
Docker所有的数据卷默认在/var/lib/docker/volumes/ 目录下
匿名挂载,具名挂载,指定路径挂载的命令区别如下:
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
指定数据卷映射的相关参数:
ro —— readonly 只读。设置了只读则只能操作宿主机的路径,不能操作容器中的对应路径。
rw ----- readwrite 可读可写
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
6. Dockerfile中设置数据卷
我们可以在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。
下面使用Dockerfile构建一个新的镜像,dockerfile01文件的内容,匿名挂载了volume01和volume02两个目录:
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile01 -t ethan/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 215ef28fd5a6
Removing intermediate container 215ef28fd5a6
---> f506ddf133d2
Step 3/4 : CMD echo "----end----"
---> Running in 62a1c4b9dc7b
Removing intermediate container 62a1c4b9dc7b
---> bbea81a6e94e
Step 4/4 : CMD /bin/bash
---> Running in 245d239f3776
Removing intermediate container 245d239f3776
---> 1df90e6fd790
Successfully built 1df90e6fd790
Successfully tagged ethan/centos:1.0
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ethan/centos 1.0 1df90e6fd790 13 minutes ago 209MB
mytomcat 1.0 f189aac861de 25 hours ago 653MB
mysql 5.7 f07dfa83b528 7 days ago 448MB
tomcat latest feba8d001e3f 11 days ago 649MB
nginx latest ae2feff98a0c 13 days ago 133MB
centos latest 300e315adb2f 3 weeks ago 209MB
portainer/portainer latest 62771b0b9b09 5 months ago 79.1MB
elasticsearch 7.6.2 f29a1ee41030 9 months ago 791MB
7. 容器数据卷
容器数据卷是指建立数据卷,来同步多个容器间的数据,实现容器间的数据同步。
首先启动容器1,volume01、volume02为挂载目录。
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it --name cnetos01 ethan/centos:1.0
[root@731d53b8c3d5 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
然后启动容器2,通过参数--volumes-from
,设置容器2和容器1建立数据卷挂载关系。
[root@iZwz99sm8v95sckz8bd2c4Z /]# docker run -it --name centos02 --volumes-from cnetos01 ethan/centos:1.0
[root@7f90d4147511 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Dec 30 14:58 dev
drwxr-xr-x 1 root root 4096 Dec 30 14:58 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 108 root root 0 Dec 30 14:58 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Dec 29 15:41 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Dec 30 14:54 volume01
drwxr-xr-x 2 root root 4096 Dec 30 14:54 volume02
下面同步两个MySQL的数据库和配置文件,与上面的操作相同,首先建立数据卷,然后给另一个MySQL容器建立容器数据卷挂载,示例:
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6604:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
1. Dockerfile介绍
Dockerfile是用来构建Docker镜像的文本文件,也可以说是命令参数脚本。docker build命令用于从Dockerfile构建镜像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。
Docker镜像发布的步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 镜像
4、docker push 镜像(发布镜像到DockerHub、阿里云镜像仓库)
示例一个镜像的结构图:
2. Dockerfile指令说明

一个形象的解释各个指令作用的图:
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
关于DockerFile文件的脚本注意点有:
1、每个保留关键字(指令)都必须是大写字母
2、文件中的指令从上到下顺序执行,第一个指令必须是FROM
3、# 号表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
关于Dockerfile指令的详细语法解释:Dockerfile文件详解
Dockerfile指令介绍的官方文档:https://docs.docker.com/engine/reference/builder/
3. 制作Centos镜像
下面通过编写Dockerfile文件来制作Centos镜像,并在官方镜像的基础上添加vim和net-tools工具。首先在/home/dockfile 目录下新建文件mydockerfile-centos。然后使用上述指令编写该文件。
[root@iZbp1bfgy47a5tdkyz0dxbZ home]# vim mydockerfile-centos
[root@iZbp1bfgy47a5tdkyz0dxbZ home]# cat mydockerfile-centos
FROM centos
MAINTAINER ethan<156547650@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
逐行解释该Dockerfile文件的指令:
FROM centos:该image文件继承官方的centos,后面加冒号如centos:7,用于指定镜像的版本
ENV MYPATH /usr/local:设置环境变量MYPATH ,后面有用到
WORKDIR $MYPATH:直接使用上面设置的环境变量,指定/usr/local为工作目录
RUN yum -y install vim和RUN yum -y install net-tools:在/usr/local目录下,运行yum -y install vim和yum -y install net-tools命令安装工具,注意安装后的所有依赖和工具都会打包到image文件中
EXPOSE 80:将容器80端口暴露出来,允许外部连接这个端口
CMD:指定容器启动的时候运行命令
通过这个dockerfile构建镜像,构建镜像命令:docker build -f dockerfile文件路径 -t 镜像名[:版本号] .(这里有个小点.)
上面命令中,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。
下面执行build命令生成image文件,如果执行成功,可以通过docker images来查看新生成的镜像文件。
[root@iZbp1bfgy47a5tdkyz0dxbZ home]# docker build -f mydockerfile-centos -t mycentos:1.0 .
Sending build context to Docker daemon 207.2MB
Step 1/10 : FROM centos
---> 5d0da3dc9764
Step 2/10 : MAINTAINER ethan<156547650@qq.com>
---> Running in 2d49ad287fef
Removing intermediate container 2d49ad287fef
---> d0255e83084a
Step 3/10 : ENV MYPATH /usr/local
---> Running in a7e83ccdcea0
Removing intermediate container a7e83ccdcea0
---> cd2a76f2be24
Step 4/10 : WORKDIR $MYPATH
---> Running in fb8895fcaf42
Removing intermediate container fb8895fcaf42
---> f184565cdda4
Step 5/10 : RUN yum -y install vim
---> Running in c3de69825891
CentOS Linux 8 - AppStream 5.8 MB/s | 9.6 MB 00:01
CentOS Linux 8 - BaseOS 15 MB/s | 8.5 MB 00:00
CentOS Linux 8 - Extras 17 kB/s | 10 kB 00:00
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-15.el8 appstream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-17.el8 appstream 39 k
vim-common x86_64 2:8.0.1763-15.el8 appstream 6.3 M
vim-filesystem noarch 2:8.0.1763-15.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: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm 146 kB/s | 39 kB 00:00
(2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 581 kB/s | 48 kB 00:00
(3/5): which-2.21-12.el8.x86_64.rpm 1.2 MB/s | 49 kB 00:00
(4/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm 2.0 MB/s | 1.4 MB 00:00
(5/5): vim-common-8.0.1763-15.el8.x86_64.rpm 3.5 MB/s | 6.3 MB 00:01
--------------------------------------------------------------------------------
Total 1.8 MB/s | 7.8 MB 00:04
warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS Linux 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-15.el8.noarch 2/5
Installing : vim-common-2:8.0.1763-15.el8.x86_64 3/5
Installing : gpm-libs-1.20.7-17.el8.x86_64 4/5
Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64 4/5
Installing : vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5
Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5
Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64 5/5
Verifying : gpm-libs-1.20.7-17.el8.x86_64 1/5
Verifying : vim-common-2:8.0.1763-15.el8.x86_64 2/5
Verifying : vim-enhanced-2:8.0.1763-15.el8.x86_64 3/5
Verifying : vim-filesystem-2:8.0.1763-15.el8.noarch 4/5
Verifying : which-2.21-12.el8.x86_64 5/5
Installed:
gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-15.el8.x86_64
vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarch
which-2.21-12.el8.x86_64
Complete!
Removing intermediate container c3de69825891
---> b8ecb53913f7
Step 6/10 : RUN yum -y install net-tools
---> Running in f5efec1be387
Last metadata expiration check: 0:00:14 ago on Mon Nov 8 09:22:54 2021.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
net-tools x86_64 2.0-0.52.20160912git.el8 baseos 322 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 322 k
Installed size: 942 k
Downloading Packages:
net-tools-2.0-0.52.20160912git.el8.x86_64.rpm 4.5 MB/s | 322 kB 00:00
--------------------------------------------------------------------------------
Total 89 kB/s | 322 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.52.20160912git.el8.x86_64 1/1
Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Verifying : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Installed:
net-tools-2.0-0.52.20160912git.el8.x86_64
Complete!
Removing intermediate container f5efec1be387
---> c02a25d75548
Step 7/10 : EXPOSE 80
---> Running in 1575581a7062
Removing intermediate container 1575581a7062
---> 24b886200967
Step 8/10 : CMD echo $MYPATH
---> Running in 7bdccc360c84
Removing intermediate container 7bdccc360c84
---> 437f60faaf60
Step 9/10 : CMD echo "---end---"
---> Running in 2dc7050a4e30
Removing intermediate container 2dc7050a4e30
---> 46d297291efa
Step 10/10 : CMD /bin/bash
---> Running in 3ddb0dca94a9
Removing intermediate container 3ddb0dca94a9
---> 1337b08bdc3b
Successfully built 1337b08bdc3b
Successfully tagged mycentos:1.0
[root@iZbp1bfgy47a5tdkyz0dxbZ home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 1337b08bdc3b 20 seconds ago 340MB
tomcat latest b0e0b0a92cf9 2 weeks ago 680MB
mysql 5.7 938b57d64674 2 weeks ago 448MB
mysql latest ecac195d15af 2 weeks ago 516MB
nginx latest 87a94228f133 3 weeks ago 133MB
hello-world latest feb5d9fea6a5 6 weeks ago 13.3kB
centos latest 5d0da3dc9764 7 weeks ago 231MB
portainer/portainer latest 580c0e4e98b0 7 months ago 79.1MB
下面生成容器,测试相关命令,查看默认工作目录是否设置成功,vim和net-tools工具是否下载成功。
[root@iZbp1bfgy47a5tdkyz0dxbZ home]# docker run -it mycentos:1.0
[root@4365d75518c8 local]# pwd
/usr/local
[root@4365d75518c8 local]# ipconfig
bash: ipconfig: command not found
[root@4365d75518c8 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.6 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:06 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@4365d75518c8 local]#
另外,我们通过docker history 容器id
命令来查看镜像的构建步骤
[root@iZbp1bfgy47a5tdkyz0dxbZ home]# docker history b0e0b0a92cf9
IMAGE CREATED CREATED BY SIZE COMMENT
b0e0b0a92cf9 2 weeks ago /bin/sh -c #(nop) CMD ["catalina.sh" "run"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) EXPOSE 8080 0B
<missing> 2 weeks ago /bin/sh -c set -eux; nativeLines="$(catalin… 0B
<missing> 2 weeks ago /bin/sh -c set -eux; savedAptMark="$(apt-m… 20.1MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV TOMCAT_SHA512=e084fc0… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV TOMCAT_VERSION=10.0.12 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV TOMCAT_MAJOR=10 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV GPG_KEYS=A9C5DF4D22E9… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV LD_LIBRARY_PATH=/usr/… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV TOMCAT_NATIVE_LIBDIR=… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) WORKDIR /usr/local/tomcat 0B
<missing> 2 weeks ago /bin/sh -c mkdir -p "$CATALINA_HOME" 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PATH=/usr/local/tomca… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV CATALINA_HOME=/usr/lo… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) CMD ["jshell"] 0B
<missing> 2 weeks ago /bin/sh -c set -eux; arch="$(dpkg --print-… 343MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV JAVA_VERSION=11.0.13 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ENV PATH=/usr/local/openj… 0B
<missing> 3 weeks ago /bin/sh -c { echo '#/bin/sh'; echo 'echo "$J… 27B
<missing> 3 weeks ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/local/… 0B
<missing> 3 weeks ago /bin/sh -c set -eux; apt-get update; apt-g… 11.3MB
<missing> 3 weeks ago /bin/sh -c apt-get update && apt-get install… 152MB
<missing> 3 weeks ago /bin/sh -c set -ex; if ! command -v gpg > /… 18.9MB
<missing> 3 weeks ago /bin/sh -c set -eux; apt-get update; apt-g… 10.7MB
<missing> 3 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:aea313ae50ce6474a… 124MB
4. RUN,CMD和ENTRYPOINT的区别
RUN命令与CMD命令的区别在哪里?
简单说,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。
注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。
CMD和ENTRYPOINT的区别在哪里?
CMD :指定容器启动的时候要运行的命令,只有最后一个会生效
ENTRYPOINT :指定容器启动的时候要运行的命令,命令可以追加
使用CMD
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# cat dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest:1.0 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"]
---> Running in 6d4d0112322f
Removing intermediate container 6d4d0112322f
---> b6ec5224d2ac
Successfully built b6ec5224d2ac
Successfully tagged cmdtest:1.0
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker run cmdtest:1.0
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#由于使用的是 CMD指令,命令无追加,-l取代了原本的ls -a,而-l命令不存在所以报错。
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker run cmdtest:1.0 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
其次使用ENTRYPOINT
#1.修改dockerfile文件
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# cat dockerfile-cmd-test
FROM centos
ENTRYPOINT ["ls","-a"]
#2.构建镜像
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest:2.0 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 61389c0c1967
Removing intermediate container 61389c0c1967
---> ac7b7e83ff88
Successfully built ac7b7e83ff88
Successfully tagged cmdtest:2.0
#3.运行镜像
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker run cmdtest:2.0
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#4.追加镜像再次运行
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# docker run cmdtest:2.0 -l
total 56
drwxr-xr-x 1 root root 4096 Jan 1 03:55 .
drwxr-xr-x 1 root root 4096 Jan 1 03:55 ..
-rwxr-xr-x 1 root root 0 Jan 1 03:55 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 340 Jan 1 03:55 dev
drwxr-xr-x 1 root root 4096 Jan 1 03:55 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 106 root root 0 Jan 1 03:55 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Dec 29 15:41 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
Docker网络
[root@iZbp1bfgy47a5tdkyz0dxbZ home]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:1b:56:7d brd ff:ff:ff:ff:ff:ff
inet 172.26.141.29/20 brd 172.26.143.255 scope global dynamic eth0
valid_lft 315087172sec preferred_lft 315087172sec
inet6 fe80::216:3eff:fe1b:567d/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:d7:55:c1:ac brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:d7ff:fe55:c1ac/64 scope link
valid_lft forever preferred_lft forever
1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要按照了docker,就会有一个docker0桥接模式,使用的技术是veth-pair技术!
https://www.cnblogs.com/bakari/p/10613710.html
再次测试ip add
# 我们发现这个容器带来网卡,都是一对对的
# veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
# 正因为有这个特性 veth-pair 充当一个桥梁,连接各种虚拟网络设备的
# OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术
2 、在启动一个容器测试,发现又多了一对网络
[root@iZbp1bfgy47a5tdkyz0dxbZ home]# docker run -d -P --name tomcat01 tomcat
Unable to find image 'tomcat:latest' locally
latest: Pulling from library/tomcat
bb7d5a84853b: Pull complete
f02b617c6a8c: Pull complete
d32e17419b7e: Pull complete
c9d2d81226a4: Pull complete
fab4960f9cd2: Pull complete
da1c1e7baf6d: Pull complete
1d2ade66c57e: Pull complete
ea2ad3f7cb7c: Pull complete
d75cb8d0a5ae: Pull complete
76c37a4fffe6: Pull complete
Digest: sha256:509cf786b26a8bd43e58a90beba60bdfd6927d2ce9c7902cfa675d3ea9f4c631
Status: Downloaded newer image for tomcat:latest
0a00750d14a7cb758a17b327557f80614273f1e22666068502c17c835d77fa66
[root@iZbp1bfgy47a5tdkyz0dxbZ home]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:1b:56:7d brd ff:ff:ff:ff:ff:ff
inet 172.26.141.29/20 brd 172.26.143.255 scope global dynamic eth0
valid_lft 315086830sec preferred_lft 315086830sec
inet6 fe80::216:3eff:fe1b:567d/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:d7:55:c1:ac brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:d7ff:fe55:c1ac/64 scope link
valid_lft forever preferred_lft forever
95: vethd8e3a65@if94: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 3a:e3:3f:c2:59:5d brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::38e3:3fff:fec2:595d/64 scope link
valid_lft forever preferred_lft forever
[root@iZbp1bfgy47a5tdkyz0dxbZ home]# docker run -d -P --name tomcat02 tomcat
6b13fe19bd4b7b20af49b7cf7b98762ffc7365480e56298dff73385ab4e70012
[root@iZbp1bfgy47a5tdkyz0dxbZ home]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:1b:56:7d brd ff:ff:ff:ff:ff:ff
inet 172.26.141.29/20 brd 172.26.143.255 scope global dynamic eth0
valid_lft 315086821sec preferred_lft 315086821sec
inet6 fe80::216:3eff:fe1b:567d/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:d7:55:c1:ac brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:d7ff:fe55:c1ac/64 scope link
valid_lft forever preferred_lft forever
95: vethd8e3a65@if94: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 3a:e3:3f:c2:59:5d brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::38e3:3fff:fec2:595d/64 scope link
valid_lft forever preferred_lft forever
97: veth55f1e4a@if96: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether b2:62:61:7f:27:d4 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::b062:61ff:fe7f:27d4/64 scope link tentative
valid_lft forever preferred_lft forever
[root@iZbp1bfgy47a5tdkyz0dxbZ home]#
3、我们来测试下tomcat01和tomcat02是否可以ping通
$ docker-tomcat docker exec -it tomcat01 ip addr #获取tomcat01的ip 172.17.0.2
550: eth0@if551: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
$ docker-tomcat docker exec -it tomcat02 ping 172.17.0.2#让tomcat02ping tomcat01
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.098 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.071 ms
# 可以ping通
结论:tomcat01和tomcat02公用一个路由器,docker0。
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip。
Docker使用的是Linux的桥接,宿主机是一个Docker容器的网桥 docker0
Docker中所有网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)
只要容器删除,对应的网桥一对就没了!
–link
$ docker exec -it tomcat02 ping tomca01 # ping不通
ping: tomca01: Name or service not known
# 运行一个tomcat03 --link tomcat02
$ docker run -d -P --name tomcat03 --link tomcat02 tomcat
5f9331566980a9e92bc54681caaac14e9fc993f14ad13d98534026c08c0a9aef
# 用tomcat03 ping tomcat02 可以ping通
$ docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.115 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.080 ms# 用tomcat02 ping tomcat03 ping不通
–link 本质就是在hosts配置中添加映射
现在使用Docker已经不建议使用–link了!
自定义网络,不适用docker0!
docker0问题:不支持容器名连接访问!
自定义网络
docker network
connect -- Connect a container to a network
create -- Creates a new network with a name specified by the
disconnect -- Disconnects a container from a network
inspect -- Displays detailed information on a network
ls -- Lists all the networks created by the user
prune -- Remove all unused networks
rm -- Deletes one or more networks
SpringBoot微服务打包Docker镜像
1、构建SpringBoot项目
2、打包运行
mvn package
3、编写dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
4、构建镜像
# 1.复制jar和DockerFIle到服务器
# 2.构建镜像 $ docker build -t xxxxx:xx
5、发布运行
以后我们使用了Docker之后,给别人交付就是一个镜像即可!