目录
容器入门
常用命令:
docker介绍及常用命令大全(超详细)_docker是什么命令_luckySnow-julyo的博客-CSDN博客
小作业:nginx
端口暴露:
docker search nginx
docker pull nginx
docker run -d --name nginx01 -p 3344:80 nginx
docker ps
curl localhost:3344
//进入容器
docker exec -it nginx01 /bin/bash
whereis nginx
cd /etc/nginx
ls
exit
docker ps
docker stop fb78ae0b4b2c
思考问题:是否一定要进入容器内部才可以修改nginx的配置文件,容器外可以有映射吗
容器卷技术
作业2:tomcat
docker run -it -rm tomcat:9.0
//-rm 用完即删容器,一般用于测试
网络问题:容器与容器之间怎么通信
可视化
portainer:图形化界面管理工具
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
rancher
容器:分层
如何提交自己的镜像:commit
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
docker commit -a="xxx" -m="add webapps app" 容器id tomcat02:1.0
docker images
容器数据卷
问题:如果数据都在容器里,删除容器就会全部丢失,那么数据应该存在哪里?
需求:数据可以存储在本地
容器之间的数据共享技术!数据同步到本地!
卷技术:目录的挂载,将容器内的目录挂载到linux上
实现容器的持久化和同步操作,容器间数据共享
docker run -it -v 主机目录:容器内目录(映射)
docker run -it -v /home/ceshi:/home centos /bin/bash
docker inspect d47661f6e9f2
容器内添加文件,本地也会添加
容器停止
修改宿主机本地文件,再次启动容器(需要再挂载吗?启动同一个容器不需要再挂载),也会有修改
作业:mysql容器
docker pull mysql:5.7
-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
问题:没run起来
使用navicat连接报错:
原来是把ssh连接的密码搞错了,ssh连接时虚拟机的root登录密码而不是sql的
具名挂载和匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx
docker volume ls
//发现乱码都是匿名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
//查看卷
docker volume inspect juming-nginx
所有docker容器内的卷,没有指定目录情况下都挂载再 /var/lib/docker/volumes/xxx/xx
通过具名挂载可以方便找到卷信息,推荐使用
-v 容器内路径 匿名挂载
-v 卷名:容器内路径 具名挂载
-v /宿主机路径:容器内路径 指定路径挂载
拓展:ro、rw
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 rw 改变读写权限
//ro 只读,只能通过宿主机改变
//rw 可读可写
初识dockerfile:
dockerfile就是用来构建docker镜像的构建文件,由一条条命令脚本组成,通过脚本生成镜像,每个命令都是一层
创建一个dockerfile文件
cd /home
mkdir docker-test-volume
cd docker-test-volume
vi dockerfile01
文件中指令要大写,参数
FROM centos
VOLUME ["/volume01","/volume02"]
CMD echo "----end----"
CMD /bin/bash
docker build -f dockerfile01 -t mycentos:1.0 .
启动镜像,自动生成一个容器
在容器内创建数据文件
在宿主机查看容器的挂载
进入查看数据文件已同步
数据卷容器
多个mysql共享数据
删除docker01后数据还在
自己验证一下吧,看看docker02数据卷挂载在哪里
如果两个宿主机不同怎么挂载
都挂在宿主机是怎么样的
DockerFile
1、编写一个dockerfile文件
2、docker build构建成为一个镜像
3、 docker run 运行镜像
4、docker push 发布镜像
指令:
FROM centos
MAINTAINER yjy<3203014138@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
workdir:设置工作目录,一进入就是/usr/local 而不是root
docker history
Docker网络
问题:docker是如何处理容器网络访问的?
宿主机可以ping通容器
1、每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker就会有一个网卡docker0,桥接模式,使用的技术是evth-pair技术!
两个容器之间也可以ping通
docker中的所有网络接口都是虚拟的,虚拟的转发效率高
--link(不推荐使用)
如何用容器名ping通
docker run -d -P --name tomcat03 --link tomcat02 tomcat
docker exec -it tomcat02 ping tomcat03
//反向ping不通
docker network ls
docker network inspect id
原理:在tomcat03的配置文件里配了02的ip
docker0不支持容器名连接
自定义网络
docker run -d -P --name tomcat01 --net bridge tomcat
自定义网络:
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker network inspect mynet
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
自定义的好处:可以用容器名ping通
网络连通
//测试打通tomcat01到tomcat-net-01
docker network connect tomcat01 -mynet
联通之后就是将tomcat01放到mynet网络下
一个容器两个ip地址
实战:部署redis集群
docker network create redis --subnet 192.169.0.0/16
docker network ls
通过脚本创建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 192.169.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
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 192.169.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
创建集群:
docker exec -it redis-1 /bin/sh
ls
redis-cli --cluster create 192.169.0.11:6379 192.169.0.12:6379 192.169.0.13:6379 192.169.0.14:6379 192.169.0.15:6379 192.169.0.16:6379 --cluster-replicas 1
redis-cli -c
cluster info
cluster nodes
set a b
三主三从
主机挂了,从机应该替代
删除主机后
get a //需要停止重连