Docker从入门到精通

简介:

镜像就相当于centos.iso文件,docker就相当VMware

Docker就是把应用打包成镜像,然后部署在Docker上运行,镜像就是运行在Docker上的实例。Dcoker在任何操作系统上都是一样的。这就实现了跨平台,跨服务器,只需要一次配置好环境,换到别的机子上就可以一键部署好

 

2:镜像容器仓库之间的关系


Docker的基本组成

1、镜像 image

2、容器 container

3、仓库 repository


镜像和容器的关系:根据镜像来创建容器

镜像可以看成是Java中的类,容器可以看做是类的实例化对象。一个类可以有多个对象。

同理,一个镜像可以有多个容器。

容器是由镜像实例化而来。

简单来说,镜像是文件,容器是进程。

容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。


仓库是什么?

仓库是存放镜像的地方

Maven仓库存放 jar包的地方

GitHub仓库存放 git项目的地方

Docker Hub 存放 Dcoker镜像的地方

公开库和私有库

公开库Docker Hub

私有库阿里云 网易云 华为云等


Dcoker本身就是一个容器运行的载体或称之为管理引擎,我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是 image 镜像文件,只有通过这个镜像文件才能生成Docker容器实例

Image文件(镜像文件)可以看成容器的模版,Docker 通过 镜像文件生成容器的实例,同一个镜像文件可以生成多个同时运行的容器实例

3:Docker自身启动命令

启动类命令 :systemctl 开头

 4:镜像命令

列出本地主机上的镜像

docker images


搜索某个镜像:查询出使用最多的前5个redis的镜像

docker search --limit 5 redis


下载镜像,从仓库拉取一个镜像到本地,比如拉取mysql 5.7版本

docker pull mysql:5.7 拉取 mysql 5.7版本的镜像到本地


删除镜像

docker rmi 镜像id

强制删除镜像

docker rmi -f 镜像id


查看镜像所占用的空间

docker system df 镜像名

5:容器命令

现在是容器命令,之前是镜像命令,

docker启动ubuntu

docker run -it -ubuntu /bin/bash

/bin/bash的意思是 希望有一个交互式Shell , 因此使用的是/bin/bash


列出当前所有正在运行的容器实例

docker ps


为启动的容器ubuntu 命名一个名字叫 myu1

docker run -it --name=myu1 ubuntu bash 或者

docker run -it --name=myu1 ubuntu /bin/bash


上面的图文,已经创建了两个ubuntu容器了。

通过docker ps 可以查看到通过一个镜像文件ubuntu,创建了两个容器实例,容器ID都不一样。


Options说明

docker -ps -a

docker -ps -l

docker -ps -n

docker -ps -q




以Redis6.0.8为例一个小实战

通过docker image 查看到已经有redis了

-d 启动守护式容器:在大部分场景下我们希望docker是在后台默默运行的,例如tomcat,可以通过 -d 来指定容器的后台运行模式

docker run -d 容器名

-it 启动前台交互式.redis如果以这样的方式启动,那么就是找死,一旦ctrl+c 窗口就关了,各种缓存就没了,会出现各种穿透击穿的问题。

docker run -it redis:6.0.8


通过docker logs 容器ID 来查看容器日志


查看容器内运行的进程

docker ps

docker top 容器ID

查看容器内部细节

docker inspect 容器ID


进入正在运行的容器并以命令行交互

容器退出了,然后再想进入容器,使用docker exec -it 容器ID bashShell 以交互式命令运行


容器内文件拷贝到主机


导入和导出容器

导出:并且用 ls查看 ,发现导出成功

导入:atguigu是镜像用户,ubuntu是镜像名,3.7是镜像版本号

6:魔改镜像并发布到阿里云

Docker拉取的ubuntu以及centos 是没有vim命令的

所以我们可以给ubuntu和centos上下载一个vim功能,然后把这个一块打包发布成新的镜像

别人Docker下载你发布的那个带有vim功能的ubuntu或者centos,就可以天生自带vim功能了。


发布到阿里云

容器卷是什么

在docker容器内 /tmp/myDockerData/下创建一个 txt文件。

然后切换到主机目录下:发现也有一个txt文件


Docker上创建文件,主机上也有相同的文件。

主机上创建文件,Docker容器上也有相同的文件。

Docker容器stop,主机修改,Docker容器重启数据依然同步。


查看数据卷是否挂载成功

7:安装tomcat和mysql 

安装tomcat

