Docker

Docker-相关书籍

Docker-资源

Mac OS安装Docker

CentOS安装Docker

Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
Docker CE 分为 stable testnightly 三个更新频道。
官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 CentOS上的安装。
Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。
docker-ce为社区免费版本。稍等片刻,docker即可安装成功。

安装

  1. yum 包更新到最新yum update
  2. 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
    yum install -y yum-utils device-mapper-persistent-data lvm2
  3. 设置yum源yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
    yum makecache fast
  4. 安装docker,出现输入的界面都按 y yum install -y docker-ce
  5. 查看docker版本,验证是否验证成功docker -v

卸载

如果之前安装过旧版本的Docker,可以使用下面命令卸载:
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine docker-ce

启动docker

Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
启动docker前,一定要关闭防火墙后!!

关闭防火墙systemctl stop firewalld
禁止开机启动防火墙 systemctl disable firewalld
启动dockersystemctl start docker
查看版本docker -v

配置镜像加速

docker官方镜像仓库网速较差,我们需要设置国内镜像服务:

参考阿里云的镜像加速文档

阿里云查询镜像连接

Docker 国内镜像
阿里云的加速器:https://help.aliyun.com/document_detail/60750.html
网易加速器:http://hub-mirror.c.163.com
官方中国加速器:https://registry.docker-cn.com
ustc 的镜像:https://docker.mirrors.ustc.edu.cn
daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://bhhj3hr0.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

查看文件cat /etc/docker/daemon.json

Docker配置数据卷和数据卷容器

配置数据卷

docker run ... –v 宿主机目录(文件):容器内目录(文件) ...

注意事项:

  1. 目录必须是绝对路径
  2. 如果目录不存在,会自动创建
  3. 可以挂载多个数据卷

演示持久化:

  1. 创建容器和数据卷,将宿主机的数据券/root/data 与 容器的目录 /root/data_container 挂载
    docker run -it --name c1 -v /root/data:/root/data_container centos:7 /bin/bash
  2. 宿主机/root/data下创建文件,容器中/root/data_container会同步
    touch zhangxin.txt
  3. 反之亦如此/root/data_container下,宿主机/root/data会同步
    echo zhangxin > zhangxin2.txt
  4. 重新建立容器并挂载保留的数据卷
    docker run -it –name c2 -v ~/data:/root/data_con centos:7

挂载多个:

docker run -it --name c4 \
-v ~/data2:/root/data2 \
-v ~/data3:/root/data3 \
centos:7

两个容器挂载同一个数据卷:

docker run -it --name c5 -v ~/data:/root/data centos:7
docker run -it --name c6 -v ~/data:/root/data centos:7

配置数据卷容器

创建启动c3数据卷容器,使用 –v 参数 设置数据卷
docker run –it --name c3 –v /volume centos:7 /bin/bash

创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷
docker run –it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run –it --name=c2 --volumes-from c3 centos:7 /bin/bash

案例:执行完之后三个容器挂载在宿主机同一个数据卷下,
比如:/var/lib/docker/volumes/06f881244d61ebd6e36992c8186fc944ba4f609d966b8668d7522710e6ed3c7e/_data
docker run -it --name c3 -v /volume centos:7
docker run -it --name c1 --volumes-from c3 centos:7
docker run -it --name c2 --volumes-from c3 centos:7

Docker镜像制作

容器转为镜像流程
docker commit 容器id 镜像名称:版本号
docker save -o 压缩文件名称 镜像名称:版本号
docker load –i 压缩文件名称

Docker镜像仓库

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。

官网地址 https://hub.docker.com/_/registry

简化版镜像仓库

Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。

搭建方式比较简单,命令如下:

docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry

命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。

访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像

带有图形化界面版本

使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=传智教育私有仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry

配置Docker信任地址

我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

  1. 打开要修改的文件vi /etc/docker/daemon.json
  2. 添加内容: "insecure-registries":["http://192.168.150.101:8080"]
  3. 重加载 systemctl daemon-reload
  4. 重启docker systemctl restart docker docker start registry

将镜像上传至私有仓库

  1. 标记镜像为私有仓库的镜像 docker tag centos:7 私有仓库服务器IP:5000/centos:7
  2. 上传标记的镜像 docker push 私有仓库服务器IP:5000/centos:7

