docker学习

Docker概述

真实项目部署环境可能非常复杂,传统发布项目一个只需要一个jar包,运行环境需要单独部署。而通过Docker可将jar包和相关环境(如jdk,redis,Hadoop...)等打包到docker镜像里,将镜像发布到Docker仓库,部署时下载发布的镜像,直接运行发布的镜像即可。Docker容器使用沙箱机制,通过隔离机制,使每个发布的应用之间互相隔离,相互之间不会有任何接口。
优点:隔离,镜像轻巧,秒级启动。

文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/

  • Docker基本组成:

    1.镜像(image):类似于一个模板,通过这个模板来创建容器服务,如tomcat镜像=》run命令运行镜像=》创建tomcat容器
    2.容器(container):Docker利用容器技术,可独立运行一个或一组应用,是通过镜像来创建的。可以执行启动,停止,删除等命令。暂时可将容器理解为一个简易的linux系统。
    3.仓库(repository):存放镜像的地方,分为共有仓库(如Docker hub)和私有仓库。

Docker安装

根据帮助文档:

#1.卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
#2.安装包
sudo yum install -y yum-utils

#3.设置镜像仓库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo #默认国外的,非常慢

sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推荐阿里云

#4.更新软件包索引
yum makecache fast

#4.安装Docker引擎 (docker-ce:社区版)
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

#5.启动Docker
sudo systemctl start docker

#docker version查看是否安装成功

#6.测试helloword
sudo docker run hello-world

#7.查看下载的hello-world镜像
docker images

#8.卸载docker
#移除Docker引擎
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

#移除镜像
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

阿里云镜像加速

  • 进入阿里云官网的容器镜像服务,找到镜像加速地址

  • 配置使用

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

Docker run的流程

Docker如何工作的?
Docker是一个CS结构的系统,Docker的守护进程运行在主机上,DockerServer接收到DockerClient的指令执行。

Docker命令

官方文档:https://docs.docker.com/engine/reference/commandline/build/

docker version #显示版本信息
docker info #docker更加详细的信息
docker 命令 --help #帮助命令

  • 镜像命令

docker images #查看所有镜像

解释

  • Repostory #镜像仓库源
  • TAG #镜像标签
  • IMAGE_ID #镜像id

可选项(可通过docker images --help查看)

-a, --all Show all images (default hides intermediate images)
-q, --quiet Only show image IDs

docker search搜索镜像

可选项

  • 通过收藏数过滤

docker pull下载镜像 镜像名[:tag]

[root@cchuang cchuang]# docker pull mysql
Using default tag: latest  #如果不写tag,默认最新版
latest: Pulling from library/mysql
72a69066d2fe: Pull complete    #分层下载 
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #真实地址

#指定版本下载
[root@cchuang cchuang]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists 
93619dbc5b36: Already exists 
99da31dd6142: Already exists 
626033c43d70: Already exists 
37d5d7efb64e: Already exists 
ac563158d721: Already exists 
d2ba16033dad: Already exists 
0ceb82207cd7: Pull complete 
37f2405cae96: Pull complete 
e2482e017e53: Pull complete 
70deed891d42: Pull complete 
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

删除镜像

  • 通过image_id删除

  • 删除所有镜像

  • 容器命令
    说明:有了镜像才能创建容器,先下载一个centos镜像学习。

docker pull centos

新建容器并启动:

docker run [参数] image

#参数说明:
--name="Name" #容器名称,tomcat1,Tomcat2
-d            #后台运行
-it            #交互方式运行,进入容器查看内容
-p            #指定容器端口
     -p  ip:主机端口:容器端口(常用)
    -p  主机端口:容器端口(常用)
    -p  容器端口
-P            #随机指定端口

#测试
[root@cchuang ~]# docker run -it centos /bin/bash  #启动并进入容器
[root@a25b788abecd /]# 

#查看容器内的centos
[root@a25b788abecd /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

#退出容器(exit:退出容器并停止;ctrl+P+Q:容器退出不停止)
[root@a25b788abecd /]# exit
exit

#列出所有运行容器
[root@cchuang /]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@cchuang /]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                          PORTS     NAMES
a25b788abecd   centos         "/bin/bash"   3 minutes ago   Exited (0) About a minute ago             agitated_khorana
8e4b0bac5001   feb5d9fea6a5   "/hello"      3 hours ago     Exited (0) 3 hours ago                    epic_hypatia

#删除容器
docker rm 容器id      #删除指定容器,不能删除正在运行的容器,若强制删除,-f
docker rm -f $(docker ps -aq)  #删除所有容器
docker ps -a -q|xargs docker rm #删除所有容器