1、在Docker Hub上搜索镜像

2、拉取对应镜像

docker pull tomcat

3、查看镜像是否被拉取成功

docker image tomcat

4、使用tomcat镜像创建容器实例(运行镜像),-it是以交互式启动 -d是以后台启动

docker run -it -p 8080:8080 tomcat
docker run  -d -p 8080:8080 --name t1 tomcat

5、访问会报错,所以不要用10版本的,可以用以下命令运行


安装mysql

1、拉取对应mysql5.7镜像

docker run mysql:5.7

2、容器运行

docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

3、进入容器

docker exec -it mysql容器ID /bin/bash
mysql -uroot -p
输入123456
就可以进入mysql了,创建表之类的
但是公司是直接通过图形化工具直接连公司自己的容器内的mysql,所以一般的开发人员不需要做以上步骤

4、mysql安装进阶版

docker run -d -p 3306:3306 -- privileged=true -v /zzyyuse/mysql/log:/var/log/mysql 
-v /zzyyuse/mysql/data:/var/log/data
-v /zzyyuse/mysql/conf:/ect/mysql/conf.d
--name mysql mysql:5.7

8:Docker File

之前我在Docker从入门到精通6:魔改镜像并发布到阿里云,写过构建镜像,当时是通过Docker commit命令


现在要说的一个东西是Docker File,Docker File是构建镜像用的

那么就很好奇,同样是构建镜像,Docker File和Docker commit 有什么区别呢?

Commit生成的镜像和Dockerfile有以下几点区别:
1. Commit生成的镜像是一个完整的镜像,而Dockerfile只是一个构建镜像的指令文件,它只能用于构建镜像,而不能用于运行容器。
2. Commit生成的镜像可以直接运行容器,而Dockerfile只能用于构建镜像,不能直接运行容器。
3. Commit生成的镜像可以直接推送到远程仓库,而Dockerfile不能直接推送到远程仓库,必须先构建镜像,然后再推送到远程仓库。

聊聊什么是Docker File

Docker File是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本,所以这里是一系列的构建镜像功能的集合。


如何通过Docker File构建镜像?

1、首先编写Docker File文件

2、Docker build 命令构建镜像

3、Docker run 依照新编写好的镜像运行容器实例

Docker File构建过程解析

Docker File基础知识


Docker执行Docker File的大致流程

9:DockerFile-Docker镜像-Docker容器之间的关系 

DockerFile是软件的原材料

Docker镜像是软件的交付品

Docker容器则可以认为是软件镜像的运行态,也是依照镜像运行的容器实例

DockerFile面向开发

Docker镜像是一个交付标准

Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker的基石

 

10:DockerFile保留字指令

先来看一下tomcat8.5的DockerFile,下图红色的就是关键保留字

https://github.com/docker-library/tomcat/blob/master/8.5/jdk8/corretto-al2/Dockerfile


一行一行进行分析

FROM

基础镜像,当前镜像是基于哪个镜像的,指定一个已经存在的镜像作为模版,第一条必须是FROM

RUN

容器构建时需要运行的命令,支持shell格式和exec格式,在 docker build 时运行run命令

expose

当前容器对外暴露的端口

workdir

指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点,比如下图落脚点就是根目录

再比如tomcat登陆后的工作目录是 /usr/local/tomcat

user

指定该镜像以什么样的用户去执行,如果都不指定,默认是root

env

用户在构建镜像中设置环境变量


volume

数据容器卷,用户数据保存和持久化工作。容器卷命令,相当于之前说容器卷的时候的 -v 命令

copy

之前说过copy命令,从容器内拷贝文件到主机上的命令是:docker cp 容器ID:容器内路径 目的主机路径

拷贝文件和目录-----> 镜像中。

将从构建上下文目录中<源路径>的文件/目录 复制到 新的一层镜像内的<目标路径>位置

add 相当于copy + 解压

将宿主机目录下的文件------> 拷贝进 -----> 镜像,并会自动处理URL和解压 tar 压缩包

cmd

指定容器启动后要干的事情,DockerFile中可以有多个cmd指令,但只有最后一个cmd指令生效,

cmd会被docker run之后的参数替换。???这是什么意思呢?

比如启动tomcat docker run -it -p 8080:8080 容器id

现在是可以启动tomcat的,浏览器访问localhost:8080是可以访问到tomcat的

但是如果 docker run -it -p 8080:8080 容器id /bin/bash 则是进入了tomcat的工作空间 /usr/local/tomcat

