一、commit镜像
#1.docker commit 提交容器成为一个新的副本
#命令和get原理类似
docker commit -m="提交的描述信息" -a="作者" [容器ID] 目标镜像名:[TAG]
#实战测试
- 启动一个默认的tomcat
- 发现这个默认的tomcat,是没有webapps应用,镜像的原因,官方的镜像默认web apps下面是没有文件的
- 我自己拷贝进去了进本的文件
- 将我们操作过的容器通过commit提交为一个镜像,我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像。
二、用docker部署nginx
#1.搜索镜像
[root@docker ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 14607 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1988 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 811 [OK]
jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 163
linuxserver/nginx An Nginx container, brought to you by LinuxS… 142
tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 119 [OK]
jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 97 [OK]
bitnami/nginx Bitnami nginx Docker Image
........
#2.下载镜像
[root@docker ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a076a628af6f: Already exists
0732ab25fa22: Already exists
d7f36f6fe38f: Already exists
f72584a26f32: Already exists
7125e4df9063: Already exists
Digest: sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
#3.查看镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 621ceef7494a 2 months ago 104MB
nginx latest f6d0b4767a6c 2 months ago 133MB
centos latest 300e315adb2f 3 months ago 209MB
#4.运行镜像
[root@docker ~]# docker run -d --name nginx01 -p 3344:80 nginx
WARNING: IPv4 forwarding is disabled. Networking will not work.
517fcb76337275dbd6a2e0a5ddfcca4ca821a288d9b5c05fa9be82835f78ee9d
注:-d:后台运行 -name:给容器命名 -p:宿主机端口,容器内部端口
#5.查看运行的容器
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
517fcb763372 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:3344->80/tcp nginx01
#6.本地主机测试端口(网页已经可以打开查看)
[root@docker ~]# curl localhost:3344
<!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>
#7.外网测试:10.0.0.30:3344
三、使用docker部署tomact
#1.下载镜像
[root@docker ~]# docker pull tomact
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/library/tomact/manifests/latest: dial tcp: lookup registry-1.docker.io on 223.5.5.5:53: server misbehaving
#2.运行镜像
[root@docker ~]# docker run -d -p 3355:8080 --name tomcat01 tomcat
Unable to find image 'tomcat:latest' locally
latest: Pulling from library/tomcat
b9a857cbf04d: Pull complete
d557ee20540b: Pull complete
3b9ca4f00c2e: Pull complete
667fd949ed93: Pull complete
661d3b55f657: Pull complete
511ef4338a0b: Pull complete
a56db448fefe: Pull complete
00612a99c7dc: Pull complete
326f9601c512: Pull complete
c547db74f1e1: Pull complete
Digest: sha256:94cc18203335e400dbafcd0633f33c53663b1c1012a13bcad58cced9cd9d1305
Status: Downloaded newer image for tomcat:latest
WARNING: IPv4 forwarding is disabled. Networking will not work.
59e723b71f788628c3b778531900ccd2c65f3a7febfe209c7892bb26bf221834
#3.查看运行镜像
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59e723b71f78 tomcat "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:3355->8080/tcp tomcat01
517fcb763372 nginx "/docker-entrypoint.…" 20 minutes ago Up 20 minutes 0.0.0.0:3344->80/tcp nginx01
#4.测试访问
curl localhost:3355
10.0.0.30:3355
四、容器数据卷
1.什么是容器数据卷
docker的理念回顾
将应用和环境打包成一个镜像
数据?如果数据都在容器中,那么我们容器删除,数据会丢失!(需求:数据持久化)
MySQL,容器删除了,删库跑路!(需求:MySQL数据可以存储在本地)
容器之间可以有一个数据共享技术!docker容器中产生的数据,同步到本地!
这就是卷技术,目录的挂载,将我们容器内的目录挂载到linux上面!
总结:容器的持久化和同步操作!容器间也是可以数据共享的!
2.使用数据卷
1.方法一:直接使用命令来挂载 -v 【方式二:dockerfile】
[root@docker ~]# docker run -it -v /home/ceshi:/home centos /bin/bash
指定主机目录:容器挂载目录
[root@docker ~]# cd /home #切换到主机家目录查看挂载目录
[root@docker home]# ll
总用量 0
drwxr-xr-x 2 root root 6 3月 20 06:11 ceshi
[root@docker ~]# docker inspect #查看挂载详细信息
测试挂载:
目录同步测试:容器到主机
#1.容器内部
[root@92109883794f /]# cd /home
[root@92109883794f home]# ls
[root@92109883794f home]# touch test.java
[root@92109883794f home]# ls
test.java
#2.主机上查看
[root@docker ~]# cd /home/ceshi/
[root@docker ceshi]# ll
总用量 0
[root@docker ceshi]# ls
test.java
#1.主机上修改内容测试:主机到容器
[root@92109883794f home]# exit #要先停掉容器
exit
[root@docker ~]# cd /home/ceshi/
[root@docker ceshi]# ll
总用量 0
[root@docker ceshi]# ls
test.java
[root@docker ceshi]# vim test.java
hello world 123
#2.在容器内文件查看内容
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92109883794f centos "/bin/bash" 32 minutes ago Exited (0) 2 minutes ago quizzical_grothendieck
[root@docker ~]# docker start 92109883794f
92109883794f
[root@docker ~]# docker attach 92109883794f
[root@92109883794f /]# cd /home/
[root@92109883794f home]# ls
test.java
[root@92109883794f home]# cat test.java
hello world 123
总结:挂载是双向的
2.具名和匿名挂载
#1.匿名挂载
-v 容器内路径
docker run -d -p --name nginx01 -v /etc/nginx #不指定主机路径直接是容器内部目录
#实例:
[root@docker ~]# docker run -d -P --name=nginx01 -v /etc/nginx nginx
70935dcb3f6965868c01ac8c0e6f064d852369e40014a8e77dddaef306bf7474
[root@docker ~]# docker volume ls #查看所有卷的情况(匿名卷)
DRIVER VOLUME NAME
local 407aab886d4ab09134f036628a7eac69604f204bd2facbae5b01c1ef3aa33a00
#这种就是匿名挂载,我们在-v只写了容器内部的路径,没有写容器外的路径
#2.具名挂载
[root@docker ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
8ac7b6cf216f26d58f46c8af45754abcf08134460d2be802863b43516c08538f
注:-v 卷名:容器路径
[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
[root@docker ~]# docker volume inspect juming-nginx #查看具名挂载的具体信息
[
{
"CreatedAt": "2021-03-20T08:16:05+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
注:所有的docker容器内的卷,没有指定目录的情况下都在/var/lib/docker/volumes/xxxx/_data
我们通过具名挂载可以方便的找到我们一个卷,大多数情况在使用具名挂载。
3.如何确定具名挂载还是匿名挂载,还是指定路径挂载?
-v 容器内路径 #匿名挂载
-v 卷名:容器内部路径 #具名挂载
-v /宿主机路径:容器内部路径 #指定路径挂载
扩展:
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
# 通过-v 容器内部路径:ro/rw改变读写权限
#ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部无法操作!
五、实战MySQL同步数据
#1.下载镜像
[root@docker ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
a076a628af6f: Already exists
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1a8c919e89bf: Pull complete
9f3cf4bd1a07: Pull complete
80539cea118d: Pull complete
201b3cad54ce: Pull complete
944ba37e1c06: Pull complete
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
#2.运行容器,需要数据挂载(安装MySQL需要设置密码)
[root@docker ~]# 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 --name mysql01 mysql
c9518317aa16b5110e49681474470bb0912b6d048f9258f63fa814c3a8a1f56f
#3.在主机查看映射路径
[root@docker ~]# cd /home
[root@docker home]# ll
总用量 0
drwxr-xr-x 2 root root 23 3月 20 06:46 ceshi
drwxr-xr-x 4 root root 30 3月 20 07:37 mysql
[root@docker home]# cd mysql/
[root@docker mysql]# ll
总用量 4
drwxr-xr-x 2 root root 6 3月 20 07:37 conf
drwxr-xr-x 6 polkitd root 4096 3月 20 07:37 data
#如果我们将容器删除,发现挂载到本地的数据卷依旧没有消失,这就实现了容器数据持久化功能!