#启动和停止容器
docker start 容器id    #启动容器
docker restart 容器id  #重启容器
docker stop 容器id      #停止容器
docker kill 容器id      #

常用的其它命令

后台启动容器

#docker run -d 镜像名
[root@cchuang /]# docker run -d centos

#docker ps 发现centos停止了
#docker容器使用后台运行时,必须要有个前台进程,docker发现没有应用,就会自动停止。
#nginx,容器启动后,发现没有提供服务,就会自动停止。

查看日志

docker logs
#显示指定条数的日志
-ft    #显示格式时间戳
--tail 10  #显示条数
[root@cchuang /]# docker logs -ft --tail 10 ddeeded713ed

查看容器中的进程信息

#docker top 容器id
[root@cchuang /]# docker top ddeeded713ed
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                17484               17465               0                   11:15               pts/0               00:00:00            /bin/bash

查看容器的元数据

[root@cchuang /]# docker inspect ddeeded713ed

进入容器的命令
通常容器都是以后台方式运行的,需要进入容器,修改一些配置。

docker exec -it 容器id /bin/bash

docker attach 容器id 

从容器内拷贝到主机上

#docker cp 容器id:容器内路劲  目标主机路劲

[root@cchuang /]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED       STATUS       PORTS     NAMES
ddeeded713ed   centos    "/bin/bash"   6 hours ago   Up 6 hours             cool_wozniak
#查看主机路径
[root@cchuang /]# cd /home
[root@cchuang home]# mkdir test
[root@cchuang home]# ls
cchuang  test
#进入容器内部
[root@cchuang home]# docker attach ddeeded713ed
[root@ddeeded713ed /]# cd home
[root@ddeeded713ed home]# ls
[root@ddeeded713ed home]# touch test.txt
[root@ddeeded713ed home]# ls
test.txt
[root@ddeeded713ed home]# exit
exit
#拷贝文件到主机上
[root@cchuang home]# docker cp ddeeded713ed:/home/test.txt /home/test
Successfully copied 1.536kB to /home/test
[root@cchuang home]# ls
cchuang  test
[root@cchuang home]# cd test
[root@cchuang test]# ls
test.txt

1.部署nginx

#1.搜索镜像
[root@cchuang test]# docker search nginx

#2.pull镜像
[root@cchuang test]# docker pull nginx

#3.启动容器并开放端口
[root@cchuang test]# docker run -d --name nginx01 -p 3344:80 nginx

端口暴露:

补充:(阿里云开放端口步骤)

1.新增安全组访问规则配置

2.开放端口

开放端口:firewall-cmd --zone=public --add-port=3344/tcp --permanent

查看已开启的端口信息:

firewall-cmd --list-ports

3.重启防火墙

systemctl restart firewalld.service

利用iptable开启端口

命令:iptables -A INPUT -p tcp --dport 3344 -j ACCEPT

4.启动docker,映射端口

docker run -d --name nginx0 -p 3344:80 nginx

5.如果报错,重启docker服务

systemctl restart docker

6.测试
外网输入地址 ip:3344 可进入docker容器的nginx

若要修改nginx配置文件,每次都要进入nginx内部修改,非常麻烦,我们可以在容器外部提供一个映射的路径,达到在容器外部修改文件,容器内部可以自动修改(-v 数据卷的方式)

2.部署es+kibana

#1.es暴露的端口很多
#2.耗内存
#3.es数据一般要放到安全目录,挂载

$ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

#启动之后linux卡住,耗内存

#查看cpu状态
docker stats

#关闭docker,增加es的内存限制,通过 -e 环境变量配置修改
$ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

docker stats

CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O       PIDS
de3ab3cae3fb   elasticsearch01   97.21%    318MiB / 1.715GiB   18.11%    656B / 0B   108MB / 246kB   26

kibana连接es,如何才能连接过去?见下文docker网络原理

可视化

  • portainer
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

测试:
打开阿里云安全组,外网测试 ip:8088

  • Rancher(CI/CD)

Docker镜像加载原理

  • UnionFS(联合文件系统)
    UnionFS(联合文件系统)是一种分层,轻量级且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层一层叠加,同时可将不同的目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像的基础,镜像可以通过分层来继承,基于基础镜像可以制作各种具体的应用镜像。

  • Docker镜像加载原理
    docker镜像实际上是由一层一层的文件系统组成,这种层级的文件系统即UnionFS。

bootfs(boot file system)主要包含bootloader和kernel,bootloader主要引导加载kernel,Linux刚启动时就会加载bootfs文件系统,Docker最底层就是bootfs,这一层与典型的Linux/Unix是一样的,包含boot加载器和内核,当boot加载完整个内核就在内存中了,此时内存的使用权已经由bootfs转交给内核了,此时系统就会卸载bootfs。

