docker从入门到入土

docker到底是什么?

  • docker是世界领先的软件容器平台,基于GO语言进行开发实现
  • docker能够自动执行重复性任务,例如搭建和配置开发环境,从而解放开发人员
  • 用户可以方便地创建和使用容器,把自己的应用放入容器,容器还可以进行版本管理,复制,分享,修改,就像管理普通的代码一样
  • docker可以对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器

为什么要使用docker

docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中,然后发布到任何流行的linux机器上,也可以实现虚拟化

容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销低

传统的开发流程中,我们的项目通常需要使用Mysql,Redis等环境,这些环境都是需要我们手动去进行下载并配置的,安装配置流程极其复杂,而且不同操作下的操作也不一样。

docker的出现完美地解决了这一问题,我们可以在容器中安装mysql。redis等软件环境,使得应用和环境架构分开,它的优势在于:

  1. 一致的运行环境,能够更轻松地迁移
  2. 对进程进行封装隔离,容器与容器之间互不影响,更高效地利用系统资源
  3. 可以通过镜像复制多个一致的容器
  4. 更快速的启动时间
  5. 一致的运行环境
  6. 持续交付和部署

linux中安装docker centos7 为例

plain 复制代码
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun

安装完成后直接启动服务:

plain 复制代码
systemctl start docker

推荐设置开机自启,执行指令 :

plain 复制代码
systemtl enable docker

Docker中的几个概念

镜像

镜像就是一个只读模版,镜像可以用来创建docker容器,一个镜像可以创建多个容器

容器

容器是用镜像创建的运行实例,Docker利用容器独立运行一个或一组应用。它可以被启动,开始,停止,删除,每个容器都是相互隔离的,保证安全的平台。可以把容器看作是一个简易的linux环境和运行在其中的应用程序,容器的定义和镜像几乎一模一样。也是一堆层的统一视角。唯一区别在于容器的最上面那一层是可读可写的

仓库

仓库是集中存放镜像文件的场所。仓库和仓库注册服务器是有去别的,仓库注册服务器上往往放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。仓库分为公开仓库和私有仓库两种,最大的公开仓库是DockerHub,存放了数量庞大的镜像供用户下载,国内的公开仓库有阿里云,网易云等

总结

一个镜像代表一个软件;而基于某个镜像运行就是生成一个程序实例,这个程序实例就是容器;而仓库是用来存储Docker中所有镜像的

其中仓库又分为远程仓库和本地仓库,第一次访问依赖时,将其下载到本地仓库,第二次,第三次使用时直接用本地仓库的依赖即可

Docker初体验

可以去访问DockerHubhttps://hub.docker.com/open in new window

搜索想要下载的镜像,找到下载的指令

例如mysql的指令:

plain 复制代码
docker pull MySQL

该指令会下载MySQL镜像的最新版本

docker镜像指令

查看docker中当前拥有哪些镜像:

plain 复制代码
docker images

查询指定镜像名:

plain 复制代码
docker images MySQL 

-q表示仅显示镜像的id:

plain 复制代码
docker images -q

下载镜像使用:

plain 复制代码
docker pull MySQL:5.7

未指定则下载最新的

删除镜像使用指令 :

plain 复制代码
docker images rm MySQL 

还可以通过指定镜像id进行删除。

在删除之前应该先让容器停止

也可以进行强制执行删除

plain 复制代码
docker iamges rm -f id 

该指令会将镜像和通过该镜像执行的容器全部删除,谨慎使用

docker容器指令

容器是基于镜像的

若需要通过镜像运行一个容器,则使用:

plain 复制代码
docker run tomcat:8.0-jre8

如果没有这个镜像

所有就先去下载一个镜像

plain 复制代码
docker pull tomcat:8.0-jre8

下载完成之后就可以运行了,运行后查看一下当前运行的容器:docker ps

通过该方式运行的tomcat是不能直接被外部访问的,因为容器具有隔离性,若是想直接通过8080端口访问容器内部的tomcat,则需要对宿主机端口与容器内的端口进行映射:

plain 复制代码
docker run -p 8080:8080 tomcat:8.0-jre8

解释一下这两个端口的作用(8080:8080),第一个8080为宿主机端口,第二个8080为容器内的端口,外部访问8080端口就会通过映射访问容器内的8080端口。

此时外部就可以访问Tomcat了:

若是这样进行映射:

plain 复制代码
docker run -p 8088:8080 tomcat:8.0-jre8

则外部需访问8088端口才能访问tomcat,需要注意的是,每次运行的容器都是相互独立的,所以同时运行多个tomcat容器并不会产生端口的冲突。

容器还能够以后台的方式运行,这样就不会占用终端:

plain 复制代码
docker run -d -p 8080:8080 tomcat:8.0-jre8

启动容器时默认会给容器一个名称,但这个名称其实是可以设置的,使用指令:

plain 复制代码
docker run -d -p 8080:8080 --name tomcat01 tomcat:8.0-jre8

此时的容器名称即为tomcat01,容器名称必须是唯一的

