docker-compose
#
docker-compose安装
官网地址//docs.docker.com/compose/install/
运行此命令以下载Docker Compose的当前稳定版本
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s
-
uname -m` -o /usr/local/bin/docker-compose
由于网络问题,常常安装不上,换成国内的
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
测试安装结果
docker-compose -v
docker-compose version 1.22.0, build 1719ceb
docker-compose基本使用
- mkdir -p /usr/local/docker/tomcat
- cd /usr/local/docker/tomcat
- vi docker-compose.yml
- version: ‘3’
services:
tomcat:restart: always
image: tomcat
container_name: tomcat
ports:
- 8080:8080
- systemctl start docker
- docker-compose up -d (后台运行)
- docker-compose logs tomcat (查看日志) docker-compose logs -f tomcat (监听)
docker-compose down (删除容器)
- 启动mysql
version: ‘3’
services:
mysql:restart: always
image: mysql:8.0.17
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: r9PRv1$JncnjWRbq
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
volumes:
- /usr/local/docker/mysql/data:/var/lib/mysql
- /usr/local/docker/mysql/conf/mysql:/etc/mysql
- /usr/local/docker/mysql/log:/var/log/mysql
- /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files/
第二种:
- 首先拉取镜像 docker pull mysql:5.7
- 运行容器 docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
- 查看mysql容器ID docker ps
将容器中mysql的配置拷贝到conf中,注意目录层级关系会影响docker-compose挂载的配置
mkdir -p /usr/local/docker/mysql/conf
docker cp ae2e8348e6ea:/etc/mysql /usr/local/docker/mysql/conf
删除容器 docker -rm -f ae2e8348e6ea 通过docker-compose的方式启动
version: ‘3’
services:
mysql:restart: always
image: mysql:5.7
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: r9PRv1$JncnjWRbq
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- /usr/local/docker/mysql/data:/var/lib/mysql
- /usr/local/docker/mysql/conf/mysql:/etc/mysql
- /usr/local/docker/mysql/log:/var/log/mysql
连接的时候出现错误 access denied for user ‘root’@’*****‘ (using password:YES)
解决办法:进入mysql容器,mysql -uroot -pxxxx.
use mysql;
GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ IDENTIFIED BY ‘你的root密码’;
flush privileges;
备份
docker exec -it mysql mysqldump -uroot -pr9PRv1$JncnjWRbq leyou > ./leyou.sql
- 启动gitlab ,首先下载镜像docker pull twang2218/gitlab-ce-zh ,这里下载的是汉化版
进入/usr/local/docker/gitlab目录,创建docker-compose.yml
version: '3'
services:
gitlab:
image: 'twang2218/gitlab-ce-zh'
restart: always
hostname: '192.168.0.184'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.0.184:3000'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 3000
ports:
- '3000:3000'
- '8443:443'
- '2222:22'
volumes:
- /usr/local/docker/gitlab/config:/etc/gitlab
- /usr/local/docker/gitlab/data:/var/opt/gitlab
- /usr/local/docker/gitlab/logs:/var/log/gitlab
gitlab配置免密登录,使用ssh.进入D:\Program Files\Git\usr\bin
打开cmd,执行ssh-keygen -t rsa -C “31346337@qq.com” 将邮箱替换成自己的gitlab登录邮箱
一路回车,生成后的路径
找到id_rsa.pub文件,打开它,这就是sha256加密后的
全选复制.
配置ssh.修改成git的ssh
#
就可以使用shh免密pull和push了.
启动nexus3.提前创建data, mkdir -p /docker/nexus/data, 并给与读写权限 chmod 777 data
version: ‘3.1’
services:
nexus:restart: always
image: sonatype/nexus3
container_name: nexus
ports:
- 8081:8081
volumes:
- /usr/local/docker/nexus/data:/nexus-data
启动docker registry(docker镜像仓库)
version: ‘3.1’
services:
registry:restart: always
image: registry
container_name: registry
ports:
- 5000:5000
volumes:
- /usr/local/docker/registry/data:/var/lib/registry
查看全部镜像 http://192.168.0.184:5000/v2/_catalog
配置客户端”insecure-registries”:[“192.168.0.184:5000”]
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://7lr4t6cd.mirror.aliyuncs.com"],
"insecure-registries":["192.168.0.184:5000"]
}
Docker开启远程API
vi /usr/lib/systemd/system/docker.service
需要修改的部分:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改后的部分:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
重启docker,使修改生效. systemctl daemon-reload systemctl restart docker
docker info 可以查看
开启防火墙的Docker构建端口 (查看端口开放情况 netstat -ntpl)
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload
开启防火墙systemctl start firewalld 防火墙开机启动systemctl enable firewalld
使用Maven构建Docker镜像.在应用的pom.xml文件中添加docker-maven-plugin的依赖
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker的maven插件,官网:https://github.com/spotify/docker‐maven‐plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>192.168.10.89:5000/${project.artifactId}:${project.version}</imageName>
<dockerHost>http://192.168.10.89:2375</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
- 启动nginx (需要提前创建nginx.conf配置文件及html/xx下面的静态文件)
每个静态资源文件夹都必须放在挂载的目录下(/usr/local/docker/nginx/html),不同的静态资源文件夹在nginx.conf中配置不同的server,将root指向各自具体的目录
version: '3.1'
services:
nginx:
restart: always
image: nginx
container_name: nginx
ports:
# 暴露监听的端口
- 80:80
volumes:
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
- ./logs:/var/log/nginx
最简默认配置
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
# 启动进程,通常设置成和 CPU 的数量相等
worker_processes 1;
events {
# epoll 是多路复用 IO(I/O Multiplexing) 中的一种方式
# 但是仅用于 linux2.6 以上内核,可以大大提高 nginx 的性能
use epoll;
# 单个后台 worker process 进程的最大并发链接数
worker_connections 1024;
}
http {
# 设定 mime 类型,类型由 mime.type 文件定义
include mime.types;
default_type application/octet-stream;
# sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
# 必须设为 on,如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 I/O 处理速度,降低系统的 uptime.
sendfile on;
# 连接超时时间
keepalive_timeout 65;
# 设定请求缓冲
client_header_buffer_size 2k;
# 配置虚拟主机 192.168.141.121
server {
# 监听的 IP 和端口,配置 192.168.141.121:80
listen 80;
# 虚拟主机名称这里配置 IP 地址
server_name 192.168.141.121;
# 所有的请求都以 / 开始,所有的请求都可以匹配此 location
location / {
# 使用 root 指令指定虚拟主机目录即网页存放目录
# 比如访问 http://ip/index.html 将找到 /usr/local/docker/nginx/html/html80/index.html
# 比如访问 http://ip/item/index.html 将找到 /usr/local/docker/nginx/html/html80/item/index.html
root /usr/share/nginx/html/html80;
# 指定欢迎页面,按从左到右顺序查找
index index.html index.htm;
}
}
# 配置虚拟主机 192.168.141.121
server {
listen 8080;
server_name 192.168.141.121;
location / {
root /usr/share/nginx/html/html8080;
index index.html index.htm;
}
}
}
启动redis高可用集群(一主两从三哨兵)
1.创建目录 mkdir /usr/local/docker/redis/sentinel
2.在redis目录创建 vi docker-compose.yml
version: '3.1'
services:
redis-master:
image: redis:5
ports:
- 6379:6379
restart: always
container_name: redis-master
command: redis-server --appendonly yes
volumes:
- ./data:/data
redis-slave-1:
image: redis:5
ports:
- 6380:6379
restart: always
container_name: redis-slave-1
command: redis-server --slaveof redis-master 6379 --appendonly yes
volumes:
- ./data:/data
links:
- redis-master
redis-slave-2:
image: redis:5
ports:
- 6381:6379
restart: always
container_name: redis-slave-2
command: redis-server --slaveof redis-master 6379 --appendonly yes
volumes:
- ./data:/data
links:
- redis-master
redis-sentinel-1:
build: sentinel
ports:
- 26379:26379
container_name: redis-sentinel-1
environment:
- SENTINEL_DOWN_AFTER=5000
- SENTINEL_FAILOVER=5000
links:
- redis-master
- redis-slave-1
- redis-slave-2
redis-sentinel-2:
build: sentinel
ports:
- 26380:26379
container_name: redis-sentinel-2
environment:
- SENTINEL_DOWN_AFTER=5000
- SENTINEL_FAILOVER=5000
links:
- redis-master
- redis-slave-1
- redis-slave-2
redis-sentinel-3:
build: sentinel
ports:
- 26381:26379
container_name: redis-sentinel-3
environment:
- SENTINEL_DOWN_AFTER=5000
- SENTINEL_FAILOVER=5000
links:
- redis-master
- redis-slave-1
- redis-slave-2
3.进入sentinel目录 创建 vi Dockerfile
FROM redis:5
MAINTAINER jiangli <31346337@qq.com>
EXPOSE 26379
ADD sentinel.conf /etc/redis/sentinel.conf
RUN chown redis:redis /etc/redis/sentinel.conf
ENV SENTINEL_QUORUM 2
ENV SENTINEL_DOWN_AFTER 30000
ENV SENTINEL_FAILOVER 180000
ENV SENTINEL_AUTH_PASS 31346337
COPY sentinel-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/sentinel-entrypoint.sh
ENTRYPOINT ["sentinel-entrypoint.sh"]
3.在sentinel目录 创建 vi sentinel.conf
port 26379
dir /tmp
sentinel monitor mymaster redis-master 6379 $SENTINEL_QUORUM
sentinel down-after-milliseconds mymaster $SENTINEL_DOWN_AFTER
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster $SENTINEL_AUTH_PASS
sentinel failover-timeout mymaster $SENTINEL_FAILOVER
在sentinel目录 创建 vi sentinel-entrypoint.sh
!/bin/sh
sed -i “s/\$SENTINEL_QUORUM/$SENTINEL_QUORUM/g” /etc/redis/sentinel.conf
sed -i “s/\$SENTINEL_DOWN_AFTER/$SENTINEL_DOWN_AFTER/g” /etc/redis/sentinel.conf
sed -i “s/\$SENTINEL_FAILOVER/$SENTINEL_FAILOVER/g” /etc/redis/sentinel.confexec docker-entrypoint.sh redis-server /etc/redis/sentinel.conf —sentinel
5.回到redis目录,执行 docker-compose up -d
验证集群是否成功.进入主容器写数据,进入从容器查(从容器没有写的权限)
查看日志 docker logs -f redis-sentinel-1 ,停掉redis-master, 观察日志,故障迁移
进入容器查看集群是否成功 docker exec -it redis-sentinel-1 bash
连接客户端 redis-cli -p 26379, 查看redis主信息 sentinel master mymaster
查看从redis信息 sentinel slaves mymaster
启动rabbitmaq
version: ‘3.1’
services:
rabbitmq:restart: always
image: rabbitmq:management
container_name: rabbitmq
ports:
- 5672:5672
- 15672:15672
environment:
TZ: Asia/Shanghai
volumes:
- ./data:/var/lib/rabbitmq
启动mysql集群一主两从
- 首先拉取镜像 docker pull mysql:5.7
- 运行容器 docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
- 查看mysql容器ID docker ps
将容器中mysql的配置拷贝到主库的conf中,注意目录层级关系会影响docker-compose挂载的配置
mkdir -p /usr/local/docker/mysql/master/conf
docker cp ae2e8348e6ea:/etc/mysql /usr/local/docker/mysql/master/conf
- 删除mysql容器 docker rm -f ae2e8348e6ea (以上5步的作用是获取mysql的配置文件)
给从库拷贝配置, 两个从库,拷贝两份
cp -r /usr/local/docker/mysql/master /usr/local/docker/mysql/slave1
cp -r /usr/local/docker/mysql/master /usr/local/docker/mysql/slave2
修改配置文件.首先我们要知道容器中要加载的配置文件是/etc/mysql/mysql.conf.d/mysqld.cnf, 所以对应的我们要修改 vi /usr/local/docker/mysql/master(slave1和slave2)/conf/mysql/mysql.conf.d/mysqld.cnf ,主从3个配置文件
vi /usr/local/docker/mysql/master/conf/mysql/mysql.conf.d/mysqld.cnf
log-bin=mysql-bin
server_id=1
从库设置server_id不相同即可
vi /usr/local/docker/mysql/slave1/conf/mysql/mysql.conf.d/mysqld.cnf
server_id=2
vi /usr/local/docker/mysql/slave2/conf/mysql/mysql.conf.d/mysqld.cnf
server_id=3
编写docker-compose.yml. vi docker-compose.yml
version: '3'
services:
mysql-master:
restart: always
image: mysql:5.7
networks:
mysqlnet:
ipv4_address: 172.18.0.2
container_name: mysql-master
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- /usr/local/docker/mysql/master/data:/var/lib/mysql
- /usr/local/docker/mysql/master/conf/mysql:/etc/mysql
- /usr/local/docker/mysql/master/log:/var/log/mysql
mysql-slave1:
restart: always
image: mysql:5.7
networks:
mysqlnet:
ipv4_address: 172.18.0.3
container_name: mysql-slave1
ports:
- 3307:3306
depends_on:
- mysql-master
links:
- mysql-master
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- /usr/local/docker/mysql/slave1/data:/var/lib/mysql
- /usr/local/docker/mysql/slave1/conf/mysql:/etc/mysql
- /usr/local/docker/mysql/slave1/log:/var/log/mysql
mysql-slave2:
restart: always
image: mysql:5.7
networks:
mysqlnet:
ipv4_address: 172.18.0.4
container_name: mysql-slave2
ports:
- 3308:3306
depends_on:
- mysql-master
links:
- mysql-master
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- /usr/local/docker/mysql/slave2/data:/var/lib/mysql
- /usr/local/docker/mysql/slave2/conf/mysql:/etc/mysql
- /usr/local/docker/mysql/slave2/log:/var/log/mysql
networks:
mysqlnet:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.18.0.0/26
当前目录结构
,启动容器
docker-compose up -d
授权与配置主从
进入主容器
1.docker exec -it mysql-master /bin/bash
调用mysql-cli:
2.mysql -uroot -p123456
创建用户用于同步数据
3.create user ‘worker’@’%’ identified by ‘worker’;
为worker用户赋予 REPLICATION SLAVE 权限。
4.grant replication slave on . to ‘worker’@’%’;
刷新权限
5.FLUSH PRIVILEGES ;
查看 master 状态
6.show master status;
File和Position从库设置会用到
查看容器ip
docker inspect -f '{
{range .NetworkSettings.Networks}}{
{.IPAddress}}{
{end}}' mysql-master
与我们在docker-compose.yml中设置的一致
进入从容器
1.docker exec -it mysql-slave1 /bin/bash
调用mysql-cli:
2.mysql -uroot -p123456
将从节点挂载到主节点上
3.change master to master_host=’172.18.0.2’,master_port=3306,master_user=’worker’,master_password=’worker’,master_log_file=’mysql-bin.000001’,master_log_pos=154;
启动同步
4.START SLAVE;
查看同步状态
5.show slave status \G;
- Slave_IO_Running和Slave_SQL_Running都是Yes则设置成功
- 设置从库mysql-slave2,同mysql-slave1
用数据库管理工具连接主库进行测试
CREATE DATABASE test01;
USE test01;
DROP TABLE IF EXISTScourse
;
CREATE TABLEcourse
(`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`lesson_period` DOUBLE(5,0) DEFAULT NULL,
`score` DOUBLE(10,0) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
- 连接从库查看
在主库添加数据,在从库查看
- 启动elasticsearch+ik+head+kibana
修改系统参数 sudo vi /etc/sysctl.conf 文件最后添加一行
vm.max_map_count=262144
sudo sysctl -p
此参数是elasticsearch需要修改的值,如果不修改,在生产模式下elasticsearch会启动失败。
version: '3'
services:
elasticsearch:
restart: always
image: bolingcavalry/elasticsearch-with-ik:6.5.0
container_name: elasticsearch
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- http.cors.enabled=true
- http.cors.allow-origin=*
- "ES_JAVA_OPTS=-Xms256m -Xmx256m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata1:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
networks:
- esnet
head:
restart: always
image: bolingcavalry/elasticsearch-head:6
container_name: head
ports:
- 9100:9100
networks:
- esnet
kibana:
restart: always
image: docker.elastic.co/kibana/kibana-oss:6.1.4
container_name: kibana
networks:
- esnet
ports:
- 5601:5601
volumes:
esdata1:
driver: local
esdata2:
driver: local
networks:
esnet:
driver: bridge
需要开放9100.9200.9300.5601端口. 测试一下
curl -X PUT http://127.0.0.1:9200/test001
curl -X POST \
‘http://127.0.0.1:9200/test001/\_analyze?pretty=true‘ \
-H ‘Content-Type: application/json’ \
-d ‘{“text”:”我们是软件工程师”,”tokenizer”:”ik_smart”}‘
curl -X DELETE http://127.0.0.1:9200/test001
查看挂载的data放哪儿了? docker inspect -f “{ {.Mounts}}“ elasticsearch
启动mongo
version: ‘3’
services:image: mongo
container_name: mongo
restart: always
ports:
- 27017:27017
networks:
default:
ipv4_address: 172.18.0.9
environment:
TZ: Asia/Shanghai
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: 123456
volumes:
- mongodata:/data/db
command: --auth
volumes:
esdata:driver: local
mongodata:
networks:
default:external:
name: net
启动alibaba-sentinel
version: ‘3.1’
services:
sentinel:image: bladex/sentinel-dashboard
restart: always
container_name: sentinel
ports:
- 8858:8858
还没有评论,来说两句吧...