rootfs(root file system),在bootfs之上,包含的就是典型的 /dev,/proc,/bin,/etc等标准目录和文件,rootfs就是各种不同操作系统的发行版,如centos,Ubuntu等等。

为何docker的centos只有几百MB,而安装进虚拟机的有是几个G
对于一个精简的centos,rootfs可以很小,只需要包含最基本的命令即可,底层的kernel用的还是host的,自己只需要提供rootfs即可,不同的发行版本可以共用bootfs。

Docker分层理解

所有的Docker镜像都起始于一个基础镜像,当进行修改或者新增时,会在当前镜像层之上,创建新的镜像层。

在额外添加镜像层的同时,镜像是始终保持当前镜像的所有组合,如图,每个镜像层包含三个文件,整个镜像包含来自两个镜像层的6个文件。

下图展示了三层镜像,在外界看来只有6个文件,因为最上层文件7是文件5的更新版本。

最终对外展示的镜像层视图:

特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常是所说的容器层,容器层之下的都叫镜像层。

如何提交一个自己的镜像(commit)

如果想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像。

docker commit 提交容器成为一个新副本

#命令和git原理近似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

#原tomcat镜像没有webapp下的应用,添加应用后提交镜像
[root@cchuang ~]# docker commit -a="cchuang" -m="添加应用" 1274e9395923 tomcat1.0

