一、概述

1.1 Docker介绍

Docker其中包括,镜像、容器、仓库,很简单,目的就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的产品(可以是 web 应用或者数据库应用)及其环境能够做到“一次封装,到处运行”。

Docker_html

1.2 作用

docker 的好处

  1. 简化配置,构建一次后打包后就可以用作测试环境,也可以用作生产环境或与预生产环境,可以省去很多测试环节。比如一台服务器可以进行测试多个版本的测试,不用等待。
  2. 可以解决开发人员部署环境的困难,好比如一个刚来的新同事安装环境可能需要半天时间,但要是直接运行一个已经配好的容器的话就方便多了。
  3. 应用隔离,服务器整合,一个服务器可以用docker部署多套业务,并且隔离性很高(除了虚拟机)。
  4. 对于开发来说部署好之后到处运行便于开发调试。
  5. 可以减少资源的利用,和虚拟机比较省去了很多不必要的资源,损失的隔离性其他的有点足以弥补啦。
  6. 对与运维来说,可以快速的进行扩容,减少原利用率
  7. 每个小的服务都可以进行集群,docker对资源的利用比较小,可以在一台服务器启动多台,相比其他产品对服务器的I/O使用上要多例如(启动storm)。
  8. 可以多平台部署


传统虚拟机部署项目:

Docker_html_02

Docker虚拟化部署项目:

Docker_html_03


二、命令

1.1 镜像命令

1.1.1 全部命令

docker images :查看所有本地主机上的镜像
docker search 镜像名:查找镜像
docker pull 镜像名(docker pull 镜像名:版本好):下载镜像,版本号可选

1.1.2 详解

docker images :查看所有本地主机上的镜像

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB

docker search 镜像名:查找镜像

# docker search mysql --filter=STARS=3000   
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql               MySQL is a widely used, open-source relation…   9822                [OK]                
mariadb             MariaDB is a community-developed fork of MyS…   3586                [OK]  

//--filter=STARS=3000  可选项,搜素出来的镜像就是STARS大于3000的

docker pull 镜像名(docker pull 镜像名:版本好):下载镜像,版本号可选


1.2 容器命令

1.2.1 全部命令

docker ps:                               # 列出所有当前正在运行的运行的容器
exit                                      # 直接退出容器并关闭
Ctrl + P + Q                              # 容器不关闭退出
docker rm -f 容器id(或者容器名)           # 删除指定容器
docker rm -f $(docker ps -aq)             # 删除所有容器
docker ps -a -q|xargs docker rm -f        # 删除所有的容器
docker start 容器id                       # 启动容器
docker restart 容器id                     # 重启容器
docker stop 容器id                        # 停止当前正在运行的容器
docker kill 容器id                        # 强制停止当前的容器
docker logs 容器ID(容器名)               # 查看日志
docker inspect 容器id:                  # 查看镜像的元数据
docker exec -it 容器id /bin/bash:        # 进入当前正在运行的容器
docker cp 容器id:容器内路径 目的地主机路径  # 从容器中拷贝文件到主机 
docker run [可选参数] image:              # 新建容器并启动,image为镜像名

# run命令可选参数说明
--name=容器名字                容器名字  
-d                            后台方式运行
-it                          使用交互方式运行,进入容器查看内容
-p 主机端口:容器端口           指定容器的端口     -p 8080:8080
-e                           环境配置修改
-v 主机路径:容器路径           数据挂载

1.2.2 详解

docker run [可选参数] image:新建容器并启动,image为镜像名

docker run [可选参数] image

# 参数说明
--name=“Name”   容器名字    tomcat01    tomcat02    用来区分容器
-d      后台方式运行
-it     使用交互方式运行,进入容器查看内容
-p      指定容器的端口     -p 8080:8080
    -p  ip:主机端口:容器端口
    -p  主机端口:容器端口(常用)
    -p  容器端口
    容器端口
-p      随机指定端口

