是一个虚拟化平台
可以通过虚拟化方式,为应用提供可运行的容器
可更快地打包、测试以及部署应用程序
无需配置
下载docker离线包 官网下载
放到一个文件夹里执行命令
# 进入/root/setup/docker 文件夹
cd /root/setup/docker
# 为 install.sh添加执行权限
chmod +x install.sh
# 安装
./install.sh -f docker-20.10.6.tgz
安装成功后检查安装状态
docker info
启动docker服务
systemctl start docker
查看docker状态
systemctl status docker
# 设置Docker开机自启
systemctl enable docker
# 禁用Docker开机自启
systemctl disable docker
# 重新启动Docker服务
systemctl restart docker
# 查看Docker信息
docker info
# 查看docker info中具体key的信息,例如:
docker info | grep 'Docker Root Dir:'
# 停止docker服务
systemctl stop docker
镜像加速
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"
],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"data-root": "/var/lib/docker"
}
EOF
重启docker
下载镜像
docker pull 镜像名
docker pull hello-world
浏览镜像文件
docker images
查看镜像详情
# 语法:docker inspect 镜像名或镜像id
docker inspect hello-world
导出镜像文件
导出后给他人使用
docker save hello-world | gzip > hello-world.tar.gz
删除镜像文件
删除镜像文件时没有使用此镜像
语法:docker image rm 镜像名或镜像id
docker image rm hello-world
导入镜像操作
从本地导入镜像
docker load < hello-world.tar.gz
运行镜像文件
docker run hello-world
查看所有运行容器
docker ps -a
删除容器
docker container rm 容器id
下载镜像
docker pull centos:7
创建并启动容器
docker run -it 镜像名 bash
退出容器
exit
查看容器日志信息
如果容器没有启动需要查看错误日志
docker container logs 容器id
停止(stop)或重启(Restart)容器(Container)
停止运行的容器,代码如下:
docker container stop 802 #802为容器自己的id
重新启动容器,代码如下:
docker container restart 802 #802位容器自己的id
进入容器 可以使用docker exec命令
docker exec -it 802 bash #802为容器id 使用docker ps -a查看id
清楚所有容器
docker container prune
数据卷操作
数据卷是一个多个容器使用的特殊目录
可以在容器之间共享和重用
创建数据卷
docker volume create container-vol # container-vol是名称
查看所有数据卷
docker volume ls
查看指定数据卷信息
docker volume inspect container-vol # container-vol是名称
启动挂载数据卷容器
把数据卷挂载到容器/root/test
docker run -it --count source=container-vol,target=/root/test centos:7 bash
docker run -it -v container-vol:/root centos:7 bash
删除数据卷
docker volume rm container-vol # container-vol是名称
清理无主数据卷
docker volume prune
镜像制作
我们可以在远程仓库下载需要的镜像
也可以上传到远程仓库
创建Dockerfile
文件
vim Dockerfile
注意大小写
添加如下代码
FROM centos:7
ADD jdk-8u51-linux-x64.tar.gz /usr/local/docker
ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_51 \
PATH=/usr/local/docker/jdk1.8.0_51/bin:$PATH
CMD ['bash']
将当期目录所有的文件进行打包为jdk:8
docker build -t jdk:8 .
运行镜像文件
docker run -it jdk:8 bash
运行java程序
创建.java
文件
vi hello.java
添加程序
package pkg;
class Hello{
public static void main(String[] arges){
System.out.println("hello world");
}
}
编译
javac -d . hello.java
运行
java pkg.Hello
基于JDK启动sentinel
将sentinel拷贝到虚拟机
启动容器
docker run -d -p 8180:8080 --name sentinel \
-v /root/servers:/usr/sca \
jdk:8 java -jar /usr/sca/sentinel-bashboard-1.8.1.jar
8180:8080
表示sentinel
默认端口是8080更改为8180
-d
代表后台运行
--name
表示为启动的容器起一个名字
-v /root/servers
表示宿主机路径
:/usr/sca
表示容器路径
jdk:8 java -jar /usr/sca/sentinel-bashboard-1.8.1.jar
java运行jar包
制作sentinel镜像
创建Dockerfile
FROM centos:7
ADD jdk-8u51-linux-x64.tar.gz /usr/local/
ADD sentinel-dashboard-1.8.1.jar /usr/local/
ENV JAVA_HOME=/usr/local/jdk1.8.0_51 \
PATH=/usr/local/jdk1.8.0_51/bin:$PATH
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/sentinel-dashboard-1.8.1.jar"]
打包
docker build -t sentinel:8 . #不要丢掉这里的点
运行
docker run -d --name sentinel8181 -p 8181:8080 sentinel:8 #-d 表示后台运行,-p用于指定端口映射,sentinel:8为镜像文件名
安装Mysql
拉取指定版本
docker pull mysql:8.0.23
运行镜像文件
sudo docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0.23
进入容器
docker exec -it mysql bash
执行sql
脚本
source /usr/ #注意存放 sql 脚本的位置 对应的目录
使用docker-compose
编写yml
文件
version: '3'
services:
mdb-admin: #名称
image: mall/mdb-admin:1.0-SNAPSHOT #镜像名称
container_name: mdb-admin #容器名称
network_mode: host #使用主网络
ports:
- 8282:8282 #对外开放端口
volumes:
- /mydata/app/mdb-admin/logs:/var/logs #文件挂载
- /etc/localtime:/etc/localtime #使用系统时间
environment:
TZ: Asia/Shanghai #时区
logging:
driver: "json-file"
options:
max-size: "10g" #日志文件大小
entrypoint: java -Xms256m -Xmx512m -jar -Dspring.profiles.active=prod /mdb-admin-1.0-SNAPSHOT.jar #设置启动参数
执行命令启动
docker-compose -f docker-compose-env.yml up -d # docker-compose-env.yml是文件名称
安装Redis
数据库
下载镜像文件
docker pull redis
准备文件目录
mkdir -p /usr/local/docker/redis01/conf
准备文件
touch /usr/local/docker/redis01/conf/redis.conf
启动redis
sudo docker run -p 6379:6379 --name redis01 \
-v /usr/local/docker/redis01/data:/data \
-v /usr/local/docker/redis01/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
进入redis01
容器
docker exec -it redis01 bash
检测版本
redis-server -v
登录redis
redis-cli
安装Nginx
下载
docker pull nginx
创建数据卷
docker volume create nginx-vol
查看对应的目录
docker inspect nginx-vol
启动nginx
docker run --name nginx -p 80:80 -v nginx-vol:/etc/nginx -d nginx
安装Nacos
下载
docker pull nacos/nacos-server:1.4.1
执行脚本过后进行启动
docker run \
-e TZ="Asia/Shanghai" \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_DATABASE_NUM=1 \
-e MYSQL_SERVICE_HOST=192.168.126.129 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-p 8848:8848 \
--name nacos \
--restart=always \
-d nacos/nacos-server:1.4.1
参数说明
时区
TZ="Asia/Shanghai"
单节点模式
MODE=standalone
数据库地址
MYSQL_SERVICE_HOST
数据库用户名
MYSQL_SERVICE_USER
数据库密码
MYSQL_SERVICE_PASSWORD
需连接的数据库名称
MYSQL_SERVICE_DB_NAME
端口映射
-p 8848:8848
任意时候重启容器,开机就能自动启动容器(需设置docker为开机自启)
--restart=always
nacos
版本
nacos/nacos-server:1.4.11
容器通讯
创建虚拟网络
创建名字为 t-dachui
的虚拟网络
docker network create t-dachui
查看所有网络
docker network ls
查看网络信息
docker inspect 67d #67d 为创建的网络id
Docker
Docker
是开发运维一体化核心工具
提高开发-测试-运维软件的生命周期效率
在服务器上可以大量运行Docker
容器充分使用服务器运算资源
上传 docker-images.gz
文件到/root/
目录
导入镜像docker load -i docker-images.gz
重启 docker
服务
systemctl restart docker
复制镜像并重命名
docker tag 原来的名字 新名字
复制的镜像和被复制的镜像一模一样
只是在原来的镜像上新增加了一个标签
删除镜像名标签
docker rmi 名称
如果删除的标签只有一个那么会将镜像一同删除
导出镜像
docker save 镜像名 镜像名2 | gzip > a.gz
# 将镜像导出压缩到 a.gz压缩文件里
运行容器
docker run tomcat
查看镜像构建过程
docker history 镜像名
设置自己的CMD
默认启动命令
CMD ["java", "-jar", "/e.jar", "--server.port=2001"]
# 或者 每一个中间有空格
ENTRYPOINT ["java"]
CMD ["-jar", "/e.jar", "--server.port=2001"]
覆盖默认命令
docker run eureka java -jar /a2.jar
或者
docker run --entrypoint java eureka -jar /a2.jar
例如
docker run --entrypoint ls tomcat -a -l
#
docker run -d tomcat#后台启动tomcat
--name
:
每个启动的容器都可以指定一个名称,方便使用名称来操作容器
--restart=always
:
docker
系统服务重启,或者操作系统重启,容器可以随系统自动启动。
例如
# cat1容器可以随系统启动
docker run -d \
--name cat1 \
--restart=always \
tomcat
--rm
:
我们会临时使用一个容器之后这个容器就不再使用,添加此参数器停止时自动删除容器
docker cp
:
在容器和宿主机之间复制文件
例如
# 启动一个临时容器
docker run -d \
--rm \
--name tmp \
tomcat
# 把 tomcat 的 server.xml 复制到宿主机的 /root/ 目录下
docker cp tmp:/usr/local/tomcat/conf/server.xml /root/
# 停止临时容器,会自动删除
docker stop tmp
# 修改 server.xml 中的8080端口,改成80
vim server.xml
# -v 把宿主机路径挂载到容器的一个路径
# 挂载的路径可以是文件,也可以是文件夹
# 这里把修改过的 server.xml 挂载到新启动的容器中
docker run -d \
--name cat2 \
-v /root/server.xml:/usr/local/tomcat/conf/server.xml \
tomcat
清理容器
docker rm -f $(docker ps -aq)#清理所有容器
端口映射
-p
# 端口映射
# -p 宿主机端口:容器端口
docker run -d \
--name cat1 \
-p 80:8080 \
tomcat
自动端口映射
-P
大写
根据镜像中设置暴露的端口
自动映射到宿主机相同端口
容器直接使用宿主机的网络和端口
--net host
docker run -d --name cat1 \
--net host \
tomcat
创建虚拟网络
# 新建虚拟网络 my-net
docker network create my-net
# 查看虚拟网络
docker network ls
# 查看网络描述信息
docker inspect my-net
# 查看宿主机新建的虚拟网卡
ifconfig
容器互通
# 清理容器
docker rm -f $(docker ps -aq)
# 新建两个容器 cat1 和 cat2
# 连接到虚拟网络 my-net
docker run -d --name cat1 \
--net my-net \
tomcat
docker run -d --name cat2 \
--net my-net \
tomcat
# 查看两个容器的虚拟网络ip
docker inspect cat1
docker inspect cat2
构建镜像
将jdk
和tomcat
压缩文件放到一个文件夹里
jdk-8u291-linux-x64.tar.gz
apache-tomcat-10.0.6.tar.gz
创建一个Dockerfile
文件
cd /root/tomcat
vim Dockerfile
添加如下内容
# 选择基础镜像
FROM centos:8
# jdk 和 tomcat 文件添加到镜像的 /usr/local/ 目录下
# ADD 指令会自动解压文件
ADD jdk-8u291-linux-x64.tar.gz apache-tomcat-10.0.6.tar.gz /usr/local/
# 切换到镜像中指定的文件夹下
WORKDIR /usr/local/apache-tomcat-10.0.6/
# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk1.8.0_291 \
CATALINA_HOME=/usr/local/apache-tomcat-10.0.6 \
PATH=/usr/local/jdk1.8.0_291/bin:/usr/local/apache-tomcat-10.0.6/bin:$PATH
# EXPOSE 8080 只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
# 这个声明有两个好处:
# 1.帮助镜像使用者理解这个镜像服务的端口,以方便配置映射
# 2.在运行时使用随机端口映射时,也就是 docker run -P时,会自动随机映射 EXPOSE 的端口
EXPOSE 8080
# 设置启动命令
CMD ["catalina.sh", "run"]
执行构建
在tomcat
文件夹里执行
# 使用当前文件夹中的 Dockerfile 文件进行构建
# 新构建的镜像命名为 tomcat:10
docker build -t tomcat:10 ./
redis
redis
启动多个容器
docker run -d --name redis7000 -p 7000:6379 redis
docker run -d --name redis7001 -p 7001:6379 redis
docker run -d --name redis7002 -p 7002:6379 redis
添加数据
导入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
// 服务器的地址列表
List<JedisShardInfo> list = new ArrayList<JedisShardInfo>();
list.add(new JedisShardInfo("192.168.64.131",7000));
list.add(new JedisShardInfo("192.168.64.131",7001));
list.add(new JedisShardInfo("192.168.64.131",7002));
// 连接池配置对象
GenericObjectPoolConfig config = new JedisPoolConfig();
// 新建分片连接池
ShardedJedisPool pool = new ShardedJedisPool(config, list);
// 新建连接池
ShardedJedis j = pool.getResource();
//放入100条数据
for (int i = 0; i < 100; i++) {
j.set("k"+i,"v"+i);
}
pool.close();
主从服务
docker
启动主从
docker run -d --name redis6379 --net host redis
进入容器
docker exec -it redis6379 redis-cli
# 查看集群信息,默认是主服务器
info replication
启动两个服务器
docker run -d --name redis6380 --net host redis \
redis-server --port 6380 \
--slaveof 192.168.64.131 6379 #自己的服务器地址
docker run -d --name redis6381 --net host redis \
redis-server --port 6381 \
--slaveof 192.168.64.131 6379 #自己的服务器地址
进入容器连接端口
docker exec -it redis6380 redis-cli -p 6380
# 查看集群信息,默认是主服务器
info replication
docker exec -it redis6381 redis-cli -p 6381
# 查看集群信息,默认是主服务器
info replication
启动哨兵
哨兵的配置文件
将下方所有命令执行
里面的ip
更改为自己的ip
mkdir /opt/sentinel/
cd /opt/sentinel/
# 配置文件中的 "sentinel monitor mymaster 192.168.64.150 6379 2"
# 末尾的 2 表示两个哨兵投票确认主服务器宕机,哨兵才会认为主服务器宕机
cat <<EOF >5000.conf
port 5000
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
cat <<EOF >5001.conf
port 5001
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
cat <<EOF >5002.conf
port 5002
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
启动
docker run -d --name sentinel5000 \
-v /opt/sentinel/5000.conf:/sentinel.conf \
--net=host \
redis redis-sentinel /sentinel.conf
docker run -d --name sentinel5001 \
-v /opt/sentinel/5001.conf:/sentinel.conf \
--net=host \
redis redis-sentinel /sentinel.conf
docker run -d --name sentinel5002 \
-v /opt/sentinel/5002.conf:/sentinel.conf \
--net=host \
redis redis-sentinel /sentinel.conf
# 进入一个哨兵容器,查看它监控的主从服务器和其他哨兵
docker exec -it sentinel5000 redis-cli -p 5000
> sentinel master mymaster
> sentinel slaves mymaster
> sentinel sentinels mymaster
集群
新增6个配置文件
mkdir /opt/redis
cd /opt/redis
mkdir 7000 7001 7002 7003 7004 7005
添加配置信息
cat <<EOF >7000/redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7001/redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7002/redis.conf
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7003/redis.conf
port 7003
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7004/redis.conf
port 7004
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
cat <<EOF >7005/redis.conf
port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
启动这六个redis
实例
docker run -d --name redis7000 \
-v /opt/redis/7000/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf
docker run -d --name redis7001 \
-v /opt/redis/7001/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf
docker run -d --name redis7002 \
-v /opt/redis/7002/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf
docker run -d --name redis7003 \
-v /opt/redis/7003/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf
docker run -d --name redis7004 \
-v /opt/redis/7004/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf
docker run -d --name redis7005 \
-v /opt/redis/7005/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf
配置集群
# 进入容器执行集群配置命令
# ip换成自己的
docker exec -it redis7000 \
redis-cli --cluster create \
192.168.64.150:7000 192.168.64.150:7001 \
192.168.64.150:7002 192.168.64.150:7003 \
192.168.64.150:7004 192.168.64.150:7005 \
--cluster-replicas 1
Elasticsearch
集群
关闭防火墙
# 关闭防火墙
systemctl stop firewalld.service
# 禁用防火墙
systemctl disable firewalld.service
设置底层参数
echo 'vm.max_map_count=262144' >>/etc/sysctl.conf
重启服务器
shutdown -r now
下载镜像
docker pull elasticsearch:7.9.3
挂载目录文件
# 创建虚拟网络
docker network create es-net
# node1 的挂载目录
mkdir -p -m 777 /var/lib/es/node1/plugins
mkdir -p -m 777 /var/lib/es/node1/data
# node2 的挂载目录
mkdir -p -m 777 /var/lib/es/node2/plugins
mkdir -p -m 777 /var/lib/es/node2/data
# node3 的挂载目录
mkdir -p -m 777 /var/lib/es/node3/plugins
mkdir -p -m 777 /var/lib/es/node3/data
启动集群
# node 1
docker run -d \
--name=node1 \
--restart=always \
--net es-net \
-p 9200:9200 \
-p 9300:9300 \
-v /var/lib/es/node1/plugins:/usr/share/elasticsearch/plugins \
-v /var/lib/es/node1/data:/usr/share/elasticsearch/data \
-e node.name=node1 \
-e node.master=true \
-e network.host=node1 \
-e discovery.seed_hosts=node1,node2,node3 \
-e cluster.initial_master_nodes=node1 \
-e cluster.name=es-cluster \
-e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
elasticsearch:7.9.3
# node 2
docker run -d \
--name=node2 \
--restart=always \
--net es-net \
-p 9201:9200 \
-p 9301:9300 \
-v /var/lib/es/node2/plugins:/usr/share/elasticsearch/plugins \
-v /var/lib/es/node2/data:/usr/share/elasticsearch/data \
-e node.name=node2 \
-e node.master=true \
-e network.host=node2 \
-e discovery.seed_hosts=node1,node2,node3 \
-e cluster.initial_master_nodes=node1 \
-e cluster.name=es-cluster \
-e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
elasticsearch:7.9.3
# node 3
docker run -d \
--name=node3 \
--restart=always \
--net es-net \
-p 9202:9200 \
-p 9302:9300 \
-v /var/lib/es/node3/plugins:/usr/share/elasticsearch/plugins \
-v /var/lib/es/node3/data:/usr/share/elasticsearch/data \
-e node.name=node3 \
-e node.master=true \
-e network.host=node3 \
-e discovery.seed_hosts=node1,node2,node3 \
-e cluster.initial_master_nodes=node1 \
-e cluster.name=es-cluster \
-e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
elasticsearch:7.9.3
中文分词器
下载 elasticsearch-analysis-ik-7.9.3.zip
复制到 /root/
目录下
安装分词器
cd ~/
# 复制 ik 分词器到三个 es 容器
docker cp elasticsearch-analysis-ik-7.9.3.zip node1:/root/
docker cp elasticsearch-analysis-ik-7.9.3.zip node2:/root/
docker cp elasticsearch-analysis-ik-7.9.3.zip node3:/root/
# 在 node1 中安装 ik 分词器
docker exec -it node1 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip
# 在 node2 中安装 ik 分词器
docker exec -it node2 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip
# 在 node3 中安装 ik 分词器
docker exec -it node3 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip
# 重启三个 es 容器
docker restart node1 node2 node3