[root@cchuang ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
tomcat1.0             latest    ad4efd5a4e82   24 seconds ago   684MB

Docker数据卷

  • 什么是容器数据卷?
    docker将应用和环境打包成镜像,但是如果像mysql等将数据也放在容器中,那么容器删除,数据也会丢失,我们可以将数据存在一个容器可以共享的地方。Docker容器中产生的数据,可以同步到本地,这就是卷技术,可以将Docker容器内的目录,挂载到Linux上面。

  • 使用方式:
1.使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录 

docker run -it -v /home/test:/home tomcat /bin/bash

#启动后通过docker inspect查看挂载信息

对本地文件的修改会使挂载的容器内的目录同步修改!

实战:安装mysql,MySQL的数据持久化问题。

mysql的数据再data目录下,将data目录挂载出来.

#1.拉取mysql镜像
[root@cchuang /]# docker pull mysql:5.7

-d  后台运行
-p  端口映射
-v  挂载
-e  环境配置
--name  容器名称
#2.运行容器,需要做数据挂载,安装启动mysql时,需要设置密码
[root@cchuang /]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 

#3.启动成功,从本地通过sqlyog连接服务器的3306,映射到容器内的3306

#4.查看本地挂载目录
[root@cchuang home]# ls
cchuang  mysql  test
[root@cchuang home]# cd mysql
[root@cchuang mysql]# ls
conf  data
[root@cchuang mysql]# cd data
[root@cchuang data]# ls
auto.cnf         ib_buffer_pool  mysql               server-key.pem
ca-key.pem       ibdata1         performance_schema  sys
ca.pem           ib_logfile0     private_key.pem
client-cert.pem  ib_logfile1     public_key.pem
client-key.pem   ibtmp1          server-cert.pem

#5.通过本地sqlyog创建一个test数据库,即docker容器内也会创建一个文件,查看本地挂载的data目录,发现多一个文件,挂载成功。

[root@cchuang data]# ls
auto.cnf         ib_buffer_pool  mysql               server-key.pem
ca-key.pem       ibdata1         performance_schema  sys
ca.pem           ib_logfile0     private_key.pem     test
client-cert.pem  ib_logfile1     public_key.pem
client-key.pem   ibtmp1          server-cert.pem

#6.删除docker容器,linux本地挂载的data目录下的文件依旧存在,数据持久化。

[root@cchuang data]# docker rm -f 60afb0e127e9

[root@cchuang data]# ls
auto.cnf         ib_buffer_pool  mysql               server-key.pem
ca-key.pem       ibdata1         performance_schema  sys
ca.pem           ib_logfile0     private_key.pem     test
client-cert.pem  ib_logfile1     public_key.pem
client-key.pem   ibtmp1          server-cert.pem

具名挂载和匿名挂载

#匿名挂载(没有指定容器外的路径)

[root@cchuang /]# docker run -d -p 80:80 --name nginx01 -v /etc/nginx nginx

#查看所有volume情况
[root@cchuang /]# docker volume ls
DRIVER    VOLUME NAME
local     1ef0259786a48805e8816ea03f5dafc92477a449d64117c4c3a4cda027906ba3
local     52eeb7ad21d8cff59fdeab57ed8e3c9ca868620a542b9c058a6db8ba8504f1f3

#具名挂载(通过 -v 卷名:容器内路径)
[root@cchuang /]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
a4e76f8aecbd7889f85f7955eb1839924c4bf273fc807ef6cc0b2dab308c5f83

[root@cchuang /]# docker volume ls
DRIVER    VOLUME NAME
local     juming-nginx
#查看一下挂载的卷

[root@cchuang ~]# docker volume inspect juming-nginx 
[
    {
        "CreatedAt": "2023-04-17T17:33:31+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

所有docker下的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/XX下的。通过具名挂载可以很方便的找到卷,多数情况下都是具名挂载。

#挂载方式
-v 容器内路径      #匿名挂载
-v 卷名:容器外路径    #具名挂载
-v /宿主机路径:容器内路径  #指定路径挂载

拓展:

#通过 -v 容器内路径:ro rw改变读写权限(对于容器来说,在容器内操作挂载出来的目录的权限)

ro  readonly #只读 (只能从容器外部宿主机来操作,容器内部无法操作)
rw  readwrite  #可读写

[root@cchuang ~]# docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx

初识DockerFile

Dockfile就是用来构建Docker镜像的,一段命令脚本,通过这个脚本可以生成镜像,脚本里的每个命令就是一层。

#构建dockerfile文件

[root@cchuang docker-file-volume]# vim dockerfile1
[root@cchuang docker-file-volume]# cat dockerfile1 
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end---"

CMD /bin/bash

#构建镜像
[root@cchuang docker-file-volume]# docker build -f dockerfile1 -t cchuang/centos .
[+] Building 0.1s (5/5) FINISHED                                                                                                                                         
 => [internal] load build definition from dockerfile1                                                                                                               0.0s
 => => transferring dockerfile: 121B                                                                                                                                0.0s
 => [internal] load .dockerignore                                                                                                                                   0.0s
 => => transferring context: 2B                                                                                                                                     0.0s
 => [internal] load metadata for docker.io/library/centos:latest                                                                                                    0.0s
 => [1/1] FROM docker.io/library/centos                                                                                                                             0.0s
 => exporting to image                                                                                                                                              0.0s
 => => exporting layers                                                                                                                                             0.0s
 => => writing image sha256:da9e95cba3f789425b8d7437106995c796f02b5bb5c0b05aa2c43df4399ef0f0                                                                        0.0s
 => => naming to docker.io/cchuang/centos                                                                                                                           0.0s

#启动容器运行新建的镜像

[root@cchuang docker-file-volume]# docker run -it cchuang/centos /bin/bash
[root@f5826eedf0d5 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01  volume02

#查看挂载的路径
[root@cchuang docker-file-volume]# docker inspect da9e95cba3f7

数据卷容器

多个容器之间共享数据(通过 --volume-from)

#启动三个容器,通过上面构建的镜像启动
[root@cchuang ~]# docker run -it --name docker01 da9e95cba3f7

[root@6e21966e1eaf /]# ls -l

#创建docker02,通过--volume-from 继承docker01容器
[root@cchuang ~]# docker run -it --name docker02 --volumes-from docker01 da9e95cba3f7

#进入docker01的容器,在挂载的volume01目录下创建一个文件,在docker02里也会新增。

[root@cchuang ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
c430673f042d   da9e95cba3f7   "/bin/sh -c /bin/bash"   3 minutes ago   Up 3 minutes             docker02
6e21966e1eaf   da9e95cba3f7   "/bin/sh -c /bin/bash"   6 minutes ago   Up 6 minutes             docker01

#进入docker01

[root@cchuang ~]# docker attach 6e21966e1eaf
[root@6e21966e1eaf /]# ls -l
total 56
lrwxrwxrwx  1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x  5 root root  360 Apr 17 12:58 dev
drwxr-xr-x  1 root root 4096 Apr 17 12:58 etc
drwxr-xr-x  2 root root 4096 Nov  3  2020 home
lrwxrwxrwx  1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx  1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------  2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x  2 root root 4096 Nov  3  2020 media
drwxr-xr-x  2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x  2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 99 root root    0 Apr 17 12:58 proc
dr-xr-x---  2 root root 4096 Sep 15  2021 root
drwxr-xr-x 11 root root 4096 Sep 15  2021 run
lrwxrwxrwx  1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x  2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x 13 root root    0 Apr 17 12:58 sys
drwxrwxrwt  7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15  2021 usr
drwxr-xr-x 20 root root 4096 Sep 15  2021 var
drwxr-xr-x  2 root root 4096 Apr 17 12:58 volume01
drwxr-xr-x  2 root root 4096 Apr 17 12:58 volume02
[root@6e21966e1eaf /]# cd volume01

#新增文件

[root@6e21966e1eaf volume01]# ls
[root@6e21966e1eaf volume01]# touch docker01
[root@6e21966e1eaf volume01]# ls
docker01
#进入docker02容器,查看volume01目录发现docker01创建的文件同步到的docker02
[root@cchuang ~]# docker attach c430673f042d
[root@c430673f042d /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01  volume02

[root@c430673f042d /]# cd volume01
[root@c430673f042d volume01]# ls
docker01

可以用来实现多个mysql之间的数据共享

DockerFile介绍

DockerFile就是用来构建Docker镜像的,是一个命令脚本。
构建步骤:

  • 编写一个Dockefile文件
  • docker build构建成为一个镜像
  • docker run运行镜像
  • docker push发布镜像(docker hub或者阿里云镜像仓库)

官网centos镜像:

很多官方镜像都是基础包,很多功能都没有,我们通常会制作自己的镜像。

DockerFile构建过程

  • 注意:
    1.每个保留关键字都是大写字母。
    2.每个指令都会创建提交一个新的镜像层,并提交。

  • dockerfile指令说明:
FORM       #基础镜像,一切从这里构建
MAINTAINER #镜像作者,姓名+邮箱
RUN        #镜像构建的时候运行的命令
ADD        #需要添加的其他镜像,如tomcat压缩包
WORKDIR    #镜像工作目录
VOLUME     #挂载卷位置
EXPOSE     #暴露端口,不指定需要在run的时候 -p 指定
CMD        #指定这个容器启动时要运行的命令 (只有最后一个会生效,可被替代)
ENTRYPOINT #指定这个容器启动时要运行的命令 (可以追加命令)
ONBUILD    #当构建一个被继承的Dockerfile时,会运行ONBUILD的指令
COPY       #类似ADD,将文件拷贝到镜像里
ENV        #构建的时候设置环境变量

  • 构建自己的centos镜像(原始centos镜像没有vim和ipconfig命令)
#编写dockerfile文件

FROM centos:7

MAINTAINER cchuang<111@qq.com>

ENV MYPATH /usr/local

WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end---"
CMD /bin/bash
#通过这个文件构建镜像
[root@cchuang dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .

[root@cchuang dockerfile]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
mycentos              0.1       ab91446c9412   32 seconds ago   640MB
#运行测试vim和ipconfig命令

[root@cchuang dockerfile]# docker run -it ab91446c9412 /bin/bash
[root@f1a5718cc952 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
#docker history命令查看镜像的构建历史

[root@cchuang dockerfile]# docker history mysql:5.7
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
c20987f18b13   16 months ago   /bin/sh -c #(nop)  CMD ["mysqld"]               0B        
<missing>      16 months ago   /bin/sh -c #(nop)  EXPOSE 3306 33060            0B        
<missing>      16 months ago   /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B        
<missing>      16 months ago   /bin/sh -c ln -s usr/local/bin/docker-entryp…   34B       
<missing>      16 months ago   /bin/sh -c #(nop) COPY file:345a22fe55d3e678…   14.5kB    
<missing>      16 months ago   /bin/sh -c #(nop)  VOLUME [/var/lib/mysql]      0B        
<missing>      16 months ago   /bin/sh -c {   echo mysql-community-server m…   313MB     
<missing>      16 months ago   /bin/sh -c echo 'deb http://repo.mysql.com/a…   55B       
<missing>      16 months ago   /bin/sh -c #(nop)  ENV MYSQL_VERSION=5.7.36-…   0B        
<missing>      16 months ago   /bin/sh -c #(nop)  ENV MYSQL_MAJOR=5.7          0B        
<missing>      16 months ago   /bin/sh -c set -ex;  key='A4A9406876FCBD3C45…   1.84kB    
<missing>      16 months ago   /bin/sh -c apt-get update && apt-get install…   52.2MB    
<missing>      16 months ago   /bin/sh -c mkdir /docker-entrypoint-initdb.d    0B        
<missing>      16 months ago   /bin/sh -c set -eux;  savedAptMark="$(apt-ma…   4.17MB    
<missing>      16 months ago   /bin/sh -c #(nop)  ENV GOSU_VERSION=1.12        0B        
<missing>      16 months ago   /bin/sh -c apt-get update && apt-get install…   9.34MB    
<missing>      16 months ago   /bin/sh -c groupadd -r mysql && useradd -r -…   329kB     
<missing>      16 months ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      16 months ago   /bin/sh -c #(nop) ADD file:bd5c9e0e0145fe33b…   69.3MB   
  • CMD和ENTRYPOINT的区别
    ENTRYPOINT 中的参数始终会被使用,而CMD中的额外参数可以在容器启动时动态替换掉。
    如果Dockerfile文件既有CMD,又有ENTRYPOINT ,那么CMD将会被当做参数传递给ENTRYPOINT

Dockerfile制作Tomcat镜像

1.准备镜像文件,tomcat压缩包,jdk压缩包

#下载jdk
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz

[root@cchuang cchuang]# ls
apache-tomcat-9.0.73.tar.gz  jdk-8u131-linux-x64.tar.gz

2.编写dockerfile文件

[root@cchuang cchuang]# vim Dockerfile

FROM centos:7

MAINTAINER cchuang<111@qq.com>

ADD jdk-8u131-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.73.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local

WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_131
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.73
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.73
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.73/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.73/logs/catalina.out
#构建镜像
[root@cchuang cchuang]# docker build -t diytomcat .

#启动容器并挂载webapps,logs目录

[root@cchuang cchuang]# docker run -d --name ccuhangTomcat -p 8080:8080 -v /home/cchuang/tomcat/webapps:/usr/local/apache-tomcat-9.0.73/webapps -v /home/cchuang/tomcat/logs:/usr/local/apache-tomcat-9.0.73/logs diytomcat
948bd5fbbcb271ca048c72a1d605693701e3cfbde1472d6e900411ff9a1367f2

#文件挂载成功,发布项目只需发布在本地挂载的webapps目录,会同步到容器内的webapps目录
[root@cchuang tomcat]# ls
logs  webapps
[root@cchuang tomcat]# pwd
/home/cchuang/tomcat

发布自己的镜像

发布dockerhub

#登陆dockerhub
[root@cchuang /]# docker login -u huangchengcong
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

#提交镜像
#docker push dockerhub用户名/镜像名:tag
[root@cchuang /]# docker push huangchengcong/diytomcat:1.0

#若报错,修改tag,带上版本号
[root@cchuang /]# docker tag afda1a6423f6 huangchengcong/diytomcat:1.0
#再次提交push成功
[root@cchuang /]# docker push huangchengcong/diytomcat:1.0
The push refers to repository [docker.io/huangchengcong/diytomcat]
5f70bf18a086: Pushed 
a42a41fd6008: Pushing   12.5MB/259.3MB
8cf305978f90: Pushing  5.036MB/16.17MB

发布到阿里云

1.找到阿里云容器镜像服务

2.创建命名空间

3.创建镜像仓库

4.操作参考官方文档

小结图

Docker网络原理

理解Docker0

[root@cchuang /]# ip addr

  • docker 是如何处理网络访问的?
    1.我们每启动一个容器,docker就会为docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0,桥接模式,使用veth-pair技术。

再启动一个容器,又多了一对网卡:

# 启动容器带来的网卡都是一对一对的,veth-pair技术提供一对虚拟的设备接口,充当一个桥梁。容器和容器之间是可以通信的。

所有的容器不指定网络的情况下,都是通过Docker0路由的,docker会为容器分配一个可用ip,docker中的所有网络接口都是虚拟的。

容器互联 --link ;。
容器之间可以通过容器名ping通,如:

[root@cchuang ~]# docker exec -it tomcat02 ping tomcat01
#实现,通过 --link,就是在容器的host配置文件新增一条配置
[root@cchuang ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat

发现tomcat03的host配置文件和tomcat02的联系

[root@cchuang ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3      tomcat02 09abfc1d9356
172.17.0.4      6c3e62552585

自定义网络互联

#查看所有的docker网络
[root@cchuang ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
3368f7e41d43   bridge    bridge    local
b705923b3209   host      host      local
e220dcd80b94   none      null      local

#前面不指定网络的情况下默认参数为 --net bridge 为docker0
[root@cchuang /]# docker run -d -P --name tomcat01 --net bridge tomcat

#docker0默认不支持域名访问,需要用--link实现

#自定义网络
#--driver bridge 桥接
#--subnet  子网
#--gateway  网关
[root@cchuang /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
38260ff41b7ad9078a2b765464638c0242dae84aac0fa756646d07bd96de881b

[root@cchuang /]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
3368f7e41d43   bridge    bridge    local
b705923b3209   host      host      local
38260ff41b7a   mynet     bridge    local
e220dcd80b94   none      null      local

#查看自己配置的mynet网络信息
[root@cchuang /]# docker inspect mynet net
[
    {
        "Name": "mynet",
        "Id": "38260ff41b7ad9078a2b765464638c0242dae84aac0fa756646d07bd96de881b",
        "Created": "2023-04-18T15:09:03.295634613+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
#测试,启动两个容器,指定网络为自定义网络
[root@cchuang /]# docker run -d -P --name tomcat-net-01 --net mynet tomcat

[root@cchuang /]# docker run -d -P --name tomcat-net-02 --net mynet tomcat

#查看mynet网络下的信息
[root@cchuang /]# docker inspect mynet net
[
    {
        "Name": "mynet",
        "Id": "38260ff41b7ad9078a2b765464638c0242dae84aac0fa756646d07bd96de881b",
        "Created": "2023-04-18T15:09:03.295634613+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "8e3125446425fe4c250749bd8f10c048606d3f647af747eb578add88fb27d41b": {
                "Name": "tomcat-net-01",
                "EndpointID": "df034fd89f6ededfd6032cc552f1d6d993b277fb0afea17174bd2c439f424ac8",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "ee47cd02a96c0f080f9634ec9f6b3c0d3bb01a1c5a502590d857e779e9c31169": {
                "Name": "tomcat-net-02",
                "EndpointID": "2495488fd7c9656c5b697e37428c9779691be02225082c969d5f856d05569061",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
#自定义网络的好处,可以直接通过容器名ping通,而docker0不指定 -- link是无法通过容器名ping通。而且搭建集群时不同的集群使用不同的网络,保证集群的安全和健康。

网络连通,即如何让docker0和自定义网络之间实现通讯(本质是容器和网卡实现通讯)

#通过network 的connect参数
[root@cchuang /]# docker network connect --help

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER

Connect a container to a network

Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., "172.30.100.104")
      --ip6 string              IPv6 address (e.g., "2001:db8::33")
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container
#将mynet网卡和tomcat01连通
[root@cchuang /]# docker network connect mynet tomcat01

#查看mynet网络信息,发现将tomcat01容器加到mynet中来,即一个容器,两个ip

部署Redis集群,建立自己的redis网卡。

#1.建立redis网络
[root@cchuang /]# docker network create redis --subnet 172.38.0.0/16

[root@cchuang /]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
3368f7e41d43   bridge    bridge    local
b705923b3209   host      host      local
38260ff41b7a   mynet     bridge    local
e220dcd80b94   none      null      local
5db97860681f   redis     bridge    local

#2.通过脚本年创建6个redis配置文件

for port in $(seq 1 6);\
do  \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

#查看节点
root@cchuang mydata]# ls
redis
[root@cchuang mydata]# cd redis/
[root@cchuang redis]# ls
node-1  node-2  node-3  node-4  node-5  node-6

#启动redis-1
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data  \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf  \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#启动redis-2
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data  \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf  \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#启动redis-3
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data  \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf  \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#启动redis-4
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data  \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf  \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#启动redis-5
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data  \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf  \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#启动redis-6
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data  \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf  \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#查看所有启动redis
[root@cchuang /]# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED              STATUS              PORTS                                                                                      NAMES
2d41d6bc058a   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   6 seconds ago        Up 5 seconds        0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp   redis-6
700afe5dc35f   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   38 seconds ago       Up 37 seconds       0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp   redis-5
94ad1e4dfdb1   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp   redis-4
657ae5c6bb50   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp   redis-3
60ef474566c8   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   2 minutes ago        Up 2 minutes        0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp   redis-2
427e4900481f   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   2 minutes ago        Up 2 minutes        0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp   redis-1
[root@cchuang /]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof  nodes.conf

#创建集群
/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --

cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 1759e80401711e6eb4d544d69c8ea621460223dc 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: 17a9936229cacb5416dc66101627aec511c48ae3 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: bf2c752b2119fabae55c3fd83c05f8d240c6b11a 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: f5eccd3cc18d12d8e9fe247deed229a3bb284c33 172.38.0.14:6379
   replicates bf2c752b2119fabae55c3fd83c05f8d240c6b11a
S: 40feaf9141203d5753974ebe22463db86ee8a59e 172.38.0.15:6379
   replicates 1759e80401711e6eb4d544d69c8ea621460223dc
S: 5428e54dce5556fbe3f588d0a42726d97056ffb7 172.38.0.16:6379
   replicates 17a9936229cacb5416dc66101627aec511c48ae3
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: 1759e80401711e6eb4d544d69c8ea621460223dc 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 40feaf9141203d5753974ebe22463db86ee8a59e 172.38.0.15:6379
   slots: (0 slots) slave
   replicates 1759e80401711e6eb4d544d69c8ea621460223dc
M: bf2c752b2119fabae55c3fd83c05f8d240c6b11a 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 5428e54dce5556fbe3f588d0a42726d97056ffb7 172.38.0.16:6379
   slots: (0 slots) slave
   replicates 17a9936229cacb5416dc66101627aec511c48ae3
M: 17a9936229cacb5416dc66101627aec511c48ae3 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: f5eccd3cc18d12d8e9fe247deed229a3bb284c33 172.38.0.14:6379
   slots: (0 slots) slave
   replicates bf2c752b2119fabae55c3fd83c05f8d240c6b11a
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

#连接集群
/data # redis-cli -c
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:189
cluster_stats_messages_pong_sent:194
cluster_stats_messages_sent:383
cluster_stats_messages_ping_received:189
cluster_stats_messages_pong_received:189
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:383

#查看集群节点信息
127.0.0.1:6379> cluster nodes
40feaf9141203d5753974ebe22463db86ee8a59e 172.38.0.15:6379@16379 slave 1759e80401711e6eb4d544d69c8ea621460223dc 0 1681806643621 5 connected
bf2c752b2119fabae55c3fd83c05f8d240c6b11a 172.38.0.13:6379@16379 master - 0 1681806644523 3 connected 10923-16383
5428e54dce5556fbe3f588d0a42726d97056ffb7 172.38.0.16:6379@16379 slave 17a9936229cacb5416dc66101627aec511c48ae3 0 1681806643000 6 connected
1759e80401711e6eb4d544d69c8ea621460223dc 172.38.0.11:6379@16379 myself,master - 0 1681806644000 1 connected 0-5460
17a9936229cacb5416dc66101627aec511c48ae3 172.38.0.12:6379@16379 master - 0 1681806644623 2 connected 5461-10922
f5eccd3cc18d12d8e9fe247deed229a3bb284c33 172.38.0.14:6379@16379 slave bf2c752b2119fabae55c3fd83c05f8d240c6b11a 0 1681806644000 4 connected

#测试,set一个kv
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK

#停止172.38.0.13的容器
[root@cchuang ~]# docker stop redis-3

#查看集群节点信息
127.0.0.1:6379> cluster nodes
40feaf9141203d5753974ebe22463db86ee8a59e 172.38.0.15:6379@16379 slave 1759e80401711e6eb4d544d69c8ea621460223dc 0 1681806643621 5 connected
bf2c752b2119fabae55c3fd83c05f8d240c6b11a 172.38.0.13:6379@16379 master - 0 1681806644523 3 connected 10923-16383
5428e54dce5556fbe3f588d0a42726d97056ffb7 172.38.0.16:6379@16379 slave 17a9936229cacb5416dc66101627aec511c48ae3 0 1681806643000 6 connected
1759e80401711e6eb4d544d69c8ea621460223dc 172.38.0.11:6379@16379 myself,master - 0 1681806644000 1 connected 0-5460
17a9936229cacb5416dc66101627aec511c48ae3 172.38.0.12:6379@16379 master - 0 1681806644623 2 connected 5461-10922
f5eccd3cc18d12d8e9fe247deed229a3bb284c33 172.38.0.14:6379@16379 slave bf2c752b2119fabae55c3fd83c05f8d240c6b11a 0 1681806644000 4 connected

#再去get a,发现依然可以得到,此处的值是从从机得到的。
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"b"

IDEA整合Docker

  • 将springboot应用打成jar包,编写Dockefile文件

  • 将Dockerfile和jar包上传到服务器
[root@cchuang home]# cd idea
[root@cchuang idea]# ls
demo-0.0.1-SNAPSHOT.jar  Dockerfile
  • 通过Dockerfile生成镜像
[root@cchuang idea]# docker build -t springbootimage .
[+] Building 45.4s (7/7) FINISHED 
  • 启动容器
[root@cchuang idea]# docker images
REPOSITORY        TAG                IMAGE ID       CREATED          SIZE
springbootimage   latest             926a61407aa4   38 seconds ago   661MB

[root@cchuang idea]# docker run -d -P --name springbootimage springbootimage
a628e2ef78ba764bbf908774f71b7a9e0e3113bc309899101c48525278f82940

[root@cchuang idea]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                                         NAMES
a628e2ef78ba   springbootimage   "java -jar /app.jar …"   45 seconds ago   Up 44 seconds   0.0.0.0:32775->8080/tcp, :::32775->8080/tcp   springbootimage
  • 访问测试,成功
[root@cchuang idea]# curl localhost:32775/hello
hello!!!

Docker Compose容器编排

Docker Swarm集群部署

Jenkins(CI/CD)

posted @ 2023-04-18 21:10  StudyHardWork  阅读(262)  评论(0编辑  收藏  举报