#启动并进入容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -it centos /bin/bash
[root@74e82b7980e7 /]# ls   # 查看容器内的centos,基础版本,很多命令是不完善的
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr

#后台启动容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker run -d centos
# 问题 docker ps, 发现centos停止了
# 常见的坑, docker 容器使用后台运行, 就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx, 容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了

docker ps:列出所有当前正在运行的运行的容器

# docker ps 
        # 列出当前正在运行的容器
-a      # 列出所有已经创建的容器
-n=?    # 显示最近创建的容器
-q      # 只显示当前容器的编号

退出容器:在容器内使用

exit            # 直接退出容器并关闭
Ctrl + P + Q    # 容器不关闭退出

删除容器

docker rm -f 容器id(或者容器名)     # 删除指定容器
docker rm -f $(docker ps -aq)       # 删除所有容器
docker ps -a -q|xargs docker rm -f  # 删除所有的容器

启动和停止容器的操作

docker start 容器id           # 启动容器
docker restart 容器id         # 重启容器
docker stop 容器id            # 停止当前正在运行的容器
docker kill 容器id            # 强制停止当前的容器

docker logs 容器ID(容器名):查看日志

docker logs -tf --tail number 容器id

# 显示日志
-tf                 # 显示日志
--tail number       # 显示日志条数
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker logs -tf --tail 10 a0d580a21251
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker logs -tf --tail 1 8d1621e09bff
2020-08-11T10:53:15.987702897Z [root@8d1621e09bff /]# exit      # 日志输出

docker inspect 容器id:查看镜像的元数据

docker inspect 容器id
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker inspect df358bc06b17

docker exec -it 容器id /bin/bash:进入当前正在运行的容器

# docker exec       # 进入容器后开启一个新的终端,可以在里面操作
# docker attach     # 进入容器正在执行的终端,不会启动新的进程

[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker exec -it df358bc06b17 /bin/bash
[root@df358bc06b17 /]# ls       
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr

docker cp 容器id:容器内路径 目的地主机路径  :从容器中拷贝文件到主机

docker cp 容器id:容器内路径    目的地主机路径
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker cp 7af535f807e0:/home/Test.java /home


1.3 提交镜像到docker hub

(1) 提交容器成为一个新的镜像。

docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]

-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。

 比如这里将添加了war包的容器打包成一个新的镜像。
docker commit -a="badaodechengxvyuan" -m"addgeoserver" 39f5b723d1b8 myubuntu:1.0

(2) 镜像推送到docker hub仓库中去:docker push [OPTIONS] NAME[:TAG]

首先是登录docker hub:  docker login

~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (wangshibo): wangshibo
Password:
Login Succeeded

镜像改名:docker tag 容器ID 新的容器名字:新的版本号

2、镜像改名
[~]# docker tag 6ce4aedd12cd wangshibo/myubuntu:1.0

将镜像提交到docker hub

docker push wangshibo/myubuntu:v1

[root@docker-test1 ~]# docker push wangshibo/myubuntu:v1           
The push refers to a repository [docker.io/wangshibo/myubuntu]
b5948ba9486d: Pushed
8d7ea83e3c62: Mounted from library/ubuntu
6a061ee02432: Mounted from library/ubuntu
f73b2816c52a: Mounted from library/ubuntu
6267b420796f: Mounted from library/ubuntu
a30b835850bf: Mounted from library/ubuntu
v1: digest: sha256:e9cd9075d262848a307c92751e1a5890d883b814a31abd118161442461a1ca2d size: 1564


1.4 导出和导入本地镜像

导出的镜像到指定文件夹:docker save 镜像id > 镜像保存路径

docker save aba01f181a4a > /opt/webconsole.tar

将本地镜像文件.tar包,导入到docker中:docker load < 文件.tar

# docker load < webconsole.tar

