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 镜像名称