0%

Docker 部署微服务 (Cloud-Admin) 以及 Docker 参数、命令

  1. Docker 的安装

    1. 安装

      卸载旧版本

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      sudo yum remove docker \
      docker-client \
      docker-client-latest \
      docker-common \
      docker-latest \
      docker-latest-logrotate \
      docker-logrotate \
      docker-selinux \
      docker-engine-selinux \
      docker-engine

      安装依赖包

      1
      2
      3
      sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2

      添加国内 yum 软件源

      1
      2
      3
      yum-config-manager \
      --add-repo \
      https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

      更新 yum 软件源缓存

      1
      yum makecache fast

      安装 docker-ce

      1
      yum install docker-ce
    2. 配置

      设置 Docker 自启

      1
      systemctl enable docker

      添加用户组

      1
      groupadd docker

      将当前用户加入 docker 组

      1
      usermod -aG docker $USER

      启动 Docker

      1
      systemctl start docker

      新建 Docker 网络

      1
      docker network create -d bridge docker-net
  2. 私有仓库的搭建

    1. 创建私有仓库的用户名和密码

      usernamepassword换成自己的用户名密码

      1
      2
      mkdir /etc/docker/auth
      docker run --rm --entrypoint htpasswd httpd:alpine -Bbn username password > /etc/docker/auth/auth.htpasswd
    2. 运行镜像

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      docker run -d -t --name registry -p 5000:5000 \
      -v /opt/data/registry:/var/lib/registry \
      -v /etc/docker/auth:/auth \
      -v /certs:/certs:ro \
      -e REGISTRY_STORAGE_DELETE_ENABLED=true \
      -e "REGISTRY_AUTH=htpasswd" \
      -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
      -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/auth.htpasswd \
      -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
      -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
      registry
    3. 推送镜像到仓库

      1. 为镜像打标签

        1
        2
        docker tag 镜像 ID/ 名称 远程仓库地址 / 仓库名 / 镜像名
        docker tag 63c7588bf5a1 test.com:5000/development/gateway
      2. 推送至远程仓库

        1
        docker push test.com:5000/development/gateway
      3. 使用docker-maven-plugin

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>1.2.0</version>
        <configuration>
        <serverId>test.com</serverId>
        <dockerHost>http://***:2375</dockerHost>
        <imageName>test.com:5000/development/${project.artifactId}</imageName>
        <imageTags>latest</imageTags>
        <dockerDirectory>src/main/docker</dockerDirectory>
        <forceTags>true</forceTags>
        <pushImageTag>true</pushImageTag>
        <pushImage>true</pushImage>
        <rm>true</rm>
        <resources>
        <resource>
        <targetPath>/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>${project.build.finalName}.jar</include>
        </resource>
        </resources>
        </configuration>
        </plugin>

        修改 Maven 的配置 (settings.xml),其中<id><serverId>对应,usernamepassword 为私有仓库账号密码。

        1
        2
        3
        4
        5
        6
        7
        8
        <server>
        <id>test.com</id>
        <username>username</username>
        <password>password</password>
        <configuration>
        <email>test@test.com</email>
        </configuration>
        </server>
      4. 仓库API

  3. 安装 consul、nacos、redis、rabbitmq、mysql、mogodb

    1. 获取镜像

      1
      2
      3
      4
      docker pull consul
      docker pull nacos/nacos-server:1.1.4
      docker pull redis
      docker pull rabbitmq:management
    2. 运行镜像

      1. Consul

        1
        docker run -d -p 8500:8500 --name consul --network spring-net consul agent -server -bootstrap-expect=1 -client 0.0.0.0 -ui

        -bootstrap-expect: 指定期望的 server 节点的数量,并当 server 节点可用的时候,自动进行 bootstrapping

      2. Nacos

        1
        docker run --name nacos --network spring-net -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_MASTER_SERVICE_HOST=192.168.1.1 -e MYSQL_MASTER_SERVICE_PORT=3306 -e MYSQL_MASTER_SERVICE_DB_NAME=nacos -e MYSQL_MASTER_SERVICE_USER=user -e MYSQL_MASTER_SERVICE_PASSWORD=password -e MYSQL_DATABASE_NUM=1 -e NACOS_SERVERS="192.168.1.1:8848 192.168.1.2:8848 192.168.1.3:8848" -e NACOS_SERVER_IP=192.168.1.216 -p 8848:8848 -d nacos/nacos-server:1.1.4
      3. RabbitMQ

        1
        docker run -d --name rabbitmq --network spring-net -e RABBITMQ_DEFAULT_USER=username -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672  rabbitmq:management
      4. Redis

        需要先配置好 /etc/redis.conf, 可下载 官方配置

        密码配置:requirepass password

        远程访问注释 bind 127.0.0.1 即可

        1
        docker run -p 6379:6379 --network spring-net -v /etc/redis/redis.conf:/etc/redis/redis.conf -v /opt/docker/redis:/data  --name redis -d redis redis-server /etc/redis/redis.conf --appendonly yes

        redis-server --appendonly yes: 在容器执行 redis-server 启动命令,并打开 redis 持久化配置

      5. MySQL

        先配置好 /etc/mysql/my.cnf

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        [mysqld]
        # 添加 GROUP BY 查询限制
        sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
        # 拼接最大长度
        group_concat_max_len = 102400
        # 字符集
        character-set-server=utf8mb4
        collation-server=utf8mb4_unicode_ci

        [mysql]
        default-character-set = utf8mb4

        [client]
        default-character-set = utf8mb4

        注意服务器时区:
        修改文件

        1
        cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

        在 centos7 中设置时区的命令可以通过 timedatectl 命令来实现

        1
        timedatectl set-timezone Asia/Shanghai
        1
        docker run -d -p 3306:3306 --name mysql --network spring-net -v /etc/mysql/my.cnf:/etc/my.cnf -v /var/log/mysql:/var/log/mysql -v /var/lib/mysql:/var/lib/mysql -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=password mysql:5.7.26

        进入 MySQL 容器

        1
        docker exec -it mysql bash

        登录 MySQL

        1
        mysql -u root -p

        创建远程连接账号

        1
        CREATE USER 'username'@'%' IDENTIFIED BY 'password';

        授予权限:privileges 为 ALL,则授予所有权限,可参考 官方文档

        1
        GRANT privileges  ON databasename.* TO 'username'@'%';

        刷新授权

        1
        flush privileges;
      6. MogoDB

        创建并启动容器

        1
        docker run -d --name mongo -p 27017:27017 --network spring-net -v /etc/localtime:/etc/localtime:ro -v /var/lib/mongo:/data/db mongo --auth

        进入容器

        1
        docker exec -it mongo mongo admin

        创建管理员用户

        1
        db.createUser({ user:' 用户名 ',pwd:' 密码 ',roles:[{ role:'userAdminAnyDatabase', db: 'admin'}]});

        创建读写用户

        1
        db.createUser({ user: " 用户名 ", pwd: " 密码 ", roles: [{ role: "readWrite", db: "admin" }]})
  4. 安装 nginx

    可以参考 Docker 中安装 Nginx 以及使用 Logrotate 进行日志轮替

  5. 部署微服务

    1. 配置服务器 docker 可以远程访问

      1
      2
      3
      4
      5
      6
      7
      8
      // 在 /usr/lib/systemd/system/docker.service 中添加参数
      [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
    2. pom 配置

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      <build>
      <finalName>ace-gateway</finalName>
      <plugins>
      <plugin>
      <groupId>com.spotify</groupId>
      <artifactId>docker-maven-plugin</artifactId>
      <version>1.2.0</version>
      <configuration>
      <dockerHost>http:// 你的服务器地址:2375</dockerHost>
      <imageName>${project.artifactId}</imageName>
      <dockerDirectory>src/main/docker</dockerDirectory>
      <resources>
      <resource>
      <targetPath>/</targetPath>
      <directory>${project.build.directory}</directory>
      <include>${project.build.finalName}.jar</include>
      </resource>
      </resources>
      </configuration>
      </plugin>
      </plugins>
      </build>
    3. application 配置

      1
      2
      3
      4
      5
      6
      redis:
      host: ${REDIS_HOST:localhost}
      rabbitmq:
      host: ${RABBIT_MQ_HOST:localhost}
      consul:
      host: ${CONSUL_HOST:localhost}
    4. Dockerfile 配置

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      FROM anapsix/alpine-java:8_server-jre_unlimited
      VOLUME /tmp
      ADD ace-gateway.jar app.jar
      ENV REDIS_HOST=redis
      ENV RABBIT_MQ_HOST=rabbitmq
      ENV CONSUL_HOST=consul
      RUN bash -c 'touch /app.jar' \
      && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
      && echo 'Asia/Shanghai' >/etc/timezone
      ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dfile.encoding=utf-8","-jar","/app.jar"]
    5. 运行服务

      1
      docker run -d --name geteway -p 8765:8765 --network spring-net -v /var/log/gateway:/var/log/gateway iot-gateway
  6. 防火墙开启端口

    1
    2
    3
    4
    5
    6
    // 查看已开放端口
    firewall-cmd --list-ports
    // 添加端口 consul:8500 rabbitmq 后台管理界面:15672
    firewall-cmd --zone=public --add-port=8500/tcp --permanent
    // 修改配置文件后 使用命令重新加载
    firewall-cmd --reload
  7. Docker 参数 / 命令

    参数 描述
    -d, –detach=false 指定容器运行于前台还是后台,默认为 false
    -i, –interactive=false 打开 STDIN,用于控制台交互
    -t, –tty=false 分配 tty 设备,该可以支持终端登录,默认为 false
    -u, –user=”” 指定容器的用户
    -a, –attach=[] 登录容器(必须是以 docker run -d 启动的容器)
    -w, –workdir=”” 指定容器的工作目录
    -c, –cpu-shares=0 设置容器 CPU 权重,在 CPU 共享场景使用
    -e, –env=[] 指定环境变量,容器中可以使用该环境变量
    -m, –memory=”300M” 设置容器内存上限 300M(只设置 -m 不设置–memory-swap,则–memory-swap 为 -m 两倍)
    –memory-swap=1 要和 -m 连用,设置内存 +swap 的使用限额。,值为 -1 表示不受限
    -P, –publish-all=false 指定容器暴露的端口
    -p, –publish=[] 指定容器暴露的端口
    -h, –hostname=”” 指定容器的主机名
    -v, –volume=[] 给容器挂载存储卷,挂载到容器的某个目录,要挂载文件需要现在宿主机中提前创建
    –volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
    –cap-add=[] 添加权限,–cap-add=SYS_PTRACE(JVM 的调试)
    –cap-drop=[] 删除权限
    –cidfile=”” 运行容器后,在指定文件中写入容器 PID 值,一种典型的监控系统用法
    –cpuset=”” 设置容器可以使用哪些 CPU,此参数可以用来容器独占 CPU
    –device=[] 添加主机设备给容器,相当于设备直通
    –dns=[] 指定容器的 dns 服务器
    –dns-search=[] 指定容器的 dns 搜索域名,写入到容器的 /etc/resolv.conf 文件
    –entrypoint=”” 覆盖 image 的入口点
    –env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
    –expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
    –link=[] 指定容器间的关联,使用其他容器的 IP、env 等信息
    –lxc-conf=[] 指定容器的配置文件,只有在指定–exec-driver=lxc 时使用
    –name=”” 指定容器名字,后续可以通过名字进行容器管理,links 特性需要使用名字
    –net=”bridge” 容器网络设置
    bridge 使用 docker daemon 指定的网桥
    host // 容器使用主机的网络
    container:NAME_or_ID >// 使用其他容器的网路,共享 IP 和 PORT 等网络资源
    none 容器使用自己的网络(类似–net=bridge),但是不进行配置
    –privileged=false 指定容器是否为特权容器,特权容器拥有所有的 capabilities
    –restart=”no” 指定容器停止后的重启策略:
    no:容器退出时不重启
    on-failure:容器故障退出(返回值非零)时重启
    always:容器退出时总是重启
    –rm=false 指定容器停止后自动删除容器(不支持以 docker run -d 启动的容器)
    –sig-proxy=true 设置由代理接受并处理信号,但是 SIGCHLD、SIGSTOP 和 SIGKILL 不能被代理
    –log-opt max-size=10m –log-opt max-file=1 限制生成的 json.log 单个文件大小和保留文件个数
    或者配置 Dockerd 的配置:编辑 /etc/docker/daemon.json
    添加 {“log-opts”: { “max-size”: “10m”, “max-file”:”5”} }
    加载配置文件:systemctl daemon-reload 重启:systemctl restart docker
    命令 描述
    docker attach 附加到正在运行的容器
    docker commit 从容器的更改创建一个新的映像
    docker cp 在容器和本地文件系统之间复制文件 / 文件夹
    docker create 创建一个新的容器
    docker diff 检查容器文件系统上文件或目录的更改
    docker exec 在运行容器中运行命令
    docker export 将容器的文件系统导出为 tar 存档
    docker inspect 显示一个或多个容器的详细信息 docker inspect 容器名 -f ‘‘
    docker kill 杀死一个或多个运行容器
    docker logs 获取容器的日志
    docker ls 列出容器
    docker pause 暂停一个或多个容器内的所有进程
    docker port 列出端口映射或容器的特定映射
    docker prune 取出所有停止的容器
    docker rename 重命名容器
    docker restart 重新启动一个或多个容器
    docker rm 删除 (移除) 一个或多个容器
    -v :同时移除数据卷
    docker run 在新容器中运行命令
    docker start 启动一个或多个停止的容器
    docker stats 显示容器的实时流资源使用统计信息
    docker stop 停止一个或多个运行容器
    docker top 显示容器的正在运行的进程
    docker update 更新一个或多个容器的配置
    docker wait 阻止一个或多个容器停止,然后打印退出代码
    docker image prune 清除 REPOSITORY 和 TAG 为 的镜像
    docker volume prune 清除无主的数据卷
    docker container update 更新容器属性