镜像(image)
docker 好比是一个模板,可以通过这个模板来创建容器服务, 通过这个镜像可以创建多个容器 它包括代码、运行时、库、环境变量、和配置文件 所以应用,直接打包docker 就可以直接跑起来
如何得到镜像:
1、从远程仓库下载
2、别人拷贝给你
3、自己制作一个镜像dockerfile
容器( container)
docker 利用容器技术,独立运行一个或者一组应用,通过镜像来创建。 启动,停止,删除,基本命令 可以把容器理解为一个简易的Linux系统
仓库(repository)
仓库就是存放镜像的地方; 仓库分为公有、私有仓库; Dock Hub (默认国外); 可配置镜像加速;
安装docker
环境准备: 1、一台远程服务器; 2、linux基础
环境查看: uname -r 5.10.23-5.al8.x86_64 需要系统内核版本 3.0 以上
安装:
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
download.docker.com/linux/cento…
//阿里云
yum-config-manager
--add-repo
mirrors.aliyun.com/docker-ce/l…
安装前建议更新索引:yum makecache fast
4、安装docker相关内容 ce社区版 ee企业版
yum install docker-ce docker-ce-cli containerd.io
5、启动docker
systemctl start docker
运行 hello-word 镜像
docker run hello-word
6、查看下载的hello-word镜像 docker images
了解:卸载dock
1、删除依赖
yum remove docker-ce docker-ce-cli containerd.io
2、删除资源
rm -rf /var/lib/docker rm -rf /var/lib/containerd
阿里云镜像加速
1、登录阿里云 容器镜像服务
2、找到镜像工具-镜像加速地址
3、配置使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{ "registry-mirrors": ["28cqj8s9.mirror.aliyuncs.com"] }
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
底层原理
docker 是怎么工作的?
docker 是一个client-server 结构的系统,Docker的守护进程运行在主机上,通过socket从客户端访问
dockerServer接收到docker-client指令,就会执行命令
docker 为什么比vm虚拟机快?
1、docker有比虚拟机更少的抽象层。
2、docker利用的是宿主机的内核,vm需要是guest os
docker常用命令
帮助命令
docker version //显示版本信息
docker info //系统信息 包括镜像、容器数量
docker --help //帮助命令
镜像命令
docker imgages 查看本地主机上所以镜像
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 3 months ago 13.3kB
//解释
REPOSITORY 镜像仓库源
TAG 镜像标签
IMAGE ID 镜像id
CREATED 镜像创建时间
SIZE 镜像的大小
//可选项
Options:
-a, --all 列出所有镜像
-q, --quiet 只显示镜像的id
docker search 搜索镜像
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11076 [OK]
mariadb MariaDB Server is a high performing open sou… 4196 [OK]
//可选项,通过收藏来过滤
--filter=STARTS=3000 搜索镜像STARTS大于3000的
例:docker search --filter=STARTS=3000
docker pull 下载镜像
docker pull 镜像名[:tag]
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker pull mysql
Using default tag: latest //如果不写tag 默认下载 latest最新版本
latest: Pulling from library/mysql
b4d181a07f80: Pull complete //分层下载 docker images核心 联合文件系统
a462b60610f5: Pull complete
578fafb77ab8: Pull complete
524046006037: Pull complete
d0cbe54c8855: Pull complete
aa18e05cc46d: Pull complete
32ca814c833f: Pull complete
9ecc8abdb7f5: Pull complete
ad042b682e0f: Pull complete
71d327c6bb78: Pull complete
165d1d10a3fa: Pull complete
2f40c47d0626: Pull complete
Digest: sha256:52b8406e4c32b8cf0557f1b74517e14c5393aff5cf0384eff62d9e81f4985d4b //签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest //真实地址
docker pull mysql 等价于 docker.io/library/mysql:latest
//指定版本下载
docker pull mysql:5.7 //注意dockerhub中必须有相应的版本
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
b4d181a07f80: Already exists
a462b60610f5: Already exists
578fafb77ab8: Already exists
524046006037: Already exists
d0cbe54c8855: Already exists
aa18e05cc46d: Already exists
32ca814c833f: Already exists
52645b4af634: Pull complete
bca6a5b14385: Pull complete
309f36297c75: Pull complete
7d75cacde0f8: Pull complete
Digest: sha256:1a2f9cd257e75cc80e9118b303d1648366bc2049101449bf2c8d82b022ea86b7
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 删除镜像
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker rmi -f 容器id //指定id删除
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker rmi -f 容器id 容器id 容器id //删除多个
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker rmi -f $(docker images -aq) //删除所有
容器命令
说明:有了镜像才能够创建容器,Linux,下载一个centos 镜像学习
docker pull centos
新建容器并启动
docker run [可选参数] image
//参数说明
--name="Name" 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-it 使用交互方式运行 进入容器查看内容
-p 指定容器端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-p 随机指定端口
测试 启动并进入容器
[root@iZ2zeexbrhzlc1zlxjcj6yZ ~]# docker run -it centos /bin/bash
[root@f6f595f3093b /]#
//查看内部centos 基础版本 很多命令不完善
[root@f6f595f3093b /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
//从容器退到主机
[root@f6f595f3093b /]# exit
exit
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# ls
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
列出运行的容器
docker ps //列出当前正在运行的容器
docker ps -a //列出历史运行的(运行过的)容器
docker ps -n=? //显示最近创建的容器
docker ps -q //只显示容器的编号
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f6f595f3093b centos "/bin/bash" 4 minutes ago Exited (130) 2 minutes ago sharp_grothendieck
9dcc44056e5e d1165f221234 "/hello" 25 hours ago Exited (0) 25 hours ago dreamy_hoover
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker ps -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f6f595f3093b centos "/bin/bash" 6 minutes ago Exited (130) 4 minutes ago sharp_grothendieck
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker ps -aq
f6f595f3093b
9dcc44056e5e
退出容器
exit //直接停止并退出容器
ctrl + p + q //容器不停止退出
删除容器
docker rm 容器id //根据容器id指定删除 不能删除正在运行的容器
docker rm -f $(docker ps -aq) //删除所有容器
docker ps -a -q|xargs docker rm //删除所有容器
启动和停止容器
docker start 容器id //启动容器
docker restart 容器id //重启容器
docker stop 容器id //停止当前正在运行的容器
docker kill 容器id //强制停止容器
常用其他命令
后台启动容器
//命令 docker run -d 镜像名
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker run -d centos
3373f786dd0c63942c4cd1d279c7e05435bda8a41a9874cc8d1ada6c475865db
//问题 docker ps 发现 centos 停止了
//常见的坑,docker 容器使用后台运行 就必须要有一个前台进程 docker发现没有应用 就会自动停止
//Nginx 容器启动后 发现自己没有提供服务 就会立刻停止服务
查看日志
docker logs -f -t --tails 容器,没有日志
//自己编写一段脚本
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker run -d centos /bin/sh/ -c "while true;do echo gyyy;sleep 1;done"
//docker ps
//显示日志
-tf //显示全部
--tail 10 //显示当前行数
docker logs -tf 容器id //显示全部
docker logs -tf --tail 10 容器id //要显示10条
查看容器中进程信息
//命令 docker top 容器id
top命令
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker top f529e616a615
UID PID PPID C STIME TTY TIME CMD
root 23115 23095 0 13:32 ? 00:00:00
查看镜像的元数据
//命令 docker inspect 容器id
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker inspect f529e616a615
[
{
"Id": "f529e616a61599c29f2a0345e98bed253006cad560529eb0938c04b955a15363",
"Created": "2021-07-05T05:32:32.912152767Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 23115,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-07-05T05:32:33.211958643Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/f529e616a61599c29f2a0345e98bed253006cad560529eb0938c04b955a15363/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/f529e616a61599c29f2a0345e98bed253006cad560529eb0938c04b955a15363/hostname",
"HostsPath": "/var/lib/docker/containers/f529e616a61599c29f2a0345e98bed253006cad560529eb0938c04b955a15363/hosts",
"LogPath": "/var/lib/docker/containers/f529e616a61599c29f2a0345e98bed253006cad560529eb0938c04b955a15363/f529e616a61599c29f2a0345e98bed253006cad560529eb0938c04b955a15363-json.log",
"Name": "/elated_euclid",
"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/011ec8ba5a367efd639168e2f8bfb07241e10a5d15a396e431c75d3482e612a5-init/diff:/var/lib/docker/overlay2/3f473c9d19bbc90907d8b0613f8f440b1a1ed40bd9824d9eacfb9ead6efc73c8/diff",
"MergedDir": "/var/lib/docker/overlay2/011ec8ba5a367efd639168e2f8bfb07241e10a5d15a396e431c75d3482e612a5/merged",
"UpperDir": "/var/lib/docker/overlay2/011ec8ba5a367efd639168e2f8bfb07241e10a5d15a396e431c75d3482e612a5/diff",
"WorkDir": "/var/lib/docker/overlay2/011ec8ba5a367efd639168e2f8bfb07241e10a5d15a396e431c75d3482e612a5/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "f529e616a615",
"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": "20201204",
"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": "3dbdb08708dd4358aebd0ecc20c588089ba93ee518bc203080ebdab3af4a650c",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/3dbdb08708dd",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "8e0f21ed44a09e8f032b9b0e4dd52ad571515ab39d478e7614c039f0a0052541",
"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": "49448b5ce7faf4d89e4095280fd9f01149ec62331df5c3cc7e804ba34ff4feb9",
"EndpointID": "8e0f21ed44a09e8f032b9b0e4dd52ad571515ab39d478e7614c039f0a0052541",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
进入正在运行的容器
//我们通常容器就是使用后台方式运行,需要进入容器,修改一些配置
//命令
docker exec -it 容器id bashShell
//测试 方式一
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f529e616a615 centos "/bin/bash" 10 minutes ago Up 10 minutes elated_euclid
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker exec -it f529e616a615 /bin/bash
[root@f529e616a615 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@f529e616a615 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 05:32 pts/0 00:00:00 /bin/bash
root 16 0 0 05:46 pts/1 00:00:00 /bin/bash
root 31 16 0 05:58 pts/1 00:00:00 ps -ef
//测试 方式二
docker attach 容器id
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker attach f529e616a615
正在执行当前的代码...
//docker exec //进入容器开始一个新的终端,可以再里面操作(常用)
//docker attach //进入容器正在执行得终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目标容器路径
//查看当前主机目录
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# ls
gaoyu.java
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605c0dbb0632 centos "/bin/bash" About a minute ago Up About a minute keen_goodall
//进入docker容器内部
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker attach 605c0dbb0632
[root@605c0dbb0632 /]# cd /home
[root@605c0dbb0632 home]# ls
//在容器内新建一个文件
[root@605c0dbb0632 home]# touch test.java
[root@605c0dbb0632 home]# ls
test.java
[root@605c0dbb0632 home]# exit
exit
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605c0dbb0632 centos "/bin/bash" 3 minutes ago Exited (0) 9 seconds ago
//将文件拷贝出来到主机上
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker cp 605c0dbb0632:/home/test.java /home
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# lks
-bash: lks: command not found
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# ls
gaoyu.java test.java
//拷贝是一个手动过程,未来我们使用 -v 卷的基数 实现自动同步 /home /home
docker 安装Nginx
1、搜索镜像 search
2、下载镜像 pull
3、启动Nginx
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4f380adfc10f 12 days ago 133MB
centos latest 300e315adb2f 6 months ago 209MB
//-d 后台运行
//--name 给容器命名
//-p 外部访问端口:容器内部端口
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker run -d --name nginx01 -p 8888:80 nginx
f7cbce2c7b1395053741216b17a4c41bb7cb56a9054939320029d4911681b7e8
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7cbce2c7b13 nginx "/docker-entrypoint.…" 7 seconds ago Up 7 seconds 0.0.0.0:8888->80/tcp nginx01
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# curl localhost:8888
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
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>
可视化
//portainer(先用着)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
//Rancher(CI/CD在用)
什么portainer?
Docker图形化界面管理工具 提供一个后台面板供我们操作
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试:http://ip:8088
commit镜像
如何提交一个镜像
docker commit 提交容器成为一个新的版本
//命令和git原理类似
//如果想保存当前容器的状态 可以通过commit提交获得一个镜像,就好比生成一个快照
docker commit -m='描述信息' -a='作者' 容器id 目标镜像名称:[TAG]
容器数据卷
什么是数据卷
如果数据都存在容器中 如果容器删除 数据就会丢失 需求:数据持久化
MySql 容器误删了 需求:数据可以储存再本地
容器之间可以有一个数据共享的技术!docker容器中生成的数据同步到本地! 如果容器删除数据还会存在,目录的挂载将我们容器的目录 挂载到Linux上面
使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
//测试
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker run -it -v /home/ceshi:/home centos /bin/bash
//启动起来后 通过docker inspect 容器id 查看挂载
//镜像内添加文件后 同步到了主机相应挂载的目录
//注意! 若停止容器 在主机上修改数据 容器内的数据也依旧是同步的
//好处:我们以后修改只需要在本机修改就可以了,不需要到容器内
安装mysql
MySQL数据持久化问题
//获取容器
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker pull mysql:5.7
//运行容器 需挂载目录,需配置密码 注意点!
官方:$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
测试自己启动:
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# 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=xxx --name mysql01 mysql:5.7
45fd3d33bcbd258733415e4d8dea75c9f229155991d70d40af64210cac437b74
//启动成功后使用navicat连接
//连接ip+3310连接成功
//在本机查看映射路径是否映射路径成功
//假设我们将mysql容器删除 查看本机发现数据并没有被删除 实现了数据持久化
具名、匿名卷挂载
匿名卷挂载
-v 容器内路径
docker run -d -p --name nginx01 -v /ect/nginx nginx
//查看所以的 volmne 情况
docker volume ls
local dadawdwa1221edsadasdad12e21eawd31e3123e21d
//这里发现,这种就是匿名挂载,我们在-v只写了容器内路径没有写容器外主机路径
具名挂载
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx nginx
//查看所以的 volmne 情况
docker volume ls
local juming-nginx
//通过 -v 卷名:容器内路径
//查看一下
所以docker容器内的卷 没有指定目录的情况下都是在 '/var/lib/docker/volumes/xxxx'
我们通过具名挂载可以方便的找到我们的卷,大多数情况使用具名挂载
//如何确定是具名还是匿名 还是指定路径挂载?
-v 容器内路径 //匿名挂载
-v 卷名:容器内路径 //具名挂载
-v /宿主机路径:容器内路径 //指定路径挂载
拓展:
//可以通过 -v 容器内路径:ro rw改变读写权限
ro readonly //只读
rw redwrite //可读写
//一旦设置了容器权限 容器对我们挂载出来的内容就有权限限制了
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
//ro 只能通过宿主机来操作,容器内无法操作
dockerFile镜像
dockerfile 是用来构建docker镜像文件的(命令脚本) 通过这个脚本可以生成镜像 镜像是一层层的 脚本一个个的命令 每个命令都是一层
//创建一个dockerfile文件 名字可以随机建议 dockerfile
//文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
//发现问题
下面带/ 可以安装和运行不带只能安装不能运行
VOLUME ["/volume01","/volume02"]
CMD echo "...end..."
CMD /bin/bash
//这里每个命令 就是镜像的一层
//启动自己生成的镜像
数据卷容器
//启动三个容器 通过我们刚才创建的镜像启动
//测试 删除dockertest01 查看一下dockertest02和dockertest03是否还可以访问这个文件
//测试依旧可以访问
多个mysql、redis实现数据共享
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# 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=xxx --name mysql01 mysql:5.7
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=xxx --name mysql02 --volumes-from mysql01
//可以实现两个容器数据同步
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦持久化到了本地,这个时候本地的数据是不会被删除的。
dockerFile
dockerFile介绍
dockerfile 是用来构建docker镜像的文件 命令参数脚本
构建步骤:
1、编写一个dockerfile 文件
2、docker build 构建成一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(dockerhub,阿里云镜像仓库)
很多官方镜像都是基础包,很多功能没有,我们通过自己搭自己的镜像;
官方既然可以制作镜像,我们也可以
dockerFile构建过程
基础:
1、每个保留关键字(命令)都是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每个指令会创建提交一个新的镜像层
dockerfile是面向开发的,我们一会要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单
步骤:开发、部署、运维 缺一不可
docker镜像逐渐成为及企业交付的标准 必须掌握
dockerfile:构建文件 定义了一切的步骤,源代码
dockerimages:通过dockerfile构建生成的镜像 最终要发布和运行的产品
docker容器:容器就是镜像运行起来提供服务器
docker的指令
FORM //基础镜像 一切从这里开始构建 centos
MAINTAINER //镜像是谁写的 姓名+邮箱
RUN //镜像构建的时候运行的命令
ADD //步骤:Tomcat镜像,这个Tomcat压缩包 添加内容
WORKDIR //镜像的工作目录
VOLUME //挂载的目录位置
EXPOSE //暴露端口配置
CMD //指定这个容器启动的时候要运行的命令 只有最后一个会生效而且可被替代
ENTRYPOINT //指定这个容器启动的时候要运行的命令 可以追加命令
ONBUILD //当构建一个被继承 这个时候就会运行此指令。触发指令
COPY //类似ADD,将我们文件拷贝到镜像中
ENV //构建时候设置环境变量
创建自己一个dockerFrile:
dockerHub中99%都是从这个基础镜像过来的FROM scratch 然后配置需要的软件和配置来进行构建
//创建一个自己的centos
1、编写dockerfile的文件
[root@iZ2zeexbrhzlc1zlxjcj6yZ dockerfile-centos]# vim mydockerfile
[root@iZ2zeexbrhzlc1zlxjcj6yZ dockerfile-centos]# cat mydockerfile
FROM centos
MAINTAINER gaoyu<xxxxxxxxx@qq.com>
ENV MYPATH /user/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOST 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
2、通过这个文件构建镜像
//命令 docker build -f dockerfile路径 -t 镜像名:[tag版本号] .
Successfully built 984397634b56
Successfully tagged mycentos:0.1
3、测试运行
对比:之前的官方的centos
我们增加后的镜像:
可以列出本地进行的变更历史:
我们平时拿到一个镜像可以研究一下是如何实现的
//CMD 和 ENTRYPOINT 区别
dockerfile中很多命令都十分相似,我们需要了解其中的区别,最好方法时对比测试
开发步骤:
需要掌握dockerfile的编写
之后的一切都是使用docker镜像来发布运行
发布自己的镜像
发布到dockerhub
1、注册账号
2、确定账号可以登录
3、在我们服务器上提交自己的镜像
docker login --help
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker login -u gy2986589
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
4、登录完毕后就可以提交镜像了,就是异步 docker push
//docker push 注册用户名/镜像名
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker push gy2986589/mycentos:0.1
//push镜像出现问题?
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker push gy2986589/mycentos:0.1
The push refers to repository [docker.io/gy2986589/mycentos]
An image does not exist locally with the tag: gy2986589/mycentos
//解决增加一个tag
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker tag 984397634b56 gaoyu/testcentos:1.0
//docker push 发布即可 一般记得要带版本号
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker push gaoyu/testcentos:1.0
The push refers to repository [docker.io/gaoyu/testcentos]
979ebdffcabe: Preparing
1f1b9201c4ff: Preparing
2cc2249a5e76: Preparing
2653d992f4ef: Preparing
发布到阿里云镜像
1、登录阿里云 2、找到容器镜像服务 3、创建命名空间 4、创建容器镜像 5、浏览阿里云信息
以下为上传成功
小结
docker 网络
理解docker0
三个网络
//问题 docker 如何处理容器的访问?
//查看容器内部的网络地址 ip addr
原理 我们每启动一个docker容器 docker就会给docker 容器分配一个ip,我们只安装了docker ,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!
//我们发现这个容器带来网卡 都是一对对的
//ecth-pair 就是一对虚拟的设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
//整因为有这个特性 evth-pair 充当一个桥梁,链接各种虚拟网络设备的
//openStac,docker容器之间的连接,OVS的连接 都是使用evth-pair 技术
小结 docker 使用的是linux的桥接,宿主机中是一个docker官网的网桥 docker0。
docker中所有的网络接口都是虚拟的,虚拟的转发率搞!(内网传递文件!) 只要容器删除,对应网桥就没了
--link
//解决用容器名可以来访问容器
dockr exec -it tomcat02 ping tomcat01
结果:Name or service not know
docker run -d -p --name tocmcat03 --link tomcat02 tomcat
docker exec -it tomcat03 ping tomcat02
结果:成功 ping 通
docker inspect xxx
本质探究:--link就是我么再host配置中增加了一个 172.18.0.03
我们现在玩docker 已经不建议使用 --link了
自定义网络 不适用于 docker0
docker0问题:不支持容器名连接访问
自定义网络
查看所有的docker网络
网络模式
bridge:桥接docker(默认,自己创建的也使用此种模式)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通(用的少 局限很大)
测试
//我们启动的命令 --net bridge 而这个就是我们的docker0
docker run -d -p --name tomcat01 tomcat
docker run -d -p --name tomcat01 --net bridge tomcat
//docker0特点 默认 域名不能访问 --link可以打通连接
//我们可以自定义一个网络
--driver bridge 桥接
--subnet 192.168.0.0/16 (192.168.0.2 - 192.168.255.255) 子网地址
--gateway 192.168.0.1 网关
[root@iZ2zeexbrhzlc1zlxjcj6yZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
[root@iZ2zeexbrhzlc1zlxjcj6yZ ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
49448b5ce7fa bridge bridge local
a66a9a2a9144 host host local
7a267db013c3 mynet bridge local
8e836b2d0961 none null local
启动tomcat-net-01 和 02 查看mynet网络 发现01 02放到了 mynet中
//测试ping连接
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.135 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.066 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.069 ms
//现在不使用--link 也可以ping名字了
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.066 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.069 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.078 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=5 ttl=64 time=0.067 ms
我们自定义的网络docker 都已经帮我们维护好了对应关系,推荐我们平时这样使用网络
好处:
redis 不同的集群使用不同的网络 保证集群是最安全和健康的
mysql 不同的集群使用不同的网络 保证集群是最安全和健康的
网络连通
直接ping是不通的因为用的是不同网络网段
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker run -d -P --name tomcat01 tomcat
88b45b16187c96ce447d4acb7d6b62d41dc4278f54f2858fe63bb84527537848
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker run -d -P --name tomcat02 tomcat
482d94abff78e8bc8076ae851a6c3a799325d239598060954f82e28847de9911
do[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
482d94abff78 tomcat "catalina.sh run" 4 seconds ago Up 2 seconds 0.0.0.0:49159->8080/tcp tomcat02
88b45b16187c tomcat "catalina.sh run" 12 seconds ago Up 11 seconds 0.0.0.0:49158->8080/tcp tomcat01
74d384e22b2e tomcat "catalina.sh run" 14 minutes ago Up 14 minutes 0.0.0.0:49157->8080/tcp tomcat-net-02
f4c4581c11da tomcat "catalina.sh run" 14 minutes ago Up 14 minutes 0.0.0.0:49156->8080/tcp tomcat-net-01
4349e3b237c2 nginx "/docker-entrypoint.…" 7 days ago Up 7 days 0.0.0.0:8888->80/tcp nginx01
45fd3d33bcbd mysql:5.7 "docker-entrypoint.s…" 9 days ago Up 9 days 33060/tcp, 0.0.0.0:3310->3306/tcp mysql01
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker exec -it tomcat01 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]#
网络连接命令
//测试打通 tomcat01 - mynet
//连通后 就是将tomcat01 放到了 mynet 网络下
//一个容器两个ip地址 比如:阿里云服务器:公网ip 私有ip
//01 连通
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.077 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.075 ms
//02依旧打不通
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
结论:假设要跨网络操作别人,就需要使用docker network connect 连通。
命令汇总
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 #在dockerhub中搜索镜像
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 #截取容器停止时的退出状态值