040fd7841192: Loading layer [==================================================>] 4.234 MB/4.234 MB
0f20ab684106: Loading layer [==================================================>]   959 kB/959 kB
e8984b733970: Loading layer [==================================================>] 3.072 kB/3.072 kB
61d11dce11a7: Loading layer [==================================================>] 258.1 MB/258.1 MB
f11c0d75456c: Loading layer [==================================================>]  2.56 kB/2.56 kB
46ba3a5cbbcc: Loading layer [==================================================>] 5.632 kB/5.632 kB
185300076fe6: Loading layer [==================================================>] 324.8 MB/324.8 MB
ab113f5d3101: Loading layer [==================================================>] 13.96 MB/13.96 MB
adda2c8b8266: Loading layer [==================================================>] 2.048 kB/2.048 kB
Loaded image ID: sha256:aba01f181a4aa9aa92c27232fd22a1852c1d48f00db85f57d4d3896cd08b7851

镜像的仓库名称和 TAG 均为 none,修改镜像仓库名称和版本号:docker tag 镜像id 新的镜像名:新的镜像版本号

docker tag aba01f181a4a webconsole:latest

三、数据卷

数据卷挂载命令:

docker volume create 数据卷名    # 创建数据卷
docker volume ls                # 查看所有数据卷
docker volume inspect 数据卷名   # 查看数据卷信息
docker inspect 容器ID            # 查看容器数据卷信息

#挂载,使用volume(mount type类型)方式:
-v 容器内路径				          	 # 匿名挂载,主机路径和卷面随机
-v 卷名:容器内路径			           # 具名挂载,主机卷名确认,但是路径随机

#挂载,使用(mount type类型)方式:
-v /主机路径:/容器内路径	       	 # 指定路径挂载,看前面是否有/

bind 和 volume 方式区别:

  • bind:容器以宿主机文件夹为准
  • volume:宿主有数据时,以宿主机为准。宿主无数据,从容器复制过来,再以宿主机为准

查看容器的数据卷目录,Source为主机路径,Destination为目标路径:

