Docker学习

目录

容器入门

常用命令:

小作业:nginx

作业2:tomcat

可视化

容器:分层

如何提交自己的镜像:commit

容器数据卷

作业:mysql容器

具名挂载和匿名挂载

数据卷容器 

DockerFile

指令:

Docker网络

 --link(不推荐使用)

自定义网络

网络连通

实战:部署redis集群


容器入门

常用命令:

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连接报错:

Navicate连接Linux下的MySQL数据库报错“Password authentication failed”_navicat password authentication failed-CSDN博客

原来是把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   //需要停止重连

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值