Docker基础

Docker

Docker是什么

官方的原话

​ Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

自己理解的意思

​ 在第一次听见docker这个名称的时候,我真的不知道什么意思,在网上看了一些资料还是不懂docker是什么东西。可能是我们的理解差吧!经过一段时间的学习,我们docker有了自己的看法。

​ docker可以理解为很多个迷你md版的linux系统放在一个容器里,他们互不干扰。下图可作为参考。

在这里插入图片描述

Docker安装

Docker 官网:https://www.docker.com

1、卸载之前的版本

[root@jmx ~]#  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  device-mapper-persistent-data   lvm2

在这里插入图片描述

3、设置镜像仓库

 yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

如果上面方式不能启动docker,那么就用下面这种
命令:vim /etc/docker/daemon.json

{
"registry-mirrors": [
"https://pee6w651.mirror.aliyuncs.com",
"https://kfwkfulq.mirror.aliyuncs.com",
"https://2lqq34jg.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}

4、yum makecache fast

在这里插入图片描述

5、安装docker

yum install docker-ce docker-ce-cli containerd.io

中途会提示是否安装,我们输入y即可

在这里插入图片描述

6、启动

systemctl start docker

7、验证是否启动

docker version

在这里插入图片描述

docker run hello-world

在这里插入图片描述

Docker卸载

1、查看已安装的文件

yum list installed | grep docker    

在这里插入图片描述
2、删除已安装文件(按名称删除)

 yum -y remove containerd.io.x86_64 docker-ce.x86_64 docker-ce-cli.x86_64 docker-ce-rootless-extras.x86_64

3、删除docker文件

rm -rf /var/lib/docker

docker基本理论

run命令执行过程

在这里插入图片描述

Docker是怎么工作的?

Docker是一个Client - Server结构的系统, Docker的守护进程运行在主机上。通过Socket从客户端访问 !

DockerServer接收到Docker-Client的指令,就会执行这个命令!

在这里插入图片描述

Docker命令

帮助命令

docker info  基本信息
docker version 版本信息
docker --help 查看帮助命令

镜像命令

官方文旦地址:https://docs.docker.com/engine/reference/commandline/ps/

查看本机镜像

docker images 查看本机的镜像

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        11 months ago       13.3kB
#-----说明-----
REPOSITORY # 镜像名称
TAG #镜像标签
IMAGE ID  #镜像ID
CREATED  #镜像创建时间
SIZE #镜像大小
#可选项
#-a 全部
#-q 只显示id

搜索镜像

docker search 搜索命令

docker search mysql
#可选项
--filter #过滤搜索

下载镜像

docker pull 镜像名称

如mysql

[root@jmx ~]# docker pull mysql 
Using default tag: latest #不使用tag则下载最新的软件
latest: Pulling from library/mysql
852e50cd189d: Pull complete #层级下载 docker images 的核心,联合文件系统
29969ddb0ffb: Pull complete 
a43f41a44c48: Pull complete 
5cdd802543a3: Pull complete 
b79b040de953: Pull complete 
938c64119969: Pull complete 
7689ec51a0d9: Pull complete 
a880ba7c411f: Pull complete 
984f656ec6ca: Pull complete 
9f497bce458a: Pull complete 
b9940f97694b: Pull complete 
2f069358dc96: Pull complete 
Digest: sha256:4bb2e81a40e9d0d59bd8e3dc2ba5e1f2197696f6de39a91e90798dd27299b093# 签名
Status: Downloaded newer image for mysql:latest 
docker.io/library/mysql:latest #镜像地址
#docker pull mysql 等价与 docker.io/library/mysql:latest

在这里插入图片描述

删除镜像

先查看我们的 镜像
在这里插入图片描述

根据id删除

docker rmi -f id

在这里插入图片描述

再次查看镜像5.7版的mysql删除成功

在这里插入图片描述

在这里插入图片描述

删除全部镜像

docker rmi -f $(docker images -aq)

在这里插入图片描述

容器命令

有镜像才能创建容器。这里我是用linux系统,所以下载centos

进入容器

docker run -it centos /bin/bash

#参数说明:
#-i: 交互式操作。
#-t: 终端。
#centos : centos  镜像。
#/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

#随机指定端口
#测试,启动并进入容器
[root@jmx ~]# docker run -it centos /bin/bash
[root@e42260176f54 /]# 
#这个是容器里的镜像
[root@e42260176f54 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var


从容器中退回主机

exit

#从容器中退回主机
[root@e4eccc01b495 /]# exit
exit
查看运行的容器

docker ps查看正在运行的容器

docker ps -a 查看之前运行过的容器

在这里插入图片描述

删除容器
docker rm  容器id
docker rm -f $(docker ps -aq)

不能删除正在运行的容器,如果要前置删除使用

启动和停止容器
docker start容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker ki11容器id #强制停止当前容器

在这里插入图片描述

后台启动
[root@jmx ~]# docker run -d centos /bin/bash #如果没有提供服务就会立即停止
查看日志
[root@jmx /]# docker 1ogs - tf --tail 10 dce7b86171bf(id)
查看元数据
[root@jmx ~]# docker inspect fb3d2cc92f07(容器id)

结果:

[
    {
        "Id": "fb3d2cc92f07ecc6a896c536ec7d0a3bb07abd54b41be356e57aea426d59c92f",
        "Created": "2020-12-04T08:38:04.105932986Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 58675,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-12-04T08:38:04.742603032Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
      ...................................
]

进入容器

命令 docker exec -it e0235c43a0e2 /bin/bash

在这里插入图片描述

安装软件实例

安装Nginx

下载Nginx
[root@jmx taxing]# docker pull nginx
开启nginx
[root@jmx taxing]# docker run -d --name Nginx001 -p 6999:80 nginx
#选项说明:
#-d 后台运行
#--name 这个容器的名字,不写默认为镜像名称
#-p:6999:80 nginx默认端口是80,我们通过linux系统的端口6999访问到docker容器里的80端口里。

查看我们运行的容器

在这里插入图片描述

3、进入这个容器里

​ 我们进入容器里,我们发现这Nginx容器就是就是一个Linux系统,docker官方把Nginx配置好并打包成一个镜像,我们下载这个镜像就可以使用Nginx,不需像之前在Linux系统上安装Nginx一样麻烦。

在这里插入图片描述

在浏览器输入地址:服务器地址+6999端口

在这里插入图片描述

图解

在这里插入图片描述

镜像就是一个迷你版的Linux系统。

安装Mysql

下载镜像
[root@jmx /]# docker pull mysql
开启镜像

之前我们在使用mysql时需要配置密码及其账号,在docker中我同样需要设置,只不过在docker中设置是非常简单的。

[root@jmx /]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysqlloca1 mysql
#-d 后台经行
#-p 设置系统端口映射容器端口
#-e 配置环境,这里配置密码为123456
#--name给我们的镜像起别名

测试

在本地连接是否能连接上

在这里插入图片描述

安装portainer

下载镜像
运行镜像
  • 需要开启挂载

    [root@jmx /]# docker run -d -p 9000:9000  -v /var/run/docker.sock:/var/run/docker.sock  --name portainerlocals portainer/portainer
    #-v 挂载镜像,把容器内的文件挂载到我们的系统上;“:”前面的是容器内的目录,“:”后面是linux系统的目录。
    
    

    浏览器输入地址:http://ip:9000

    1.创建用户

在这里插入图片描述

选择本地,如果没有挂载目录

注意:该页面上有提示需要挂载本地 /var/run/docker.socker与容器内的/var/run/docker.socker连接。因此,在启动时必须指定该挂载文件。

在这里插入图片描述

首页

在这里插入图片描述

Docker镜像

镜像是什么

​ 镜像是一种轻量级、可执行的独立软件包,来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内
容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像:
●从远程仓库下载
●朋友拷贝给你
●自己制作一个镜像DockerFile

Docker镜像加载原理

​ UnionFS (联合文件系统) : Union文件系统( UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改
作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
​ Union 文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像) ,可以制作各种具体的应用镜像。
​ 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

​ docker的镜像实际上由一层层的文件系统组成,这种层级的文件系统UnionFS。
​ bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boo加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs.rootfs (root file system) , 在bootfs之上,包含的就是典型Linux 系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu , Centos等等。

数据卷

​ 安装mysql镜像后我们发现如果把mysql镜像删除那么我们存在数据库的数据将不复存在,这也就是说我们的数据没有得到持久化。那么在docker中提供了一种方法来防止这样的问题,当镜像删除,数据依旧在我们服务器。这里使用docker提供的挂载来做举例。也就是挂载一个卷

挂载

​ 我们把mysql的配置文件及其数据文件挂载到我们的/home/taxing目录下。只要挂载成功那么他们就是双向绑定,也就是说只要一方有数据改变那么另外一方都会跟着改变、当镜像停止运行时同样是双向绑定、镜像删除本地文件不会删除。

命令 docker run -d -P -v /home/taxing/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 mysql

#-d 后台进行
#-P 随机端口映射
#-v 挂载,我们把/etc/mysql/conf.d挂载到我们的home/taxing/conf下。
#-e 配置环境

执行过程

[root@jmx taxing]# pwd
/home/taxing
[root@jmx taxing]# ls
[root@jmx taxing]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
nginx                 latest              bc9a0695f571        10 days ago         133MB
mysql                 latest              dd7265748b5d        2 weeks ago         545MB
tomcat                latest              e0bd8b34b4ea        2 weeks ago         649MB
centos                latest              0d120b6ccaa8        3 months ago        215MB
portainer/portainer   latest              62771b0b9b09        4 months ago        79.1MB
[root@jmx taxing]# docker run -d -P -v /home/taxing/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456  mysql
d46b5a233a64a3dcc5fab856a34d5308719c42f57a66cd8e8d4c73449fdc5038
[root@jmx taxing]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                               NAMES
d46b5a233a64        mysql               "docker-entrypoint.s…"   8 seconds ago       Up 7 seconds        0.0.0.0:32785->3306/tcp, 0.0.0.0:32784->33060/tcp   dazzling_faraday

我们进入mysql镜像下的目录/etc/mysql/conf.d并在里面创建一个目录test。

[root@jmx ~]# docker ps 查看镜像id
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                               NAMES
d46b5a233a64        mysql               "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        0.0.0.0:32785->3306/tcp, 0.0.0.0:32784->33060/tcp   dazzling_faraday
[root@jmx ~]# docker exec -it d46b5a233a64 /bin/bash 进入镜像
root@d46b5a233a64:/# ls
bin  boot  dev	docker-entrypoint-initdb.d  entrypoint.sh  etc	home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@d46b5a233a64:/# cd /etc/mysql
root@d46b5a233a64:/etc/mysql# ls
conf.d	my.cnf	my.cnf.fallback
root@d46b5a233a64:/etc/mysql# cd conf.d/
root@d46b5a233a64:/etc/mysql/conf.d# mkdir test  创建目录
root@d46b5a233a64:/etc/mysql/conf.d# ls
test



此时我们进入linux系统home/taxing/conf下

[root@jmx taxing]# ls 获取目录
conf
[root@jmx taxing]# cd conf 进入目录
[root@jmx conf]# ls 获取目录
test            #看到我们在mysql容器中添加的目录也在我们的系统下存在
[root@jmx conf]# 

匿名挂载

就是不给卷起名字

[root@jmx conf]# docker run -d -P -v /etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 mysql
[root@jmx conf]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                               NAMES
9f30c977e56a        mysql               "docker-entrypoint.s…"   5 seconds ago       Up 3 seconds        0.0.0.0:32787->3306/tcp, 0.0.0.0:32786->33060/tcp   xenodochial_jackson

查看现在挂载的卷

发现这些卷都是随机的看不懂的

[root@jmx conf]# docker volume ls
DRIVER              VOLUME NAME
local               1d073b41ca4206100d7500b16eb4147efbb21dff0208385c7a73c62ca651a892
local               2bc52fb3ec134a6ad4c12dfbbf6a6f45eec652822296f02daef1b4c0d6ec30aa

查看卷的挂载信息 docker volume inspect 卷名

[root@jmx conf]# docker volume inspect  1d073b41ca4206100d7500b16eb4147efbb21dff0208385c7a73c62ca651a892
[
    {
        "CreatedAt": "2020-12-05T10:56:26+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/1d073b41ca4206100d7500b16eb4147efbb21dff0208385c7a73c62ca651a892/_data",挂载的地址
        "Name": "1d073b41ca4206100d7500b16eb4147efbb21dff0208385c7a73c62ca651a892",
        "Options": null,
        "Scope": "local"
    }
]

具名挂载

就是给我们的卷器一个名字

docker run -d -P -v mysqllocal:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 mysql

在这里插入图片描述

DockerFile构建过程

基础知识

dockerfile就是制作镜像。就是编写一个文件来创建我们的自定义镜像

1、每个保留关键字(指令)都是必须是大写字母
2.执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层 ,并提交!

在这里插入图片描述

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

指令解释

FROM #基础镜镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令,比如centos没有vim功能我们可以在其构建镜像时下载这个功能,那么以后运行镜像时就可以使用这个功能
ADD #步骤: tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR #镜像的工作目录,在镜像构建成功后,如果要进入镜像时,我们可以指定进入哪一个目录。
VOLUME#挂载的目录
ONBUILD#当构建一个被继承DockerFile 这个时候就会运行ONBUILD 的指令。触发指令。
COPY#类似ADD,将我们文件拷贝到镜像中
ENV#构建的时候设置环境变量!

在这里插入图片描述

centos案例

编写dockerfile文件
portainer/portainer   latest              62771b0b9b09        4 months ago        79.1MB
[root@jmx taxing]# cat dockerfile 
FROM centos
MAINTAINER TAXING<2465180091@qq.com>
ENV MYPATH /use/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATHvim
CMD echo '---end---'
CMD /bin/bash

构建

注意后的

docker build -f dockerfile -t mycentos .
#命令 docker build
#-f 为创建的dockerfile文件名 
#-t 为构建后的镜像名称
#“ . ”必须加,否则无法构建成功 
运行
docker run -it mycentos
注意

WORDDIR(workdir)命令的执行效果,cento镜像原本的目录是根目录

在这里插入图片描述

原来在centos镜像下没有ifconfig命令,我们通过run下载了命令工具就可以使用了
在这里插入图片描述

tomcat\jdk案例

编写dockerfile

FROM centos #基础镜像
MAINTAINER taxing #作者信息
#添加tomcat、和jdk,会自动解压到指定的目录
ADD apache-tomcat-10.0.0-M10.tar.gz /usr/local/ 
ADD jdk-8u60-linux-x64.tar.gz  /usr/local/

ENV MYPATH /usr/local #设置工作目录环境
WORKDIR $MYPATH #设置工作目录
 #设置jdk环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_60
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#设tomcat环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.0-M10
ENV CATALINA_BASH /usr/local/apache-tomcat-10.0.0-M10
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#暴露的端口
EXPOSE 8080
#一启动就执行的命令 tomcat必须启动及其日志输入,否则无法啊正常运行
CMD /usr/local/apache-tomcat-10.0.0-M10/bin/startup.sh && tail -F /usr/local/apache-tomcat-10.0.0-M10/logs/catalina.out

构建

docker build -f dockerfile -t mycats .

运行:

 docker run -d -p 8080:8080 mycats

注意:如果docker ps不能看到自己的容器运行则表示容器运行失败。

进入容器可以看到我们用ADD添加的jdk、tomcat都在目录。

在这里插入图片描述

SpringBoot打包

创建dockerfile

FROM java:8
COPY *.jar /ta.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/ta.jar"]

把 文件了jar发送到服务器上,然后构造即可

Docker HUB

地址:https://hub.docker.com/

1、注册账号并创建命令空间
在这里插入图片描述

进入仓库

在这里插入图片描述

这个就是我们仓库的

在这里插入图片描述

2、在docker上登陆账号

docker login -u dockerhub账号 -p 密码

在这里插入图片描述

3、push镜像

按镜像名称上传镜像

docker push 镜像名称

在这里插入图片描述

阿里云管理镜像

阿里云地址:https://www.aliyun.com/

在这里插入图片描述

进入阿里云后点击控制台
在这里插入图片描述

第一进入需要创建命名空间

命名空间里面可以放很多的仓库

在这里插入图片描述

创建仓库

用于存放镜像的

在这里插入图片描述

点击管理就可以看到如何推送自己镜像,里面信息比较私密这里就不展示了。

在这里插入图片描述

按照阿里云的步骤提交镜像后可看到自己的镜像

2、在docker上登陆账号

docker login -u dockerhub账号 -p 密码

在这里插入图片描述

3、push镜像

按镜像名称上传镜像

docker push 镜像名称

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值