从私有仓库拉取镜像

docker pull 私有仓库服务器ip:5000/centos:7

Dockerfile

Dockerfile关键字

关键字 作用 备注
FROM 指定父镜像 指定dockerfile基于那个image构建
MAINTAINER 作者信息 用来标明这个dockerfile谁写的
LABEL 标签 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看
RUN 执行命令 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,”param2”]
CMD 容器启动命令 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,”param2”]
ENTRYPOINT 入口 一般在制作一些执行就关闭的容器中会使用
COPY 复制文件 build的时候复制文件到image中
ADD 添加文件 build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务
ENV 环境变量 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value
ARG 构建参数 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数
VOLUME 定义外部可以挂载的数据卷 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]
EXPOSE 暴露端口 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工作目录 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径
USER 指定执行用户 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK 健康检查 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制
ONBUILD 触发器 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大
STOPSIGNAL 发送信号量到宿主机 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL 指定执行脚本的shell 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shellDocker 应用部署

Dockerfile 案例

案例一

需求:自定义centos7镜像。要求: 1. 默认登录路径为 /usr 2. 可以使用vim

实现步骤:
① 定义父镜像:FROM centos:7
② 定义作者信息:MAINTAINER itheima itheima@itcast.cn
③ 执行安装vim命令: RUN yum install -y vim
④ 定义默认的工作目录:WORKDIR /usr
⑤ 定义容器启动执行的命令:CMD /bin/bash
⑥ 通过dockerfile构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本

案例二

需求:定义dockerfile,发布springboot项目

实现步骤:

① 定义父镜像:FROM java:8
② 定义作者信息:MAINTAINER itheima itheima@itcast.cn
③ 将jar包添加到容器: ADD springboot.jar app.jar
④ 定义容器启动执行的命令:CMD java–jar app.jar
⑤ 通过dockerfile构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本
定义dockerfile,发布springboot项目

FROM java:8
MAINTAINER zhangxin <1205362172@qq.com>
ADD springboot.jar app.jar
CMD java–jar app.jar
docker build -f ./springboot_dockerfile -t app . 

Docker-Compose

参考文章:https://www.runoob.com/docker/docker-compose.html

安装Docker Compose

# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。 
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version

1、换源:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2、更改权限:
chmod +x /usr/local/bin/docker-compose

3、查看版本:
docker-compose --version

4. 创建软链
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

如果下载速度较慢,或者下载失败,可以使用课前资料提供的docker-compose文件:

上传到/usr/local/bin/目录也可以。

Base自动补全命令

# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果这里出现错误,需要修改自己的hosts文件:

echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

卸载Docker Compose

# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose

编排nginx+springboot项目

  1. 创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
  1. 编写 docker-compose.yml 文件
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
  1. 创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
  1. 在./nginx/conf.d目录下 编写itheima.conf文件
server {
listen 80;
access_log off;

location / {
proxy_pass http://app:8080;
}

}
  1. 在~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up
  1. 测试访问
http://192.168.149.135/hello

Dcoker部署应用

Docker创建自定义网络

(用于容器之间的通信 common-network 是网络名称 可改)

docker network create common-network 创建自定义网络(用于容器之间的通信 common-network 是网络名称 可改)

docker network ls 查看网络

docker network rm 名称 删除自定义网络

Docker部署CentOS

mkdir ~/centos/root
cd ~/centos

docker run -id \
--name=centos \
-p 12345:12345 \
-v $PWD/root:/root \
centos

Docker部署MySQL

  1. 创建数据卷目录mkdir ~/mysql cd ~/mysql

  2. 创建自定义网络common-network

  3. 自动拉取镜像并启动容器

    docker run -id \
    -p 3306:3306 \
    --name=mysql \
    --network common-network \
    --restart=always \
    -e TZ=Asia/Shanghai \
    -v $PWD/conf:/etc/mysql/conf.d \
    -v $PWD/logs:/logs \
    -v $PWD/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    mysql:5.6

    参数说明:

    • -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
    • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
    • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
    • -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
    • -e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码为root。
  4. 进入容器,操作mysql
    docker exec -it mysql /bin/bash
    mysql -uroot -proot

  5. 使用外部机器连接容器中的mysql

