文章目录
容器数据卷
容器中的数据会跟随容器的删除而删除,为了保证容器中的数据持久化,需要数据可以存储到本地,例如MySQL
。
容器数据卷就是容器之间的数据共享技术,Docker容器中产生的数据同步到本地。卷技术就是将容器内的目录挂载到Linux上。
数据卷命令
docker run -it -v 主机目录,容器内目录
同步centos中的 /home 到主机的 /home/centosSync
docker run -it -v /home/centosSync/:/home centos /bin/bash
centos中的java程序同步到本地
通过inspect语句查看容器详细信息,包括数据卷的挂载关系,Source
主机地址,Destination
docker容器内地址
docker inspect centos容器ID
在容器中修改文件和在本地修改文件,都会同步到对方,通过这种方式就可以修改容器配置而不需要进入容器中。
MySQL开启同步
mysql启动方法
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
docker run
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名称
3316:3306
服务器端口 3316 对应 容器 3306-v /home/mysqlSync/conf:/etc/mysql/conf.d
挂载配置文件-v /home/mysqlSync/data:/var/lib/mysql
挂载数据文件MYSQL_ROOT_PASSWORD=root
设置root密码--name mysqlSync
容器命名
docker run -d -p 3316:3306 -v /home/mysqlSync/conf:/etc/mysql/conf.d -v /home/mysqlSync/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysqlSync mysql
与数据库成功建立连接,本地建立与容器MySQL的连接
新建一张表可以发现同步到了本地的文件夹内,如果删除容器,本地数据依旧不会被删除,持久化到了本地。
匿名/具名挂载
匿名挂载 -v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
-v 卷名:容器内路径
左侧不加/就不是绝对地址,就是卷名
所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
拓展
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 readonly 只读
rw readwrite 可读可写
ro表明路径只能通过宿主机来操作,容器内部无法操作
数据卷容器
--volumes-from
将一个容器挂载到另一个容器上,通过一个容器同步文件到多个容器,容器之间通过
--volumes-from 实现容器间的数据共享
docker run -it --name doker02 --volumes-from docker01 centos
Dockerfile
Dockerfile就是用来构建docker镜像的构建文件,通过命令脚本生成镜像,镜像是分层的,所以每个命令都是一层
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
构建镜像
docker build -f dockerFile1 -t chai/centos:1.0 .
流程:
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 0d120b6ccaa8
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 5f4a8a323090
Removing intermediate container 5f4a8a323090
---> a74fdef970c8
Step 3/4 : CMD echo "----end----"
---> Running in d6045c0d189f
Removing intermediate container d6045c0d189f
---> 77a50471a942
Step 4/4 : CMD /bin/bash
---> Running in a50258208065
Removing intermediate container a50258208065
---> 783e079abd34
Successfully built 783e079abd34
Successfully tagged chai/centos:1.0
查看镜像
docker images
进入自己创建的镜像
docker run -it --name mycentos02 783e079abd34 /bin/bash
发现自己挂载的两个数据卷目录,则本地有同样的文件夹进行同步,匿名挂载说明名字是乱码。查看挂载信息,可以看到目录地址
docker inspect 容器ID
DockerFile步骤
- 编写dockerfile文件
douker build
构建成为一个镜像douker run
运行镜像douker push
发布镜像(DockerHub,阿里云镜像仓库)
基础:
- 指令必须都是大写字母
- 执行顺序从上到下
#
表示注释- 每个指令都会创建提交一个新的镜像层
指令介绍
FROM 指定基础镜像,一切从这里构建
MAINTAINER 镜像是谁写的,姓名+邮箱
RUN 镜像构建时需要运行的命令
ADD 增加其他镜像,按层添加
WORKDIR 当前工作目录
VOLUME 挂载到主机的目录
EXPOST 保留端口配置
CMD 指定容器启动的时候运行的命令,只有最有一个会生效,可以被替代
ENTRYPOINT 指定容器启动的时候运行的命令,可以追加命令
ONBUILD 都构建一个被继承的DockerFile 就会运行这个指令
COPY 类似ADD,文件拷贝到镜像中
ENV 构建时设置环境变量
CMD和ENTRYPOINT
CMD 不会追加在命令后面
例如: CMD ls -a 在执行时列出所有目录
如果执行 docker run -it mycentos -l . 会报错
但如果是 ENTRYPOINT ls -a 不会报错
构建自己的Centos
centos最新版本的DockerFile
FROM scratch
ADD centos-8-x86_64.tar.xz /
LABEL org.label-schema.schema-version="1.0"
org.label-schema.name="CentOS Base Image"
org.label-schema.vendor="CentOS"
org.label-schema.license="GPLv2"
org.label-schema.build-date="20200809"
CMD ["/bin/bash"]
DockerHub中99%的镜像都是从scratch基础镜像构建的,然后配置需要的软件和配置
1.编写DockerFile文件
FROM centos
MAINTAINER cccrj<123@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
2.构建镜像
docker build -f centosDockerFile01 -t mycentos:0.1 .
-f DockerFile文件地址
-t 镜像名:[tag]
3.测试镜像
可以发现自己加的网络工具,ifconfig
可以使用,并且进入centos直接进入/usr/local
目录下
查看镜像变更历史
docker history 容器ID
构建自己的Tomcat
FROM centos
MAINTAINER cccrj<123@qq.com>
COPY README.md /usr/local/README.md
ADD jdk-8u191-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.36.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_191
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.36
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.36
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.36/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.36/bin/logs/catalina.out
- COPY 拷贝文件到镜像中
- ADD 自动解压压缩包到指定目录
- ENV设置Java 和 Tomcat 的环境变量
- 开放端口8080
- CMD 启动Tomcat 并且 查看日志
Dockerfile是默认名称,会自动识别,不需要在build中再写-f
文件名了
docker build -t mytomcat .
启动自定义tomcat,设置端口8090
,挂载webapps
和 logs
两个文件夹
docker run -d -p 8090:8080 --name mytomcat -v /home/myTomcat/webappsSync:/usr/local/apache-tomcat-9.0.36/webapps -v /home/myTomcat/logsSync:/usr/local/apache-tomcat-9.0.36/logs mytomcat
发布自己的镜像
DockerHub
docker login
-u 账户
-p 密码
docker push 镜像名[:tag]
可以通过docker tag对镜像改名
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
上传完成后,dockerhub上出现自己上传的镜像
阿里云镜像
-
容器镜像服务
-
创建命名空间,存储镜像
-
创建容器镜像,上传镜像需要按照阿里云的提示进行,不然上传失败