文章目录
- 容器数据卷
- 1、什么是数据卷
- 2、容器数据卷的作用
- 3、容器数据卷的使用
- 3.1、创建容器数据卷
- 3.2使用数据卷
- 3.3 、 数据卷实战 (mysql 安装)
- 3.4 利用数据卷容器实现容器间数据共享
- 3.5 数据备份
- 3.6 数据恢复
- 4、具名和匿名挂载
- 5、 三种挂载: 匿名挂载、具名挂载、指定路径挂载
- 6、初识DockerFile
- 6.1 dockerFile 的创建步骤
- 6.2 dockerFile 指令语句的基础知识
- 6.3 dockerFile的基础指令
- 6.4构建dockerFile
- 6.5 使用dicker history 查看 docker镜像的变更记录
- 7、CMD 和 ENTRYPOINT 命令区别
- 7.1 CMD
- 7.2 ENTRYPOINT
- 8.实战(构建tomcat镜像)
容器数据卷
1、什么是数据卷
数据卷是在容器内的特殊目录,这个目录和宿主机里的某个目录有特殊的映射关系,类似于linux 中的mount行为
2、容器数据卷的作用
- 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便
- 对数据卷内数据的修改会立马生效,无论是容器内操作还是宿主机本地操作
- 对数据卷的更新不会影响镜像,解耦开应用和数据
- 数据卷会一直存在,直到没有容器使用,可以安全地卸载它
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
3、容器数据卷的使用
3.1、创建容器数据卷
- 使用 docker volume 创建本地数据卷
Usage: docker volume COMMAND
Manage volumes
Options:
Commands:
create Create a volume -- 创建一个本地数据卷
inspect Display detailed information on one or more volumes -- 查看数据卷详情
ls List volumes -- 查看所有的数据卷
prune Remove all unused volumes -- 删除所有没有使用的数据卷
rm Remove one or more volumes -- 删除一个多个数据卷
3.2使用数据卷
用docker [container] run 命令的时候,可以使用–mount选项来使用数据卷。
–mount选项支持三种类型的数据卷,包括
bind:绑定数据卷,映射到主机指定路径下;
tmpfs:临时数据卷,只存在于内存中。
volume:普通数据卷,映射到主机/var/lib/docker/volumes路径下;
下面使用centos:7镜像创建一个centos容器,并创建一个数据卷挂载到容器的/test目录:
$ docker container run -dit --name centos --mount type=volume, source=testvolume, destination=/test centos:7
$ docker container run -dit --name centos1 --mount type=bind,source=/root/abc,destination=/test centos:7
上述type=bind的命令等同于下面的写法 :
# /root/abc主机内地址 /test docker 容器地址
$ docker container run -dit --name centos2 -v /root/abc:/test/ centos:7
注意,本地目录的路径必须是绝对路径,容器内路径可以为相对路径。如果目录不存在,Docker会自动创建
当使用容器数据卷时,在容器内或者宿主机内操作共享的文件都会同步,即使是容器停止,在宿主机内操作共享文件,重启容器后,文件就会同步
3.3 、 数据卷实战 (mysql 安装)
#使用docker 下载镜像这里就不做介绍,下面主要说一下数据卷的使用
-d 后台运行
-p 指定端口号
-v 数据卷 (可以设置多个)
-e 指定mysql的账户密码
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql
如果将容器删除,本地的数据仍然不会丢失,这就是数据卷的作用
3.4 利用数据卷容器实现容器间数据共享
数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载
- 创建一个数据卷容器 dbdata,并让宿主机创建一个数据卷挂到centos 容器里/dbdata 目录下
docker run -it -v /dbdata --name dbdata centos
//这里没明确指定宿主机中的目录,会在/var/lib/docker/volumes下自动生成,名字随机
- 可以在其他容器中使用–volumes-from来挂载dbdata容器中的数据卷,
例如创建db1和db2两个容器,并从dbdata容器挂载数据卷:
docker run -it --volumes-from dbdata --name db1 centos
docker run -it --volumes-from dbdata --name db2 centos
- 此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata目录,三个容器任何一方在该目录下的写入,其他容器都可以看到。
如果删除了挂载的容器(包括dbdata、db1和db2 ),数据卷并不会被自动删除
3.5 数据备份
使用下面的命令来备份dbdata数据卷容器内的数据卷
docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos:7 tar cvPf /backup/backup.tar /dbdata
# 首先利用 centos:7镜像创建了一个容器worker
# 使用--volumes-from dbdata 参数来让worker容器挂载dbdata容器的数据卷(即dbdata 数据卷)
# 使用-v $(pwd):/backup参数来挂载本地的当前目录到worker容器的/backup目录
# worker容器启动后,使用tar cvPf /backup/backup.tar /dbdata 命令将/dbdata下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar
3.6 数据恢复
如果要恢复数据到一个容器,可以按照下面的操作。
创建另一个新的容器,并使用untar解压备份文件到所挂载的容器卷中
docker run --volumes-from dbdata -v $(pwd):/backup centos tar xvf /backup/backup.tar -C /
4、具名和匿名挂载
# 匿名挂载
-v 容器内路径! /etc/nginx 表示宿主机路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的volume的情况
➜ ~ docker volume ls
DRIVER VOLUME NAME
local 33ae588fae6d34f511a769948f0d3d123c9d45c442ac7728cb85599c2657e50d
local
# 这里发现,这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路劲!
# 具名挂载 -- juming-nginx 名字
➜ ~ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
➜ ~ docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 通过 -v 卷名:容器内路径
# 查看一下这个卷
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data下
如果指定了目录,docker volume ls 是查看不到的
5、 三种挂载: 匿名挂载、具名挂载、指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的
拓展
# 通过 -v 容器内路径: ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
6、初识DockerFile
Dockerfile 就是用来构建docker镜像的构建文件!命令脚本!通过这个脚本可以生成镜像
6.1 dockerFile 的创建步骤
- 编写一个dockerFile文件
- docker build 构建成一个镜像
- docker run 运行一个镜像
- docker push 发布镜像 (DockerHub 阿里云镜像仓库)
6.2 dockerFile 指令语句的基础知识
- 每条保留字命令都必须为大写字母且后面要跟随至少一个参数。
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令的执行都会创建一个新的镜像层
6.3 dockerFile的基础指令
FEOM #基础镜像,一切从这里构建
MAINTAINER #镜像是谁写的 姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤 添加内容,添加同目录,添加的文件可以是压缩文件,默认自动解压
WORKDIR # 镜像的工作目录
VOLUME # 挂载目录
EXPOSE #保留端口配置
CMD #指定这个容器启动的时候要执行的命令,只有最后一个会生效,可悲替代
ENTRYPONIT #指定这个容器启动的时候要执行的命令,可以追加命令
ONBUILD #当构建一个被继承DockerFile 这个时候就会运行ONBULID的指令,触发指令
COPY # 类似ADD,将我们文件拷贝到镜像中,不能解压文件,也不能访问网络资源
ENV #构建的时候设置环境变量
6.4构建dockerFile
- 进去/home 路径下创建 mydockerfile文件夹,在该文件夹下面创建dockerfile 文件
- 编辑dockerfile文件,输入 dockerFile 命令
[root@localhost mydockerfile]# vim dockerfile
FROM centos
MAINTAINER jiangheng
ENV MYPATH /usr/local
WORKDIR $MYPATH
VOLUME /home
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo"----end-----"
CMD /bin/bash
- 使用docker build 构建dockerFile
# 命令 docker build -f 文件路径 -t 镜像名:[tag] .
[root@localhost mydockerfile]# docker build -f dockerfile -t mycentos:1.0 .
- 创建成功
~
# 截取了一部分
"test.txt" [New] 1L, 18C written
---> 40ba0ae60979
Successfully built 40ba0ae60979
Successfully tagged mycentos:1.0
- 查看自己创建的镜像
Successfully tagged mycentos:1.0
[root@localhost mydockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 40ba0ae60979 10 seconds ago 295MB
- 启动自己创建的镜像
[root@localhost mydockerfile]# docker run -it --name mycentos mycentos:1.0
- 查看安装的 vim 和 net-tools 和设置的工作区
[root@db25ce71000e local]# pwd
/usr/local # 这里是工作目录
[root@db25ce71000e local]# vim test.txt # 表示vim 可以用
[root@db25ce71000e local]# cat test.txt
ceshi dockerfile
[root@db25ce71000e local]# ifconfig # net-tools 工具可以用
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 15 bytes 1226 (1.1 KiB)
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
6.5 使用dicker history 查看 docker镜像的变更记录
[root@localhost /]# docker history 40ba0ae60979
IMAGE CREATED CREATED BY SIZE COMMENT
40ba0ae60979 17 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
c54e3f43f9ab 17 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
fb54f8461a40 17 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
f3056a8498d9 17 minutes ago /bin/sh -c yum -y install net-tools 22.8MB
9c3a70d33838 17 minutes ago /bin/sh -c yum -y install vim 57.3MB
b62a1ee9e4af 18 minutes ago /bin/sh -c #(nop) VOLUME [/home] 0B
5b8195d42a01 18 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
9acc4893c6f9 18 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
757b5a3a87a2 18 minutes ago /bin/sh -c #(nop) MAINTAINER jiangheng<jian… 0B
0d120b6ccaa8 6 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 6 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 6 weeks ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB
7、CMD 和 ENTRYPOINT 命令区别
7.1 CMD
# 编写dockerfile文件
$ vim dockerfile-test-cmd
FROM centos
CMD ["ls","-a"]
# 构建镜像
$ docker build -f dockerfile-test-cmd -t cmd-test:0.1 .
# 运行镜像
$ docker run cmd-test:0.1
.
..
.dockerenv
bin
dev
# 想追加一个命令 -l 成为ls -al
$ docker run cmd-test:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\":
executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled
# cmd的情况下 -l 替换了CMD["ls","-l"]。 -l 不是命令所有报错
7.2 ENTRYPOINT
# 编写dockerfile文件
$ vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
$ docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found ...
# 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的
$ docker run entrypoint-test:0.1 -l
total 56
drwxr-xr-x 1 root root 4096 May 16 06:32 .
drwxr-xr-x 1 root root 4096 May 16 06:32 ..
-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 May 16 06:32 dev
drwxr-xr-x 1 root root 4096 May 16 06:32 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ....
从上面两个例子中可以发现,CMD 是不能追加命令,而ENTRYPOINT 是可以追加命令
8.实战(构建tomcat镜像)
tomcat jdk 安装包连接
- 准备镜像文件 tomcat 和 jdk压缩包 放到 自定义的 mytomcat 文件夹中
- 在mytomcat 文件夹中定义dock而file文件
FROM centos
复制这段内容后打开百度网盘手机App,操作更方便哦
MAINTAINER jiangheng
ADD jdk-8u144-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.59.tar.gz /usr/local/
RUN yum -y install vim
#设置环境变量
ENV MYPATH /usr/local
#设置工作目录
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_144
ENV TOMCAT_HOME /usr/local/apache-tomcat-8.5.59
ENV PATH $PATH:$JAVA_HOME/bin:$TOMCAT_HOME/lib # 分隔符:
#端口号默认为8080
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.59/bin/startup.sh && tail -F
#设置默认命令
/usr/local/apache-tomcat-8.5.59/logs/catalina.out
3.构建镜像
#注: 如果你定义的文件名叫 dockerfile 可以不用写 -f dockerfile
docker build -f dockerfile -t mytomcat:1.0 .
- 验证是否构建成功
使用 docker images 命令查看是否有刚刚创建的镜像
- run 镜像
# 使用 -v 进行 文件挂载当容器启动的时候,tomcat 就已经启动了,以为在dockerfile文件中指定了启动tomcat的配置
docker run -p 8080:8080 --name tomcat1 -v /home/mytomcat:/usr/local/apache-tomcat-8.5.59/webapps/test -v/home/mytomcat/:/usr/local/apache-tomcat-8.5.59/logs mytomcat:1.0
- 访问测试