Docker部署Nginx

  1. 创建数据卷目录
    mkdir -p ~/nginx/conf
    mkdir -p ~/nginx/conf/conf.d
    cd ~/nginx/conf

  2. conf目录下创建nginx.conf文件

    vim nginx.conf

    user  nginx;
    worker_processes 1;

    error_log /var/log/nginx/error.log warn;
    pid /var/run/nginx.pid;

    events {
    worker_connections 1024;
    }

    http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    #tcp_nopush on;

    keepalive_timeout 65;

    #gzip on;

    include /etc/nginx/conf.d/*.conf;
    }
  3. conf.d目录下

    vim default.conf

    server {
    listen 443;
    server_name 101.43.123.47
    root html;
    index index.html index.htm;

    # 定义首页索引目录和名称
    location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
    }

    }
  4. nginx目录下

    docker run -id \
    --name=nginx \
    --restart=always \
    -p 80:80 \
    -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v $PWD/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
    -v $PWD/logs:/var/log/nginx \
    -v $PWD/html:/usr/share/nginx/html \
    nginx

    参数说明:

    • -p 80:80:将容器的 80端口映射到宿主机的 80 端口。
    • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录
    • -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录
  5. 使用外部机器访问nginx

Docker部署Tomcat

  1. 创建数据卷目录 mkdir ~/tomcat cd ~/tomcat

  2. 自动拉取镜像并启动容器

    docker run -id \
    --name=tomcat \
    -p 8080:8080 \
    -e TZ="Asia/Shanghai" \
    --privileged=true \
    -v $PWD/webapps:/usr/local/tomcat/webapps \
    -v $PWD/logs:/mnt/applog \
    tomcat

    参数说明:

    • -p 8080:8080:将容器的8080端口映射到主机的8080端口
    • -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps
  3. 使用外部机器访问tomcat

Docker部署Redis

  1. 自动拉取镜像并启动容器

    docker run -id \
    --name=c_redis \
    -p 6379:6379 \
    redis:5.0
  2. 使用外部机器连接redis

    ./redis-cli.exe -h 192.168.149.135 -p 6379

Docker部署Wordpress

  1. 创建目录 mkdir ~/wordpress

  2. 部署MySQL
    mkdir ~/wordpress/mysql
    cd ~/wordpress/mysql

    docker run -id \
    -p 3307:3306 \
    --name=mysql4WP \
    --network common-network \
    --restart=always \
    -e TZ=Asia/Shanghai \
    -v $PWD/conf:/etc/mysql/conf.d \
    -v $PWD/logs:/logs \
    -v $PWD/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    mysql:5.6

    创建数据库wordpress

  3. 自动拉取镜像并启动容器

    docker run -d --name wordpress \
    -e TZ="Asia/Shanghai" \
    -e WORDPRESS_DB_HOST=101.43.123.47:3307 \
    -e WORDPRESS_DB_USER=root \
    -e WORDPRESS_DB_PASSWORD=root \
    -e WORDPRESS_DB_NAME=wordpress \
    -v ~/wordpress/www:/var/www/html \
    -p 1080:80 \
    --restart=always \
    wordpress

    参数说明:

    • WORDPRESS_DB_HOST:mysql的IP+端口
    • WORDPRESS_DB_USER:mysq用户名
    • WORDPRESS_DB_PASSWORD:mysql密码
    • WORDPRESS_DB_NAME:数据库名,默认是wordpress
    • -p 1080:80 是指宿主机的1080端口映射容器的80端口,容器内端口80不要修改
    • restart=always 随docker的启动而启动
  4. 运行完可以查看日志 docker logs --tail 10 wordpress | grep info

  5. 打开地址安装:https://www.zhangxin.cloud/wp-admin/setup-config.php

  6. 后台管理地址 http://127.0.0.1:80/wp-admin

Docker-Composs部署Wordpress

  1. 创建挂载目录

    注意:若挂载的为文件夹,则不需要,在执行命令时会自动创建,但是要是挂载文件,必须要提前准备

    mkdir -p ~/nginx/data
    mkdir -p ~/nginx/config/conf.d
    mkdir -p ~/nginx/logs
    mkdir -p ~/nginx/ssl
    touch ~/nginx/config/nginx.conf
    touch ~/nginx/config/conf.d/default.conf

    mkdir -p ~/wordpress/html
    mkdir -p ~/mysql
  2. wordpress目录下添加

    version: '3'
    services:
    mysql:
    image: mysql
    container_name: mysql
    ports:
    - '3306:3306'
    volumes:
    - ./mysql:/var/lib/mysql
    environment:
    - MYSQL_ROOT_PASSWORD=7963zxv!
    - MYSQL_DATABASE=wordpress
    - MYSQL_USER=wordpress
    - MYSQL_PASSWORD=7963zxv!
    networks:
    - backend
    restart: always

    wordpress:
    depends_on:
    - mysql
    image: wordpress
    container_name: wordpress
    ports:
    - '9000:80'
    volumes:
    - ./wordpress/html:/var/www/html
    environment:
    - WORDPRESS_DB_NAME=wordpress
    - WORDPRESS_TABLE_PREFIX=wp_
    - WORDPRESS_DB_HOST=mysql:3306
    - WORDPRESS_DB_USER=wordpress
    - WORDPRESS_DB_PASSWORD=7963zxv!
    links:
    - mysql
    networks:
    - backend
    - frontend
    restart: always

    nginx:
    image: nginx
    container_name: nginx
    ports:
    - '80:80'
    - "443:443"
    volumes:
    - ./nginx/data:/usr/share/nginx/html
    - ./nginx/config/nginx.conf:/etc/nginx/nginx.conf
    - ./nginx/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf
    - ./nginx/logs:/var/log/nginx
    - ./nginx/ssl:/ssl
    - /var/run/docker.sock:/tmp/docker.sock:ro
    links:
    - wordpress
    networks:
    - frontend
    restart: always

    networks:
    frontend:
    #name: test_frontend
    driver: bridge
    backend:
    #name: test_backend
    driver: bridge
  3. nginx目录下添加 nginx.conf

    #运行nginx的用户
    user nginx;
    #启动进程设置成和CPU数量相等
    worker_processes 1;

    #全局错误日志及PID文件的位置
    error_log /var/log/nginx/error.log warn;
    pid /var/run/nginx.pid;

    #工作模式及连接数上限
    events {
    #单个后台work进程最大并发数设置为1024
    worker_connections 1024;
    }


    http {
    #设定mime类型
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    #设定日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    #tcp_nopush on;

    #设置连接超时的事件
    keepalive_timeout 65;

    #开启GZIP压缩
    #gzip on;

    include /etc/nginx/conf.d/*.conf;
    }

  4. wpress目录,docker-compose up -d

  5. docker ps 查看容器

  6. 配置https

    考文章:SSL 证书 Nginx 服务器 SSL 证书安装部署 - 证书安装 - 文档中心 - 腾讯云 https://cloud.tencent.com/document/product/400/35244

  7. 打开地址安装:https://www.zhangxin.cloud/wp-admin/setup-config.php

  8. 后台管理地址 https://www.zhangxin.cloud/wp-admin/

  9. 解决https访问不加载css样式https://blog.csdn.net/weixin_36237054/article/details/113027073

    wordpress如何开启https-WordPress-PHP中文网 https://www.php.cn/cms/wordpress/425534.html

    wordpress开启https失败问题_weixin_34297300的博客-CSDN博客 https://blog.csdn.net/weixin_34297300/article/details/92397756

    WORDPRESS安装SSL证书后,无法加载CSS解决办法 - 菜鸟学苑 https://www.cainiaoxueyuan.com/cms/11356.html

Docker部署RabbitMQ

自动拉取镜像并启动容器

docker run \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq \
--hostname mq1 \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3-management

Docker部署hexo

  1. 创建并进入数据卷目录

    mkdir -p /zx/hexo
    cd /zx/hexo
  2. 启动容器

    docker run \
    -id \
    --name hexo \
    -p 4000:4000 \
    -v $PWD/data:/opt/website \
    hexo:1.0
  3. 进入容器内部docker exec -it hexo /bin/bash

  4. 初始化环境hexo init

    现在$PWD/data中已经有了hexo的内容

  5. 生成网站内容hexo g

  6. 预览hexo s,在宿主机的浏览器上输入 127.0.0.1:4000

  7. 待补充。。。

Docker部署Cloudreve

参考文章:https://hub.docker.com/r/xavierniu/cloudreve

  1. 创建数据卷目录

    mkdir -p /zx/cloudreve/uploads
    mkdir -p /zx/cloudreve/config
    mkdir -p /zx/cloudreve/db
    mkdir -p /zx/cloudreve/avatar
  2. 进行目录cd /zx/cloudreve

  3. 自动拉取镜像并启动容器

    docker run -d \
    --name cloudreve \
    -e PUID=1000 \ # optional
    -e PGID=1000 \ # optional
    -e TZ="Asia/Shanghai" \ # optional
    -p 5212:5212 \
    --restart=unless-stopped \
    -v $PWD/uploads:/cloudreve/uploads \
    -v $PWD/config:/cloudreve/config \
    -v $PWD/db:/cloudreve/db \
    -v $PWD/avatar:/cloudreve/avatar \
    xavierniu/cloudreve
  4. 获取初始密码docker logs -f cloudreve

Dcoker部署Nacos

参考:https://www.cnblogs.com/wandoupeas/p/12205176.html
https://blog.csdn.net/m0_56000832/article/details/120890310

  1. 创建自定义网络common-network

  2. 创建存储nacos配置的数据库
    create database nacos_config

  3. 初始化数据库,导入初始化文件nacos-db.sql

  4. 创建数据卷目录

    mkdir ~/nacos/logs
    mkdir ~/nacos/init.d
    cd ~/nacos

  5. 自动拉取镜像并启动容器

    docker run -d \
    --name nacos \
    -p 8848:8848 \
    -restart=always \
    --privileged=true \
    -e PREFER_HOST_MODE=101.43.123.47 \
    -e SPRING_DATASOURCE_PLATFORM=mysql \
    -e MYSQL_MASTER_SERVICE_HOST=101.43.123.47 \
    -e MYSQL_MASTER_SERVICE_PORT=3306 \
    -e MYSQL_MASTER_SERVICE_USER=root \
    -e MYSQL_MASTER_SERVICE_PASSWORD=root \
    -e MYSQL_MASTER_SERVICE_DB_NAME=nacos_config \
    -e MYSQL_SLAVE_SERVICE_HOST=101.43.123.47 \
    -e JVM_XMS=256m \
    -e JVM_XMX=256m \
    -e MODE=standalone \
    -v $PWD/logs:/home/nacos/logs \
    -v $PWD/init.d/custom.properties:/home/nacos/init.d/custom.properties \
    -v $PWD/conf:/home/nacos/conf \
    --restart=always \
    --network common-network \
    nacos/nacos-server:1.4.1

    具体配置参数参考官方文档

    参数说明:

    • –network common-network : 容器网络
    • -v /zx/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties :配置文件映射路径
  6. 查看网络容器

    docker network inspect common-network

    这个时候mysql容器和nacos容器的网络就注册到了我们创建的那个网络里面了

  7. 进入nacos容器内部 修改一下配置

    docker exec -it nacos bash 进入容器命令

    vim conf/application.properties 修改配置文件

    也可以从其他地方获取:

    复制nacos配置目录到宿主机(或从其他地方复制需要application.properties、cluster.conf)

    docker cp 1d8a4a767027:/home/nacos/conf /zx/nacos

  8. 修改完成后 退出nacos容器并且重启nacos容器

    docker restart nacos 重启nacos命令

    http://ip:8848/nacos/index.html
    nacos/nacos(用户名密码)

  9. 添加的配置信息可在数据库中下面那张表中看到

Docker部署Nacos集群

(先执行完上面的nacos单容器)

cd /zx/nacos/conf
vim cluster.conf

cluster.conf文件内容

101.43.123.47:8841
101.43.123.47:8842
101.43.123.47:8843

创建3个nacos容器(conf绑定同的port)

# 创建三个nacos容器
docker run -d \
--name nacos1 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_MASTER_SERVICE_HOST=101.43.123.47 \
-e MYSQL_MASTER_SERVICE_PORT=3306 \
-e MYSQL_MASTER_SERVICE_USER=root \
-e MYSQL_MASTER_SERVICE_PASSWORD=root \
-e MYSQL_MASTER_SERVICE_DB_NAME=nacos \
-e MYSQL_SLAVE_SERVICE_HOST=101.43.123.47 \
-e PREFER_HOST_MODE=101.43.123.47 \
-e MODE=cluster \
-e NACOS_SERVER_PORT=8841 \
-e NACOS_SERVERS="101.43.123.47:8841 101.43.123.47:8842 101.43.123.47:8843" \
-e NACOS_SERVER_IP=101.43.123.47 \
-e JVM_XMS=256m -e JVM_XMX=256m \
-v /zx/nacos1/logs:/home/nacos/logs \
-v /zx/nacos1/init.d/custom.properties:/home/nacos/init.d/custom.properties \
-v /zx/nacos1/conf:/home/nacos/conf \
-p 8841:8841 \
--restart=always \
nacos/nacos-server:1.4.1

docker run -d \
--name nacos2 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_MASTER_SERVICE_HOST=101.43.123.47 \
-e MYSQL_MASTER_SERVICE_PORT=3306 \
-e MYSQL_MASTER_SERVICE_USER=root \
-e MYSQL_MASTER_SERVICE_PASSWORD=root \
-e MYSQL_MASTER_SERVICE_DB_NAME=nacos \
-e MYSQL_SLAVE_SERVICE_HOST=101.43.123.47 \
-e PREFER_HOST_MODE=101.43.123.47 \
-e MODE=cluster \
-e NACOS_SERVER_PORT=8842 \
-e NACOS_SERVERS="101.43.123.47:8841 101.43.123.47:8842 101.43.123.47:8843" \
-e NACOS_SERVER_IP=101.43.123.47 \
-e JVM_XMS=256m -e JVM_XMX=256m \
-v /zx/nacos2/logs:/home/nacos/logs \
-v /zx/nacos2/init.d/custom.properties:/home/nacos/init.d/custom.properties \
-v /zx/nacos2/conf:/home/nacos/conf \
-p 8842:8842 \
--restart=always \
nacos/nacos-server:1.4.1

docker run -d \
--name nacos3 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_MASTER_SERVICE_HOST=101.43.123.47 \
-e MYSQL_MASTER_SERVICE_PORT=3306 \
-e MYSQL_MASTER_SERVICE_USER=root \
-e MYSQL_MASTER_SERVICE_PASSWORD=root \
-e MYSQL_MASTER_SERVICE_DB_NAME=nacos \
-e MYSQL_SLAVE_SERVICE_HOST=101.43.123.47 \
-e PREFER_HOST_MODE=101.43.123.47 \
-e MODE=cluster \
-e NACOS_SERVER_PORT=8843 \
-e NACOS_SERVERS="101.43.123.47:8841 101.43.123.47:8842 101.43.123.47:8843" \
-e NACOS_SERVER_IP=101.43.123.47 \
-e JVM_XMS=256m -e JVM_XMX=256m \
-v /zx/nacos3/logs:/home/nacos/logs \
-v /zx/nacos3/init.d/custom.properties:/home/nacos/init.d/custom.properties \
-v /zx/nacos3/conf:/home/nacos/conf \
-p 8843:8843 \
--restart=always \
nacos/nacos-server:1.4.1

安装nginx 反向代理nacos

nginx.conf内容(新启动的容器copy过来的)

user  nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
worker_connections 1024;
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;
}

docker run -id --name=nginx \
-p 80:80 \
-v /zx/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /zx/nginx/logs:/var/log/nginx \
-v /zx/nginx/html:/usr/share/nginx/html \
nginx:1.8

修改conf/nginx.conf文件,配置如下:

upstream nacos-cluster {
server 101.43.123.47:8841;
server 101.43.123.47:8842;
server 101.43.123.47:8843;
}

server {
listen 80;
server_name 101.43.123.47;

location /nacos {
proxy_pass http://nacos-cluster;
}
}

而后在浏览器访问:http://localhost/nacos即可。

代码中application.yml文件配置如下:

spring:
cloud:
nacos:
server-addr: localhost:80 # Nacos地址

如果项目注册不了

1. 设置本机名称:/etc/hostname   mName
2. 在/etc/hosts里加一行 本机IP mName

还是无法解决 错误:

(目前最靠谱解释:)

由于集群模式中,配置nacos.naming.data.warmup 属性为 true,因此当集群中只有一台服务时,会导致nacos服务为不可用状态。而本地测试时,该属性没有配置(默认值为false),因此集群只有一台服务也可以正常使用。

因此在使用时,如果是开发或者测试环境,只部署一台服务时,使用单机模式就可以了,配置集群模式在刚开始使用时,会遇到许多坑。

  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.9.RELEASE)

12-20 22:25:23:135 INFO 6676 --- [ main] cn.itcast.order.OrderApplication : No active profile set, falling back to default profiles: default
12-20 22:25:23:549 INFO 6676 --- [ main] o.s.cloud.context.scope.GenericScope : BeanFactory id=1e3d3419-6ac5-3b72-b649-6b2133cfab3e
12-20 22:25:23:730 INFO 6676 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
12-20 22:25:23:736 INFO 6676 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
12-20 22:25:23:737 INFO 6676 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.43]
12-20 22:25:23:826 INFO 6676 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
12-20 22:25:23:826 INFO 6676 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 677 ms
12-20 22:25:23:972 WARN 6676 --- [ main] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources.
12-20 22:25:23:973 INFO 6676 --- [ main] c.n.c.sources.URLConfigurationSource : To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
12-20 22:25:23:975 WARN 6676 --- [ main] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources.
12-20 22:25:23:975 INFO 6676 --- [ main] c.n.c.sources.URLConfigurationSource : To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
12-20 22:25:24:060 INFO 6676 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
12-20 22:25:24:232 INFO 6676 --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 'Nacos-Watch-Task-Scheduler'
12-20 22:25:24:702 INFO 6676 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
12-20 22:25:24:797 ERROR 6676 --- [ main] c.a.c.n.registry.NacosServiceRegistry : nacos registry, orderServer register failed...NacosRegistration{nacosDiscoveryProperties=NacosDiscoveryProperties{serverAddr='101.43.123.47:8841', endpoint='', namespace='', watchDelay=30000, logName='', service='orderServer', weight=1.0, clusterName='DEFAULT', group='DEFAULT_GROUP', namingLoadCacheAtStart='false', metadata={preserved.register.source=SPRING_CLOUD}, registerEnabled=true, ip='192.168.124.25', networkInterface='', port=8080, secure=false, accessKey='', secretKey='', heartBeatInterval=null, heartBeatTimeout=null, ipDeleteTimeout=null}},

com.alibaba.nacos.api.exception.NacosException: failed to req API:/nacos/v1/ns/instance after all servers([101.43.123.47:8841]) tried: ErrCode:503, ErrMsg:server is DOWN now, please try again later!
at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.Java:556) ~[nacos-client-1.4.1.jar:na]
at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.Java:498) ~[nacos-client-1.4.1.jar:na]
at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.Java:493) ~[nacos-client-1.4.1.jar:na]
at com.alibaba.nacos.client.naming.net.NamingProxy.registerService(NamingProxy.Java:246) ~[nacos-client-1.4.1.jar:na]
at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.Java:212) ~[nacos-client-1.4.1.jar:na]
at com.alibaba.cloud.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.Java:74) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.5.RELEASE.jar:2.2.5.RELEASE]
at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.register(AbstractAutoServiceRegistration.Java:239) [spring-cloud-commons-2.2.7.RELEASE.jar:2.2.7.RELEASE]
at com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration.register(NacosAutoServiceRegistration.Java:78) [spring-cloud-starter-alibaba-nacos-discovery-2.2.5.RELEASE.jar:2.2.5.RELEASE]
at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.start(AbstractAutoServiceRegistration.Java:138) [spring-cloud-commons-2.2.7.RELEASE.jar:2.2.7.RELEASE]
at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.bind(AbstractAutoServiceRegistration.Java:101) [spring-cloud-commons-2.2.7.RELEASE.jar:2.2.7.RELEASE]
at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.onApplicationEvent(AbstractAutoServiceRegistration.Java:88) [spring-cloud-commons-2.2.7.RELEASE.jar:2.2.7.RELEASE]
at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.onApplicationEvent(AbstractAutoServiceRegistration.Java:47) [spring-cloud-commons-2.2.7.RELEASE.jar:2.2.7.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.Java:172) [spring-context-5.2.13.RELEASE.jar:5.2.13.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.Java:165) [spring-context-5.2.13.RELEASE.jar:5.2.13.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.Java:139) [spring-context-5.2.13.RELEASE.jar:5.2.13.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.Java:404) [spring-context-5.2.13.RELEASE.jar:5.2.13.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.Java:361) [spring-context-5.2.13.RELEASE.jar:5.2.13.RELEASE]
at org.springframework.boot.web.servlet.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.Java:46) [spring-boot-2.3.9.RELEASE.jar:2.3.9.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.Java:182) [spring-context-5.2.13.RELEASE.jar:5.2.13.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.Java:53) [spring-context-5.2.13.RELEASE.jar:5.2.13.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.Java:360) [spring-context-5.2.13.RELEASE.jar:5.2.13.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.Java:158) [spring-context-5.2.13.RELEASE.jar:5.2.13.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.Java:122) [spring-context-5.2.13.RELEASE.jar:5.2.13.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.Java:895) [spring-context-5.2.13.RELEASE.jar:5.2.13.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:554) [spring-context-5.2.13.RELEASE.jar:5.2.13.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.Java:143) [spring-boot-2.3.9.RELEASE.jar:2.3.9.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:758) [spring-boot-2.3.9.RELEASE.jar:2.3.9.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:750) [spring-boot-2.3.9.RELEASE.jar:2.3.9.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.Java:405) [spring-boot-2.3.9.RELEASE.jar:2.3.9.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:315) [spring-boot-2.3.9.RELEASE.jar:2.3.9.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1237) [spring-boot-2.3.9.RELEASE.jar:2.3.9.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1226) [spring-boot-2.3.9.RELEASE.jar:2.3.9.RELEASE]
at cn.itcast.order.OrderApplication.main(OrderApplication.Java:17) [classes/:na]

12-20 22:25:24:797 WARN 6676 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is Java.lang.reflect.UndeclaredThrowableException

Docker命令

Docker进程相关

linux系统

  • systemctl start docker 启动docker服务
  • systemctl status docker 查看docker服务状态
  • systemctl stop docker 停止docker服务
  • systemctl restart docker 重启docker服务
  • systemctl enable docker 设置开机启动docker服务

Docker 镜像相关

  • docker images查看本地所有的镜像
  • docker images –q查看所用镜像的id
  • docker search 镜像名称从网络中查找需要的镜像
  • docker pull 镜像名称拉取镜像,不加版本号,默认latest版本
  • docker pull redis:5.0
  • docker rmi 镜像id删除指定本地镜像
  • docker rmi 镜像名称:版本号删除指定本地镜像
  • docker rmi $(docker images –qa)删除所有本地镜像
  • docker rmi $(docker images –q redis)删除所有仓库名为redis的镜像

创建并启动容器

docker run 参数
参数说明:

  • -i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
  • -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
    • -it:创建的容器一般称为交互式容器,
    • -id:创建的容器一般称为守护式容器
    • –name:为创建的容器命名。

两种启动方式

  1. docker run -it --name c1 centos:7 /bin/bash 执行完会进入容器内部
    exit 退出容器会关闭容器

  2. docker run -id --name c2 centos:7 后台运行
    docker exec -it c2 /bin/bash
    exit 退出容器不会关闭容器

Docker 容器相关命令

  • docker ps 查看正在运行的容器
  • docker ps –a 查看所有容器
  • docker pa -aq 查看所有容器的id列表
  • docker exec 参数进入容器,退出容器,容器不会关闭
    docker exec -it c1 /bin/bash
  • docker stop 容器名称 停止容器
  • docker start 容器名称 启动容器
  • docker rm 容器名称 删除容器:如果容器是运行状态则删除失败,需要停止容器才能删除
  • docker rm $(docker ps -aq) 删除所有容器,正在运行的删除不了,所有未运行的都被删除f\
  • docker inspect 容器名称 查看容器信息

docker-compose常用命令

  • docker-compose up 前台运行
  • docker-compose up -d 后台运行
  • docker-compose down 关闭
  • docker-compose restart 重启