docker入门

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
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值