1.连接阿里云服务器
ssh root@公网ip
2.docker 为什么比vm快
因为docker不需要像虚拟机一样重新加载一个操作系统内核,而是利用宿主机的操作系统
3.docker启动一个应用 流程
docker首先在本机寻找镜像。如果本机有则下载运行,若没有则在dockerhub上下载,若dockerhub上没有找到这个镜像则返回错误,若能找到则下载运行
4.docker是怎么工作的
docker是c/s结构
Docker-client通过Socket访问docker-server 在server接收到client的指令时就会执行这个命令
在server端会通过镜像创建很多docker容器,不同容器之间是相互隔离的,
Docker理念:将应用和环境打包成镜像
5.镜像命令
Name, shorthand Default Description
--all , -a Show all images (default hides intermediate images)
--digests Show digests
--filter , -f Filter output based on conditions provided
--format Pretty-print images using a Go template
--no-trunc Don't truncate output
--quiet , -q Only show image IDs
docker images
REPOSITORY:镜像名(镜像的仓库源)
CREATED :镜像创建时间
下载镜像
docker pull mysql(默认下载最新版本的mysql)
docker pull mysql:版本号(下载指定版本的Mysql)
删除镜像
docker rmi -f 镜像id (删除指定镜像)
docker rmi -f 镜像id 镜像id 镜像id 镜像id(删除多个镜像)
docker rmi -f $(docker images -aq) (删除所有镜像)
6.容器命令
docker ps 列出当前运行中的容器
docker run [可选参数] image
--name=”name” 容器名字用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p主机端口:容器端口
-p容器端口
-p (随机指定端口)
docker run -it centos /bin/bash 启动并进入容器
Exit 退出容器
docker rm -f 容器id (强制删除指定容器)
docker rm -f 容器id 容器id 容器id(强制删除多个容器)
docker rm -f $(docker ps-aq) (强制删除所有容器)
docker rm 不能删除正在运行的容器 加上-f可靠强制删除
docker exec 进入容器后开启一个新的终端 可以在里面操作
docker attach 进入容器正在执行的终端,不会启动新的进程
docker cp 容器id:容器路径 主机路径 将容器中文件拷贝到主机上
docker stop 容器id 停止容器
部署nginx
docker run -d --name 自定义容器名 -p 3344:80 nginx
3344为本地端口 80为容器端口
docker exec -it nginx02 /bin/bash
进入容器nginx02
部署tomcat
docker run -it --rm tomcat:9.0
下载启动tomcat,启动完即删(用于测试使用)
docker pull tomcat
下载镜像
docker run -d -p 3344:8080 --name tomcat01 tomcat
docker exec -it tomcat01 /bin/bash
进入tomcat01容器
容器内webapps文件夹为空 把webapps.dist文件夹下文件复制到webapps
cp -r webapps.dist/* webapps
此时访问http://ip地址/3344
容器数据卷
1. 什么是容器数据卷
将容器内的目录挂载到linux主机,实现数据的持久化
2. 如何挂载
方法一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
例:[root@iZwz93i9d6sgnqnck60ksoZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash
启动容器后可以通过docker inspect 容器id
测试数据卷是否挂载成功
3 容器内新增文件
4. 查看主机/home/ceshi目录是否存在该文件
5. 容器外更改文件
6. 查看容器内是否同步了此文件
实战:同步mysql数据
[root@iZwz93i9d6sgnqnck60ksoZ /]# docker run -d -p 33306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Mysql@123 --name mysql01 mysql:5.7
-d后台运行
-p端口映射
-v数据卷挂载
-e环境配置
--name 容器名字
查看主机home文件夹下是否同步数据
在本地新增一个test库后,在docker容器内映射出来,也可以同步到本地主机
具名挂载和匿名挂载
docker volume ls
查看所有卷的情况
具名挂载
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
查看这个卷
docker volume inspect juming-nginx
docker容器内的所有卷,没有指定目录的情况下都是在/var/lib/docker/volumes/***/_data
-v 容器内路径 匿名挂载
-v 卷名:容器内路径 具名挂载
-v /宿主机路径:容器内路径 指定路径挂载
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx :ro nginx
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx :rw nginx
ro 只读
rw 读写
Dockerfile方式挂载
dockerfile就是用来构建docker镜像的构建文件
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令是一层
1.创建一个dockerfile文件,文件名建议名称dockerfile
2.文件中内容 指令(大写) 参数
FROM centos
VOLUME [“volume01”,“volume02”] 匿名挂载
CMD echo “----end----”
CMD /bin/bash
这里的每个命令都是镜像的一层
docker build -f dockerfile1 -t bella/centos:1.0 . 生成镜像
启动我们自己生成的容器
这个卷一定和外部有个同步的目录
1.查看容器id
2.查看挂载地址
进入持久化保存的地址即可看到从容器内同步的文件
数据卷容器
启动2个容器
1.启动dicker01
Ctrl+P+Q不退出容器 回到主机命令行
2.启动dicker04
3.在dicker01中新增文件能够同步到dicker04
docker run -it --name dicker04 --volumes-from dicker01 18c56a1ff0fa
dicker01在这里就是数据卷容器
4.在dicker04中新增文件能够同步到dicker01
删除dicker01 dicker04依然可以访问
因为容器之间是相互隔离的,数据共享是一种拷贝实现
Dockerfile
构建docker镜像的文件 就是命令参数脚本
构建步骤
1.编写dockerfile文件
2.docker build 构建成为一个镜像
3.docker run运行镜像
4.docker push发布镜像(dockerhub,阿里云镜像仓库)
构建过程
1.每个保留关键字(指令)都必须是大写字母
2.执行从上到下顺序执行
3.#表示注释
4.每个指令都会创建提交一个新的镜像层并提交
dockerfile:构建文件,定义了一切的步骤,源代码
dockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品
docker容器:容器就是镜像运行起来提供服务
dockerfile指令
FROM
构建镜像基于哪个镜像
MAINTAINER
镜像维护者姓名或邮箱地址
RUN
构建镜像时运行的指令
CMD
指定这个容器启动时要运行的命令(只有最后一个会生效)
VOLUME
指定容器挂载点到宿主机自动生成的目录或其他容器
USER
为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
WORKDIR
为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
HEALTHCHECH
健康检查
ARG
构建时指定的一些参数
EXPOSE
声明容器的服务端口(仅仅是声明)
ENV
设置容器环境变量
ADD
拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
COPY
拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
ENTRYPOINT
指定这个容器启动时要运行的命令,可以追加命令
实战
创建一个自己的centos
1.编写dockerfile文件
2.通过这个文件构建镜像
docker build -f belladockerfile -t bellacentos:0.1 .
Successfully built 7e6a27447645
Successfully tagged bellacentos:0.1
3.测试运行
原生centos工作目录默认是根目录
增加之后是/usr/local
CMD和ENTRYPOINT区别
测试CMD命令
1.编写dockerfile文件
FROM centos
CMD ["ls","-a"]
2.构建镜像
3.run 运行,发现ls -a生效
4.想追加一个-l参数 ls -al
-l替换了ls -a命令 但是-l并不是命令 所以报错
测试ENTRYPOINT命令
1.编写dockerfile文件
FROM centos
ENTRYPOINT ["ls","-a"]
2.构建镜像
3.运行
4.追加参数-l
可见 追加的-l参数是拼接在ENTRYPOINT命令后面的
实战:Tomcat镜像
1.准备镜像文件tomcat压缩包jdk压缩包
rz上传jdk压缩包时出现乱码
如图
无法用rm或者rmdir删除这些乱码文件则用ls -i找到inode号,根据inode号查找删除
find ./ -inum 1056939 | xargs rm -rf
2.编写dockerfile文件
FROM centos:centos7
MAINTAINER bellali<159@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u331-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.62.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORK $MYPATH
ENV JAVA_HOME /usr/local/jdk
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASE/usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA-HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh&&tail -F /url/local/apache-tomcat-9.0.62/bin/logs/catali
na.out
问题: dockerfile中写 FROM centos时 yum下载会报错
因为没有指定centos版本的情况下,默认会拉取最新的镜像,但是centOS8于2021年12月31日停止了源的服务,所以会报错
解决办法:指定centos版本: FROM centos:centos7
3.构建镜像
因为官方命令为Dockerfile 所以build会自动寻找这个文件,就不需要-f指定了
docker build -t diytomcat .
4.启动镜像
docker run -d -p 3344:8080 --name diytomcat -v /home/build/test:/usr/local/apache-tomcat-9.0.62/webapps/test -v /home/build/tomcatlogs/:/usr/local/apache-tomcat-9.0.62/logs diytomcat
5.访问测试
Docker网络
理解Docker0
自定义网络
查看所有的docker网络
网络模式
bridge:桥接docker
none:不配置网络
host:和宿主机共享网络
自定义一个网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
–driver bridge 默认桥接
–subnet 192.168.0.0/16 子网地址
–gateway 192.168.0.1 网关
自己的网络创建好之后,我们自己的服务就可以放在这个网络上
测试ping连接,能ping通
docker exec -it tomcat-net01 ping 192.168.0.3
docker exec -it tomcat-net01 tomcat-net02
网络连通
不同网段的容器之间是不能ping通的 例如tomcat04和tomcat-net01是不能ping通的
测试打通tomcat04到mynet
docker network connect mynet tomcat04
docker inspect mynet
连通之后就是把tomcat04放到了mynet网络下
意思就是一个容器两个ip地址
就相当于阿里云服务的公网ip和私网ip
结论:假设要跨网络去操作别人,就需要使用docker network connect连通
redis集群部署
SpringBoot微服务打包Docker镜像
1.构建springboot项目
2.打包应用
3.编写dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
4.构建镜像
准备镜像文件:使用rz命令上传Dockerfile和jar包
构建镜像:docker build -t jj666
5.发布运行
启动镜像:
docker run -d -P --name jj666-springboot-web jj666
访问测试:curl localhost:49153/hello
Docker Compose
作用:批量容器编排:
Compose是Docker官方的开源项目,需要安装
概念
services:容器 应用 (web/redis/mysql)
project:一组关联的容器, 例如搭建起来的一个博客系统(包含了mysql服务、web服务等)
安装授权
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
安装成功后在能看到/usr/local/bin/docker-compose文件夹
授权:
sudo chmod +x docker-compose
compose配置编写规则
官网说明地址
https://docs.docker.com/compose/compose-file/
例子:
version: '3.8'
services:
bellapp:
build: .
image: bellapp
depends_on:
- redis
-db
ports:
- "8080:8080"
redis:
image: "library/redis:alpine"
注意点:depends_on配置依赖是有先后顺序的例如下图配置,db依赖redis,那么redis要配置在db前面
depends_on:
- redis
-db
微服务上线
1.构建自己的微服务(打成jar包)
2.编写Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
3.编写docker-compose.yml
version: '3.8'
services:
bellapp:
build: .
image: bellapp
depends_on:
- redis
ports:
- "8080:8080"
redis:
image: "library/redis:alpine"
bellapp
服务使用从 Dockerfile 当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口 8080
redis
该 redis 服务使用 Docker Hub 的公共 Redis 映像。
4.将微服务的jar包、Dockerfile、docker-compose.yml上传到服务器
5.docker-compose up构建运行
构建时创建的容器
6.测试
curl localhost:8080/hello