这样浏览器访问localhost:8080是访问不到tomcat的,这就是cmd会被docker run之后的参数替换的意思

这就相当于


cmd 和 run 的区别

cmd 是在 docker run 的时候运行

run 是在 docker build 的时候运行

11:自定义镜像mycentosjava8

1、先通过docker pull centos 拉取centos镜像,然后查看镜像,拉取成功centos

2、docker run -it centos镜像ID /bin/bash 查看有没有 vim ifconfig. java

发现 vim ifconfig java 都没有,现在我想使这个centos具备 vim+ifconfig+java8

3、先在myfile目录下准备一个jdk安装包,然后运行 vim Dockerfile

4、在vim 命令里编写Dockerfile

FROM centos
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装 java8 以及lib库 
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD是相对路径jar,把jdk8-8u171-linux-x64.tar.gz添加到容器中,jdk安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/bin/tools.jar:$JRE_HOME/lib:$CLASS_PATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success-----------ok"
CMD /bin/bash

然后ESC :wq! 回车退出

5、构建

docker build -t 新镜像的名字:TAG . (注意TAG后面有个空格,空格后面有个点)

docker build -t centosjava8:1.5 .

6、通过镜像创建容器并且运行

docker run -it 新的镜像的ID(也就是centosjava8) /bin/bash

12:把本地微服务模块发布到Docker容器里

1、通过 IDEA 新建一个微服务模块

这块就不说了,创建一个springboot的helloworld,给一个controller 写个方法 ,写一个getmapping方法,然后本地测试hello world通过,然后通过IDEA里maven插件打包,然后把打包好的jar包上传复制到Linux目录下

2、通过Dockerfile发布微服务部署到Docker容器

还是老三步

1、在jar包所在路径下编写Dockerfile

2、构建镜像docker build -t

3、通过构建的镜像创建容器并运行,报错是因为防火墙,把防火墙关了就是了

报错是因为防火墙

sysytemctl stop firewalld

然后重启docker systemctl restart docker

然后重新 docker run -d -p 6001:6001 镜像ID

4、然后打开浏览器输入Linux系统下的IP地址加端口号6001加controller的路径,显示访问成功

 

13:Docker Compose容器编排

容器实例太多了该如何管理,这时候就用到容器编排了。

只要用Docker,没有上K8S之前,compose是必须要会的。鲸鱼背上集装箱太多了,涉及到容器启动顺序,容器通信


什么是Docker Compose?

Compose负责对Docker容器集群的快速编排,是一个工具软件,可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后只需要一个命令,就能同时按顺序启动关闭这些容器。

比如:微服务需要依赖mysql,否则无法启动,所以得先启动mysql,再启动微服务吧。

Docker Compose相当于Spring里的配置文件一样,管理了很多Bean,以及Bean之间的关系

假如有nginx,redis,mysql,微服务,那么我依次启动,如果有一个出问题了,我得依次关闭,这样很麻烦,包括还要写Dockerfile 还要run,容器实例多了,针对每个服务还要单独写Dockerfile,要run好多次,疯球了。有了Docker Compose 可以一键启动,一键关闭


Compose允许用户通过一个单独的docker-compose.yml来定义一组相关联的应用容器为一个项目

具体步骤分为以下三步

1、还是写Dockerfile

2、写docker-compose.yml

3、执行docker-compose up

 

 14:Docker网络

当需要为Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置Docker容器网络环境

当需要限制Docker 容器运行资源或执行用户指令等操作时,则通过Execdriver 来完成

Libcontainer是一项独立的容器管理包,Network driver以及Exec driver 都是通过Libcontainer来实现具体对容器进行的操作。

docker启动之后会产生一个docker0

docker通过docker0这个网桥来和宿主机以及容器和容器之间docker的网络通信



安装完docker会创建3大网络模式,桥接,主机,还有一个none

创建一个aa 网络


所有网络的访问得在同一个网段

Docker网络能做的事情有:

容器间的互联和通信以及端口映射

容器IP变动时候可以通过服务名直接通过网络通信而不受到影响。:比如容器A里的服务要去调用容器B里的服务,容器重启后IP有可能会变化,所以这个时候通过IP就调不通了,得用服务名去调用


罗列本机Docker网络

docker network ls
会出现bridge , host,none

brige模式:(默认使用docker0)

--network brige 指定

host模式

--network host 指定

container模式

--network container:NAME 或者容器ID 指定

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值