docker pull mysql:5.7
5.1.2 重命名镜像
# 重命名镜像
docker tag docker.io/mysql:5.7 mysql:5.7
# 删除镜像
docker rmi docker.io/mysql:5.7
5.1.3 启动MySQL镜像
# 启动镜像
docker run -itd --name mysql -p 8206:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
5.1.4 查看镜像启动状态
docker ps
5.1.5 进入MySQL数据库
# 进入docker 环境
docker exec -it mysql /bin/bash
# 使用数据库客户端
mysql -u root -h localhost -p123456
5.1.6 配置远程访问
5.1.6.1 开放防火墙
# 开放防火墙
firewall-cmd --zone=public --add-port=8206/tcp --permanent
# 防火墙生效
firewall-cmd --reload
5.1.6.2 设置账户远程访问
# 授予账户远程访问权限
grant all privileges on *.* to root@'%' identified by "123456";
flush privileges;
5.1.7 远程连接
5.1.8 修改MySQL密码
SET PASSWORD FOR 'root' = PASSWORD('H1997!');
5.2 docker搭建PXC集群
5.2.1 什么是PXC
# PXC是MySQL的高可用性和扩展性的解决方案,通俗来讲就是MySQL的集群方案
5.2.2 PXC集群的作用
# 实现数据库的节点实时同步,可以保证数据的一致性,保证数据同步(强一致性)
5.2.3 PXC集群和Replication集群
5.2.3.1 PXC集群的特点
● PXC实现了同步复制,复制数据是双向的,事务在所有的集群节点要么同时提交,要么不提交
● 多主机复制,可以在任何节点上提交数据
● 从( slave)服务器上的并行应用事件,真正的“并行复制”
● 如果设置有自增主键的话,数据不是按照+1的模式进行的,而是按照节点的数量进行递增
● Replication同步数据是单向的
● Replication在主节点写入, Slave分支读取,master无法读取数据,所以说Replication的每一个节点都不能同时读写
# 可以看到PXC的方案是双向的同步数据,任何的一个节点都可以进行读写
# PXC方案如下图所示:
5.2.3.4 Replication方案
# 可以看到Replication集群是通过一个Master的主节点进行写入数据,
# 用户通过Slave节点来读取数据的,数据只能够从Master节点像Slave节点同步
# 这样异步复制数据就会造成数据的不一致性
# Replication方案如下图所示:
5.2.4 PXC下载地址
# https://hub.docker.com/r/percona/percona-xtradb-cluster/
5.2.5 安装PXC集群
# 安装命令 5.7是版本号
docker pull percona/percona-xtradb-cluster:5.7
# 查看镜像是否下载成功,结果如下图所示:
docker images
# 可以看到pxc的名字很长,于是我们需要对名字进行重命名
docker tag docker.io/percona/percona-xtradb-cluster pxc
# 查询重命名的结果,如下图所示:
# 删除原来的镜像,命令如下:
docker rmi docker.io/percona/percona-xtradb-cluster
# 查询现在的镜像,如下图所示:
# 创建docker内部网络,网络的名字叫net1,IP地址是172.18.0.1,命令如下:
docker network create --subnet=172.18.0.1/24 net1
# 创建结果如下图所示:
# 查看创建的内部网络net1的信息,命令如下:
docker inspect net1
# net1的网络信息如下图所示:
# 删除net1的网段,命令如下:
docker network rm net1
# 删除结果如图所示:
# 创建docker卷(docker卷可以在宿主机上看的见)
docker volume create --name V1
# 查看创建的docker卷
docker inspect V1
# docker卷创建信息如下图所示:
5.2.6 PXC 集群的启动
# 经过上面的步骤我们已经成功的安装了pxc的镜像,docker内部网络net1
# docker卷V1,现在我们要做的就是启动PXC的容器
# 创建PXC容器,命令如下:
# 参数解释:
# -v是创建的docker卷
# MYSQL_ROOT_PASSWORD 是MySQL的密码
# CLUSTER_NAME 集群名称
# XTRABACKUP_PASSWORD 加入集群的密码
# privileged是设置权限
# name=node1 是启动的容器的名字
# net=net1 是加入的网络的名字
# ip 是指定的启动的IP
# pxc:5.7 是启动的镜像
docker run -d -p 3306:3306
-v v1:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=123456
--privileged
--name=node1
--net=net1
--ip 172.18.0.2 pxc:5.7
# 创建启动截图如下所示:
# 创建第二个pxc容器,(如果是MySQL8.0的就会出现SSL错误的情况)
# 出现SSL的情况就需要给docker卷最高权限,命令如下:
# 参考链接:https://juejin.cn/post/6850418107782004750#heading-11
# 创建命令如下:
# 参数解释:
# CLUSTER_JOIN 表示加入主节点为node1的集群
docker run -d -p 3307:3306
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=123456
-e CLUSTER_JOIN=node1
-v v2:/var/lib/mysql
--privileged
--name=node2
--net=net1
--ip 172.18.0.3 pxc:5.7
# 创建结果如下图所示:
# 查看docker容器的运行,命令如下:
docker ps -a
结果如下图所示:
5.2.7 PXC集群演示
# 安装完成后可通过本地的客户端工具进行连接,端口和IP都是宿主机的,连接演示如下:
● 要等到主节点也就是node1能通过主节点连接上在创建第二个节点
● 如果安装的是MySQL8.0就要注意SSL的问题,需要给docker卷足够的权限,不然第二个节点起不来
● 客户端连接的一定是宿主机的IP和端口,宿主机就是你的Linux系统
# docker下载redis镜像
docker pull redis
5.3.2 查看镜像
# docker 查看镜像
docker images
5.3.3 镜像重命名
# docker 镜像重命名
docker tag docker.io/redis redis
# 代码截图如下:
5.3.4 删除老的镜像
# 删除老的镜像
docker rmi docker.io/redis
# 删除代码如下图所示:
5.3.5 redis 服务启动
# 启动命令如下所示:
docker run -p 6379:6379 -d -it --name redis \
-v /home/data/redis:/var/lib/redis redis:latest \
redis-server --appendonly yes
# 命令解释
# -p 端口映射,docker的6379端口映射宿主机的6379端口
# -d 后台启动
# -v 将docker的/var/lib/redis目录映射到宿主机的/home/data/redis目录
# redis-server --appendonly yes 在容器执行redis-server启动命令,并打
# 开redis持久化配置
5.3.6 服务启动验证
# 查看正在运行的镜像
docker ps
5.3.7 reids的连接
# 连接进入redis, redis是名字
docker exec -it redis
5.3.8 连接redis客户端
docker exec -it 851c84650721 redis-cli
5.3.9 设置远程访问并设置密码
# 需要上传redis配置文件并且映射到docker容器
docker run -p 6379:6379 -d -it --name redis -v /etc/redis.conf:/etc/redis.conf -v /home/data/redis:/var/lib/redis redis:latest redis-server /etc/redis.conf --appendonly yes --requirepass "H123456"
# -v /etc/redis.conf:/etc/redis.conf 映射配置文件
# -v /home/data/redis:/var/lib/redis 映射数据目录
# --appendonly yes 数据持久化
# --requirepass 设置密码
# 远程访问需要注释掉 bind 127.0.0.1 -::1 或者 bind 127.0.0.1
# 还需修改protected-mode yes改为protected-mode no
5.3.10 redis.conf配置文件
# 下载地址
# http://download.redis.io/redis-stable/redis.conf
5.3.11 参考地址
# https://www.cnblogs.com/yqh0128/articles/14592910.html
5.4 docker 搭建 elasticsearch
5.4.1 下载镜像命令
docker pull elasticsearch:6.5.4
5.4.2 elasticsearch 重新命名
# 查看docker 镜像
docker images
# 重新命名容器
docker tag docker.io/elasticsearch:6.5.4 elasticsearch:6.5.4
# 删除容器
docker rmi docker.io/elasticsearch:6.5.4、
# 查看容器
docker images
5.4.3 elasticsearch 配置文件
# 启动配置文件为es-node1.yml
cluster.name: elasticsearch-cluster
node.name: es-node1
network.bind_host: 0.0.0.0
network.publish_host: 192.168.224.209
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["192.168.224.209:9300","192.168.224.209:9301","192.168.224.209:9302"]
discovery.zen.minimum_master_nodes: 2
# 配置文件es-node2.yml
cluster.name: elasticsearch-cluster
node.name: es-node2
network.bind_host: 0.0.0.0
network.publish_host: 192.168.224.209
http.port: 9201
transport.tcp.port: 9301
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["192.168.224.209:9300","192.168.224.209:9301","192.168.224.209:9302"]
discovery.zen.minimum_master_nodes: 2
# 配置文件es-node3.yml
cluster.name: elasticsearch-cluster
node.name: es-node3
network.bind_host: 0.0.0.0
network.publish_host: 192.168.224.209
http.port: 9202
transport.tcp.port: 9302
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["192.168.224.209:9300","192.168.224.209:9301","192.168.224.209:9302"]
discovery.zen.minimum_master_nodes: 2
5.4.4 配置文件说明
# cluster.name:用于标识一个集群,cluster.name 集群名字相同的所有节点自动
# 成一个集群。如果不配置改属性,默认值是:elasticsearch。
# node.name:节点名,默认随机指定一个name列表中名字。集群中node名字不能重复
# index.number_of_shards: 默认的配置是把索引分为5个分片
# index.number_of_replicas:设置每个index的默认的冗余备份的分片数,
# 默认是1
# network.publish_host:设置其它结点和该结点交互的ip地址,
# 如果不设置它会自动判断,值必须是个真实的ip地址
# network.bind_host: 设置可以访问的ip,可以是ipv4或ipv6的,
# 默认为0.0.0.0,这里全部设置通过
# http.port:设置对外服务的http端口,默认为9200
# transport.tcp.port: 设置节点之间交互的tcp端口,默认是9300
# http.cors.enabled: 是否允许跨域REST请求
# http.cors.allow-origin: 允许 REST 请求来自何处
# node.master: true 配置该结点有资格被选举为主结点(候选主结点),
# 用于处理请求和管理集群。如果结点没有资格成为主结点,那么该结点永远不可能
# 成为主结点;如果结点有资格成为主结点,只有在被其他候选主结点认可和被选举
# 为主结点之后,才真正成为主结点。
# node.data: true 配置该结点是数据结点,用于保存数据,执行数据相关的 *** 作
#(CRUD,Aggregation)
# discovery.zen.minimum_master_nodes: //自动发现master节点的最小数,
# 如果这个集群中配置进来的master节点少于这个数目,es的日志会一直报master
# 节点数目不足。(默认为1)为了避免脑裂,个数请遵从该公式 =>
# (totalnumber of master-eligible nodes / 2 + 1)。 *
# 脑裂是指在主备切换时,由于切换不彻底或其他原因,
# 导致客户端和Slave误以为出现两个active master,
# 最终使得整个集群处于混乱状态*
# discovery.zen.ping.unicast.hosts:集群个节点IP地址,
#也可以使用es-node等名称,需要各节点能够解析
5.4.5 启动docker容器
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 -v /etc/elasticsearch/config/es-node1.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/data/elasticsearch/node1:/usr/share/elasticsearch/data --name es-node1 elasticsearch:6.5.4
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9201:9201 -p 9301:9301 -v /etc/elasticsearch/config/es-node2.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/data/elasticsearch/node2:/usr/share/elasticsearch/data --name es-node2 elasticsearch:6.5.4
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9202:9202 -p 9302:9302 -v /etc/elasticsearch/config/es-node3.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/data/elasticsearch/node3:/usr/share/elasticsearch/data --name es-node3 elasticsearch:6.5.4
5.4.6 查看集群状态
# 访问地址
http://211.149.224.209:9200/_cat/nodes?pretty
5.4.7 安装elasticsearch-head 可视化es
# 下载镜像
docker pull mobz/elasticsearch-head:5-alpine
# 重命名镜像
docker tag docker.io/mobz/elasticsearch-head:5-alpine mobz/elasticsearch-head:5-alpine
# 删除老的镜像
docker rmi docker.io/mobz/elasticsearch-head:5-alpine
# 启动容器
docker run -d -p 9100:9100 --name es-manager mobz/elasticsearch-head:5-alpine
# 访问地址
http://211.149.224.209:9100/
# 访问es集群
5.5 docker 搭建 kibana
5.5.1 下载kibana命令
# 安装命令
docker pull kibana:6.5.4
5.5.2 kibana配置文件
server.name: kibana
server.host: "0"
#elasticsearch.hosts: [ "http://192.168.224.209:9200" ]
elasticsearch.url: "http://192.168.224.209:9200"
xpack.monitoring.ui.container.elasticsearch.enabled: true
5.5.3 启动kibana服务
# 启动kibana命令
# docker run -d --name=kibana -p 5601:5601 -e ELASTICSEARCH_URL=http://192.168.224.209:9200 kibana:6.5.4
docker run -d --name=kibana -p 5601:5601 -v /etc/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:6.5.4
5.5.4 验证服务
# 查看docker服务2状态
docker ps
# 页面访问地址
http://211.149.224.209:5601/app/kibana#/home?_g=()
5.6 docker 搭建 mongo
5.6.1 mongo镜像下载
docker pull mongo:latest
5.6.2 镜像重命名
# 镜像重新命名,重新命名为mongo
docker tag docker.io/mongo:latest mongo
5.6.3 启动mongo容器
# 启动命令如下:
docker run -itd -p 27017:27017 --name mongo mongo:latest --auth
# --auth 表示需要密码才能够进行访问
# 启动截图如下:
# 查看当前运行得容器
docker ps
5.6.4 连接进入容器
docker exec -it mongo mongo admin
5.6.5 创建用户
# 创建一个名为admin 密码为123456的用户
db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 尝试使用上面创建的用户信息进行连接
db.auth('admin','123456')
5.7 docker 开启远程访问
5.7.1 方式一
# 这是网上给的配置方法,也是这种简单配置让Docker Daemon把服务
# 暴露在tcp的2375端口上,这样就可以在网络上 *** 作Docker了。
# Docker本身没有身份认证的功能,只要网络上能访问到服务端口,
# 就可以 *** 作Docker。
vim /etc/default/docker
# 在文件中加入下面一句
DOCKER_OPTS="-H tcp://0.0.0.0:2375"
# 重启docker
systemctl restart docker
5.7.2 方式二
# 修改docker服务配置参数
vim /usr/lib/systemd/system/docker.service
# 修改如下:
ExecStart= ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
# 重启服务
systemctl daemon-reload
systemctl restart docker
5.7.3 方式三
下面修改daemon.json的配置
vim /etc/docker/daemon.json
# 修改配置文件
{
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
# 修改配置
systemctl daemon-reload
systemctl restart docker
5.7.4 测试是否配置成功
# 输入命令
docker -H tcp://192.168.91.128:2375 version
# 结果如下:
5.8 docker 部署 maven项目
5.8.1 本地工程启动正常
# 本次用来演示的是一个eureka注册中心,首先保证本地启动成功才能部署docker
# 访问地址 127.0.0.1:8220 如下图所示
5.8.2 pom文件修改
# 加入docker 部署插件
src/main/resources
true
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
1.8
UTF-8
true
D:\Program Files\Java\jdk1.8.0_201\bin\javac
org.springframework.boot
spring-boot-maven-plugin
2.3.7.RELEASE
com.dream.EurekaRegisterCenterApplication
repackage
repackage
com.spotify
docker-maven-plugin
1.0.0
http://192.168.91.128:2375
${docker.image.prefix}/${project.artifactId}
src/main/docker
/
${project.build.directory}
${project.build.finalName}.jar
eureka-register-center
1.8
UTF-8
UTF-8
dream
# 对于以上配置的说明
# 这是为了解决IDEA一直找不到JDK的问题
D:\Program Files\Java\jdk1.8.0_201\bin\javac
# 这是dockerFile文件的位置
src/main/docker
# 表示最后打成jar的名称,这个地方在dockerFile的时候会有影响
eureka-register-center
# Dokcerfile 文件内容
FROM java:8
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名eureka-register-center.jar
ADD eureka-register-center.jar eureka-register-center.jar
# 运行jar包
RUN bash -c 'touch /eureka-register-center.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom-","-jar","/eureka-register-center.jar"]
# Dockerfile 文件说明注意点
# 将jar包添加到容器中并更名为eureka-register-center.jar
# ADD eureka-register-center.jar eureka-register-center.jar
# 这里如果有了这个同时pom文件中写了eureka-register-center
# 这时候pom文件中的0.0.1-SNAPSHOT 就没有作用了
# 如果你写的是ADD eureka-register-center-0.0.1-SNAPSHOT.jar eureka-register-center.jar
# 就会出现异常
5.8.3 执行一键部署
# 在Dockerfile文件编写好之后,需要将镜像给推到docker服务上面
# 执行命令 mvn clean package docker:build -Dmaven.test.skip=true
# 此时我们来看服务器上的docker镜像
# docker images
5.8.4 启动容器
# 启动命令
docker run -p 8220:8220 dream/eureka-register-center:latest
# 命令说明 第一个8220是宿主机的端口,第二个8220是容器的端口
5.8.5 访问eureka地址
# http://192.168.91.128:8220/
# 结果如下图所示:
6、 Dockerfile 文件
6.1 Dockerfile 简介
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
6.2 Dockerfile 基本语法 FROM 指令:FROM指定基础镜像
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。
就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。
而 FROM 就是指定 基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
RUN指令:RUN指令是用来执行命令行命令的。RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:shell格式和exec格式
shell格式RUN指令如下:
RUN echo 'Hello, Docker!' > /usr/share/nginx/html/index.html
exec格式RUN指令如下:
FROM debian:stretch
RUN apt-get update
RUN apt-get install -y gcc libc6-dev make wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN mkdir -p /usr/src/redis
RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install
6.3 Dockerfile 构建镜像
# 在Dockerfile 文件目录执行,实例:
$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM nginx
---> e43d811ce2f4
Step 2 : RUN echo 'Hello, Docker!' > /usr/share/nginx/html/index.html
---> Running in 9cdc27646c7b
---> 44aa4490ce2c
Removing intermediate container 9cdc27646c7b
Successfully built 44aa4490ce2c
# 以上示例中我们使用了 docker build 命令对镜像进行构建
6.4 Dockerfile 构建镜像地注意点
构建Dockerfile镜像的时候会看到上面docker build 最后面有个点。 . 表示当前目录,但是这个当前目录不是指的 *** 作者现在所在的这个当前目录,而是指的是上下文的这目录。那么什么是上下文。下面看一下官方给的上下文例子。
如果在 Dockerfile 中这么写:
COPY ./package.json /app/
这并不是要复制执行 docker build 命令所在的目录下的 package.json,也不是复制 Dockerfile 所在目录下的 package.json,而是复制 上下文(context) 目录下的 package.json。
因此,COPY 这类指令中的源文件的路径都是相对路径。这也是初学者经常会问的为什么 COPY …/package.json /app 或者 COPY /opt/xxxx /app 无法工作的原因,因为这些路径已经超出了上下文的范围,Docker 引擎无法获得这些位置的文件。如果真的需要那些文件,应该将它们复制到上下文目录中去。
现在就可以理解刚才的命令 docker build -t nginx:v3 . 中的这个 .,实际上是在指定上下文的目录,docker build 命令会将该目录下的内容打包交给 Docker 引擎以帮助构建镜像。
如果观察 docker build 输出,我们其实已经看到了这个发送上下文的过程:
$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
# 直接用git仓库进行构建 (可以看出docker build 支持从URL构建)
docker build -t hello-world https://github.com/docker-library/hello-world.git#master:amd64/hello-world
# 用给定的压缩包构建
docker build http://server/context.tar.gz
如果所给出的 URL 不是个 Git repo,而是个 tar 压缩包,那么 Docker 引擎会下载这个包,并自动解压缩,以其作为上下文,开始构建。
6.6 Dockerfile 指令详解
# COPY 指令 (复制文件)
# COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
COPY package.json /usr/src/app/
# ADD 指令 更高级的复制文件(如果不需要解压文件就可以使用ADD指令)
# ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz
# CMD 容器启动命令
CMD 指令的格式和 RUN 相似,也是两种格式:shell格式和exec格式。
Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。
shell 格式:CMD <命令>
exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数
7、 docker-compose 基础
7.1 docker-compose 安装(centos7)
# 访问 https://docs.docker.com/compose/install/
# 下载命令
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 对二进制文件应用可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 注意:如果docker-compose安装后命令失败,请检查您的路径。您还可以/usr/bin在路径中创建指向或任何其他目录的符号链接。
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 完成安装,查看版本
docker-compose --version
7.2 docker-compose 几个术语
服务 (service) 一个应用容器,实际上可以运行多个相同镜像的实例。
项目 (project) 由一组关联的应用容器组成的一个完整业务单元。
可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。
7.3 docker-compose 几个常见指令
# 服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。可以随时在项目目录下运行 docker-compose build 来重新构建服务
docker-compose build
# 验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
docker-compose config
# down此命令将会停止 up 命令所启动的容器,并移除网络
docker-compose up
# 进入指定的容器
docker-compose exec
# 获得一个命令的帮助。
docker-compose help
# 列出 Compose 文件中包含的镜像。
docker-compose images
# 停止服务容器
docker-compose kill -s SIGINT
# 查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。
docker-compose logs [options] [SERVICE...]
# 暂停一个服务容器。
docker-compose pause [SERVICE...]
# 打印某个容器端口所映射的公共端口。
docker-compose port [options] SERVICE PRIVATE_PORT
选项:
--protocol=proto 指定端口协议,tcp(默认值)或者 udp。
--index=index 如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。
# 列出项目中目前的所有容器。
docker-compose ps
# 拉取镜像依赖
docker-compose pull 服务名称
# 推送服务依赖的镜像到 Docker 镜像仓库。
docker-compose push 服务名称
# 重启项目中的服务。
docker-compose restart 服务名称
# 删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
docker-compose rm 服务名称
7.4 docker-compse 的模板文件
# 容器名称 指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。
container_name
# depends_on 解决容器的依赖、启动先后的问题。以下例子中会先启动 redis db 再启动 web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
# 注意:web 服务不会等待 redis db 「完全启动」之后才启动。
# dns 自定义 DNS 服务器。可以是一个值,也可以是一个列表。
dns:
- 8.8.8.8
- 114.114.114.114
# env_file 从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。
如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。
env_file:
- ./common.env
- ./apps/web.env
# environment 设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
environment:
- RACK_ENV=development
- SESSION_SECRET
# expose 暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数
expose:
- "3000"
- "8000"
# image 镜像名称 指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
image: ubuntu
image: orchardup/postgresql
# logging 配置日志选项
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
# 目前支持三种日志类型
driver: "json-file"
driver: "syslog"
driver: "none"
# 配置日志相关参数
options:
max-size: "200k"
max-file: "10"
# network_mode 设置网络模式
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
# networks 配置容器连接的网络
version: "3"
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
# 暴露端口信息 使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。
# sysctls 配置系统内核参数
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
# ulimits 指定容器的 ulimits 限制值。
例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
# volumes 数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。
version: "3"
services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
# restart 指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always或者 unless-stopped。
restart: always
# privileged 允许容器中运行一些特权命令。
privileged: true
8、 docker-compose 部署常见服务
8.1 docker-compose 搭建 MySQL
version: '3'
services:
mysql:
image: mysql:5.7
restart: always
container_name: mysql
volumes:
- /home/data/mysql:/var/lib/mysql
- /home/logs/mysql:/var/log/mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=Hjc19970616
privileged: true
networks:
default:
external:
name: mysql_default
8.2 docker-compose 搭建Redis
version: '3'
services:
redis:
image: redis:latest
restart: always
container_name: redis
ports:
- 8210:6379
volumes:
- /etc/redis.conf:/etc/redis.conf
- /home/data/redis:/var/lib/redis
command: redis-server /etc/redis.conf --appendonly yes --requirepass "Hjc19970616"
privileged: true
networks:
default:
external:
name: bin_default
8.3 docker-compose 搭建mongo
version: '3'
services:
mongodb:
image: mongo:5.0
container_name: mongodb
volumes:
# ./data/db 数据库文件存放地址,根据需要修改为本地地址
- /home/data/mongodb:/home/data/mongodb
ports:
- 27017:27017
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: Hjc19970616
privileged: true
networks:
default:
external:
name: mysql_default
8.4 docker-compose 搭建single-es
version: '3'
services:
elasticsearch:
image: elasticsearch:6.8.17
container_name: elasticsearch
privileged: true
environment:
- xpack.security.enabled=false
- discovery.type=single-node
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
cap_add:
- IPC_LOCK
volumes:
- /home/data/elasticsearch/single:/home/data/elasticsearch/single
- /home/logs/elasticsearch/single:/home/logs/elasticsearch/single
ports:
- 9200:9200
- 9300:9300
kibana:
image: kibana:6.8.17
container_name: kibana
environment:
- SERVER_NAME=kibana
- ELASTICSEARCH_URL=http://elasticsearch:9200
- XPACK_MONITORING_ENABLED=true
ports:
- 5601:5601
depends_on:
- elasticsearch
networks:
default:
external:
name: mysql_default
8.5 docker-compose 搭建zookeeper
version: '3'
services:
zoo1:
image: zookeeper
restart: always
container_name: zoo1
hostname: zoo1
ports:
- 2181:2181
volumes:
- "/home/data/zookeeper/zoo1:/home/data/zookeeper/zoo1"
- "/home/logs/zookeeper/zoo1:/home/logs/zookeeper/zoo1"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181
privileged: true
zoo2:
image: zookeeper
restart: always
container_name: zoo2
hostname: zoo2
ports:
- 2182:2181
volumes:
- "/home/data/zookeeper/zoo2:/home/data/zookeeper/zoo2"
- "/home/logs/zookeeper/zoo2:/home/logs/zookeeper/zoo2"
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181
privileged: true
networks:
default:
external:
name: zookeeper_default
8.6 docker-compose 搭建kafka
version: '3'
services:
kafka1:
image: wurstmeister/kafka
restart: unless-stopped
container_name: kafka1
hostname: kafka1
ports:
- "9092:9092"
external_links:
- zoo1
- zoo2
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.3.84:9092 # 宿主机IP
KAFKA_ADVERTISED_HOST_NAME: kafka1
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181"
volumes:
- "/home/data/kafka/kafka1:/home/data/kafka/kafka1"
privileged: true
kafka2:
image: wurstmeister/kafka
restart: unless-stopped
container_name: kafka2
hostname: kafka2
ports:
- "9093:9092"
external_links:
- zoo1
- zoo2
environment:
KAFKA_BROKER_ID: 2
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.3.84:9093 # 宿主机IP
KAFKA_ADVERTISED_HOST_NAME: kafka2
KAFKA_ADVERTISED_PORT: 9093
KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181"
volumes:
- "/home/data/kafka/kafka2:/home/data/kafka/kafka2"
privileged: true
kafka-manager: # Kafka 图形管理界面
image: sheepkiller/kafka-manager:latest
restart: unless-stopped
container_name: kafka-manager
hostname: kafka-manager
ports:
- "9000:9000"
links: # 连接本compose文件创建的container
- kafka1
- kafka2
external_links: # 连接外部compose文件创建的container
- zoo1
- zoo2
environment:
ZK_HOSTS: zoo1:2181,zoo2:2181
KAFKA_BROKERS: kafka1:9092,kafka2:9093
networks:
default:
external:
name: zookeeper_default
8.7 docker-compose 搭建nps
version: '3'
services:
nps:
image: ffdfgdfg/nps
container_name: nps
restart: always
network_mode: "host"
volumes:
- /etc/nps:/conf
privileged: true
networks:
default:
external:
name: bin_default
8.8 docker-compose 搭建npc
version: '3'
services:
npc:
image: ffdfgdfg/npc
restart: always
container_name: npc
network_mode: "host"
command:
- -server
- req.alone-dream.cn:8224
- -vkey
- Hjc199706
privileged: true
networks:
default:
external:
name: mysql_default
8.9 docker-compose 搭建Nacos
version: '3'
services:
nacos:
image: nacos/nacos-server:latest
restart: always
container_name: nacos
environment:
# 如果支持主机名可以使用hostname,否则使用ip,默认也是ip
PREFER_HOST_MODE: hostname
# 数据源平台 仅支持mysql或不保存empty
SPRING_DATASOURCE_PLATFORM: mysql
MODE: standalone
MYSQL_SERVICE_HOST: mysql
MYSQL_SERVICE_DB_NAME: nacos_config
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_USER: root
MYSQL_SERVICE_PASSWORD: Hjc19970616
# NACOS_APPLICATION_PORT: 9999
JVM_XMS: 256m
JVM_MMS: 128m
# 设置挂载目录
volumes:
- /home/logs/nacos:/home/logs/nacos
ports:
- 8248:8848
privileged: true
networks:
default:
external:
name: bin_default
8.10 docker-compose 搭建portainer
version: '3'
services:
portainer:
image: portainer/portainer:1.24.1
container_name: portainer-manage
command: -H unix:///var/run/docker.sock
restart: always
ports:
- 8205:9000
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /portainer_data:/data
privileged: true
8.11 docker-compose 搭建DOClever
version: '3'
services:
DOClever:
image: lw96/doclever
restart: always
container_name: "DOClever"
ports:
- 8247:10000
volumes:
- /home/data/DOClever/file:/home/DOClever/data/file
- /home/data/DOClever/img:/home/data/DOClever/img
- /home/data/DOClever/tmp:/home/data/DOClever/tmp
environment:
- DB_HOST=mongodb://mongodb:27017/DOClever
# - MONGO_INITDB_ROOT_USERNAME=root
# - MONGO_INITDB_ROOT_PASSWORD=Hjc19970616
privileged: true
networks:
default:
external:
name: bin_default
欢迎关注我的微信公众号,更多内容将在微信公众号中发布:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)