一.docker 安装
https://docs.docker.com/engine/install/centos/
#1卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2需要的安装包
yum install -y yum-utils
#3设置镜像的仓库(使用阿里云的)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#4安装docker相关 ce社区版 ee企业版
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#5启动docker
systemctl start docker
#6查看是否安装成功
docker version
#7hello world
docker run hello-world
①提示docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
See 'docker run --help'.
②解决方法:在/etc/docker/下创建daemon.json
里面加入内容
{
"registry-mirrors": ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://docker.m.daocloud.io",
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn",
"https://mirror.ccs.tencentyun.com"]
}
③重启docker
systemctl daemon-reload
systemctl restart docker
④可能慢点,等一会就会发现,成了.
#8查看镜像是否存在
docker images
#9卸载docker
①卸载依赖
yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
②删除资源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
③/var/lib/docker 是docker的默认工作路径
二.docker执行顺序
开始->本地查看是否有目标镜像->有直接用,没有去DockerHub下载->DockerHub有下载到本地,无报错.
三.docker命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
帮助文档地址:https://docs.docker.com/reference/
1.镜像命令
docker images
docker search mysql #搜索
docker pull #拉取镜像
docker rmi #删除镜像 docker rmi -f 镜像id
docker rmi -f $(docker images -aq) #删所有镜像
ps:删除镜像后,容器不会自动删除,还会占用内存,需要手动将容器删除
2.容器命令(有了镜像才能创建容器)
docker run image
--name="name" 容器名字
-d 后台方式运行
常见的坑:docker容器使用后台运行,必须要有一个前台进程,若没有自动停止
-it 使用交互方式运行,进入容器查看内容
docker run -it centos /bin/bash #启动并进入容器
-p 指定容器的端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P 随机指定端口
docker ps 命令
-a #列出正在运行的容器+历史运行过的容器
-n=? #显示最近创建的容器
-q #只显示容器的编号
退出容器
exit #直接容器停止并退出
ctrl + p + q #(快捷键)容器不停止退出
删除容器
docker rm 容器id
启动和停止容器操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
查看日志
docker logs -tf --tail 10 容器id
-t日志加时间 -f保留打印窗口
查看容器中进程信息
docker top 容器id
进入当前正在运行的容器
docker exec -it 容器id /bin/bash #进入容器后开启一个新的终端
docker attach 容器id#进入容器正在执行的终端,不会启动新的进程
从容器拷贝文件到主机上
docker cp 容器id:容器内路径 目的地主机路径
docker cp 1d2184bf9e40:/home/test.java /home
四.安装nginx
docker pull nginx
docker run -d --name nginx01 -p 3344:80 nginx
测试 curl localhost:3344
五.安装tomcat
docker pull tomcat:9.0
docker run -d -p 3344:8080 --name tomcat01 tomcat:9.0 #最后不指定版本号,默认启动最新版本
发现问题:1.linux命令少了2.webapps内没有内容
解决问题:可以将webapps.dist 中的内容复制到webapps文件中
cp -r webapps.dist/* webapps
六.部署es+kibana
#es暴露的端口最多
#es十分耗内存
#es的数据一般需要放置到安全目录
#--net somenetwork ? 网络配置
#启动es
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
七.commit镜像(等于保存快照)
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像:[TAG]
八.容器数据卷(卷技术,将容器内的目录,挂载到linux上面)
1.需求:若mysql在某个容器内,删了容器,数据也就丢了.如何删了容器,数据不丢.
2.使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
docker run -it -v /home/ceshi:/home centos /bin/bash
3.具名和匿名挂载
#匿名挂载:在-v 只写了容器内的路径,没有写容器外的路径
docker run -d -p --name nginx01 -v /etc/nginx nginx
#具名挂载:
docker run -d -p --name nginx02 -v test-nginx:/etc/nginx nginx
#查看 docker column ls
#没有指定目录的情况下,卷都放在/var/lib/docker/volumes/xx
#如何确定具名挂载还是匿名挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
4.拓展
#通过-v 容器内路径 ro rw 改变读写权限
ro readonly #只读
rw readwrite #只读可写
#ro 只要看到ro说明只能通过宿主机来操作,容器内部无法操作!
5.mysql卷测试
docker pull mysql
#-d后台启动 -p端口映射 -v挂载 -e环境配置 --name容器名字
docker run -d -p 3344:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
九.数据卷容器
多个容器之间实现同步数据
docker run -it --name docker02 --volumes-from docker01 centos
多个mysql实现共享
docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql
结论:容器的生命周期一直持续到没有容器使用为止,但是持久到了本地,本地数据不会删除.
十.DockerFile
1.构建docker镜像步骤:
①.编写一个dockerfile文件
②.docker build构建成一个镜像
③.docker run运行镜像
④.docker push发布镜像(DockerHub.阿里云镜像仓库)
2.基础知识
①每个保留关键字(指令)都是必须是大写字母
②执行从上到下顺序执行
③#表示注释
④每一行指令都会创建提交一个新的镜像层,并提交
3.开发,部署,运维
DocekerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成镜像,最终发布和运行的产品
Docker容器:容器是镜像运行起来提供服务的
4.基本命令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #添加其他镜像,比如添加tomcat镜像,需要添加tomcat压缩包
WORKDIR #进项的工作目录
VOLUME #挂载的目录
EXPOSE #暴露端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承 DockerFile的容器时就会运行ONBUILD的指令,是个触发指令
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候配置环境变量
5.编写centos
①编写dockerfile文件
FROM centos
MAINTAINER people<12345@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
②查看dockerfile文件
cat 文件名
③构建dockerfile文件镜像(最后那个点不能掉)
docker build -f dockerfile文件路径 -t 镜像名:[tag] .
docker build -f mydockerfile -t mycentos:0.1 .
④启动镜像
docker run -it mycentos:0.1
⑤查看镜像历史
docker history 镜像id
6.编写tomcat
①编写dockerfile
FROM centos
MAINTAINER people<12345@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8ull-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.22.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORK $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
②构建镜像
docker build -t diytomcat .
③启动镜像
docker run -d -p 3344:8080 --name testtomcat -v /home/mytomcat/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/mytomcat/build/tomcat/tomcatlogs/:usr/local/apache-tomcat-9.0.22/logs diytomcat
7.发布镜像
1.发布到DockerHub
①DockerHub注册账号
②登录
docker login -u name
③提交
docker push username/myapp:v1.0
④提交不成功
构建镜像的时候,命名需要username打头
docker tag 镜像id username/diytomcat:1.0
重新提交
2.发布到阿里云
十一.Docker网络
ps:容器之间可以通过ip进行ping通,无法通过容器名字ping通,若是在自定义的网络中启动容器,则两个容器可以通过名字ping通
1.自定义网络
docker network ls #查看docker网络
网络模式
bridge:桥接docker(默认,自己创建也是用该模式)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通 (局限大,用的少)
2.测试
①配置自己的网络
# --driver bridge
# --subnet 192.168.0.0/16
# --gateway 192.168.0.1
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
②查看自己的网络
docker network inspect mynet
③在自己网络中启动容器
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
④测试ping连接
docker exec -it tomcat-net-01 ping tomcat-net-02
3.好处
不同的集群使用不同的网络,保证集群的安全
4.网络连通(两个独立的网络连通)
docker network connect mynet tomcat01
docker network inspect mynet
十二.搭建redis集群
docker network create redis --subnet 172.38.0.0/16
docker network ls
docker network inspect redis
1. 通过脚本创建六个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
2.在自己网络内启动redis (启动6个,改端口,名字,ip)
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 redis-server /etc/redis/redis.conf
3.进入任何一个redis内,搭建集群
docker exec -it redis-1 /bin/sh
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 l
#查看是否成功
redis-cli -c
cluster nodes
set a b 将处理该操作的容器停掉,然后执行get a,若获取到b,说明集群搭建成功.
十三.SpringBoot微服务打包Docker镜像
1.构建SpringBoot项目
①file->new project->Spring Initializr->type选择maven,SpringBoot版本可能不让选择2.x,可以忽略,后面直接改pom文件->一路next,完成
②修改pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
2.打包应用
pakage
3.安装docker插件
4.编写dockerfile ps:jdk8下不动就换成from openjdk:8
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
5.构建镜像
①将jar包和Dokerfile上传至服务器
②docker build -t testimage .
③docker run -d -P --name springboot-web testimage
④curl localhost:外部端口/接口测试
6.发布运行
①导出docker镜像
#myimage:tag 是你要导出的镜像名称和标签。
#myimage.tar 是你希望保存的文件名。
docker save -o myimage.tar myimage:tag
#压缩 tar 文件
gzip myimage.tar
②导入docker镜像
gunzip myimage.tar.gz
docker load -i myimage.tar