一、概述
1.1 Docker介绍
Docker其中包括,镜像、容器、仓库,很简单,目的就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的产品(可以是 web 应用或者数据库应用)及其环境能够做到“一次封装,到处运行”。
1.2 作用
docker 的好处
- 简化配置,构建一次后打包后就可以用作测试环境,也可以用作生产环境或与预生产环境,可以省去很多测试环节。比如一台服务器可以进行测试多个版本的测试,不用等待。
- 可以解决开发人员部署环境的困难,好比如一个刚来的新同事安装环境可能需要半天时间,但要是直接运行一个已经配好的容器的话就方便多了。
- 应用隔离,服务器整合,一个服务器可以用docker部署多套业务,并且隔离性很高(除了虚拟机)。
- 对于开发来说部署好之后到处运行便于开发调试。
- 可以减少资源的利用,和虚拟机比较省去了很多不必要的资源,损失的隔离性其他的有点足以弥补啦。
- 对与运维来说,可以快速的进行扩容,减少原利用率
- 每个小的服务都可以进行集群,docker对资源的利用比较小,可以在一台服务器启动多台,相比其他产品对服务器的I/O使用上要多例如(启动storm)。
- 可以多平台部署
传统虚拟机部署项目:
Docker虚拟化部署项目:
二、命令
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
:再次查看容器的网络信息
五、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指令。 |
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 #验证密码
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