一、mysql
1、创建带密码的mysql
docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD=123123 mysql
docker exec -it mysql01 bash
删除容器:docker rm -f mysql01-------->mysql中的数据也没了
github中上搜docker-library
2、mysql数据保存的目录
myslq-dockerfile中的volume /var/lib/mysql
进入mysql:docker exec -it mysql01 bash
mysql -uroot -p123123
数据保存在:cd /var/lib/mysql
3、docker中的volume(数据所在的位置)
展示docker的valume:docker valume ls
删除docker的valume:docker volume rm - $(docker volume ls)
查看volume:docker volume inspect volumeId
4、mysql数据所在容器的目录和宿主机的目录 (持久化存储)
容器目录:/var/lib/mysql
宿主机目录:/var/lib/docker/volumes/volumeID/_data
注:当容器删掉的时候,可以通过宿主机进行数据恢复
5、自定义volumeID
docker run -d --name mysql03 -v mysql03_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123123 myql
所以宿主机目录为:/var/lib/docker/volumes/mysql03_volume/_data
注:删除了container,但volume还在,除非手动删除volume:docker volume rm -f volumeID
6、将volume中的内容同步到新的container (持久化存储)
docker run -d --name mysql04 -v mysql03_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123123 myql
登录容器:docker exec -it mysql04 bash
登录mysql:mysql -uroot -p123123
7、bind mounts(开发利器)
将宿主机的目录和container的目录进行绑定:更新宿主记得内容,马上会同步到container
例如:docker run -d --name tomcat01 -p 9090:8080 -v /tmp/sunxj:/user/loacal/tomcat/webapps/sunxj tomcat
docker run -d --name 容器的名字 -p 宿主机端口:容器端口 -v 宿主机目录:容器目录
8、数据库高可用的集群方案:
Replication:速度比较快,无需所有节点都同步数据成功。异步复制,无法保证集群中每个节点的数据是一致的
PXC(percona XtraDB cluster):强一致性的高可用数据库集群方案,速度效率比较慢,需要每个节点都同步数据成功。
hub.docker.com中搜:percona XtraDB cluster,直接用这个镜像
9、percona XtraDB cluster
docker pull percona/percona-xtradb-cluster:5.7.21
docker images
a、网络pxc-net 172.18.0.0/24
b、持久化:docker volumer create --name v1 --mysql01 v2 --mysql02 v3--mysql03
c、创建容器:docker run -d -p 3301:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123123 -e XTRABACKUP_PASSWORD=123123 -e CLUSTER_NAME=pxc myql --privileged --name=node1 --net=pxc-net 172.18.0.2 镜像名
XTRABACKUP_PASSWORD:多节点同步的密码
CLUSTER_NAME:集群的名字
(1)搭建3个节点的pxc-mysql具体过程如下:
创建网络:docker network create --subnet=172.18.0.0/24 pxc-net
检查网络:docker network inspect pxc-net
创建3个volume给容器使用:docker volume create --name v1、docker volume create --name v2、docker volume create --name v3
检查volume:docker volume ls、docker volume inspect v1
创建第一个container:docker run -d -p 3301:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123123 -e XTRABACKUP_PASSWORD=123123 -e CLUSTER_NAME=pxc myql --privileged --name=node1 --net=pxc-net 172.18.0.2 镜像名
检查container:docker ps
进入到容器:docker exec -it node1 bash
进入到mysql:mysql -uroot -p123123
创建第二个container:docker run -d -p 3302:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123123 -e CLUSTER_JOIN=node1 -e XTRABACKUP_PASSWORD=123123 -e CLUSTER_NAME=pxc myql --privileged --name=node2 --net=pxc-net 172.18.0.3 镜像名
CLUSTER_JOIN=node1:加入到node1形成集群
创建第三个container:docker run -d -p 3302:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123123 -e CLUSTER_JOIN=node1 -e XTRABACKUP_PASSWORD=123123 -e CLUSTER_NAME=pxc myql --privileged --name=node3 --net=pxc-net 172.18.0.4 镜像名
CLUSTER_JOIN=node1:加入到node1形成集群
二、haproxy
1、安装haproxy
a、hub.docker.com上搜:haproxy
b、docker pull haproxy
c、vim haproxy.cfg
d、启动:docker run -d -p 3306:3306 -p 8888:8888 -v /tmp/haproxy:/user/local/etc/haproxy --name haproxy01 --privileged --net=pex-net(与mysql 用的同一个网络) haproxy
注:如有报错先将haproxy01删掉:docker rm -f haproxy01
监控:宿主机ip:8888/dbs_monitor
e、进入到haproxy01-container:docker exec -it haproxy01 bash
f、启动加载配置文件:cd /user/local/etc/haproxy---->haproxy -f haproxy.cfg
三、
1、创建网络:docker network create --subnet=172.19.0.0/24 pro-net
验证:docker network ls
2、将spring-mybatis.jar上传到/root/springboot-mybatis 目录下
3、构建dockerfile vim Dockerfile
4、根据dockerfile构建image:docker build -t sbm-image Dockerfile
验证:docker images
5、创建mysql的volume(用于存储数据):docker volume create v11
6、创建mysql-container:docker run -d --name my-mysql -v v11:/var/lib/mysql -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123123 --net=pro-net --ip 172.19.0.6 mysql
验证:docker network inspect pro-net
7、创建springboot-container:docker run -d --name sb01 -p 8801:8080 --net=pro-net --ip 172.19.0.11 sub-image
docker run -d --name sb02 -p 8802:8080 --net=pro-net --ip 172.19.0.12 sub-image
docker run -d --name sb03 -p 8803:8080 --net=pro-net --ip 172.19.0.13 sub-image
8、创建nginx vim nginx.cfg---->docker run -d --name my-nginx -p 80:80 -v /tmp/nginx/nginx.cfg:/etc/nginx/nginx.cfg --network=pro-net --ip 172.19.0.10 nginx
三、python
1、mkdir -p /tmp/composetest
2、vim app.py
3、vim requirements.txg
内容:flask、redis
4、vim dockerfile
5、根据dockerFile构建docker-image:docker build -t python-app-image .dockerFile
6、拉取redis镜像:docker pull redis:alpine
7、创建一个网络:docker network create --subnet=172.20.0.0/24 app-net
验证:docker network ls
8、创建app-container:docker run -d --name web -p 5000:5000 --network app-net python-app-image
9、创建redis-container:docker run -d --name redis --network app-net redis:alpine
验证:docker ps(查看有哪些container)
验证:宿主机ip:5000
10、删除所有container:docker rm -f $(docker ps -aq)
五、docker-compose(单机管理)+ yaml文件实现上述过程
1、安装docker-compose:sudo crul -L "https://..." -o /usr/local/bin/docker-compose
验证:docker-compose version
2、删除多余的net-work与volume与image
docker network rm app-net
docker volume rm -f $(docker volume ls)
docker rmi -f imageID
3、编辑compose.yaml文件
vim docker-compose.yaml
version: '3'
services: --------------->定义container,一个service就是一个container
web: ------------->service1
build: . -------------->表示从当前目录的dockerFile获取image
ports:
- "5000:5000" ------------>该container的端口镜像(宿主机端口:container端口)
network: ------------>该container使用的网络
- app-net
redis:
image: "redis:alpine"
network:
- app-net
networks: ---------------->等价于docker network create --name app-net
app-net:
driver: bridge
4、执行compose文件:docker-compose -f docker-compose.yaml up -d
停止执行:docker-compose -f docker-compose.yaml down
六、docker-swarm(多机管理)
1、将多台安装了docker的机器,组成一个集群,共同给外界提供服务,并且能很好的管理多个容器。
2、
3、
4、初始化swarm-master(manager) :docker swarm init --advertise-addr=192.168.8.11
让其他的swarm-worker加入到master-Reachable: docker swarm join --token xxxx 192.168.8.11:2377
验证:docker nodes ls
将worker晋升到manager:docker node promote worker01-node
将manager撤掉:docker node demoteworker01-node
(二)、使用docker-swarm
docker视角下:container docker-swarm视角下:service
1、创建tomcat-container:docker service create --name my-tomcat tomcat
查看service的启动日志:docker service logs my-tomcat
查看inspect:docker service inspect my-tomcat
2、查看集群中有哪些service:docker service ls
查看当前节点有哪些container:docker ls
查看该service运行在哪个节点汇中:docker service ps my-tomcat NODE(manager-node)
3、将service扩容:docker service scale my-tomcat=3
4、将service下架:docker service rm my-tomcat
(三)、docker-swarm实现上述案例
1、master中创建网络:docker network create -d overlay my-overlay-net
worker中看不到:docker network ls
2、创建mysql-service:docker service create --name mysql --mount type=volume,source=v1,destination=/var/lib/mysql --env
MYSQL_ROOT_PASSWORD=123123 --network my-overlay-net mysql:5.6
检查:docker service ls------>docker service ps mysql(manager-node)
3、创建wordpress-service:docker service create --name wordpress --env WORDPRESS_DB_USER=root --env WORDPRESS_DB_PASSWORD=123123 --env WORDPRESS_DB_HOST=mysql:3306 --env WORDPRESS_DB_NAME=db_wordpress -p 8080:80 --network my-overlay-net wordpress
检查:docker service ls------>docker service ps mysql(worker01-node)
docker network ls---->发现worker01-node中有了my-overlay-net网络
4、验证:三个docker节点ip:8080------->都可以访问到wordpress
lsof -i tcp:8080 都是listen状态,都是打开的状态
(四)、docker-swarm有n个tomcat,如何负载均衡这ngetomcat
1、创建whoami-service:docker service create --name whoami -p 8080:8080 --network my-overlay-net -d jwilder/whoami
2、internal技术:负载均衡技术