dockerfile指令总结
FROM:指定基础镜像
LABEL:指定镜像元数据,即标签
RUN:指定shell命令
CMD:容器启动命令
EXPORT:暴露端口
ENV:设置环境变量
ADD:复制和解包文件,增强版的copy
COPY:复制本地宿主机的文本到容器
VLOUME:匿名卷
WORKDIR:指定工作目录
ARG:构建参数
USER:指定当前用户
ENTRYPOINT:入口点,类似于CMD,配置容器启动后执行的命令及参数
HEALTHCHECK:健康检查
容器的分层
Lowerdir:基础镜像层,只读
mergeddir:容器变化的数据存放处,可读写,对应merged目录,新增和镜像的数据
upperdir:容器的文件系统,对应的是diff目录,可读写,新增加的数据
workdir:临时工作区,使用过程中用户不可见
#由于容器的数据存放在/var/lib/docker/overlay2/目录下,随着容器的删除,数据也会删除,所有我们需要建立数据卷进行管理,让数据不会随着容器的删除而删除。
数据卷
数据卷分类
指定宿主机目录或文件:
匿名卷:
命名卷:
数据卷使用方法:
1. -v 宿主机路径:容器路径[:ro] #可加权限
2. -v 容器内路径 #匿名卷,只指定容器内路径,没有指定宿主机路径信息,宿主机自动生成/var/lib/docker/volumes/<卷ID>/_data目录,并挂载至容器指定路径
3. -v 卷名:容器目录路径 #命名卷将固定的存放在/var/lib/docker/volumes/<卷名>/_data
#也可以先创建卷名:docker volume create <卷名>
将宿主机的目录挂载到容器实现数据卷:
[root@ubuntu2004 ~]#docker run -d -p 80:80 --name nginx01 -v /opt/test:/data/test nginx:v1.22.0-2022-10-18
df可以查看挂载情况:
root@baf68e8f4d41:/# df
在宿主机创建文件,容器里面也可以看到:
[root@ubuntu2004 test]#touch M50.test
root@baf68e8f4d41:/# ls /data/test/
M50.test
匿名卷:
创建容器的数据卷,目录/nginx/www,默认同步到宿主机的/var/lib/docker/volumes/下面
[root@ubuntu2004 ~]#docker run -d -p 80:80 --name nginx01 -v /nginx/www nginx:v1.22.0-2022-10-18
在宿主机创建文件,无容器查看同步情况
[root@ubuntu2004 ~]#touch /var/lib/docker/volumes/e9e468de9ed3badac8885274eaa1c592187a12a62c9bba62362e50660bb580df/_data/123.txt
[root@ubuntu2004 ~]#docker exec nginx01 ls -l /nginx/www
total 0
-rw-r--r-- 1 root root 0 Oct 20 02:07 123.txt
命名卷:
可以先创建卷名,文件默认路径在/var/lib/docker/volumes/下:
[root@ubuntu2004 ~]#docker volume create volume1
volume1
[root@ubuntu2004 ~]#docker inspect volume1
[
{
"CreatedAt": "2022-10-20T10:12:10+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/volume1/_data",
"Name": "volume1",
"Options": {},
"Scope": "local"
}
]
将宿主机的卷名挂载到容器:
[root@ubuntu2004 ~]#docker run -d -p 80:80 --name nginx01 -v volume1:/nginx/www nginx:v1.22.0-2022-10-18
此时删除容器后,数据卷不会删除,数据依然保留
手工不创建,直接跟卷名,也会自动创建数据卷文件
实现多容器共享一个数据卷:
[root@ubuntu2004 ~]#docker run -d -p 80:80 --name nginx01 -v volume1:/apps/nginx/html nginx:v1.22.0-2022-10-18
5b41294b1fb0a807d67560be65d2c3afb618c87634a8418629cc22fafe521e34
[root@ubuntu2004 ~]#docker run -d -p 81:80 --name nginx02 -v volume1:/apps/nginx/html nginx:v1.22.0-2022-10-18
挂载时加只读,时容器只读,不可写
实战案例:实现 wordpress 持久化
[root@ubuntu2004 ~]#docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=123456 --name mysql -d -v /data/mysql:/var/lib/mysql --restart=always mysql:8.0.29-oracle
[root@ubuntu2004 ~]#docker run -d -p 80:80 --name wordpress -v /data/wordpess:/var/www/html --restart=always wordpress:php7.4-apache
网站上传的数据在:
[root@ubuntu2004 nginx]# tree /data/wordpess/wp-content/uploads/
数据卷容器
[root@ubuntu2004 ~]#docker run -d -p 80:80 --name nginx01 -v volume1:/apps/nginx/html nginx:v1.22.0-2022-10-18
共享nginx01容器的挂载数据卷,实现容器数据卷共享:
--volume-from
[root@ubuntu2004 ~]#docker run -d -p 81:80 --name nginx02 --volume-from nginx01 nginx:v1.22.0-2022-10-18
[root@ubuntu2004 ~]#docker run -d -p 82:80 --name nginx03 --volume-from nginx01 nginx:v1.22.0-2022-10-18
第一个容器称为server,后续基于server创建的成为client
数据卷容器备份
#MySQL容器默认使用了匿名数据卷
[root@ubuntu1804 ~]#docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.30
#备份数据库
[root@ubuntu1804 ~]#docker run -it --rm --volumes-from mysql -v $(pwd):/backup centos tar xvf /backup/mysql.tar -C /var/lib/mysql
标签:容器,ubuntu2004,--,dockerfile,nginx,指令,root,docker,数据
From: https://blog.51cto.com/lmm01/6834428