MBP下的Docker管理

121 阅读6分钟

作为一个开发人员,作为生产力工具Mac总避免不了安装一些中间件,这时Docker就起到很大作用啦,不同的版本、不同的中间件,一条命令就可以了,实在太方便啦

Docker是一种容器化技术,可以在Mac上创建、部署和运行应用程序。它可以帮助开发人员在Mac上快速创建开发环境,同时也可以在生产环境中使用Docker容器来部署应用程序。Docker可以将应用程序打包成一个独立的容器,容器中包含了应用程序的所有依赖项和配置信息,这使得应用程序在不同的环境中运行时保持一致性,避免了因环境差异导致的问题。此外,Docker还可以帮助开发人员快速构建、测试和部署应用程序,提高了开发效率和应用程序的可移植性。

Docker配置

配置磁盘

image.png

配置镜像加速

通过配置文件设置

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
systemctl daemon-reload && systemctl restart docker

通过UI配置

  • 在任务栏点击 Docker for mac 应用图标 -> Perferences… -> Daemon -> Registry mirrors

image.png

Docker常用命令

# 查看镜像
docker images

# 查看容器
docker ps 
docker ps -a 

# 查看容器ID
docker ps -aq

# 进入容器
docker exec -it 容器id /bin/bash

# 查看docker详情,比如查看IP
docker inspect bfa5d203afe3

# 删除容器
docker rm 容器id

Docker安装中间件

部署zookeeper

docker pull zookeeper:3.8.0

docker run -d \
	--log-driver json-file \
	--log-opt max-size=100m \
	--log-opt max-file=2 \
	--name zookeeper \
	-p 2181:2181 \
	-v /etc/localtime:/etc/localtime \
	zookeeper:3.8.0
  • --restart=always 是否启动docker时自动重启容器

部署kafka

docker run -d \
	--log-driver json-file \
	--log-opt max-size=100m \
	--log-opt max-file=2 \
	--name kafka \
	-p 9092:9092 \
	-e KAFKA_BROKER_ID=0 \
	-e KAFKA_ZOOKEEPER_CONNECT=host.docker.internal:2181 \
	-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092 \
	-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
	-v /etc/localtime:/etc/localtime \
	wurstmeister/kafka:2.13-2.8.1

部署consul

# 运行实例
docker run -d -p 8500:8500 \
	--restart=always \
	--name=consul \
	consul:1.6.1 \
	-node=1 \
	-client='0.0.0.0' \
	agent -server -bootstrap -ui

说明

  • -node/-clieng/agent/-server/-bootstrap/-ui 要放在 镜像名称 之后
  • agent: 表示启动 Agent 进程。
  • server:表示启动 Consul Server 模式
  • client:表示启动 Consul Cilent 模式。
  • bootstrap:表示这个节点是 Server-Leader ,每个数据中心只能运行一台服务器。技术角度上讲 Leader 是通过 Raft 算法选举的,但是集群第一次启动时需要一个引导 Leader,在引导群集后,建议不要使用此标志。
  • ui:表示启动 Web UI 管理器,默认开放端口 8500,所以上面使用 Docker 命令把 8500 端口对外开放。
  • node:节点的名称,集群中必须是唯一的,默认是该节点的主机名。
  • client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0
  • join:表示加入到某一个集群中去。 如:-json=192.168.0.11

部署redis

docker pull redis:7.0.4

docker run -itd \
	--name redis \
	-p 6379:6379 \
	redis:7.0.4

部署nginx

# 1 在宿主机创建相关文件夹
mkdir -p /opt/docker/nginx/conf
mkdir -p /opt/docker/nginx/conf.d
mkdir -p /opt/docker/nginx/html
mkdir -p /opt/docker/nginx/logs

# 2 添加nginx配置文件 
docker run --name nginx -p 9080:80 -d nginx:1.23.1
docker cp nginx:/etc/nginx/conf.d/default.conf  /opt/docker/nginx/conf.d
docker cp nginx:/etc/nginx/nginx.conf  /opt/docker/nginx/conf
docker stop nginx
docker rm nginx

# 3 mac还要将/opt/docker添加到share

# 4 运行容器
docker run -itd --name nginx \
-p 9080:80 -p 9003:9003 -p 9103:9103 -p 9100:9100  \
-p 9081:9081 \
-v /opt/docker/nginx/logs:/var/log/nginx \
-v /opt/docker/nginx/conf.d:/etc/nginx/conf.d \
-v /opt/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/docker/nginx/html:/usr/share/nginx/html \
-e TZ="Asia/Shanghai" \
nginx:1.23.1
 
--privileged  是添加启动的权限
--net=host -itd 启用docker网络模式为host,就是使用宿主机的网络  使用docker run时使用–net=host指定docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip就是宿主机ip
-v 冒号前面是宿主机的配置文件目录 冒号后面是容器内部的目录



docker exec nginx nginx -t
docker exec nginx nginx -s reload

说明:

  • --name nginx-test:容器名称。
  • -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
  • -d nginx: 设置容器在在后台一直运行。

部署elasticsearch

# 下载镜像
docker pull elasticsearch:7.8.1

