赞
踩
docker的理念是把应用和环境打包成镜像,方便我们去运行容器。这样引出了一个问题,如果容器没有打包成新的镜像,容器删除了,则容器的数据就会丢失。所以需要同步容器内的数据到其他地方,对应的解决方案就是容器卷技术,通过容器卷技术可以保证容器内的数据同步至本地,让容器间共享数据。
容器卷可以保证容器数据的持久化和同步操作,容器间也可以进行数据共享。
容器卷特点:
-
- # 宿主机和容器之间映射添加容器卷 -v 可以挂载多个
- docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
- # 上面的命令是默认的可读可写,容器内可以读可以写
- # 容器内可读可写
- # docker run -it -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
- # 容器内只读,宿主机写的内容会同步到容器内
- # docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
-
- # 查看数据卷是否挂载成功 Mounts下
- docker inspect 容器id
-
- # 具名挂载、匿名挂载、指定路径挂载
- -v 容器内目录 # 匿名挂载
- -v 卷名:容器内目录 # 具名挂载
- -v 宿主机绝对路径目录:容器内目录 # 指定路径挂载
-
- # 卷的继承和共享
- # 1,容器1完成和宿主机的映射
- docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
- # 2,容器2继承容器1的卷规则
- docker run -it --volumes -from 父类 --name=名称 镜像名
-
- 复制代码
- # 下载mysql镜像
- docker pull mysql:5.7
-
- # 启动容器
- # -d mysql:tag
- # -d 后台运行
- # -p 端口映射
- # -v 卷挂载
- # -e 环境配置
- # --name 容器命名
-
- 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=123456 --name mysql01 mysql:5.7
-
- #navicat测试连接成功
- 复制代码
navicat新建test库,查看同步情况
删除容器,查看本地数据
dockerfile是用来构建docker镜像的构建文件(命令参数脚本),其中包含了许多条指令,每条指令构件一层镜像,最后汇总bulid用户自定义镜像。
自定义镜像结构图如下:
Dockerfile的作用即是自定义镜像,用户发布和运行最终的产品。
官方文档
安装制作tomcat镜像
dockerfile-tomcat文件如下:
- FROM centos:7
- MAINTAINER liumiao<XX@qq.com>
-
- COPY readme.txt /usr/local/readme.txt
- ADD jdk-8u321-linux-x64.tar.gz /usr/local/
- ADD apache-tomcat-9.0.62.tar.gz /usr/local/
-
- RUN yum -y install vim
- RUN yum -y install net-tools
- ENV MYPATH /usr/local
-
- WORKDIR $MYPATH
-
- ENV JAVA_HOME /usr/local/jdk1.8.0_321
- ENV CLASS_PATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.65
- ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.65
- ENV PATH $PATH:$JAVAHOME/BIN:$CATALINA_HOME/lib:$CATALINA_HOME/bin
-
- EXPOSE 8080
-
- CMD /usr/local/apache-tomcat-9.0.65/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.65/bin/logs/catalina.out
- 复制代码
- # 制作自定义容镜像
- docker build -f dockerfile-tomcat -t tomcat_lm:1.0 .
- # 运行自定义镜像
- docker run -d -p 3355:8080 --name tomcat_lm -v /home/tomcat_lm/test:/usr/local/apache-tomcat-9.0.65/webapps/test -v /home/tomcat_lm/tomcatlogs/:/usr/local/apache-tomcat-9.0.65/logs tomcat_lm:1.0
- 复制代码
访问ip:3355,显示当前页面。
在本地/home/tomcat_lm/test路径下,新增web.xml和index.jsp
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- version="2.5">
- </web-app>
- 复制代码
2.index.jsp
- <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
- <!DOCTYPE HTML>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>hello,world</title>
- </head>
- <body>
- Hello World<br/>
- <%
- System.out.println("----test weblogs-------");
- %>
- </body>
- </html>
-
- 复制代码
3.查看容器内是否同步文件,访问ip:3355/test/index.jsp,页面正常显示。
- docker login -u 用户名 #回车
- Password: #输入密码
-
- #镜像名:需要以dockerHub账号的用户名开头, 命名为 userName/imageName
- docker push 镜像名:TAG
- 复制代码
这里建议参考阿里文档,很详细。
docker网络是指在docker容器内创造的独立与宿主机的网络的网络环境,实现docker容器内的网络通信。
部署Redis集群
- # 创建一个 redis集群使用的网卡
- docker network create redis --subnet 172.38.0.0/16
-
- # 通过shell 脚本创建6个redis配置
- for port in $(seq 1 6);\
- do \
- mkdir -p /mydata/redis/node-${port}/conf
- touch /mydata/redis/node-${port}/conf/redis.conf
- cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
- port 6379
- bind 0.0.0.0
- cluster-enabled yes
- cluster-config-file nodes.conf
- cluster-node-timeout 5000
- cluster-announce-ip 172.38.0.1${port}
- cluster-announce-port 6379
- cluster-announce-bus-port 16379
- appendonly yes
- EOF
- donesh
-
- # 启动6个redis镜像容器
-
- docker run -p 6371:6379 -p 16371:16379 --name redis-1 \ -v /mydata/redis/node-1/data:/data \ -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.11 redis:6.2.6-alpine redis-server /etc/redis/redis.conf
- docker run -p 6372:6379 -p 16372:16379 --name redis-2 \ -v /mydata/redis/node-2/data:/data \ -v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.12 redis:6.2.6-alpine redis-server /etc/redis/redis.conf
- docker run -p 6373:6379 -p 16373:16379 --name redis-3 \ -v /mydata/redis/node-3/data:/data \ -v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.13 redis:6.2.6-alpine redis-server /etc/redis/redis.conf
- docker run -p 6374:6379 -p 16374:16379 --name redis-4 \ -v /mydata/redis/node-4/data:/data \ -v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.14 redis:6.2.6-alpine redis-server /etc/redis/redis.conf
- docker run -p 6375:6379 -p 16375:16379 --name redis-5 \ -v /mydata/redis/node-5/data:/data \ -v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.15 redis:6.2.6-alpine redis-server /etc/redis/redis.conf
- docker run -p 6376:6379 -p 16376:16379 --name redis-6 \ -v /mydata/redis/node-6/data:/data \ -v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.16 redis:6.2.6-alpine redis-server /etc/redis/redis.conf
-
- # 进入redis-1容器
- docker exec -it redis-1 /bin/sh
-
- # 容器内创建集群
- redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
-
- # 登陆redis
- redis-cli -c
-
- #查询集群状态
- cluster info
- cluster nodes
-
- #主节点设置值,关闭主节点容器,查看是否可以查询到指定值
- set name lm
- docker stop redis-2
- get name
-
- 复制代码
- @RestController
- public class HelloController {
- @RequestMapping("/hello")
- public String hello(){
- return "hello";
- }
- }
- 复制代码
- FROM java:8
- COPY *.jar /app.jar
- CMD ["--server.port=8080"]
- EXPOSE 8080
- ENTRYPOINT ["java","-jar","/app.jar"]
-
- # 将生成的boot生成的jar和dockerFile文件放在同一目录层级下
- docker build -t 镜像名:[tag]
- 复制代码
- docker run -d -P --name docker-test 镜像名:[tag]
- curl localhost:端口/hello
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。