该参数会将运行和非运行的容器全部列举出来:

plain 复制代码
docker ps -a

接下来是容器的开始,停止,重启指令,因为非常简单,

plain 复制代码
docker start xxx
docker restart xxx
docker stop xxx
docker kill xxx
docker rm xxx
docker rm -f xxx

查看容器的日志

plain 复制代码
docker logs xxx

查看实时的日志

plain 复制代码
docker logs -f xxx

通过-t参数还能够显示日志的时间戳,通常与-f参数联合使用

plain 复制代码
docker logs -ft xxx

查看容器内运行了哪些进程可以使用指令:

plain 复制代码
docker top xxx

若想与容器进行交互,则使用指令:

plain 复制代码
docker exec -it xxx bash

此时终端将会进入容器内部,执行的指令都将在容器中生效

若退出则使用exit

下面将介绍如何在容器中部署一个项目

plain 复制代码
docker cp ./test.html xxx:/usr/local/tomcat/webapps

通过docker cp 指令能够将文件从Centos复制到容器中,./test.html为centos中的资源路径,xxx为容器id,/usr/local/tomcat/webapps 为容器的资源路径,此时test.html文件将会被复制到该路径下

plain 复制代码
docker exec -it xxx bash
cd webapps
ls

若是想见容器内的文件复制到centos中,则反过来写即可

plain 复制代码
docker cp xxx:usr/local/tomcat/webapps/test.html./

所以现在若是想要部署项目,则先将项目上传到centos,然后将项目从centos复制到容器内,此时启动容器即可

看似使用docker中启动软件环境非常简单,但是同时也面临着一个问题,我们无法知晓容器内部具体细节,比如监听的端口,绑定的ip地址等

我们可以使用

plain 复制代码
docker inspect xxx

docker数据卷

学习了容器的相关指令之后,我们来学习一下docker中的数据卷,它能够实现宿主机与容器之间的文件共享,它的好处在于我们对宿主机的文件进行修改将直接影响容器,而无需再将宿主机的文件再复制到容器中

若是想将宿主机中/opt/apps目录与容器中webapps目录做一个数据卷,则应该这样编写指令:

plain 复制代码
docker run -d -p 8080:8080 --name tomcat01 -v /opt/apps:/usr/local/tomcat/webapps tomcat:8.0-jre8

若此时发现无法访问,这就说明我们的设置成功了。docker会将容器内的webapps目录与/opt/apps目录进行同步,而此时/opt/apps目录是空的,导致webapps目录也会变成空目录,所以无法访问

此时我们只需要向/opt/apps目录下添加文件,就会使得webapps目录也会拥有相同的文件,达到文件共享。

这种方式设置的数据卷称为自定义数据卷,因为数据卷的目录是我们自己设置的

docker还为我们提供了另一种设置数据卷的方式 :

plain 复制代码
docker run -d -p 8080:8080 --name tomcat01 -v aa:/usr/local/tomcat/webapps tomcat:8.0-jre8

此时的aa并不是数据卷的目录而是数据卷的别名,docker会自动为我们创建一个名为aa的数据卷,并且会将容器内webapps目录下所有的内容复制到数据卷中,该数据卷的位置在/var/lib/docker/volumes目录下:

此时我们只需要修改该目录的内用就能够影响到容器

最后再介绍几个容器和镜像相关的指令:

plain 复制代码
docker commit -m '描述信息' -a '镜像作者' tomcat01 my_tomcat:1.0

该指令能够将容器打包成一个镜像,此时查询docker中的镜像将会看到自己的镜像

若想将镜像备份出来,则可以使用指令:

plain 复制代码
docker save my_tomcat:1.0 -0 my-tomact-1.0.tar

拥有.tar格式的镜像,如何加载到docker中呢?

plain 复制代码
docker load -i my-tomcat-1.0.tar
相关推荐
真想骂*8 分钟前
如何在Linux上配置SSH密钥以实现免密登录
linux·运维·ssh
Just_Do_IT_OK12 分钟前
Docker--Bitnami/redis
docker·容器
webmote15 分钟前
Fabric.js 入门教程:扩展自定义对象的完整实践(V6)
运维·javascript·canvas·fabric·绘图
元气满满的热码式17 分钟前
k8s-node2 NotReady 节点NotReady如何解决?
云原生·容器·kubernetes
lory代码搬运工21 分钟前
解决PDF.js部署到IIS服务器上后报错mjs,.ftl 404 (Not Found)
运维·服务器·pdf
飞翔沫沫情33 分钟前
《快速部署Mysql-slave 容器,实现高效主从同步》
数据库·docker·mysql主从同步
享受 生活39 分钟前
【docker】docker desktop 在windows上支持 host模式
运维·docker·容器
mengao123440 分钟前
arm架构 uos操作系统离线安装k8s
容器·kubernetes
小安运维日记1 小时前
CKA认证 | Day8 K8s安全
运维·云原生·容器·kubernetes·云计算
WTT00111 小时前
CTFshow-SSRF&文件上传
大数据·运维·网络·安全·web安全·ctf