# volume方式:
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker inspect 828d43dba78e
[
    {
        "Id": "828d43dba78ecaa10e7e57c1091ee8cf3581dae88187aa04163946dfc86bfd76",
        "Created": "2020-12-29T15:41:29.297091075Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 1719,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-12-29T15:41:34.107755138Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
...
        #重点:
        "Mounts": [
            {
                "Type": "volume",    # volume 类型
                "Name": "c51c75b11a69c526a97a07b03ce2ec74d8e77aa150b736291777c1c204a8aecc",
                "Source": "/var/lib/docker/volumes/c51c75b11a69c526a97a07b03ce2ec74d8e77aa150b736291777c1c204a8aecc/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

# bing mount方式:
[root@iZwz99sm8v95sckz8bd2c4Z docker-test-volume]# docker inspect 828d43dba78e
 "Mounts": [
            {
                "Type": "bind",       # bing mount方式
                "Source": "/home/nginx/conf.d",
                "Destination": "/etc/nginx/conf.d",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],


四、docker网络

4.1 四种网络模式

bridge: 桥接模式,docker 默认模式。

host: 让容器共享宿主机网络栈

none: 不配置网络,容器与外部网络不通。

container:容器网络连通!(用的少, 局限很大)

(1)bridge

bridge网络模式是Docker的默认网络模式。

桥接模式的容器和宿主机网络不在同一个网段,容器不能直接和宿主机以外的网络进行通信,而必须要经过NAT转换。

(2)host

容器不会获得一个独立的网络,而是和宿主机共用一个网络。

容器内服务的端口和IP也可以使用宿主机的端口和IP,无需额外进行 NAT 转换。

(3)none

none 网络模式是指禁用网络功能。

使用此网络模式,容器之间、以及容器与宿主机之间都不允许进行通信。

(4)container

Docker的container网络模式是指新创建的容器和已经存在的一个容器共享一个Network Namespace。

这意味着新创建的容器不会创建自己的网卡、配置自己的IP地址,而是和一个已存在的容器共享IP地址、端口范围等网络资源。

同时,这两个容器的进程可以通过lo网卡设备通信。然而,这两个容器在其他方面,如文件系统、进程列表等,仍然是隔离的。

4.2 自定义网络

好处:不同的集群使用不同的网络,保证集群时安全和健康的

命令:

docker network create 网络名         # 创建网络,如docker network create custom_network
docker network ls                   # 查看网络模式
--net 网络名            # docker run 时指定的网络模式,
                       # 如:docker run -di --name bbox05 --net custom_network busybox
docker network connect 网络名称 容器名称   # 为容器连接新的网络模式
                                         # 如:docker network connect bridge bbox05
docker network disconnect 网络名称 容器名称  # 命令断开网络
                                           # docker network disconnect custom_network bbox05
docker inspect 容器名称|ID     # 再次查看容器的网络信信息
docker network rm 网络名称     # 移除自定义网络模式。注意:如果通过某个自定义网络模式创建了容器,则该网络模式无法删除。

容器之间要互相通信,必须要有属于同一个网络的网卡。

docker inspect 容器名称|ID :再次查看容器的网络信息

Docker_Nginx_04












五、dockerfile

4.1 指令汇总

Dockerfile 指令

说明

FROM

指定基础镜像,用于后续的指令构建。

MAINTAINER

指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)

LABEL

添加镜像的元数据,使用键值对的形式。

RUN

构建docker镜像执行的命令。(相当于往基础镜像加东西)

CMD

镜像创建容器,且容器启动后要运行的命令。(可以被覆盖)

ENTRYPOINT

镜像创建容器,且容器启动后要运行的命令。(不可被覆盖)

EXPOSE

声明容器运行时监听的特定网络端口。

ENV

在容器内部设置环境变量。

ADD

复制文件或者目录到容器里指定路径。ADD 指令和 COPY 的使用类似 (同样需求下,官方推荐使用 COPY)

COPY

将文件或目录复制到镜像中。

VOLUME

为容器创建挂载点或声明卷。

WORKDIR

设置后续指令的工作目录。

USER

指定后续指令的用户上下文。

ARG


定义在构建过程中传递给构建器的变量,可使用 "docker build" 命令设置。

ONBUILD

当该镜像被用作另一个构建过程的基础时,添加触发器。

STOPSIGNAL

设置发送给容器以退出的系统调用信号。

HEALTHCHECK

定义周期性检查容器健康状态的命令。

SHELL

覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。

Docker_html_05


4.2 指令详解

(1)FROM:

FROM指令的作用就是指定基础镜像。

基础镜像是必须指定的,FROM指令必须放在第一条指令的位置

(2)LABEL

LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下

LABEL <key>=<value> <key>=<value> <key>=<value> ...

比如我们可以添加镜像的作者:

LABEL org.opencontainers.image.authors="runoob"

(3)RUN

构建docker镜像执行的命令。(相当于往基础镜像加东西)

RUN命令的格式一共有两种,分别是:

  • Shell 格式
    如RUN yum -y install vim
  • exec 格式
    RUN["可执行文件","参数1","参数2"],感觉就像调用函数一样

Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以 及行首 # 进行注释的格式。

注意:

多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层。多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。RUN书写时的换行符是\

(4)CMD

镜像创建容器,且容器启动后要运行的命令,会被后续命令覆盖。

如果写了多条CMD命令,则只会执行最后一条

如果最后一条CMD命令后存在ENTRYPOINT命令,则CMD命令会被覆盖,相当于CMD命令不会执行。

包含三种语法格式,如下所示:

# 第一种就是shell这种执行方式和写法
CMD command param1
如:CMD echo 'hello'

# 第二种是可执行文件加上参数的形式(推荐)
CMD ["executable","param1","param2"] 
如:CMD ["echo","hello"]

(5)ENTRYPOINT

镜像创建容器,且容器启动后要运行的命令,不会被后续命令覆盖。

ENTRYPOINT指令如果写了多条,那么,ENTRYPOINT都只有最后一条生效。

(6)CMD与ENTRYPOINT区别

  • CMD命令能够被docker run命令后面的命令行参数替换,或者被后面的ENTRYPOINT命令替换
  • ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令,或者后面存在CMD命令)

ENTRYPOINT的Exec格式

# Dockerfile
FROM centos
ENTRYPOINT ["/bin/echo", "Hello"]

# 启动容器的命令: docker run -it [image]
# 输出: Hello
# 启动容器的命令: docker run -it [image] Test
# 输出: Hello Test

ENTRYPOINT的Exec格式 + CMD的Exec格式

# Dockerfile
FROM centos
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["Word"]

# 启动容器的命令: docker run -it [image]
# 输出: Hello Word
# 启动容器的命令: docker run -it [image] Test
# 输出: Hello Test

详情请参考:Dockerfile中CMD与ENTRYPOINT命令的区别

(7)EXPOSE

为容器打开指定要监听的端口以实现与外部通信,只是一个声明

这当然只是一个声明,没有任何作用。

在运行时并不会因为这个声明应用就会开启这个端口的服务。这样声明主要是为了方便后期我们配置端口映射。

真正要暴露这个端口需要再构建容器的时候使用"-P"选项

示例:

EXPOSE 80/tcp
EXPOSE 80/udp
EXPOSE 80

(8)ENV

设置环境变量。

它有两种语法格式,如下所示:

ENV <key> <value> 
ENV <key>=<value> ...

两者的区别就是第一种是一次设置一个,第二种是一次设置多个。

(9)ARG

定义创建镜像过程中使用的变量

作用域:ARG指令声明的变量在当前构建阶段完成后失效

相当于在函数内声明的变量,只能在该函数内生效。所以在进行多阶段构建时,每个阶段都必须重新使用ARG指令声明变量。

来自Docker官方的警告:

        不建议在构建时使用ARG传递密钥、用户凭证等信息,因为构建时的信息是任何用户都可以通过docker history看到的!!!!!!!!!

(10)COPY

复制文件或者目录到容器里指定路径。

# 复制宿主机文件index.html到容器/data/html/index.html
COPY index.html /data/html/index.html   

# 复制宿主机data目录下文件(包括子目录)到容器/data/目录下,并不会复制目录本身
COPY data  /data/

(11)ADD

复制文件或者目录到容器里指定路径。

ADD 指令和 COPY 的使用类似 (同样需求下,官方推荐使用 COPY)

ADD /data/src/nginx-1.14.0.tar.gz /data/src/

# 构建镜像
docker build -t nginx:v1.1  .

# 创建容器
docker run --rm --name nginx -it  nginx:v1.1  ls /data/src

# 我们可以发现已经解压了nginx-1.14.0.tar.gz文件

(12)VOLUME

创建一个匿名数据卷挂载点。

在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

语法:
VOLUME <path>
VOLUME ["path"]

path:代表容器中的目录,
与docker run 不同,Dockerfile中不能指定宿主机目录,默认使用docker管理的挂载点

样例:
VOLUME ["/var/log/“]
VOLUME /myvol

通过docker run命令的-v标识创建的挂载点只能对创建的容器有效。

通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。但在dockerfile中无法指定主机上对应的目录,是自动生成的。

若想要具名挂载,可以在docker run的时候 -v 指定主机名字。如 -v 卷名:容器路径。容器路径需要与dockerfile路径的卷名一样;如果不一样,就会重新生成第二个数据卷。

注:-v 命令也不能指定主机路径,指定主机路径后,类型会变成bing属性,而不是volume属性。

(13)WORKDIR

指定工作目录。

用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指令设定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

样例:

WORKDIR /var/log 

# 也可以设置多次
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# pwd执行的结果是/a/b/c

(14)USER

用于指定执行后续命令的用户和用户组。这里只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。在USER命令之前可以使用RUN命令创建需要的用户。

默认情况下,容器的运行身份为root用户

语法格式如下:

# 可以指定用户名或者UID,组名或者GID
USER <user>[:<group>]
USER <UID>[:<GID>]

USER指令还可以在docker run命令中使用-u参数进行覆盖。

















Nginx

docker run -p 8080:80 --name nginx01 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/conf.d:/etc/nginx/conf.d -v /home/nginx/html:/usr/share/nginx/html -it nginx

–name nginx  启动容器的名字

-it   运行

-p 8080:80 将容器的 9002(后面那个) 端口映射到主机的 80(前面那个) 端口

-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 挂载nginx.conf配置文件

-v /home/nginx/conf/conf.d:/etc/nginx/conf.d 挂载nginx配置文件

-v /home/nginx/log:/var/log/nginx 挂载nginx日志文件

-v /home/nginx/html:/usr/share/nginx/html 挂载nginx内容

nginx01  本地运行的版本


十、docker镜像没有命令安装


进入docker容器

sudo docker exec -it eda2222(容器名orID) /bin/bash

1、vim安装

# 先更新我们的包管理工具
apt-get update
# 然后安装我们需要的vim
apt-get install vim


1、启动jenkins命令:

docker run --name jenkins -p 1000:8080 -v /home/jenkins:/var/jenkins_home -v /etc/localtime:/etc/localtime -v /root/apache-maven-3.6.3:/usr/local/maven -it jenkins/jenkins:lts


2、安装mysql

拉区镜像

docker pull mysql:8.0.28

创建两个文件夹

/home/mysql/conf :存放配置文件my.cnf
/home/mysql/data:存放数据

创建配置文件my.cnf,存放到/home/mysql/data目录。

[client]
default-character-set = utf8mb4
[mysqld]
datadir = /home/mysql/data  #为宿主机data数据存放目录
character_set_server = utf8mb4
collation_server = utf8mb4_bin
secure-file-priv= NULL
symbolic-links=0
!includedir /etc/mysql/conf.d/

创建容器及运行命令:

docker run --restart=unless-stopped -d --name mysql -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /home/mysql/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD="mojinpeng" mysql:8.0.28

docker run   \
--restart=unless-stopped    \   #--restart 重启策略,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
-d   \                          #后台允许
--name mysql   \
-v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf  \
-v /home/mysql/data:/var/lib/mysql  \
-p 3306:3306   \
-e MYSQL_ROOT_PASSWORD="mojinpeng"  \     # 配置mysql默认密码
mysql:8.0.28


3、安装redis

拉取镜像

dokcer pull redis:7.0.5

创建文件夹

/home//data:存放数据

创建配置文件redis.conf,放到/home/redis目录,文件从这获取 redis.conf

/home/redis/redis.conf

修改配置文件,修改密码、允许外部连接配置

# requirepass foobared 找到这个,改成你想改的密码即可

比如:
#
# requirepass foobared 
requirepass
bind 127.0.0.1 -::1 # 这个改成 0.0.0.0 即可,127.0.0.1 是只允许本机访问

比如:
# bind 127.0.0.1 -::1 
bind 0.0.0.0

创建容器并启动命令

docker run --restart=always \
-p 6379:6379 \
--name redis \
-v /home/dj/redis/redis.conf:/etc/redis/redis.conf \
-v /home/dj/redis/data:/data \
-d redis:7.0.5 redis-server /etc/redis/redis.conf
各参数的意义:
1)-restart=always 总是开机启动
2)-p 6379:6379 将6379端口挂载出去
3)–name 给这个容器取一个名字
4)-v 数据卷挂载 /home/dj/redis/redis.conf:/etc/redis/redis.conf
此处是将宿主机 /home/dj/redis/redis.conf 文件映射到 redis 容器下的 /etc/redis/redis.conf,此处你也可以理解为docker容器
和宿主机共享这个文件。

