update docker

This commit is contained in:
super 2021-04-01 19:34:11 +08:00
parent 37f9b41838
commit a0a9245b66
7 changed files with 385 additions and 0 deletions

View File

@ -6,6 +6,8 @@
关于docker compose的安装请移步[docker compose安装与卸载](https://vuepress.mirror.docker-practice.com/compose/install/)或根据[docker官网](https://docs.docker.com/compose/install/)进行安装。
> 对于docker compose的学习推荐大家多看看一些项目的docker-compose.yml文件是怎么写的慢慢模仿着去写很多就越来越熟练清晰了。在[Compose文件夹]()下也在网上收集了一些docker-compose.yml文件欢迎大家一起来补充。
## 什么是docker compose
通过之前的介绍,我们知道使用一个 `Dockerfile` 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

View File

@ -0,0 +1,19 @@
```yaml
version: "3"
services:
elastic:
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
ports:
- "9200:9200"
- "9300:9300"
volumes:
- elastic-data:/data
environment:
- discovery.type=single-node
volumes:
elastic-data:
```

View File

@ -0,0 +1,73 @@
```yaml
version: '2.2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
```

View File

@ -0,0 +1,53 @@
```yaml
version: '2'
services:
etcd1:
image: quay.io/coreos/etcd:v3.1.13
restart: always
ports:
- 23791:2379
- 23801:2380
environment:
ETCD_NAME: infra1
ETCD_INITIAL_ADVERTISE_PEER_URLS: http://etcd1:2380
ETCD_INITIAL_CLUSTER: infra3=http://etcd3:2380,infra1=http://etcd1:2380,infra2=http://etcd2:2380
ETCD_INITIAL_CLUSTER_STATE: new
ETCD_INITIAL_CLUSTER_TOKEN: etcd-tasting-01
ETCD_LISTEN_CLIENT_URLS: http://etcd1:2379,http://localhost:2379
ETCD_LISTEN_PEER_URLS: http://etcd1:2380
ETCD_ADVERTISE_CLIENT_URLS: http://etcd1:2379
etcd2:
image: quay.io/coreos/etcd:v3.1.13
restart: always
ports:
- 23792:2379
- 23802:2380
environment:
ETCD_NAME: infra2
ETCD_INITIAL_ADVERTISE_PEER_URLS: http://etcd2:2380
ETCD_INITIAL_CLUSTER: infra3=http://etcd3:2380,infra1=http://etcd1:2380,infra2=http://etcd2:2380
ETCD_INITIAL_CLUSTER_STATE: new
ETCD_INITIAL_CLUSTER_TOKEN: etcd-tasting-01
ETCD_LISTEN_CLIENT_URLS: http://etcd2:2379,http://localhost:2379
ETCD_LISTEN_PEER_URLS: http://etcd2:2380
ETCD_ADVERTISE_CLIENT_URLS: http://etcd2:2379
etcd3:
image: quay.io/coreos/etcd:v3.1.13
restart: always
ports:
- 23793:2379
- 23803:2380
environment:
ETCD_NAME: infra3
ETCD_INITIAL_ADVERTISE_PEER_URLS: http://etcd3:2380
ETCD_INITIAL_CLUSTER: infra3=http://etcd3:2380,infra1=http://etcd1:2380,infra2=http://etcd2:2380
ETCD_INITIAL_CLUSTER_STATE: new
ETCD_INITIAL_CLUSTER_TOKEN: etcd-tasting-01
ETCD_LISTEN_CLIENT_URLS: http://etcd3:2379,http://localhost:2379
ETCD_LISTEN_PEER_URLS: http://etcd3:2380
ETCD_ADVERTISE_CLIENT_URLS: http://etcd3:2379
```

View File

@ -0,0 +1,177 @@
### 首先创建master结点的Dockerfile
在编写之前我们先要创建一个配置master的my.cnf配置文件
```
[mysqld]
log_bin = mysql-bin
server_id = 10
```
之后我们创建master结点的Dockerfile
```
FROM mysql:5.7
ADD ./master/my.cnf /etc/mysql/my.cnf
```
### 第二创建slave结点的Dockerfile
在编写之前我们先要创建一个配置slave结点my.cnf配置文件
```
[mysqld]
log_bin = mysql-bin
server_id = 11
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1
```
注意要修改server_id为不同值否则会发生错误之后我们创建slave结点的Dockerfile
```
FROM mysql:5.7
ADD ./slave/my.cnf /etc/mysql/my.cnf
```
### 最终的docker-compose.yml
我们创建这样一个目录结构
![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4gs1fzkpj30ko01gjrj.jpg)
其中master文件夹存放关于master结点的my.cnf和Dockerfileslave文件夹存放关于slave结点的my.cnf和Dockerfile。
```yaml
version: "3"
services:
db-master:
build:
context: ./
dockerfile: master/Dockerfile
restart: always
environment:
MYSQL_DATABASE: 'db'
# So you don't have to use root, but you can if you like
MYSQL_USER: 'user'
# You can use whatever password you like
MYSQL_PASSWORD: 'password'
# Password for root access
MYSQL_ROOT_PASSWORD: 'password'
ports:
# <Port exposed> : < MySQL Port running inside container>
- '3306:3306'
# Where our data will be persisted
volumes:
- my-db-master:/var/lib/mysql
networks:
- net-mysql
db-slave:
build:
context: ./
dockerfile: slave/Dockerfile
restart: always
environment:
MYSQL_DATABASE: 'db'
# So you don't have to use root, but you can if you like
MYSQL_USER: 'user'
# You can use whatever password you like
MYSQL_PASSWORD: 'password'
# Password for root access
MYSQL_ROOT_PASSWORD: 'password'
ports:
# <Port exposed> : < MySQL Port running inside container>
- '3307:3306'
# Where our data will be persisted
volumes:
- my-db-slave:/var/lib/mysql
networks:
- net-mysql
# Names our volume
volumes:
my-db-master:
my-db-slave:
networks:
net-mysql:
driver: bridge
```
现在我们就可以通过docker-compose来启动这两个结点了
```
docker-compose up -d
```
接下来我们就可以看到一些镜像的构建信息,当两个结点都启动之后我们来查看一下两个结点的状态
```
docker-compose ps -a
```
![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4gshmsx1j31p2050abw.jpg)
可以看到两个结点的状态已经是Up了并且主结点映射在宿主机的3306端口从结点映射在宿主机的3307端口。我们再来查看一下这两个结点的网络信息以便后续使用
```
docker network ls
```
![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4gsrjtcbj317w07g76l.jpg)
这个就是我们刚才创建的网络,刚才创建的两个结点也挂载在这个网络上,我们来查看一下详细信息
```
docker inspect 62fa5033ce48
```
![img](https://img-blog.csdnimg.cn/20200423215125125.png?x-oss-process=image%2Fwatermark%2Ctype_ZmFuZ3poZW5naGVpdGk%2Cshadow_10%2Ctext_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NfODQyNDk5NDY3%2Csize_16%2Ccolor_FFFFFF%2Ct_70)
这样我们就差看到来两个结点的具体IP地址因为Docker网络的配置两个连接到同一network的容器会直接相互连通。
### 主从配置
启动之后进入从结点
```
docker-compose exec db-slave bash
```
进入从结点mysql中
```
mysql -u root -p
```
在从结点上配置主节点信息,然后把当前结点设置为从结点。
```
mysql> CHANGE MASTER TO MASTER_HOST='192.168.64.3', MASTER_USER='root', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0;
Query OK, 0 rows affected, 2 warnings (0.11 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
```
正常情况我们应该创建一个用户然后赋予其相应的权限而不是将root用户配置给他.现在查看一下从结点的状态
```
mysql> show slave status\G;
```
![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4gtlb8g6j30k20c7wg5.jpg)
都显示为YES的话那么我们的主从配置已经成功现在我们在主节点创建一个test_db3数据库
![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4gtbc0vuj30lk0l0q4x.jpg)
然后切换到从结点,可以看到数据已经同步到从结点了
![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4gtsqnp5j307k08maah.jpg)
到这里一个简单的单主节点单从结点的MySQL架构已经搭建完毕。

View File

@ -0,0 +1,29 @@
```yaml
version: "3"
services:
rabbitmq:
image: rabbitmq:management
hostname: myrabbitmq
ports:
- "5672:5672"
- "15672:15672"
volumes:
- rabbitmq-data:/var/lib/rabbitmq
volumes:
rabbitmq-data:
```
查看服务状态
![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4gxru51ij31tm07e0ur.jpg)
确定服务正常启动后在浏览器输入网址[http://localhost:15672](http://localhost:15672/#/)进入RabbitMQ的登陆界面
![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4gy2a0irj309604cglp.jpg)
默认用户名密码都是guest。登陆之后就可以进入到主界面了
![](https://tva1.sinaimg.cn/large/008eGmZEly1gp4gyc2xe8j312m0j3whd.jpg)

View File

@ -0,0 +1,32 @@
```yaml
version: '2'
services:
proxy:
image: traefik
command: --api --docker --docker.domain=docker.localhost --logLevel=DEBUG
networks:
- apinetwork
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/etc/traefik/traefik.toml
networks:
apinetwork:
external:
name: fileserver
```
注意需要编写traefik.toml文件
```
defaultEntryPoints = ["http"]
insecureSkipVerify = true
[entryPoints]
[entryPoints.http]
address = ":80"
```