docker容器挂载方法:
docker run -it -v /home/ceshi:/home centos /bin/bash
docker 配置MySQL
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动MySQL
-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
启动sqlyog ---连接到3310 ,3310 与3306 映射,此时可以连接
具名和匿名挂载
# 匿名:
- v:容器内路径
docker run -d -P --name nginx02 -v /ect/nginx nginx
# 查看所有卷的情况
docker volume ls
这种情况:匿名挂载
local d44fe5a3a2e35d0ad4c3f2090b19ac7d1e31974760a170b000aba574080b9626
具名挂载:
[root@localhost home]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
bd937dac0a661d0d67e7774dda1712e2f9b7b04390c9a7b5f03170b0e0f7a1be
[root@localhost home]# docker volume ls
DRIVER VOLUME NAME
local d44fe5a3a2e35d0ad4c3f2090b19ac7d1e31974760a170b000aba574080b9626
local juming-nginx
[root@localhost home]#
# 通过 -v 卷名:容器内路径
# 查看卷的具体位置 :docker volume inspect juming-nginx
{
"CreatedAt": "2021-01-14T20:57:31+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/XXX/_data
大多数情况下,使用具名挂载
# 如何确定匿名还是具名 还是 指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:/容器内路径 # 指定路径挂载
拓展:
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly 只读
rw readwrite 可读写
# 只要看到ro ,说明这个路径只能通过宿主机来操作,容器内部无法操作
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx
初识Dockerfile :
Docker file就是用来构建docker镜像的文件,命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层
# 创建一个 dockerfile文件,名字随机,建议Dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---------end---------"
CMD /bin/bash
命令是镜像的一层
执行dockerfile1文件
docker build -f /home/docker-test-volume/dockerfile1 -t kaungshen/centos:1.0 .
启动自己写的容器:docker run -it id /bin/bash
这个卷和外部一定有一个同步的目录,匿名挂载
查看卷挂载的路径
查看本地是否同步成功
数据卷容器
多个mysql同步数据
# 测试结果:删除docker01中的内容,docker02中的内容还在
# 多个Mysql实现数据共享
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
结论:容器之间配置信息的传递 ,数据卷容器的生命周期一直持续到没有容器使用为止
DockerFile
dockerfile 是用来构建docker镜像的文件,命令参数脚本!!
构建步骤:
1、编写一个dockerfile 文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
查看一下官方是怎么做的?
官方镜像都是基础包,很多功能没有
dockerfile的构建过程
基础知识:
1.每个保留关键字(指令)必须是大写字母
2.执行从上到下顺序执行
3.#表示注释
4.每一个指令都会创建提交一个新的镜像层,并提交
dockerfile 是面向开发的,发布项目作镜像需要编写dockerfile文件
docker镜像成为企业交付的标准
dockerfile:构建文件,定义一切步骤,源代码
dockerImages:通过DockerFile构建生成镜像,
Docker容器:容器就是镜像运行起来提供服务
DockerFile的指令:
FROM: #基础镜像,一切从这里开始构建
MAINTAINER :# 镜像是谁写的,姓名+邮箱
RUN: # 镜像构建时运行的命令
ADD: # 步骤,tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR: # 镜像工作目录
VOLUME: # 挂载的目录
EXPOSE: # 暴露端口配置
CMD: # 指定容器启动的时候运行的命令,只有最后有一个会生效,可被替代
ENTRYPIONT:#指定容器启动的时候运行的命令,可以追加命令
ONBUILD: #当构建一个被继承DockerFile这个时候就会运行ONBUILD 的指令,触发指令
COPY: #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量!
实战测试:
docker Hub 中99%镜像都是从 FROM scratch 开始的,配置需要的软件和配置来进行构建
#构建自己的centos
1,编写一个自己的centos
FROM centos
MAINTAINER song<2294610789@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 docker -t mycentos:0.1 .
docker build -f dockerfile文件路径 -t 镜像名:[tag] .
Successfully built 4ac754d0dbfc
Successfully tagged mycentos:0.1
3,测试运行
docker run -it mycentos:0.1
列出镜像的变更历史:docker history 镜像id
查看镜像的制作过程
CMD和ENTRYPOINT的区别
测试cmd
vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]
# 想追加一个命令:ls -al
# 测试ENTRYPOINT(可以直接追加命令)
实战:Tomcat镜像
第一步:准备镜像文件,tomcat 压缩包,jdk的压缩包
第二步:编写dockerfile,官方文件Dockerfile,build会自动找这个文件,就不需要指定了
FROM centos
MAINTAINER kuangshen<2294610789@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
第三步:构建镜像
# docker build -t diytomcat .
[root@localhost tomcat]# docker run -d -p 9090:8080 --name kuangshentomcat3 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs diytomcat
01440586810f0efbf617d0245bd64baf36a03df168e90703075870cb370da5f4
[root@localhost tomcat]# ls
第四步:启动镜像
第五步:访问测试
第六步:发布项目(由于做了卷挂载,直接在本地编写项目就可以发布了)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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>
发布自己放入镜像
DockerHub:
1,有自己的账号,并且能登录
2,在服务器上提交自己放入镜像
3,登陆完之后就可以提交镜像了 使用docker push
# 增加一个tag标签:docker tag bd46f2989b99 1994123/tomcat:1.0
提交:docker push 1994123/tomcat:1.0
Docker 网络
docker是如何工作的?
# 思考:能不能Ping通docker容器内部ip
原理:
1,我们每启动一个docker容器,docker就会给docker 容器分配一个ip,只要安装docker ,就会有一个网卡
docker0桥接模式,使用的技术是evth-pair技术
2,再启动一个容器测试,又多一对网卡
# enth-pair 一对的虚拟设备接口,成对出现,一段连着协议,一段彼此相连
# enth-pair 充当一个桥梁,连接各种虚拟网络设备
# OpenStac ,Docker 容器之间的连接,OVS的连接,都是enth-pair技术
3,测试tomcat3与Tomcat4是否可以Ping通!
# 结论:容器与容器之间可以相互ping 通
# 结论:tomcat01 和 tomcat02 使用公用的路由器,docker0
所有容器不指定网络的情况下,都是docker0路由的,docker会分给容器一个默认可用的IP
小结:Docker 使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0
docker 中的所有网络接口都是虚拟的,虚拟的转发效率高
-- link
通过--link可以解决网络联通问题
docker exec -it tomcat02 ping tomcat01
docker run -d -P--name tomct03 --link tomcat02 tomcat
查看host,就是在本地配置了tomcat02 的配置
docker exec -it tomcat03 cat /etc/hosts
--link就是在hosts配置中增加了一个172.18.0.3
现在不建议使用f--link
自定义网络
网络模式:
bridge:桥接 docker(默认)
none:不能配置网络
host:和宿主机共享网络
container:容器内可以网络联通(用的少)
测试:我们直接启动命令 --net bridge ,而这个就是docker0
# docker0的特点,默认,域名不能访问 ---link 可以打通连接
# --driver bridge:桥接
# --subnet 192.168.0.0/16 :子网的地址
# --gateway :网关
# 自定义一个网络
C:\Users\Administrator>docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
4109f34f2362c11487bad18fbbd6f29efef14d8d83db5bbfb92a6a63e8072fef
查看自己的网络:
docker network inspect mynet
C:\Users\Administrator>docker run -P --name myredis --net mynet redis
1:C 20 Jan 2021 14:11:43.415 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 20 Jan 2021 14:11:43.415 # Redis version=6.0.10, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 20 Jan 2021 14:11:43.415 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 20 Jan 2021 14:11:43.417 * Running mode=standalone, port=6379.
1:M 20 Jan 2021 14:11:43.417 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 20 Jan 2021 14:11:43.417 # Server initialized
1:M 20 Jan 2021 14:11:43.417 * Ready to accept connections
自定义网络的好处:
redis-- 不同的集群使用不同的网络,保证集群是安全和健康的
mysql-不同的集群使用不同的网络,保证集群是安全和健康的
网络连通
C:\Users\Administrator>docker network connect mynet redis01
C:\Users\Administrator>docker network inspect redis01
联通之后,就是将redis01放置到mynet的网络下,一个容器,两个Ip地址
实战:部署redis集群