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

什么是Docker Docker 最初是dotCloud 公司创始人Solomon Hykes 在法国期间发起的一个公司内部项目, 它是基于dotCloud 公司多年云服务技术的一次革新,并于2013 年3 月以Apache 2.0 授权 协议开源,主要项目代码在GitHub 上进行维护。Docker 项目后来还加入了Linux 基金会, 并成立推动开放容器联盟(OCI)。 Docker 自开源后受到广泛的关注和讨论,至今其GitHub 项目已经超过4 万6 千个星标和一 万多个fork。甚至由于Docker 项目的火爆,在2013 年底,dotCloud 公司决定改名为 DockerDocker 最初是在Ubuntu 12.04 上开发实现的;Red Hat 则从RHEL 6.5 开始对 Docker 进行支持;Google 也在其PaaS 产品中广泛应用DockerDocker 使用Google 公司推出的Go 语言进行开发实现,基于Linux 内核的 cgroup,namespace,以及AUFS 类的Union FS 等技术,对进程进行封装隔离,属于操作 系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容 器。最初实现是基于LXC,从0.7 版本以后开始去除LXC,转而使用自行开发的 libcontainer,从1.11 开始,则进一步演进为使用runC 和containerd。 Docker容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极 大的简化了容器的创建和维护。使得Docker 技术比虚拟机技术更为轻便、快捷。 下面的图片比较了Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件 后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程 直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比 传统虚拟机更为轻便。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论 2

打赏作者

迪仙女

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值