# 创建目录
mkdir -p /opt/docker/elasticsearch/7.8.1/plugins
mkdir -p /opt/docker/elasticsearch/7.8.1/config
mkdir -p /opt/docker/elasticsearch/7.8.1/data

docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch \
	-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
	elasticsearch:7.8.1
	

说明:如果您在本地运行 Elasticsearch(单个节点)或仅在云上使用单个节点,则只需在启动时加上"discovery.type=single-node" 即可,以避免生产检查,命令如下

# 启动7.8.1版本
docker run -d -p 9200:9200 -p 9300:9300 --name es \
	-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
	-e "discovery.type=single-node" \
	-e "transport.host: 0.0.0.0" \
	-v /opt/docker/elasticsearch/7.8.1/plugins:/usr/share/elasticsearch/plugins \
	-v /opt/docker/elasticsearch/7.8.1/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
	-v /opt/docker/elasticsearch/7.8.1/data:/usr/share/elasticsearch/data \
	-v /opt/docker/elasticsearch/7.8.1/logs:/usr/share/elasticsearch/logs \
	elasticsearch:7.8.1

# 启动7.16.1版本
docker run -d -p 9200:9200 -p 9300:9300 --name es \
	-e ES_JAVA_OPTS="-Xms1g -Xmx1g" \
	-e "discovery.type=single-node" \
	-e "transport.host: 0.0.0.0" \
	-v /opt/docker/elasticsearch/7.16.1/plugins:/usr/share/elasticsearch/plugins \
	-v /opt/docker/elasticsearch/7.16.1/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
	-v /opt/docker/elasticsearch/7.16.1/data:/usr/share/elasticsearch/data \
	-v /opt/docker/elasticsearch/7.16.1/logs:/usr/share/elasticsearch/logs \
	elasticsearch:7.16.1

安装ik分词器

# 1、进入容器
docker exec -it es /bin/bash

# 2、进入目录
cd /usr/share/elasticsearch/bin

# 3、下载分词器
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.16.1/elasticsearch-analysis-ik-7.16.1.zip

./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/archive/refs/tags/v7.8.1.zip

# 4、重启
docker restart elasticsearch

部署xxl-job

docker pull xuxueli/xxl-job-admin:2.1.2
docker pull xuxueli/xxl-job-admin:2.2.0

docker run -d -p 8772:8080 -p 9999:9999 \
-e PARAMS="--spring.datasource.url=jdbc:mysql://host.docker.internal:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 \
--spring.datasource.username=xxl \
--spring.datasource.password=xxl \
--xxl.job.accessToken=1889c4be21b04f6f20c273abcfgdbf8f" \
-v /opt/docker/xxl-job-data/applogs:/data/applogs \
--name xxl-job-admin \
xuxueli/xxl-job-admin:2.2.0

部署nacos

docker run -d \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=数据库host \
-e MYSQL_SERVICE_PORT=数据库端口 \
-e MYSQL_SERVICE_USER=数据库用户名 \
-e MYSQL_SERVICE_PASSWORD=数据库密码 \
-e MYSQL_SERVICE_DB_NAME=数据库 \
-e MYSQL_SERVICE_DB_PARAM="autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai" \
-p 8848:8848 \
--restart=always \
--name nacos1.4.0 \
-v ~/work/nacos/standalone-logs/:/home/nacos/logs \
-v ~/work/nacos/init.d/:/home/nacos/init.d \
-v ~/work/nacos/conf/:/home/nacos/conf \
nacos/nacos-server:1.4.0

MacDocker容器中Nacos无法连接宿主机MySQL数据库 答:数据库host应该使用host.docker.internal;参考链接:

部署rabbitmq

docker pull rabbitmq:3.9.24
docker pull rabbitmq:3.9.24-management

docker run -d --name rabbitmq3.7.7 \
	-p 5672:5672 -p 15672:15672 \
	-v /opt/docker/rabbitmq/data:/var/lib/rabbitmq \
	--hostname rabbitmq \
	-e RABBITMQ_DEFAULT_VHOST=my_vhost  \
	-e RABBITMQ_DEFAULT_USER=admin \
	-e RABBITMQ_DEFAULT_PASS=admin \
	rabbitmq:3.9.24-management

可以用命令
	-v `pwd`/data:/var/lib/rabbitmq \
  • -d 后台运行容器;
  • --name 指定容器名;
  • -p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
  • -v 映射目录或文件;
  • --hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
  • -e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)

部署MySQL

docker run -d \
	-p 33061:3306 \
	-v /etc/localtime:/etc/localtime \
	-v /opt/docker/mysql/conf:/etc/mysql/mysql.conf.d \
	-v /opt/docker/mysql/log:/var/log/mysql \
	-v /opt/docker/mysql/data:/var/lib/mysql \
	-e MYSQL_ROOT_PASSWORD=root \
	--name mysql mysql:8.0.32
docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -Ddbname' < /opt/docker/nacos/conf/mysql-schema.sql

总结

Docker对Mac的作用是提供了一种便捷、高效的容器化解决方案,使得开发人员可以更加轻松地管理和部署应用程序。