docker 部署
docker命令
#info|version
docker info #显示docker的系统信息,包括镜像和容器的数量
docker version #显示docker的版本信息。
#帮助命令
docker 命令 --help #帮助命令
#镜像命令
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替
docker search #搜索镜像
docker pull #下载镜像 docker image pull
docker rmi #删除镜像 docker image rm
#容器命令
docker run 镜像id #新建容器并启动
docker ps 列出所有运行的容器 docker container list
docker rm 容器id #删除指定容器
#删除所有容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
#启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
#退出容器
exit #容器直接退出
ctrl +P +Q #容器不停止退出 ---注意:这个很有用的操作
#其他常用命令
docker run -d 镜像名 #后台启动命令
docker logs #查看日志
docker top 容器id #查看容器中进程信息ps
docker inspect 容器id #查看镜像的元数据
docker exec #进入当前容器后开启一个新的终端,可以在里面操作。(常用)
docker attach # 进入容器正在执行的终端
docker cp 容器id:容器内路径 主机目的路径 #从容器内拷贝到主机上
创建容器
docker run -id --name=容器名 --hostname=容器名 -p 8088:8088 --network mybridge 镜像名:版本
-p 暴露端口,可以暴露多个,用多个 -p 主机端口:容器端口
-network 将容器放在一个桥接网络里面,这个网络里面的容器可以互相通信
-e MYSQL_ROOT_PASSWORD=123456 数据库需要初始化密码
docker exec -it 容器名 /bin/bash # 进入容器里面
docker安装
1 安装工具
yum install -y yum-utils device-mapper-persistent-data lvm2
2 添加docker的yum库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
3 安装docker
yum install docker-ce docker-ce-cli containerd.io
4 启动
systemctl start docker
systemctl enable docker
5 查看
docker -v
systemctl status docker
6 开启Docker远程访问
vim /lib/systemd/system/docker.service
找到[Service] 节点的ExecStart这一行,修改成下面,端口号最好改成其他的,不然容易被人拿去挖矿
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:4399
ExecStart该行注释 将端口改成4399 重启
systemctl daemon-reload
systemctl restart docker
访问 http://ip:2375/version是否成功,如果访问不成功可以开放防火墙的4399端口
firewall-cmd --zone=public --add-port=4399/tcp --permanent
firewall-cmd --reload
jdk
1 Dockerfile
FROM centos:7
MAINTAINER whh
WORKDIR /usr/local
RUN mkdir /usr/local/java
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
2 将 Dockerfile 和 jdk-8u171-linux-x64.tar.gz一起上传
3 创建镜像
docker build -t="jdk:1.8" ./ # jdk的jar包和Dockerfile 在同一个文件夹下,在这个文件夹下运行命令
数据库
1 导入数据库镜像,可以不导入,在运行时自动导入
docker pull mysql:8.0
docker network create -d bridge mybridge
2 启动mysql,如果本地没有mysql:8.0会先自动导入
docker run -id --name=mysql8 --hostname=mysql8 -p 3306:3306 --network mybridge -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
redis
1 创建容器
docker run -id --name redis --hostname redis -p 6379:6379 redis --requirepass "123456"
2 创建容器
docker run -id --name redis --hostname redis -p 6379:6379 -v /usr/local/src/redis/data:/data -v /usr/local/src/redis/conf/redis.conf:/etc/redis/redis.conf redis-server /etc/redis/redis.conf \
redis:bullseye --requirepass "123456"
rocketmq
1 文件夹
1 创关联目录
mkdir -p /usr/local/src/rocketmq/data/namesrv/logs /usr/local/src/rocketmq/data/namesrv/store /usr/local/src/rocketmq/conf /usr/local/src/rocketmq/data/broker/logs /usr/local/src/rocketmq/data/broker/store
2 创建配置文件
cd /usr/local/src/rocketmq/conf
touch broker.conf
3 编辑配置文件
vim broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1 = 8.137.115.224
4 拉取镜像
docker pull rocketmqinc/rocketmq:4.4.0
docker pull styletang/rocketmq-console-ng
1 nameserver
docker run -id --network=mybridge -p 9876:9876 -v /usr/local/src/rocketmq/data/namesrv/logs:/root/logs -v /usr/local/src/rocketmq/data/namesrv/store:/root/store --name rmqnamesrv -e "MAX_POSSIBLE_HEAP=100000000" rocketmqinc/rocketmq:4.4.0 sh mqnamesrv
2 broker
docker run -id --network=mybridge -p 10911:10911 -p 10909:10909 -v /usr/local/src/rocketmq/data/broker/logs:/root/logs -v /usr/local/src/rocketmq/data/broker/store:/root/store -v /usr/local/src/rocketmq/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf --name rmqbroker --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" rocketmqinc/rocketmq:4.4.0 sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf
3 可视化工具
docker run -id --name rmqconsole --network=mybridge -p 9877:8080 --link rmqnamesrv:namesrv -e "JAVA_OPTS=-Drocketmq.namesrv.addr=namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -t styletang/rocketmq-console-ng
Fastdfs
1 拉取镜像
docker pull delron/fastdfs
2 创建Tracker服务
# 先创建文件夹
mkdir -p /usr/local/src/fastdfs/data/tracker
# 执行docker命令
docker run -id --name fdfstracker --hostname fdfstracker -p 22122:22122 --network=mybridge -v /usr/local/src/fastdfs/data/tracker:/var/fdfs delron/fastdfs tracker
# 注意:tracker服务默认的端口为22122
3 构建构建Storage服务
# 创建文件夹
mkdir -p /usr/local/src/fastdfs/data/storage
# 执行命令
docker run -id --name fdfsstorage --hostname fdfsstorage --network=mybridge -e TRACKER_SERVER=localhost:22122 -v /usr/local/src/fastdfs/data/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage
# 注意:其中TRACKER_SERVER中的ip要修改为你的Tracker服务所在的服务IP地址
RabbitMQ
docker run \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=123456 \
--name rabbitmq\
--hostname rabbitmq\
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3-management
es
docker pull elasticsearch:7.12.1
# 创建文件夹
mkdir -p /usr/local/src/es/data
mkdir -p /usr/local/src/es/plugins
docker run -id --name es --hostname es -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -e "discovery.type=single-node" --privileged --network mybridge -p 9200:9200 -p 9300:9300 -t elasticsearch:8.0.1
kibana
docker pull kibana:7.12.1
docker run -id --name kibana --hostname kibana --link elasticsearch:elasticsearch -e "I18N_LOCALE=zh-CN" -p 5601:5601 --network mybridge kibana:7.12.1
nacos
docker pull nacos/nacos-server
# 启动
docker run --name nacos --hostname nacos -d -p 8848:8848 --network mybridge -e MODE=standalone nacos/nacos-server
后端
1 在pom.xml 里面导入依赖
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!--镜像名 car:1.0-->
<imageName>permission:01</imageName>
<!--基础镜像-->
<baseImage>jdk:1.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>
<!--docker远程主机-->
<dockerHost>http://hwy:4399</dockerHost>
</configuration>
</plugin>
2 打包 成镜像
mvn clean package -Dmaven.test.skip=true docker:build
3 上传到服务器
4 创建桥接
docker network create -d bridge mybridge
5 启动镜像
docker run -id --name=permission_api --hostname=permission_api -p8080:8080 --network mybridge permissionsys:01
前端
1 打包
直接用npm run build 打包 ,将打包好的stac和index.html 一起打包,先打成 tar 包,再打成 gz 包 最后文件名变成
permissionweb.tar.gz 这种后缀的文件,然后添加 nginx.conf 和 Dockerfile 文件,
Dockerfile
FROM nginx:1.15
RUN mkdir /usr/share/nginx/permission_web
ADD ./permissionweb.tar.gz /usr/share/nginx/permission_web
ADD ./nginx.conf /etc/nginx/conf.d/
WORKDIR /usr/share/nginx
RUN chmod -R a+rx * permission_web
nginx.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/permission_web;
index index.html;
}
}
server {
listen 8088;
server_name localhost;
location / {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' '*';
add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,token,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' '*';
add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,token,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
proxy_pass http://permission_api:8080; #这里跟后端服务的link名字
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 5;
}
}
2 将这三个文件一起上传到服务器
3 创建镜像
# 必须在同一个文件目录下 这个 01 是版本
docker build -t="permission:01" ./
4 启动镜像,创建容器
# 这里要暴露两个端口 80 默认端口 8088 前段请求接口
docker run -id --name=permission_web -p 80:80 -p 8088:8088 --network mybridge permission-web:01
4 进入容器
docker exec -it 容器名 /bin/bash