5)-d redis:7.0.12 后台运行容器,不加-d就是直接在控制台输出,关闭窗口即停止容器。

6) redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的 redis.conf文件,最终找到的是挂载的目录
/etc/redis/redis.conf 也就是宿主机下共享的 /home/dj/redis/redis.conf。
补充:如果有权限相关的问题,可以给容器一个特权模式。加一个 --privileged

7)--log-opt max-size=100m --log-opt max-file=3
max-size:指定日志文件大小上限
max-file:指定日志文件个数

使用交互方式进入到容器内部:

docker exec -it myredis bash  #进入容器
redis-cli     
set k1 v1   #你会发现失败的
get k1
auth ningzaichun   #验证密码

Docker_html_06


4、安装nacos

拉取镜像

docker pull nacos/nacos-server:2.2.0

创建数据库:使用 MySQL 来存放 nacos 的配置文件信息,这样便于后期维护管理,所以我们需要使用 MySQL 创建 一个数据库名为 nacos 的数据库。

CREATE DATABASE IF NOT EXISTS `nacos` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

导入数据库脚本文件:

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info   */
/******************************************/
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  `encrypted_data_key` text NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE `config_info_aggr` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  `content` longtext NOT NULL COMMENT '内容',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE `config_info_beta` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `encrypted_data_key` text NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE `config_info_tag` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_tags_relation   */
/******************************************/
CREATE TABLE `config_tags_relation` (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
  `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`nid`),
  UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = group_capacity   */
/******************************************/
CREATE TABLE `group_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE `his_config_info` (
  `id` bigint(20) unsigned NOT NULL,
  `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `src_user` text,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `encrypted_data_key` text NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`nid`),
  KEY `idx_gmt_create` (`gmt_create`),
  KEY `idx_gmt_modified` (`gmt_modified`),
  KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_capacity   */
/******************************************/
CREATE TABLE `tenant_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';


CREATE TABLE `tenant_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `kp` varchar(128) NOT NULL COMMENT 'kp',
  `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
  `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
  `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
  `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';

CREATE TABLE `users` (
	`username` varchar(50) NOT NULL PRIMARY KEY,
	`password` varchar(500) NOT NULL,
	`enabled` boolean NOT NULL
);

CREATE TABLE `roles` (
	`username` varchar(50) NOT NULL,
	`role` varchar(50) NOT NULL,
	UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);

CREATE TABLE `permissions` (
    `role` varchar(50) NOT NULL,
    `resource` varchar(255) NOT NULL,
    `action` varchar(8) NOT NULL,
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

创建挂载目录

mkdir -p /home/nacos/logs                  
mkdir -p /home/nacos/init.d          
touch /home/nacos/init.d/custom.properties

创建容器

docker run -d --name nacos \
--restart=always \
--network=host \
-e MODE=standalone \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=127.0.0.1 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_DATABASE_NUM=1 \
-v /home/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties \
-v /home/nacos/logs:/home/nacos/logs \
nacos/nacos-server
MODE=standalone,单机模式运行
SPRING_DATASOURCE_PLATFORM=mysql,以 MySQL 作为数据源
MYSQL_SERVICE_HOST,MySQL IP地址
MYSQL_SERVICE_PORT,MySQL 端口
MYSQL_SERVICE_DB_NAME,数据库名
MYSQL_SERVICE_USER,MySQL 用户名
MYSQL_SERVICE_PASSWORD,MySQL 用户密码

注意:–network=host 指定 Docker 容器的网络模式为 Host 和宿主机在同一个网络,而不是默认的 Bridge 桥接模式,所以不指定端口的映射 -p 8848:8848

如果启动失败,可在宿主机 /home/nacos/logs 查看日志

访问地址 http://127.0.0.1:8848/nacos,默认账号nacos,默认秘密:nacos