Docker实战教程

Centos配置

查看centos系统版本命令:
cat /etc/centos-release
配置阿里云yum源
1.下载安装wget
yum install -y wget

2.备份默认的yum
mv /etc/yum.repos.d /etc/yum.repos.d.backup

3.设置新的yum目录
mkdir -p /etc/yum.repos.d

4.下载阿里yum配置到该目录中,选择对应版本
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

5.更新epel源为阿里云epel源
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

6.重建缓存
yum clean all
yum makecache

7.看一下yum仓库有多少包
yum repolist
升级系统内核
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

yum --enablerepo=elrepo-kernel install -y kernel-lt

grep initrd16 /boot/grub2/grub.cfg

grub2-set-default 0

reboot
查看centos系统内核命令
uname -r
uname -a
查看CPU命令
lscpu
查看内存命令
free
free -h
查看硬盘信息
fdisk -l
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
setenforce 0
网桥过滤
vi /etc/sysctl.conf

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward=1
net.ipv4.ip_forward_use_pmtu = 0

生效命令
sysctl --system
命令补全
安装bash-completion
yum -y install bash-completion bash-completion-extras
使用bash-completion
source /etc/profile.d/bash_completion.sh
上传文件
yum -y install lrzsz
1.鼠标拖拽上传文件
2.下载文件
	2.1下载一个文件
		sz filename
	2.2下载多个文件
		sz filename1 filename2
	2.3下载dir目录下所有文件,不包含dir下的文件夹
		sz dir/*
同步时间
安装软件
yum -y install ntpdate

向阿里云服务器同步时间
ntpdate time1.aliyun.com

删除本地时间并设置时区为上海
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

查看时间
date -R || date

安装docker

阿里云开发者平台

开发者平台官网地址:可以参考阿里云官网提供的docker安装教程进行安装。

https://www.aliyun.com/

安装docker前置条件
yum install -y yum-utils device-mapper-persistent-data lvm2
添加源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
查看docker版本
yum list docker-ce --showduplicates | sort -r
安装docker
安装最新版:推荐大家安装最新版本
yum -y install docker-ce
安装指定版本:
语法规则:yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
yum -y install docker-ce-18.06.3.ce-3.el7 docker-ce-cli.x86_64
yum -y install docker-ce-19.03.9-3.el7 docker-ce-cli-19.03.9-3.el7
开启dock而服务
systemctl start docker
systemctl status docker
安装阿里云镜像加速器
mkdir -p /etc/docker

tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://复制自己的加速器地址.mirror.aliyuncs.com"]
}
EOF

例如:
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://es4orw3p.mirror.aliyuncs.com"]
}
EOF

systemctl daemon-reload
systemctl restart docker
设置docker开启启动服务
systemctl enable docker
docker命令
docker -v
docker version
docker info
docker命令分类

Docker环境信息 — docker [info|version]

容器生命周期管理 — docker

[create|exec|run|start|stop|restart|kill|rm|pause|unpause]

容器操作管理 — docker [ps|inspect|top|attach|wait|export|port|rename|stat]

容器rootfs命令 — docker [commit|cp|diff]

镜像仓库 — docker [login|pull|push|search]

本地镜像管理 — docker [build|images|rmi|tag|save|import|load]

容器资源管理 — docker [volume|network]

系统日志信息 — docker [events|history|logs]

官网地址

https://docs.docker.com/engine/reference/run/

Docker镜像(image)

Docker Hub地址

docker hub类似maven远程仓库地址

https://hub.docker.com/

pull命令
docker pull tomcat:9.0.20-jre8
docker pull tomcat:9.0.20-jre8-slim
docker pull tomcat:9.0.20-jre8-alpine

常用参数

-a, --all-tags=true|false : 是否获取仓库中所有镜像,默认为否;

–disable-content-trust : 跳过镜像内容的校验,默认为 true;

images命令
docker images
docker image ls

各个选项说明:

REPOSITORY**:**表示镜像的仓库源

TAG**:**镜像的标签

IMAGE ID**:**镜像ID

CREATED**:**镜像创建时间

SIZE**:**镜像大小

save命令

备份镜像

mkdir -p /data
cd /data
docker save tomcat:9.0.20-jre8-alpine -o tomcat9.tar
docker save tomcat:9.0.20-jre8-slim > tomcat9.slim.tar

常用参数

-o :输出到的文件

多个镜像

mkdir -p /data
cd /data

docker save \
tomcat:9.0.20-jre8-alpine \
tomcat:9.0.20-jre8-slim \
tomcat:9.0.20-jre8 \
-o tomcat9.0.20.tar
load命令

导入镜像

mkdir -p /data
cd /data

docker load -i linux.tar
docker load < tomcat9.0.20.tar

常用参数

–input , -i : 指定导入的文件。

–quiet , -q : 精简输出信息。

search命令

不推荐使用search命令查找镜像,不够直观。

docker search tomcat

常用参数

-f, --filter filter : 过滤输出的内容;

–limit int :指定搜索内容展示个数;

–no-index : 不截断输出内容;

–no-trunc :不截断输出内容;

inspect命令

通过 docker inspect 命令,我们可以获取镜像的详细信息,其中,包括创建者,各层的数字摘要

docker inspect tomcat:9.0.20-jre8-alpine
docker inspect -f {{".Size"}} tomcat:9.0.20-jre8-alpine
history命令

通过 docker history命令,可以列出各个层的创建信息

docker history tomcat:9.0.20-jre8-alpine
tag命令

标记本地镜像,将其归入某一仓库

docker tag tomcat:9.0.20-jre8-alpine my/tomcat:9
rmi命令

通过如下两个都可以删除镜像:

docker rmi tomcat:9.0.20-jre8-alpine
docker image rm tomcat:9.0.20-jre8-alpine
清理镜像
docker image prune

常用参数

-a, --all : 删除所有没有用的镜像,而不仅仅是临时文件;

-f, --force :强制删除镜像文件,无需弹出提示确认;

Docker容器(container)

新建并启动容器

语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

运行容器

docker run -itd -p 8080:8080 --name tomcat9 tomcat:9.0.20-jre8-alpine

常用参数

-d, --detach=false: 后台运行容器,并返回容器ID

-i, --interactive=false: 以交互模式运行容器,通常与 -t 同时使用

docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

docker run -it --rm -p 8080:8080 tomcat:9.0.20-jre8-alpine

**-**P, --publish-all=false: 随机端口映射,容器内部端口随机映射到主机的端口。不推荐各位小伙伴

使用该参数

-p, --publish=[]: 指定端口映射,格式为:主机(宿主)端口:容器端口,推荐各位小伙伴们使用

**-**t, --tty=false: 为容器重新分配一个伪输入终端,通常与 -i 同时使用

–name=“nginx-lb”: 为容器指定一个名称

-h , --hostname=“”: 指定容器的hostname

-e , --env=[]: 设置环境变量,容器中可以使用该环境变量

–net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型

–link=[]: 添加链接到另一个容器;不推荐各位小伙伴使用该参数

**-**v, --volume : 绑定一个卷

–privileged=false: 指定容器是否为特权容器,特权容器拥有所有的capabilities

–restart=no:指定容器停止后的重启策略

no:容器退出时不重启

on-failure:容器故障退出(返回值非零)时重启

always:容器退出时总是重启,推荐各位小伙伴们使用

–rm=false: 指定容器停止后自动删除容器,不能以docker run -d启动的容器

容器日志
docker logs -f tomcat9

常用参数

-f : 跟踪日志输出

–tail :仅列出最新N条容器日志

删除容器
需要先停止运行中的容器再删除,否则无法删除容器
docker stop tomcat9
按照容器名称删除
docker rm tomcat9
按照容器ID删除
docker rm 8dd95a95e687

常用参数

-f :通过 SIGKILL 信号强制删除一个运行中的容器。

-l :移除容器间的网络连接,而非容器本身。

-v :删除与容器关联的卷。

列出容器
查看运行中的容器
docker ps tomcat9
查看所有容器
docker ps -a tomcat9

常用参数

-a :显示所有的容器,包括未运行的。

-q :只显示容器编号。

输出详情介绍:

CONTAINER ID: 容器 ID。

IMAGE: 使用的镜像。

COMMAND: 启动容器时运行的命令。

CREATED: 容器的创建时间。

STATUS: 容器状态。

状态有7种:

created(已创建)

restarting(重启中)

running(运行中)

removing(迁移中)

paused(暂停)

exited(停止)

dead(死亡)

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。

NAMES: 自动分配的容器名称。

实用技巧
停止所有运行容器
docker stop $(docker ps -qa)
删除所有的容器
docker rm $(docker ps -aq)
docker rm $(docker stop $(docker ps -q))
删除所有的镜像
docker rmi $(docker images -q)
创建容器

docker create **:**创建一个新的容器但不启动它。用法同 docker run命令。

docker create -it --name tomcat9 -p 8080:8080 9.0.20-jre8-alpine

常用参数

大部分参数用法与docker run命令参数相同

启动、重启、终止容器
docker start tomcat9
docker stop tomcat9
docker restart tomcat9
进入容器
有bash命令的linux系统:例如centos
docker exec -it tomcat9.1 /bin/bash
没有bash命令的linux系统:例如alpine系统
docker exec -it tomcat9.2 sh

常用参数

-i :即使没有附加也保持STDIN 打开

-t :分配一个伪终端

查看容器
docker inspect tomcat9

常用参数

-f :指定返回值的模板文件。

-s :显示总的文件大小。

–type :为指定类型返回JSON。

更新容器

docker update :可以动态地更新容器配置。可以更新一个或多个容器配置。多个容器名称或ID之间使

用空格分隔。但update命令不是很成熟,有很多配置项不能动态更新。推荐大家还是rm容器后,再重

新run一个新的镜像

更新容器restart策略
docker update --restart always tomcat9
杀掉容器

docker kill :杀掉一个运行中的容器。

docker kill tomcat9

常用参数

-s :向容器发送一个信号

docker网络

docker安装后会自动创建3种网络:

bridge

host

none

docker network ls
网络模式
Docker模式网络配置说明
host模式–net=host容器和宿主机共享Network namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
container模式–net=container:NAME_or_ID容器和另外一个容器共享Network namespace。kubernetes中的pod就是多个容器共享一个Network namespace。创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
none模式–net=none容器有独立的Network namespace,并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。该模式关闭了容器的网络功能。
bridge模式–net=bridge(默认为该模式)。此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
Macvlan network容器具备Mac地址,使其显示为网络上的物理设备
Overlay(覆盖网络): 利用VXLAN实现的bridge模式
bridge网络

Docker 创建一个容器的时候,会执行如下操作:

• 创建一对虚拟接口/网卡,也就是veth pair,分别放到本地主机和新容器中;

• 本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 vetha596da4;

• 容器一端放到新容器中,并修改名字作为 eth0,这个网卡/接口只在容器的名字空间可见;

• 从网桥可用地址段中(也就是与该bridge对应的network)获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 vetha596da4。

完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络。

如果不指定–network,创建的容器默认都会挂到 docker0 上,使用本地主机上 docker0 接口的 IP 作为所有容器的默认网关。

查看docker0网络,在默认环境中,一个名为docker0的linux bridge自动被创建好了,其上有一个
docker0 内部接口,IP地址为172.17.0.1/16
ip a

查看docker 网络
docker network ls

查看bridge网络详情。主要关注Containers节点信息。
docker network inspect bridge

link容器

学习docker run命令的link参数

–link=[]: 添加链接到另一个容器;不推荐各位小伙伴使用该参数

docker run -itd --name nginx1 nginx:1.19.3-alpine
docker run -itd --name nginx2 --link nginx1 nginx:1.19.3-alpine

docker exec -it nginx2 sh
ping 172.17.0.2
ping www.baidu.com
ping nginx1

docker rm -f nginx1
docker rm -f nginx2

新建bridge网络

docker network create -d bridge my-bridge

查看bridge信息
docker network ls
docker network inspect my-bridge

docker run -itd --name nginx1 --network my-bridge nginx:1.19.3-alpine

查看bridge信息
docker network inspect my-bridge

把一个运行中容器连接到my-bridge网络

docker run -itd --name nginx2 nginx:1.19.3-alpine
docker network connect my-bridge nginx2

查看bridge信息
docker network inspect my-bridge

docker exec -it nginx1 sh
ping nginx2

docker exec -it nginx2 sh
ping nginx1

docker rm -f nginx1
docker rm -f nginx2
none网络

注意,容器使用none模式,是没有物理地址和IP地址。我们可以进入到nginx1容器里,执行ip a命令看看。只有一个lo接口,没有其他网络接口,没有IP。也就是说,使用none模式,这个容器是不能被其他容器访问。这种使用场景很少,只有项目安全性很高的功能才能使用到。例如:密码加密算法容器。

docker run -itd --name nginx1 --network none nginx:1.19.3-alpine

docker network inspect none
host网络

我们使用前面命令,启动一个nginx的nginx2容器,连接到host网络。然后docker network inspect host, 看看容器信息。

docker run -itd --name nginx2 --network host nginx:1.19.3-alpine

docker network inspect host

这里来看,也不显示IP地址。那么是不是和none一样,肯定不是,不然也不会设计none和host网络进行区分。下面我们进入nginx2容器,执行ip a看看效果。我们在容器里执行ip a,发现打印内容和在linux本机外执行ip a是一样的。

docker exec -it nginx2 sh
ip a

容器使用了host模式,说明容器和外层linux主机共享一套网络接口。VMware公司的虚拟机管理软件,其中网络设置,也有host这个模式,作用也是一样,虚拟机里面使用网络和你自己外层机器是一模一样的。这种容器和本机使用共享一套网络接口,缺点还是很明显的,例如我们知道web服务器一般端口是80,共享了一套网络接口,那么你这台机器上只能启动一个nginx端口为80的服务器了。否则,出现端口被占用的情况。

网络命令汇总
docker network --help

网络常用命令汇总
	connect 	Connect a container to a network
	create 		Create a network
	disconnect 	Disconnect a container from a network
	inspect 	Display detailed information on one or more networks
	ls 			List networks
	prune 		Remove all unused networks
	rm 			Remove one or more networks

查看网络

查看网络 – 
docker network ls

# 作用:
	查看已经建立的网络对象
# 命令格式:
	docker network ls [OPTIONS]
# 命令参数(OPTIONS):
	-f, --filter filter 过滤条件('driver=bridge’)
		--format string 格式化打印结果
		--no-trunc 不缩略显示
	-q, --quiet 只显示网络对象的ID
# 注意:
	默认情况下,docker安装完成后,会自动创建bridge、host、none三种网络驱动
	
# 命令演示
docker network ls
docker network ls --no-trunc
docker network ls -f 'driver=host'

创建网络

创建网络 – 
docker network create

# 作用:
	创建新的网络对象
# 命令格式:
	docker network create [OPTIONS] NETWORK
# 命令参数(OPTIONS):
	-d, --driver string 指定网络的驱动(默认 "bridge")
		--subnet strings 指定子网网段(如192.168.0.0/16、172.88.0.0/24)
		--ip-range strings 执行容器的IP范围,格式同subnet参数
		--gateway strings 子网的IPv4 or IPv6网关,如(192.168.0.1)
# 注意:
	host和none模式网络只能存在一个
	docker自带的overlay 网络创建依赖于docker swarm(集群负载均衡)服务
	192.168.0.0/16 等于 192.168.0.0~192.168.255.255 192.168.8.0/24
	172.88.0.0/24 等于 172.88.0.0~172.88.0.255
# 命令演示
docker network ls
docker network create -d bridge my-bridge
docker network ls

网络删除

网络删除 – 
docker network rm
# 作用:
	删除一个或多个网络
# 命令格式:
	docker network rm NETWORK [NETWORK...]
# 命令参数(OPTIONS):

查看网络详细信息

查看网络详细信息 
docker network inspect
# 作用:
	查看一个或多个网络的详细信息
# 命令格式:
	docker network inspect [OPTIONS] NETWORK [NETWORK...]
	或者 docker inspect [OPTIONS] NETWORK [NETWORK...]
# 命令参数(OPTIONS):
	-f, --format string 根据format输出结果

使用网络

使用网络 – 
docker run –-network
# 作用:
	为启动的容器指定网络模式
# 命令格式:
	docker run/create --network NETWORK
# 命令参数(OPTIONS):# 注意:
	默认情况下,docker创建或启动容器时,会默认使用名为bridge的网络

网络连接与断开

网络连接与断开 – 
docker network connect/disconnect
# 作用:
	将指定容器与指定网络进行连接或者断开连接
# 命令格式:
	docker network connect [OPTIONS] NETWORK CONTAINER
	docker network disconnect [OPTIONS] NETWORK CONTAINER
# 命令参数(OPTIONS):
	-f, --force 强制断开连接(用于disconnect)
小练习
docker network create -d bridge --subnet=172.172.0.0/24 --gateway 172.172.0.1 my-network

172.172.0.0/24: 24代表子码掩码是255.255.255.0
172.172.0.0/16: 16 代表子码掩码

docker network ls

docker run -itd --name nginx3 -p 80:80 --net my-network --ip 172.172.0.10
nginx:1.19.3-alpine

--net my-network:选择存在的网络
--ip 172.172.0.10:给nginx分配固定的IP地址

docker network inspect my-network

docker stop nginx3
docker start nginx3

docker network inspect my-network

docker数据卷

什么是数据卷

当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们删除docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

特点:

  1. 数据卷可以在容器之间共享或重用数据

  2. 数据卷中的更改可以立即生效

  3. 数据卷中的更改不会包含在镜像的更新中

  4. 数据卷默认会一直存在,即使容器被删除

  5. 数据卷的生命周期一直持续到没有容器使用它为止

容器中的管理数据主要有两种方式:

数据卷:Data Volumes 容器内数据直接映射到本地主机环境

数据卷容器:Data Volume Containers 使用特定容器维护数据卷

cp命令

当然还有最原始的copy方式,这个也是管理数据的方式,但是基本不会用到。

**docker cp 😗*用于容器与主机之间的数据拷贝。

语法

宿主机文件复制到容器内
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

容器内文件复制到宿主机
docker cp [OPTIONS] CONTAINER:DEST_PATH SRC_PATH

常用参数

​ -L :保持源目标中的链接

宿主机文件 copy to 容器内

宿主机的index.html页面覆盖容器内的index.html页面

docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine

cd /data
echo "hello world" > /data/index.html

docker cp /data/index.html nginx:/usr/share/nginx/html/index.html

浏览器测试

容器内文件 copy to 宿主机

将容器内的nginx.cnf复制到宿主机中

docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine

cd /data
docker cp nginx:/etc/nginx/nginx.conf /data
数据卷

数据卷(Data Volumes)是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器。

注意事项

挂载数据卷,最好是通过run而非create/start创建启动容器,create/start命令创建启动容器后,再挂载数据卷相当麻烦,要修改很多配置文件,但并非不可以。

docker官网推荐尽量进行目录挂载,不要进行文件挂载

数据卷类型

有三种数据卷类型:

  1. 宿主机数据卷:直接在宿主机的文件系统中但是容器可以访问(bind mount)

  2. 命名的数据卷:磁盘上Docker管理的数据卷,但是这个卷有个名字。

  3. 匿名数据卷:磁盘上Docker管理的数据卷,因为没有名字想要找到不容易,Docker来管理这些文件。

数据卷其实都在(如果没有网络文件系统等情况下)宿主机文件系统里面的,只是第一种是在宿主机内

的特定目录下,而后两种则在docker管理的目录下,这个目录一般是 /var/lib/docker/volumes/

推荐大家使用 宿主机数据卷 方式持久化数据

宿主机数据卷

bind mounts:容器内的数据被存放到宿主机文件系统的任意位置,甚至存放到一些重要的系统目录或

文件中。除了docker之外的进程也可以任意对他们进行修改。

当使用bind mounts时,宿主机的目录或文件被挂载到容器中。容器将按照挂载目录或文件的绝对路径

来使用或修改宿主机的数据。宿主机中的目录或文件不需要预先存在,在需要的使用会自动创建。

使用bind mounts在性能上是非常好的,但这依赖于宿主机有一个目录妥善结构化的文件系统。

使用bind mounts的容器可以在通过容器内部的进程对主机文件系统进行修改,包括创建,修改和删除

重要的系统文件和目录,这个功能虽然很强大,但显然也会造成安全方面的影响,包括影响到宿主机上

Docker以外的进程

数据覆盖问题

​ 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中

​ 如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录会显示数据卷中的数据。如果原来容器中的目录有数据,那么原始数据会被隐藏掉

语法

docker run -v /宿主机绝对路径目录:/容器内目录 镜像名

运行镜像

推荐还是先创建好目录后再进行数据挂载

mkdir /data/mysql

docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai -v /data/mysql:/var/lib/mysql mysql:8.0.27 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-time_zone='+8:00'

容器目录权限

通过 -v 容器内路径: ro rw 改变读写权限

ro:readonly 只读
rw:readwrite 可读可写

docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
docker run -it -v /宿主机绝对路径目录:/容器内目录:rw 镜像名

例如:
docker run -d -P --name nginx05 -v edu1:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v edu2:/etc/nginx:rw nginx

ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
挂载目录权限问题
创建挂载目录
mkdir /data/nexus3

查看官网说明文档,需要为挂载目录授权
chown -R 200 /data/nexus3

运行容器
docker run -itd -p 8081:8081 --name nexus3 -v /data/nexus3:/nexus-data sonatype/nexus3:3.28.1

查看容器启动日志
docker logs -f nexus3

总结:开发环境中推荐各位小伙伴为挂载目录授最高权限777;生产环境需要查看官网文档,结合实际

生产环境进行授权。

命名的数据卷

挂载数据卷

docker run -itd --name nginx -p 80:80 -v nginx-volume:/etc/nginx nginx:1.19.3-alpine

查看docker数据卷
docker volume ls

查看nginx-volume宿主机目录
docker volume inspect nginx-volume

进入docker数据卷默认目录
cd /var/lib/docker/volumes/nginx-volume

查看文件
ls

所有的文件docker默认保存在_data目录中
cd _data

删除容器
docker rm $(docker stop $(docker ps -aq))

查看挂载数据是否还存在,通过查看数据,发现删除容器后,宿主机中的数据还存在
ls
匿名数据卷

挂载数据卷

docker run -itd --name nginx -p 80:80 -v /etc/nginx nginx:1.19.3-alpine

查看docker数据卷
docker volume ls

查看宿主机目录
docker volume inspect dbd07daa4e40148b11....

进入docker数据卷默认目录
cd /var/lib/docker/volumes/dbd07daa4e40148b11....

查看文件
ls

所有的文件docker默认保存在_data目录中
cd _data

删除容器
docker rm $(docker stop $(docker ps -aq))

查看挂载数据是否还存在,通过查看数据,发现删除容器后,宿主机中的数据还存在
ls
清理数据卷

删除上面创建的容器后会,发现数据卷仍然存在,我们就需要去清理它,不然会占用我们的资源

清理数据卷
docker volume prune

docker volume ls
数据卷容器

基础镜像

docker pull centos:7.8.2003
docker pull nginx:1.19.3-alpine

运行镜像

docker run -d --name data-volume -v /data/nginx:/usr/share/nginx/html -v
/data/mysql:/var/lib/mysql centos:7.8.2003
docker run -itd --name nginx01 -p 80:80 --volumes-from data-volume nginx:1.19.3-alpine

echo "edu nginx" > /data/nginx/index.html
http://192.168.198.100

docker run -itd --name nginx02 -p 81:80 --volumes-from data-volume nginx:1.19.3-alpine
http://192.168.198.100:81

docker-compose

官网地址

https://docs.docker.com/compose/compose-file/

概述

在实际生产环境中,一个应用往往由许多服务构成,而 docker 的最佳实践是一个容器只运行一个进程,因此运行多个微服务就要运行多个容器。多个容器协同工作需要一个有效的工具来管理他们,定义这些容器如何相互关联。compose 应运而生。

compose 是用来定义和运行一个或多个容器(通常都是多个)运行和应用的工具。使用 compose 可以简化容器镜像的构建以及容器的运行。

compose 使用 YAML 文件来定义多容器之间的关系。一个 docker-compose up 就可以把完整的应用跑起来。 本质上, compose 把 YAML 文件解析成 docker 命令的参数,然后调用相应的 docker 命令行接口,从而将应用以容器化的方式管理起来。它通过解析容器间的依赖关系顺序地启动容器。而容器间的依赖关系由 YAML 文件中的 links 标记指定。

docker compose安装

下载

https://github.com/docker/compose

授权

mv /data/docker-compose-linux-x86_64 /usr/local/bin/docker-compose
cp /data/docker-compose-linux-x86_64 /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

开发环境可以授予最高权限
chmod 777 /usr/local/bin/docker-compose

检查安装情况以及版本

docker-compose -v
docker-compose --version
docker-compose version

卸载docker-compose

docker-compose卸载只需要删除二进制文件就可以了。

rm -rf /usr/local/bin/docker-compose
yml配置文件及常用指令

Docker Compose 使用 YAML 文件来定义多服务的应用。YAML 是 JSON 的一个子集,因此也可以使用JSON。

Docker Compose 默认使用文件名 docker-compose.yml。当然,也可以使用 -f 参数指定具体文件。

Docker Compose 的 YAML 文件包含 4 个一级 key:version、services、networks、volumes

​ version 是必须指定的,而且总是位于文件的第一行。它定义了 Compose 文件格式(主要是API)的版本。注意,version 并非定义 Docker Compose 或 Docker 引擎的版本号。

​ services 用于定义不同的应用服务。上边的例子定义了两个服务:一个名为 my-mysql数据库服务以及一个名为my-eureka的微服。Docker Compose 会将每个服务部署在各自的容器中。

​ networks 用于指引 Docker 创建新的网络。默认情况下,Docker Compose 会创建 bridge 网络。这是一种单主机网络,只能够实现同一主机上容器的连接。当然,也可以使用 driver 属性来指定不同的网络类型。

​ volumes 用于指引 Docker 来创建新的卷。

version: '3'
services:
  my-mysql:
    build:
      context: ./mysql
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    restart: always
    volumes:
      - /data/mysql:/var/lib/mysql
    image: mysql:5.7
    ports:
      - 3306:3306
    networks:
      my-network:
  my-eureka:
    build:
      context: ./eureka-boot
    container_name: eureka-boot
    hostname: eureka-boot
    restart: always
    ports:
      - 8761:8761
    image: eureka-boot:1.0
    depends_on:
      - my-mysql
    networks:
      my-network:
networks:
  my-network:
volumes:
  my-volume:

启动服务

docker-compose.yml同一目录下运行

docker-compose up
后台运行
docker-compose up -d
反向代理案例

将宿主机恢复到docker初始化安装的状态

基础镜像

docker pull nginx:1.19.3-alpine
docker pull tomcat:9.0.20-jre8-alpine

试运行镜像

docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine
docker run -itd --name tomcat -p 8080:8080 tomcat:9.0.20-jre8-alpine

mkdir -p /data/tomcat1 tomcat2

docker cp nginx:/etc/nginx/ /data

docker cp tomcat:/usr/local/tomcat/webapps /data/tomcat1/webapps
docker cp tomcat:/usr/local/tomcat/webapps /data/tomcat2/webapps

echo "tomcat1" > /data/tomcat1/webapps/ROOT/index.jsp
echo "tomcat2" > /data/tomcat2/webapps/ROOT/index.jsp

docker rm -f nginx tomcat

nginx.conf增加内容

include vhost/*.conf;

反向代理配置

mkdir -p /data/nginx/vhost
cd vhost
vi test.com.conf

upstream test{
	server 192.168.198.100:8081;
	server 192.168.198.100:8082;
}
server{
	listen 80;
	server_name 192.168.198.100;
	autoindex on;
	index index.html index.htm index.jsp;
	location / {
		proxy_pass http://test;
		add_header Access-Control-Allow-Origin *;
	}
}

docker-compose.yml

version: '3'
services:
  my-nginx:
    restart: always
    container_name: my-nginx
    volumes:
      - /data/nginx:/etc/nginx/
    image: nginx:1.19.3-alpine
    ports:
      - 80:80
  my-tomcat1:
    restart: always
    container_name: my-tomcat1
    volumes:
      - /data/tomcat1/webapps:/usr/local/tomcat/webapps
    image: tomcat:9.0.20-jre8-alpine
    ports:
      - 8081:8080
    depends_on:
      - my-nginx
  my-tomcat2:
    restart: always
    container_name: my-tomcat2
    volumes:
      - /data/tomcat2/webapps:/usr/local/tomcat/webapps
    image: tomcat:9.0.20-jre8-alpine
    ports:
      - 8082:8080
    depends_on:
      - my-nginx

启动服务

docker-compose.yml同一目录下运行

docker-compose up
后台运行
docker-compose up -d

浏览器测试

http://192.168.198.100:8081/

http://192.168.198.100:8082/

http://192.168.198.100

常用命令汇总

启动服务

docker-compose up -d

停止服务

docker-compose down

列出所有运行容器

docker-compose ps

查看服务日志

docker-compose logs

还是推荐使用docker logs查看单个容器日志
docker logs -f nginx

构建或者重新构建服务

docker-compose build

启动服务

docker-compose start

停止已运行的服务

docker-compose stop

重启服务

docker-compose restart
官网地址

https://docs.docker.com/compose/reference/build/

安装Docker私服

官方私服

官网地址

https://hub.docker.com/_/registry

基础镜像

拉取镜像
docker pull registry:2.7.1

备份镜像
docker save registry:2.7.1 -o registry.2.7.1.tar

导入镜像
docker load -i registry.2.7.1.tar

运行容器

docker run -itd -p 5000:5000 --name registry --restart=always registry:2.7.1

添加私服仓库地址

编辑配置文件
vi /etc/docker/daemon.json

增加仓库配置信息
{ "insecure-registries":["192.168.198.101:5000"] }

重启docker
systemctl daemon-reload
systemctl restart docker

查看docker信息确认仓库是否添加
docker info

浏览器测试

http://192.168.198.101:5000/v2/_catalog

上传镜像

docker tag nginx:1.19.3-alpine 192.168.198.101:5000/nginx:v1
docker push 192.168.198.101:5000/nginx:v1

浏览器查看

http://192.168.198.101:5000/v2/nginx/tags/list

harbor

harbor官网地址:

https://goharbor.io/

github官网地址:

https://github.com/goharbor/harbor

官方帮助文档:

https://github.com/goharbor/harbor/blob/v1.9.4/docs/installation_guide.md

验证docker-compose

docker-compose -v

硬件要求

硬件资源**最小配置 **推荐配置
CPU2 CPU4 CPU
内存4 GB8 GB
硬盘40 GB160 GB

安装harbor

开发环境大部分采用http方式进行安装;生产环境必须采用https方式安装。

1.解压软件
cd /data
tar zxf harbor-offline-installer-v1.9.4.tgz

2.进入安装目录
cd harbor

3.修改配置文件(高版本需要先执行cp harbor.yml.tmpl harbor.yml)
vi harbor.yml
3.1修改私服镜像地址
hostname: 192.168.198.101
3.2修改镜像地址访问端口号
port: 5000
3.3harbor管理员登录系统密码
harbor_admin_password: Harbor12345
3.4修改harbor映射卷目录
data_volume: /data/harbor

注意:高版本使用http方式需要注释
#https:
#  port: 443
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path

4.安装harbor
4.1执行启动脚本,经过下述3个步骤后,成功安装harbor私服
./install.sh
4.2准备安装环境:检查docker版本和docker-compose版本
4.3加载harbor需要的镜像
4.4准备编译环境
4.5启动harbor。通过docker-compose方式启动服务
4.6google浏览器访问harbor私服

http://192.168.198.101:5000
username: admin
password: Harbor12345

配置私服

vi /etc/docker/daemon.json
json末尾增加
,"insecure-registries":["192.168.198.101:5000"]

重启docker服务:
systemctl daemon-reload
systemctl restart docker

在harbor中新建公共项目:

edu

登录私服

docker login -u admin -p Harbor12345 192.168.198.101:5000

退出私服
docker logout 192.168.198.101:5000

上传nginx镜像

docker tag nginx:1.19.3-alpine 192.168.198.101:5000/edu/nginx:v1

docker push 192.168.198.101:5000/edu/nginx:v1

docker image rm 192.168.198.101:5000/edu/nginx:v1

docker pull 192.168.198.101:5000/edu/nginx:v1

Dockerfile

Docker 创建镜像主要有三种:

  1. 基于已有的镜像创建;

  2. 基于 Dockerfile 来创建;

  3. 基于本地模板来导入;

基于已有的镜像创建

commit命令

**docker commit 😗*从容器创建一个新的镜像。

语法

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

常用参数

-a :提交的镜像作者;

-c :使用Dockerfile指令来创建镜像;

-m :提交时的说明文字;

-p :在commit时,将容器暂停。

简介

官网地址

https://docs.docker.com/engine/reference/builder/

Dockerfile其实就是我们用来构建Docker镜像的源码,当然这不是所谓的编程源码,而是一些命令的集合,只要理解它的逻辑和语法格式,就可以很容易的编写Dockerfile。简单点说,Dockerfile可以让用户个性化定制Docker镜像。因为工作环境中的需求各式各样,网络上的镜像很难满足实际的需求。

Dockerfile的基本结构

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。

docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用 -f 标志指向文件系统中任何位置的Dockerfile。

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行

Dockerfile分为四部分:基础镜像信息、维护者信息、 镜像操作指令和容器启动时执行指令

Dockerfile文件说明

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以 # 字符开头则被视为注释。可以在Docker文件中使用 RUN , CMD , FROM , EXPOSE , ENV 等指令。

Dockerfile常见命令
命令说明
FROM指定基础镜像,必须为第一个命令
MAINTAINER维护者(作者)信息
ENV设置环境变量
RUN构建镜像时执行的命令
CMD构建容器后调用,也就是在容器启动时才进行调用。
ENTRYPOINT指定运行容器启动过程执行命令,覆盖CMD参数ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
ADD将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
COPY功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
WORKDIR工作目录,类似于cd命令
ARG用于指定传递给构建运行时的变量
VOLUMN用于指定持久化目录
EXPOSE指定于外界交互的端口
USER指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
build命令

docker build 命令用于使用 Dockerfile 创建镜像。

语法

docker build [OPTIONS] PATH | URL | -

常用参数

build命令参数特别多。这里只给大家介绍几个常用的参数,如果小伙伴们想了解更多内容,请参考docker官网手册。

**–build-arg=[] 😗*设置镜像创建时的变量;

**-f 😗*指定要使用的Dockerfile路径;

**–rm 😗*设置镜像成功后删除中间容器;

–tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。

制作镜像

docker build --rm -t 192.168.198.101:5000/edu/mysql:5.7 .
docker images

部署微服务项目

打包项目

打包微服务项目成jar包

基础镜像

docker pull openjdk:8-alpine3.9

docker save openjdk:8-alpine3.9 -o jdk8.tar

docker load -i jdk8.tar
安装docker插件

idea安装docker插件。Dockerfile、docker-compose.yml文件大部分内容会有提示信息。方便开发人员编写配置文件。高版本的idea中已经集成docker插件(idea2019、idea2020)

官网地址:

https://plugins.jetbrains.com/plugin/7724-docker/versions

制作镜像-dockerfile

/data/dockerdemo/Dockerfile

mkdir -p /data/dockerdemo
cd /data/dockerdemo
idea中编写Dockerfile
FROM openjdk:8-alpine3.9
MAINTAINER Docker springboot
ENV TZ Asia/Shanghai
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
生成测试镜像
docker build --rm -t dockerdemo:v1 --build-arg JAR_FILE=dockerdemo.jar .

docker build --rm -t netdisk:v0.0.1 --build-arg JAR_FILE=netdisk-0.0.1-SNAPSHOT.jar .
测试、删除镜像
docker run -itd --name dockerdemo -p 8080:8080 dockerdemo:v1

docker logs -f dockerdemo

http://192.168.198.100:8080

docker stop dockerdemo

docker rm dockerdemo

idea集成docker

修改服务信息

修改docker-100服务器docker.service服务信息,允许其他主机远程访问100服务器的docker。

vi /usr/lib/systemd/system/docker.service

在ExecStart行最后增加,开放远程主机访问权限。
-H tcp://0.0.0.0:2375

最后增加修改内容如下:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
-H tcp://0.0.0.0:2375

重启docker
systemctl daemon-reload
systemctl restart docker

查看docker进程,发现docker守护进程在已经监听2375的tcp端口
ps -ef|grep docker

查看系统的网络端口,检查tcp的2375端口,docker的守护进程是否监听
netstat -tulp
配置idea

配置插件

settings->build execution…->docker->点击"+"按钮,新增docker-100服务器docker配置信息

配置内容如下:

name:docker-100

TCP Socket:

Engine API URL:tcp://192.168.198.100:2375

配置成功后,会在下方显示connection successful

操作docker

配置成功后,会在idea开发工具下方窗口"8.services"里显示信息,右键点击connect。连接成功可以查看到container和images等信息。可以对container和images进行各种相关操作。

部署dockerdemo项目

通过idea开发工具进行远程部署

Mysql主从复制

bitnami/mysql

官网地址

https://hub.docker.com/r/bitnami/mysql

节点信息

服务器用户名:root,服务器密码:123456

主机名IP地址
mysql-server-110192.168.198.100
mysql-agent-111192.168.198.101

基础镜像

docker pull bitnami/mysql:5.7.30

docker save bitnami/mysql:5.7.30 -o bitnami.mysql.5.7.30.tar

docker load -i bitnami.mysql.5.7.30.tar

master

运行master容器
docker run -itd --name mysql-master \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_REPLICATION_MODE=master \
-e MYSQL_REPLICATION_USER=mysql \
-e MYSQL_REPLICATION_PASSWORD=mysql \
bitnami/mysql:5.7.30

agent

docker run -itd --name mysql-slave \
-p 3306:3306 \
-e MYSQL_REPLICATION_MODE=slave \
-e MYSQL_REPLICATION_USER=mysql \
-e MYSQL_REPLICATION_PASSWORD=mysql \
-e MYSQL_MASTER_HOST=192.168.198.100 \
-e MYSQL_MASTER_ROOT_PASSWORD=123456 \
-e MYSQL_MASTER_PORT_NUMBER=3306 \
bitnami/mysql:5.7.30

使用Navicat测试

安装elasticsearch

docker官网

https://hub.docker.com/_/elasticsearch

https://hub.docker.com/_/kibana

https://hub.docker.com/_/logstash

ELK官网

https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html

es集群部署请参考官网帮助文档,自行练习。

基础镜像
docker pull elasticsearch:7.7.0

docker pull kibana:7.7.0

docker pull logstash:7.7.0
前置条件

文件创建数

修改Linux系统的限制配置,将文件创建数修改为65536个 :

  1. 修改系统中允许应用最多创建多少文件等的限制权限。Linux默认来说,一般限制应用最多创建的文件是65535个。但是ES至少需要65536的文件创建数的权限。

  2. 修改系统中允许用户启动的进程开启多少个线程。默认的Linux限制root用户开启的进程可以开启任意数量的线程,其他用户开启的进程可以开启1024个线程。必须修改限制数为4096+。因为ES至少需要4096的线程池预备。

vi /etc/security/limits.conf

#新增如下内容在limits.conf文件中
es soft nofile 65536
es hard nofile 65536
es soft nproc 4096
es hard nproc 4096

系统控制权限

修改系统控制权限,ElasticSearch需要开辟一个65536字节以上空间的虚拟内存。Linux默认不允许任何用户和应用程序直接开辟这么大的虚拟内存。

vi /etc/sysctl.conf

添加参数:新增如下内容在sysctl.conf文件中,当前用户拥有的内存权限大小
vm.max_map_count=262144

重启生效:让系统控制权限配置生效
sysctl -p

试运行

docker run -itd --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -v /data/elasticsearch/data:/usr/share/elasticsearch/data -v /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins elasticsearch:7.7.0

docker cp elasticsearch:/usr/share/elasticsearch/config/elasticsearch.yml /data

elasticsearch.yml

vi /data/elasticsearch.yml

添加跨域配置
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
docker-compose

挂载目录授权

chmod 777 -R /data/elasticsearch

docker rm -f elasticsearch

docker-compose.yml

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.7.0
    container_name: elasticsearch
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - "discovery.type=single-node"
      - "ES_JAVA_OPTS=-Xms2048m -Xmx2048m"
    restart: always
    volumes:
      - "/data/elasticsearch/data:/usr/share/elasticsearch/data"
      - "/data/elasticsearch/plugins:/usr/share/elasticsearch/plugins"
  kibana:
    image: kibana:7.7.0
    container_name: kibana
    environment:
      - "TZ=Asia/Shanghai"
    ports:
      - 5601:5601
    restart: always
    depends_on:
      - elasticsearch
  logstash:
    image: logstash:7.7.0
    container_name: logstash
    environment:
      - "TZ=Asia/Shanghai"
    ports:
      - 5044:5044
      - 9600:9600
    restart: always
    depends_on:
      - elasticsearch
启动服务
docker-compose up -d

覆盖elasticsearch.yml文件
docker cp /data/elasticsearch.yml elasticsearch:/usr/share/elasticsearch/config/

重启
docker-compose restart
访问测试

http://192.168.198.100:9200

http://192.168.198.100:5601

ik分词器

官网地址

https://github.com/medcl/elasticsearch-analysis-ik

安装分词器

cd /data/elasticsearch/plugins
mkdir -p ik

unzip elasticsearch-analysis-ik-7.7.0.zip

重启es

docker-compose restart

安装fastDFS

安装条件

至少需要2G以上内存。

github官网地址

https://github.com/happyfish100/

帮助手册地址:

https://github.com/happyfish100/fastdfs/wiki

自定义镜像

官网提供docker镜像制作素材,但是需要更改Dockerfile文件及source目录中的软件包。将官方下载的fastdfs-6.06.tar.gz解压缩,里边有docker目录,提供单机版和集群版本。但是都需要修改才能使用。本章节参考的是dockerfile_local单机版内容。

下载地址

https://github.com/happyfish100/fastdfs-nginx-module

https://github.com/happyfish100/libfastcommon

http://nginx.org/download/nginx-1.16.1.tar.gz

Dockerfile

Docker文件改动两处内容:

1. ADD时候的源文件名称,需要增加对应的版本号信息

2. cd目录时需要增加对应版本号信息

3.基础镜像从centos7升级为centos7.8.2003

# centos 7
FROM centos:7.8.2003
# 添加配置文件
# add profiles
ADD conf/client.conf /etc/fdfs/
ADD conf/http.conf /etc/fdfs/
ADD conf/mime.types /etc/fdfs/
ADD conf/storage.conf /etc/fdfs/
ADD conf/tracker.conf /etc/fdfs/
ADD fastdfs.sh /home
ADD conf/nginx.conf /etc/fdfs/
ADD conf/mod_fastdfs.conf /etc/fdfs

# 添加源文件
# add source code
ADD source/libfastcommon-1.0.43.tar.gz /usr/local/src/
ADD source/fastdfs-6.06.tar.gz /usr/local/src/
ADD source/fastdfs-nginx-module-1.22.tar.gz /usr/local/src/
ADD source/nginx-1.16.1.tar.gz /usr/local/src/

# Run
RUN yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y \
    && mkdir /home/dfs \
    && cd /usr/local/src/ \
    && cd libfastcommon-1.0.43/ \
    && ./make.sh && ./make.sh install \
    && cd ../ \
    && cd fastdfs-6.06/ \
    && ./make.sh && ./make.sh install \
    && cd ../ \
    && cd nginx-1.16.1/ \
    && ./configure --add-module=/usr/local/src/fastdfs-nginx-module-1.22/src/ \
    && make && make install \
    && chmod +x /home/fastdfs.sh
# export config
VOLUME /etc/fdfs
EXPOSE 22122 23000 8888 80
ENTRYPOINT ["/home/fastdfs.sh"]

制作镜像

docker build --rm -t fastdfs:1.0 .
启动镜像

按照官网提供的方式启动,springboot项目会报找不到127.0.0.1:23000端口,需要使用–net=host方式启动

错误的启动方式:
docker run -d -e FASTDFS_IPADDR=192.168.198.100 -p 8888:8888 -p 22122:22122 -p 23000:23000 -p 8011:80 --name fastdfs fastdfs:1.0
正确的启动方式:
docker run -d -e FASTDFS_IPADDR=192.168.198.100 --name fastdfs --restart=always --net=host fastdfs:1.0

安装gitlab

docker官网地址

https://hub.docker.com/r/gitlab/gitlab-ce

官网教程

https://docs.gitlab.com/omnibus/docker/

基础镜像
英文版
docker pull gitlab/gitlab-ce:12.7.6-ce.0

中文版
docker pull twang2218/gitlab-ce-zh:11.1.4
运行容器
运行镜像:运行时间比较长,大约需要3-10分钟。可以查看日志情况。
docker run -itd --name gitlab -p 443:443 -p 80:80 -p 222:22 --restart always -m 4GB -v /data/gitlab/config:/etc/gitlab -v /data/gitlab/logs:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab -e TZ=Asia/Shanghai gitlab/gitlab-ce:12.7.6-ce.0

中文版运行命令
docker run -itd --name gitlab -p 443:443 -p 80:80 -p 222:22 --restart always -v /data/gitlab/config:/etc/gitlab -v /data/gitlab/logs:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab -e TZ=Asia/Shanghai twang2218/gitlab-ce-zh:11.1.4
配置gitlab
vi /data/gitlab/config/gitlab.rb

配置项目访问地址:
external_url 'http://192.168.198.100'

配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '192.168.198.100'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 222

重启gitlab
docker restart gitlab
登录gitlab

登录gitlab:用户名默认为root。第一次登录需要设置密码。本教程将密码设置为12345678

username:root
password:12345678

创建组

组分三类:
Private:私有的
Internal:内部的
Public:公共的

创建项目

项目分类:
根据组的分类进行分类。

创建项目注意事项:
不需要创建README,否则本地项目无法上传到gitlab服务器上。

创建用户

1.创建用户
用户权限分两种:
Regular:普通权限用户
Admin:具有管理员权限的用户

2.给用户分配密码

将用户加入群组

给群组中的用户分配权限分五种:
Guest:可以创建issue、发表评论、不能读写版本库。
Reporter:可以克隆代码,不能提交、QA、PM可以赋予这个权限。
Developer:可以克隆代码、开发、提交、push,普通开发可以赋予这个权限。
Maintainer:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心开发人员可以赋予这个权限。
Owner:可以设置项目访问权限、-Visibility Level、删除项目、迁移项目、管理组成员、开发组组长可以赋予这个权限。

上传项目

使用idea开发工具演示
1.创建本地仓库
VCS->Enable Version Control Integration...

2.建立缓冲区
项目右键->git->Add

3.将代码提交到本地仓库
项目右键->git->Commit Directory

4.设置远程gitlab仓库地址
项目右键->git->Repository->Remote

5.将本地代码推送到远程gitlab仓库
项目右键->git->Repository->push

Swarm集群管理

compose、machine 和 swarm 是docker 原生提供的三大编排工具。简称docker三剑客。

节点信息

服务器用户名:root,服务器密码:123456 。及时做好系统快照。

主机名IP地址说明
manager-01192.168.198.100swarm-manager节点
work-01192.168.198.101swarm-work01节点
work-02192.168.198.102swarm-work02节点

分别给各节点命名hostname

hostnamectl set-hostname master-01

hostnamectl set-hostname work-01

hostnamectl set-hostname work-02

硬件要求

硬件资源最小配置推荐配置
CPU1 CPU2CPU
内存1GB2~4GB
硬盘20 GB50GB
安装docker-swarm

官网文档

https://docs.docker.com/engine/swarm/

概述

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,DockerCompose 是一个在单个服务器或主机上创建多个容器的工具,可以将组成某个应该的多个docker容器编排在一起,同时管理。而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口(docker stack)统一管理这些Docker主机上的各种Docker资源。

stack 是构成特定环境中的 service 集合, 它是自动部署多个相互关联的服务的简便方法,而无需单独定义每个服务。

stack file 是一种 yaml 格式的文件,类似于 docker-compose.yml 文件,它定义了一个或多个服务,并定义了服务的环境变量、部署标签、容器数量以及相关的环境特定配置等。

Docker Swarm由两部分组成:

​ Docker集群:将一个或多个Docker节点组织起来,用户就能以集群的方式进行管理;

​ 应用编排:有一套API用来部署和管理容器

配置私有仓库

私有仓库不是集群必备的组件。集群的每个节点都需要安装镜像,如果不搭建私有仓库,下载镜像速度比较耗时。

vi /etc/docker/daemon.json

"insecure-registries":["192.168.198.101:5000"]

systemctl daemon-reload
systemctl restart docker

初始化第一个管理节点

关于advertise-addr和listen-addr这两个参数:

​ 前者用来指定其他节点连接m0时的地址

​ 后者指定承载swarm流量的IP和端口

​ 会在本地新建docker网络

docker swarm init --advertise-addr 192.168.198.100:2377 --listen-addr 192.168.198.100:2377

docker node ls

docker network ls

如何加入新的节点

Docker Swarm的新节点加入策略是从管理节点获取一长串命令,被称为join token,任何想加入集群的机器只要自己执行这个join token即可加入Swarm集群;

如果有新的管理节点需要加入,在m0执行命令docker swarm join-token manager即可得到管理manager节点的join token,

如果有新的work节点需要加入,在m0执行命令docker swarm join-token worker即可得到管理work节点的join token

在manager节点执行。可以作为manager节点加入集群
docker swarm join-token manager

在manager节点执行。可以作为worker节点加入集群
docker swarm join-token worker

docker node ls

manager节点说明

MANAGER STATUS列说明:

​ Leader 意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。

​ Reachable 意味着节点是管理者节点正在参与Raft共识。如果领导节点不可用,则该节点有资格被选为新领导者。

​ Unavailable 意味着节点是不能与其他管理器通信的管理器。如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。

AVAILABILITY列说明:

​ Active 意味着调度程序可以将任务分配给节点。

​ Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。

​ Drain 意味着调度程序不会向节点分配新任务。调度程序关闭所有现有任务并在可用节点上调度它们。

验证节点

master节点:
docker info

work节点:
docker info

节点权限提升/降低

将worker节点提升为manager节点,在manager节点执行如下命令:
docker node promote work-01
docker node ls

将manager节点降低为worker节点,在manager节点执行如下命令:
docker node demote work-02
docker node ls

脱离集群

在work-02节点使用命令:docker swarm leave

稍微等待几分钟,在manager节点使用命令:docker node ls,发现work-02节点已经脱离集群管理。

删除脱离集群的节点

先使用命令:docker node demote 节点名称。将某一个节点降为worker节点后,再删除。

使用命令:docker node rm 节点名称|节点ID
例如:docker node rm work-02
manager节点只能强制退出。命令:docker swarm leave --force。manager退出后意味着整个swarm不复存在。
图形界面

docker官网地址

https://hub.docker.com/r/dockersamples/visualizer

基础镜像

拉取镜像
docker pull dockersamples/visualizer:latest

备份镜像
docker save dockersamples/visualizer:latest -o dockersamples.visualizer.tar

还原镜像
docker load -i dockersamples.visualizer.tar

运行镜像

docker run -itd --name visualizer -p 8099:8080 -e HOST=192.168.198.100 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer:latest

docker service create \
--name=viz \
--publish=8080:8080/tcp \
--constraint=node.role==manager \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
dockersamples/visualizer

测试镜像

http://192.168.198.100:8099

swarm命令
命令描述
docker swarm init初始化一个 swarm 群集
docker swarm join加入群集作为节点或管理器
docker swarm join-token管理用于加入群集的令牌
docker swarm leave离开 swarm 群集
docker swarm unlock解锁 swarm 群集
docker swarm unlock-key管理解锁钥匙
docker swarm update更新 swarm 群集
node命令
命令描述
docker node demote从 swarm 群集管理器中降级一个或多个节点
docker node inspect显示一个或多个节点的详细信息
docker node ls列出 swarm 群集中的节点
docker node promote将一个或多个节点推入到群集管理器中
docker node ps列出在一个或多个节点上运行的任务,默认为当前节点
docker node rm从 swarm 群集删除一个或多个节点
docker node update更新一个节点
service命令

命令汇总

命令描述
docker service create创建服务
docker service inspect显示一个或多个服务的详细信息
docker service logs获取服务的日志
docker service ls列出服务
docker service rm删除一个或多个服务
docker service scale设置服务的实例数量
docker service update更新服务
docker service rollback恢复服务至update之前的配置

基础镜像

集群所有节点都需要下载相关镜像

docker pull nginx:1.18.0-alpine
docker pull nginx:1.19.3-alpine

docker save nginx:1.18.0-alpine -o nginx.1.18.3.alpine.tar
docker save nginx:1.19.3-alpine -o nginx.1.19.3.alpine.tar
scp nginx.1.18.3.alpine.tar root@192.168.198.101:/data/
scp nginx.1.18.3.alpine.tar root@192.168.198.102:/data/

scp nginx.1.19.3.alpine.tar root@192.168.198.101:/data/
scp nginx.1.19.3.alpine.tar root@192.168.198.102:/data/

所有节点执行如下命令:
cd /data
docker load -i nginx.1.18.3.alpine.tar
docker load -i nginx.1.19.3.alpine.tar

rm -rf *

部署nginx

在manager节点中创建overlay网络:
docker network create -d overlay nginx-net

创建5个nginx:alpines容器的集群:
docker service create --name nginx --network nginx-net -p 80:80 --replicas 5 nginx:1.18.0-alpine

在manager节点使用docker service ls 命令查看服务情况,worker节点无法查看:
docker service ls

在manager或者worker节点都可以执行docker ps命令查看本虚拟机容器情况:
docker ps

manager节点只用于管理集群,不希望部署服务。
docker node update --availability drain master-01

使用docker service scale nginx=2命令将服务缩减为2个容器:
docker service scale nginx=2

升级nginx版本

进入其中一个容器查看nginx的版本信息:
注意事项:因nginx是alpine的linux版本。不能使用/bin/bash指令。
docker exec -it 503fe639bb89 sh
nginx -v

1.更新镜像:
docker service update --image nginx:1.19.3-alpine nginx

2.添加或者更新一个对外端口:
docker service update --publish-add 8090:80 nginx

删除服务

docker service rm nginx

docker network rm nginx-net
stack命令

命令汇总

命令描述
docker stack deploy部署新的堆栈或更新现有堆栈
docker stack ls列出现有堆栈
docker stack ps列出堆栈中的任务
docker stack rm删除一个或多个堆栈
docker stack services列出堆栈中的服务

部署nginx

docker-compose.yml

version: "3"
services:
  nginx-web:
    image: nginx:1.19.3-alpine
    container_name: nginx
    networks:
      - nginx-net
    restart: always
    ports:
      - 80:80
    deploy:
      replicas: 5
networks:
  nginx-net:
    driver: overlay

运行nginx

在manager节点中创建docker-compose.yml文件。执行如下命令:
docker stack deploy nginx-stack --compose-file=docker-compose.yml 或者是
docker stack deploy nginx-stack -c docker-compose.yml

查看stack服务运行情况。执行如下命令:
docker stack services nginx-stack

查看5个容器运行在哪个节点中。执行如下命令:
docker service ls 查看到NAME中的服务名为:nginx-stack_nginx-web
docker service ps nginx-stack_nginx-web

进行测试:
curl 192.168.0.105
curl 192.168.0.106
curl 192.168.0.107

删除stack服务。执行如下命令:
docker stack rm nginx-stack

总结:

​ networks中也可以不指定driver:overlay,因为docker swarm默认网络类型是overlay。

​ 整个networks都可以不用配置。stack部署时会默认创建网络。如果我们定义网络。在docker stack deploy时会先默认创建一个网络,在创建一个我们定义的网络。

​ 一定要把镜像先拉取到本地再执行

Docker Stack和Docker Compose区别

Docker stack会忽略了“构建”指令,无法使用stack命令构建新镜像,它是需要镜像是预先已经构建好的。 所以docker-compose更适合于开发场景;

Docker Compose是一个Python项目,在内部,它使用Docker API规范来操作容器。所以需要安装Docker -compose,以便与Docker一起在您的计算机上使用;

Docker Stack功能包含在Docker引擎中。你不需要安装额外的包来使用它,docker stacks 只是swarm mode的一部分。

Docker stack不支持基于第2版写的docker-compose.yml ,也就是version版本至少为3。然而Docker Compose对版本为2和3的 文件仍然可以处理;

docker stack把docker compose的所有工作都做完了,因此docker stack将占主导地位。同时,对于大多数用户来说,切换到使用docker stack既不困难,也不需要太多的开销。如果您是Docker新手,或正在选择用于新项目的技术,请使用docker stack。

harbor企业级部署

默认情况下,harbor不提供证书。可以在没有安全性的情况下部署harbor,就可以通过HTTP方式连接到harbor。但是,只有在没有连接到外部internet的测试环境或开发环境中才可以使用HTTP。在生产环境中,始终使用HTTPS。要配置HTTPS,必须创建SSL证书。可以使用由受信任的第三方CA签名的证书,也可以使用自签名证书。本节介绍如何使用OpenSSL创建CA,以及如何使用CA签署服务器证书和客户端证书。下面的过程假设harbor注册表的主机名是harbor.edu.com,并且它的DNS记录指向运行harbor的主机。

官网文档

官网https配置帮助文档:

https://github.com/goharbor/harbor/blob/v1.9.4/docs/configure_https.md

解压harbor

在harbor中创建一个目录,用于存放证书

echo "192.168.198.155 harbor.edu.com" >> /etc/hosts
cat /etc/hosts

cd /data
tar zxf harbor-offline-installer-v1.9.4.tgz

cd harbor/
mkdir -p ssl
cd ssl
获得证书颁发机构

在生产环境中,应该从CA官方获取证书。在测试或开发环境中,可以生成自己的CA。若要生成CA证书,请运行以下命令。

cd /data/harbor/ssl
创建CA根证书
openssl genrsa -out ca.key 4096

openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=TW/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.edu.com" -key ca.key -out ca.crt
获取服务器证书

证书通常包含.crt文件和.key文件,例如harbor.edu.com.crt和harbor.edu.com.key。

创建自己的私钥

openssl genrsa -out harbor.edu.com.key 4096
生成证书签名请求

调整-subj选项中的值以反映您的组织。如果使用域名方式连接harbor主机,则必须将其指定为common name(CN)属性,并在key和CSR文件名中使用它。

openssl req -sha512 -new -subj "/C=TW/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.edu.com" -key harbor.edu.com.key -out harbor.edu.com.csr
生成注册表主机的证书

无论是使用域名还是使用IP地址连接到您的Harbor主机,都必须创建此文件,以便您可以为harbor主机生成符合使用者替代名称(SAN)和x509 v3扩展要求的证书。替换DNS条目以反映harbor的域。

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.edu.com
EOF

使用v3.ext文件为harbor主机生成证书。

openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in harbor.edu.com.csr -out harbor.edu.com.crt
为docker配置服务器证书,密钥和CA

生成ca.crt、harbor.edu.com.crt和harbor.edu.com.key文件后,必须将它们提供给Harbor和Docker,并重新配置Harbor以使用它们。

将yourdomain.com.crt转换为yourdomain.com.cert,供Docker使用。

Docker守护进程将.crt文件解释为CA证书,.cert文件解释为客户端证书。

openssl x509 -inform PEM -in harbor.edu.com.crt -out harbor.edu.com.cert

mkdir -p /etc/docker/certs.d/harbor.edu.com/

cp harbor.edu.com.cert /etc/docker/certs.d/harbor.edu.com/
cp harbor.edu.com.key /etc/docker/certs.d/harbor.edu.com/
cp ca.crt /etc/docker/certs.d/harbor.edu.com/

重启docker服务:
systemctl daemon-reload
systemctl restart docker
修改harbor.yml文件

注释掉http的配置信息

高版本harbor需要修改harbor.yml名称
cp /data/harbor/harbor.yml.tmpl /data/harbor/harbor.yml

vi /data/harbor/harbor.yml

注释掉
#http:
#  port: 80

修改内容,注意前置空格
hostname: harbor.edu.com
https:
  port: 443
  certificate: /data/harbor/ssl/harbor.edu.com.crt
  private_key: /data/harbor/ssl/harbor.edu.com.key
安装harbor

要先安装好docker compose

docker pull goharbor/prepare:v1.9.4

cd /data/harbor

如果此处出错请检查harbor.yml配置特别是空格!!!
./prepare
./install.sh
访问WEB
C:\Windows\System32\drivers\etc

192.168.198.155 harbor.edu.com

https://harbor.edu.com/
admin
Harbor12345
上传镜像
将harbor服务器端生成的ca.crt文件复制到/etc/pki/ca-trust/source/anchors/中。
scp /data/harbor/ssl/ca.crt root@192.168.198.100:/data

进入docker-100服务器:
mv /data/ca.crt /etc/pki/ca-trust/source/anchors/

执行命令更新ca证书授权:
update-ca-trust

重启docker服务:
systemctl restart docker
echo "192.168.198.155 harbor.edu.com" >> /etc/hosts

登录时注意centos系统时间是生成证书之后的时间
docker login harbor.edu.com
admin
Harbor12345

docker load -i nginx.1.19.3.alpine.tar
docker tag nginx:1.19.3-alpine harbor.edu.com/edu/nginx:v1
docker push harbor.edu.com/edu/nginx:v1

安装nginx

docker官网地址

https://hub.docker.com/_/nginx

基础镜像
拉取镜像
docker pull nginx:1.19.3-alpine

备份镜像
docker save nginx:1.19.3-alpine -o nginx.1.19.3.alpine.tar

导入镜像
docker load -i nginx.1.19.3.alpine.tar
运行镜像
docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine

进入容器
docker exec -it nginx sh

查看html目录
cd /usr/share/nginx/html

配置文件目录
cat /etc/nginx/nginx.conf

挂载数据卷

docker run -itd --name nginx -p 80:80 -v /data/nginx/html:/usr/share/nginx/html nginx:1.19.3-alpine

安装mysql

docker官网地址

https://hub.docker.com/_/mysql

基础镜像
拉取镜像
docker pull mysql:8.0.27

docker pull mysql:5.7.31

备份镜像
docker save mysql:8.0.27 -o mysql.8.0.27.tar

导入镜像
docker load -i mysql:8.0.27.tar
运行镜像

学习docker run -e参数

-e , --env=[]: 设置环境变量,容器中可以使用该环境变量

官网中给出进入容器的第三种方式,前边我们学习了/bin/bash,sh

向my.cnf文件中追加相关配置项

docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai mysql:8.0.27 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-time_zone='+8:00'

参数说明:

MYSQL_ROOT_PASSWORD : 设置mysql数据库root的密码
MYSQL_DATABASE : 启动时创建数据库
TZ=Asia/shanghai : 设置容器时区
character-set-server : 服务器字符集,在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集。
collation-server : 排序规则字符集
default-time_zone : mysql的时区

数据卷挂载

创建挂载目录
mkdir -p /data/mysql

运行容器
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai -v /data/mysql:/var/lib/mysql mysql:8.0.27 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-time_zone='+8:00'

docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai -v /data/mysql:/var/lib/mysql mysql:5.7.31 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-time_zone='+8:00'
测试mysql

在容器内测试mysql

进入容器:根据官网上的实例,使用bash命令进入容器
docker exec -it mysql bash

登录mysql
mysql -uroot -p

输入密码
123456

use mysql;
show databases;

退出mysql
exit

退出容器
exit

安装zookeeper

docker官网地址

https://hub.docker.com/_/zookeeper

基础镜像
拉取镜像
docker pull zookeeper:3.6.2

备份镜像
docker save zookeeper:3.6.2 -o zookeeper.3.6.2.tar

导入镜像
docker load -i zookeeper.3.6.2.tar
运行镜像
docker run -itd --name zookeeper -p 2181:2181 zookeeper:3.6.2

docker exec -it zookeeper /bin/bash
cat /etc/issue

返回信息:
Debian GNU/Linux 10 \n \l

安装rabbitmq

docker官网地址

https://hub.docker.com/_/rabbitmq

基础镜像
拉取镜像
docker pull rabbitmq:3.9.14-alpine

备份镜像
docker save rabbitmq:3.9.14-alpine -o rabbitmq.3.9.14-alpine.tar

导入镜像
docker load -i rabbitmq:3.9.14-alpine.tar
运行镜像
docker run -itd --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9.14-alpine

docker exec -it rabbitmq /bin/bash

开启管理界面
rabbitmq-plugins enable rabbitmq_management

解决管理界面UI无法访问问题
cd /etc/rabbitmq/conf.d/

vi management_agent.disable_metrics_collector.conf

修改为false
management_agent.disable_metrics_collector = false

重启容器

登录账号密码
guest
guest

cat /etc/issue

返回信息:
Debian GNU/Linux 10 \n \l


安装redis

docker官网地址

https://hub.docker.com/_/redis

基础镜像
拉取镜像
docker pull redis:6.2.6-alpine

备份镜像
docker save redis:6.2.6-alpine -o redis.6.2.6-alpine.tar

导入镜像
docker load -i redis:6.2.6-alpine.tar
运行镜像
docker run -itd --name redis -p 6379:6379 redis:6.2.6-alpine
测试redis
docker exec -it redis sh

cd /usr/local/bin

./redis-cli
显示内容
127.0.0.1:6379>

安装nexus3

docker官网地址

https://hub.docker.com/r/sonatype/nexus3

基础镜像
拉取镜像
docker pull sonatype/nexus3:3.28.1

备份镜像
docker save sonatype/nexus3:3.28.1 -o sonatype.nexus3.3.28.1.tar

导入镜像
docker load -i sonatype.nexus3.3.28.1.tar
运行镜像
运行容器
docker run -d -p 8081:8081 --name nexus3 sonatype/nexus3:3.28.1

进入容器查找初始化密码
docker exec -it nexus3 /bin/bash
cd /nexus-data/
cat admin.password

浏览器端访问
http://ip:8081/

数据卷挂载

创建挂载目录
mkdir /data/nexus3

查看官网说明文档,需要为挂载目录授权
chown -R 200 /data/nexus3

运行容器
docker run -itd -p 8081:8081 --name nexus3 -v /data/nexus3:/nexus-data sonatype/nexus3:3.28.1

查看容器启动日志
docker logs -f nexus3

安装OpenZipkin

基础镜像
拉取镜像
docker pull openzipkin/zipkin
运行容器
docker run -itd -p 9411:9411 --name openzipkin openzipkin/zipkin
测试zipkin
浏览器端访问
http://ip:9411/zipkin/

安装Nacos

基础镜像
拉取镜像
docker pull nacos/nacos-server:1.3.2
运行容器
单机模式
docker  run \
--name nacos -itd \
-p 8848:8848 \
--restart=always \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e MODE=standalone \
nacos/nacos-server:1.3.2

集群

推荐docker-compose部署

访问:https://github.com/nacos-group/nacos-docker

并下载env目录下的文件

案例配置在example目录

mkdir -p /data/nacos/mysql
mkdir -p /data/env

将env目录里的文件拷贝到/data/env目录

cd /data/nacos
vim docker-compose.yml

docker-compose.yml

version: "3"
services:
  nacos1:
    hostname: nacos1
    container_name: nacos1
    image: nacos/nacos-server:1.3.2
    volumes:
      - ./cluster-logs/nacos1:/home/nacos/logs
      - ./init.d:/home/nacos/init.d
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9555:9555"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql

  nacos2:
    hostname: nacos2
    image: nacos/nacos-server:1.3.2
    container_name: nacos2
    volumes:
      - ./cluster-logs/nacos2:/home/nacos/logs
      - ./init.d:/home/nacos/init.d
    ports:
      - "8849:8848"
      - "9849:9848"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql
  nacos3:
    hostname: nacos3
    image: nacos/nacos-server:1.3.2
    container_name: nacos3
    volumes:
      - ./cluster-logs/nacos3:/home/nacos/logs
      - ./init.d:/home/nacos/init.d
    ports:
      - "8850:8848"
      - "9850:9848"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql
  mysql:
    container_name: mysql
    image: nacos/nacos-mysql:5.7
    env_file:
      - ../env/mysql.env
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "3306:3306"

启动集群

docker-compose.yml同一目录下运行

docker-compose up
后台运行
docker-compose up -d
测试Nacos
浏览器端访问
http://ip:8848/nacos

用户名及密码
nacos
nacos

安装Sentinel-dashboard

基础镜像
拉取镜像
docker pull bladex/sentinel-dashboard:1.7.2
运行容器
docker run --name sentinel  -itd -p 8858:8858 -p 8719:8719  bladex/sentinel-dashboard:1.7.2
测试zipkin
浏览器端访问
http://ip:8858/
sentinel
sentinel

如果实时监控不显示请同步服务器时间

安装Seata

基础镜像
拉取镜像
docker pull seataio/seata-server:1.5.1
复制配置文件
docker run -d --name seata-server -p 8091:8091 seataio/seata-server:1.5.1

拷贝文件
docker cp seata-server:/seata-server  /data/seata

docker rm -f seata-server
修改配置文件
server:
  port: 7091
 
spring:
  application:
    name: seata-server
logging:
  config: classpath:logback-spring.xml
  file:
    path: ${user.home}/logs/seata
  extend:
    logstash-appender:
      destination: 127.0.0.1:4560
    kafka-appender:
      bootstrap-servers: 127.0.0.1:9092
      topic: logback_to_logstash
console:
  user:
    username: admin
    password: admin
seata:
  config:
    # support: nacos 、 consul 、 apollo 、 zk  、 etcd3
    type: nacos
    nacos:
      server-addr: http://192.168.198.101:8848
      namespace:
      group: SEATA_GROUP
      username: nacos
      password: nacos
      ##if use MSE Nacos with auth, mutex with username/password attribute
      #access-key: ""
      #secret-key: ""
      data-id: seataServer.properties
  registry:
    # support: nacos 、 eureka 、 redis 、 zk  、 consul 、 etcd3 、 sofa
    type: nacos
    preferred-networks: 30.240.*
    nacos:
      application: seata-server
      server-addr: http://192.168.198.101:8848
      group: SEATA_GROUP
      namespace:
      cluster: default
      username: nacos
      password: nacos
      ##if use MSE Nacos with auth, mutex with username/password attribute
      #access-key: ""
      #secret-key: ""
  security:
    secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
    tokenValidityInMilliseconds: 1800000
    ignore:
      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

启动Nacos添加seataServer.properties配置

注意:驱动必须正确

Data ID: seataServer.properties

Group: SEATA_GROUP

配置格式: Properties

# 存储模式
store.mode=db
 
store.db.datasource=druid
store.db.dbType=mysql
# 需要根据mysql的版本调整driverClassName
# mysql8及以上版本对应的driver:com.mysql.cj.jdbc.Driver
# mysql8以下版本的driver:com.mysql.jdbc.Driver
store.db.driverClassName=com.mysql.jdbc.Driver
# 注意根据生产实际情况调整参数host和port
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
# 数据库用户名
store.db.user=root
# 数据库密码
store.db.password=123456
# 微服务里配置与这里一致
service.vgroupMapping.default_tx_group=default
store.db.minConn=5
store.db.maxConn=100
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
创建数据库和表

其他版本或数据库建表语句获取地址:

https://github.com/seata/seata/tree/v1.5.1/script/server/db

新建数据库seata,字符集为utf8mb4

执行建表语句

-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(
    `xid`                       VARCHAR(128) NOT NULL,
    `transaction_id`            BIGINT,
    `status`                    TINYINT      NOT NULL,
    `application_id`            VARCHAR(32),
    `transaction_service_group` VARCHAR(32),
    `transaction_name`          VARCHAR(128),
    `timeout`                   INT,
    `begin_time`                BIGINT,
    `application_data`          VARCHAR(2000),
    `gmt_create`                DATETIME,
    `gmt_modified`              DATETIME,
    PRIMARY KEY (`xid`),
    KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
    `branch_id`         BIGINT       NOT NULL,
    `xid`               VARCHAR(128) NOT NULL,
    `transaction_id`    BIGINT,
    `resource_group_id` VARCHAR(32),
    `resource_id`       VARCHAR(256),
    `branch_type`       VARCHAR(8),
    `status`            TINYINT,
    `client_id`         VARCHAR(64),
    `application_data`  VARCHAR(2000),
    `gmt_create`        DATETIME(6),
    `gmt_modified`      DATETIME(6),
    PRIMARY KEY (`branch_id`),
    KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(128),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_status` (`status`),
    KEY `idx_branch_id` (`branch_id`),
    KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `distributed_lock`
(
    `lock_key`       CHAR(20) NOT NULL,
    `lock_value`     VARCHAR(20) NOT NULL,
    `expire`         BIGINT,
    primary key (`lock_key`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
运行容器

-e SEATA_IP:指定当前主机IP(云服务器必须配置)

docker run -itd --restart always --name seata-server -p 7091:7091 -p 8091:8091 -e SEATA_IP=192.168.198.102 -v /data/seata:/seata-server seataio/seata-server:1.5.1
测试Seata
观察启动日志
docker logs -f seata-server

浏览器端访问
http://192.168.198.102:7091/
seata
seata
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值