面向后端的Docker初级入门教程:实战篇

前言

在以前的两篇文章中,咱们在 面向初学者的Docker学习教程:基础篇中经过mysql

  1. 什么是Docker?
  2. 为何是Docker?
  3. Docker 具体解决了什么样的问题?

这三个问题来帮助你们更好的了解Docker,以后在第二篇文章Docker 三要素 :镜像、容器和仓库中解释了docker中最核心的三个概念,经过这两篇的学习,我想你们对于Docker是什么?这个问题已经有了本身的答案,那么再了解过这些概念以后,咱们将经过实际的命令行来使用Docker,并可以完成一些基础的操做。nginx

不废话,直接上代码:git

Docker 安装:

在使用Docker以前,咱们须要先安装Docker,在这里 ,我只列举最简单的那一种安装方式,若是须要其余方式安装的话,能够参照官方文档-快速上手,上面有更为详细的安装教程。github

Docker 安装(yum):web

#在终端输入yum命令,安装docker及相关依赖
yum install docker
 #启动docker 服务:centos 7+
systemctl start docker 
 #启动docker 服务:centos 6+
service docker restart

复制代码

验证Docker是否安装成功:redis

#从docker官方仓库拉取docker hello-world镜像
docker pull hello-world
 #运行hello-world镜像
docker run hello-world
复制代码

若是出现 Hello from Docker! 则说明咱们的Docker已经正确安装完成啦sql

注:docker

docker 官方的镜像源因为在国外,致使国内不少在本低虚拟机学习docker的同窗下载镜像特别特别的慢,实测阿里云服务器速度还能够,以下载较慢的同窗能够尝试更换国内阿里云,或者网易云的镜像仓库,须要的同窗能够自行去网上搜索相关教程。shell

Docker 镜像操做:

Docker完美融合Linux,因此Docker命令行的风格和Linux仍是比较接近的,相对来讲比较容易上手,首先,咱们先说镜像相关的命令:ubuntu

#搜索镜像:
docker search 镜像名
#例:docker search centos 搜索centos相关的镜像。
 #拉取镜像到本地服务器 默认TAG是lastet即最新版本
docker pull 镜像名:TAG
 #例:docker pull mysql or docker pull mysql:5.6 拉取最新版本或者5.6版本的mysql镜像
 #查看全部镜像:
docker images 
 ##查看顶层镜像
docker image ls
 #查看中间层镜像
docker image ls -a
 #在以前的基础篇中有说到,docker的镜像是分层来存储的,为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。因此在使用一段时间后,可能会看到一些依赖的中间层镜像,这样会看到不少无标签的镜像,与以前的虚悬镜像不一样,这些无标签的镜像不少都是中间层镜像,是其它镜像所依赖的镜像。这些无标签镜像不该该删除,不然会致使上层镜像由于依赖丢失而出错。实际上,这些镜像也不必删除,由于以前说过,相同的层只会存一遍,而这些镜像是别的镜像的依赖,所以并不会由于它们被列出来而多存了一份,不管如何你也会须要它们。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。
 #列出部分镜像,若是不指定的话,TAG部分能够省略
docker image ls ubuntu:18.04
 #删除镜像
docker image rm 镜像ID
 #批量删除镜像:
docker image rm $(docker image ls -q redis) 

复制代码

执行docker images 命令,以下图所示:

列表包含了 仓库名、标签、镜像 ID、建立时间 以及 所占用的空间。

Docker 容器操做

在以前咱们有说到过,镜像与容器之间的关系相似于类与实例之间的关系,在Docker中,咱们经过运行镜像来得到一个的容器,在这里咱们以centos为例:

docker run [选项] [镜像名或者IMAGEID]
例:
docker run -it centos 
-it 交互式终端运行
 #好比不少好比mysql镜像,咱们须要这个容器在后台运行,并非十分须要进入容器终端,这个时候咱们只须要将-it 替换成 -d 便可启动守护式容器:
docker run -d centos 
复制代码

经过执行上面的命令,咱们会自动以交互模式进入到容器中,如图所示:

能够发现,咱们实际上已经进入centos容器内部的bin/bash了,在这里,咱们能够输入相关的命令来操做咱们的容器。若是只是单纯的想建立一个容器,并不怎么着急启动的话,可使用create命令:

#建立一个容器可是不当即启动
docker creat 镜像名或者镜像ID
 #例:docker create centos
 #docker容器默认命名规则是科学家+他的发现,若是咱们须要自定义本身的别名,好比说centos容器叫mycentos,咱们须要加入--name选项
docker run -it --name [别名] [镜像名]
 #例:docker run -it --name mycentos centos
复制代码

当咱们有某些应用好比tomcat须要使用特定端口向外部提供服务时,咱们可使用 -p 选项配置宿主机与容器之间的端口映射,以tomcat为例:

docker run -it -p 8899:8080 tomcat
-p 配置端口映射
复制代码

这样,当咱们访问ip:8899 时,就会发现浏览器出现了tomcat的首页,这个时候端口就已经正确映射到容器里面8080端口上了。

固然,退出交互式终端,Docker一样也提供了两种方式供咱们选择:

#退出交互式命令环境:这种是比较优雅的退出,退出后容器仍然在运行
Ctrl+P+Q

exit 
#不太优雅的方式,退出以后容器也会中止
复制代码

若是退出了以后,我后悔了,又忽然想再进去容器终端内改一些东西,从新进入容器交互式终端,Docker提供了以下两种方式:

docker attach  [别名或IMAGEID] 
 ##推荐第二种
docker exec -it centos bash
##docker exec :在运行的容器中执行命令

复制代码

除去上面这些,Docker的容器还支持启动,重启,删除等操做:

#中止容器: 温柔式,正常关机
docker stop [别名或IMAGEID]
#
docker stop mycentos
 #强制中止容器: 拔插头
docker kill [别名或IMAGEID] 
 #启动容器:
docker start  [别名或IMAGEID] 
#重启容器:
docker restart  [别名或IMAGEID] 
#删除容器,只能删除中止的容器
docker rm [别名或IMAGEID] 
复制代码

若是想查看正在运行的容器,可使用如下命令:

#查看正在运行的容器
docker ps
 #查看全部容器,包括已经中止的容器
docker ps -a
复制代码

获取容器输出信息:

docker logs container 
复制代码

容器数据卷:

在某些状况下,咱们须要实时备份容器内的数据到咱们的宿主机上,一样在Docker中,是支持容器与宿主机之间创建共享目录的,使用起来也很是简单,只须要加一个 -v 选项就能够了。

#例,执行过以后,咱们在宿主机目录中建立一个新文件,容器内目录也会相应的出现这个文件,因此就能够把mysql数据存放的目录经过这种方式和宿主机共享,达到实时备份数据的目的。
docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash
 #若是须要给容器内目录设定权限,则只须要加上 ro 便可,read -only 的缩写
docker run -it -v /宿主机目录:/容器内目录:ro /bin/bash
ro 只读,这样咱们宿主机在共享目录里面建立的文件在容器内是只读的
 #查看容器是否挂载成功:
docker inspect 容器ID
复制代码

制做Docker镜像:

使用commit命令制做镜像:

不少时候咱们不可避免的会对容器有所修改,好比修改了tomcat,mysql等等的配置文件,可是若是再配置一台如出一辙的tomcat容器的话,则又要从新修改配置文件,Docker能够经过commit命令将如今的容器从新打包成一个镜像,若是你如今修改了tomcat容器内端口为8081的话,那么咱们使用commit将该容器打包成镜像的话,以后咱们运行这个新镜像,会发现镜像里面tomcat默认端口是8081.

咱们定制好了变化,而且但愿能将其保存下来造成镜像。要知道,当咱们运行一个容器的时候(若是不使用卷的话),咱们作的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,能够将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。之后咱们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

docker commit [选项] <容器 ID 或容器名> [<仓库名>[:<标签>]]
 #例:
docker commit \
--author "Tao Wang <twang2218@gmail.com>" \
--message "修改了默认网页" \
webserver \
nginx:v2
 ##其中 --author 是指定修改的做者,而 --message 则是记录本次修改的内容。这点和 git 版本控制类似,不过这里这些信息能够省略留空。
复制代码

使用DockerFile来定制镜像:

即便Docker提供了commit来制做镜像,但是依然感受麻烦了点。若是咱们能够把每一层修改、安装、构建、操做的命令 都写入一个脚本,用这个脚原本构建、定制镜像,那么以前说起的没法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。 Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指 令构建一层,所以每一条指令的内容,就是描述该层应当如何构建。

因为DockerFile整块内容仍是不少的,因此后期我打算单独拿出来作成笔记,本篇文章做为入门教程,将使用一些简单的案例来帮助你们初识DockerFile,复杂镜像的构建,则会单独放在一篇文章中说明。

因为咱们以前的centos镜像只保留了centos的核心功能,不少经常使用的软件都没有,因而咱们打算制做一个简单的centos镜像,在原来的基础上使其拥有vim编辑器和net-tools工具。

首先新建一个DockerFile文件,写入如下内容:

from centos  //继承至centos
ENV mypath /tmp  //设置环境变量
WORKDIR $mypath //指定工做目录

RUN yum -y install vim //执行yum命令安装vim
RUN yum -y install net-tools //执行yum命令安装net-tools

EXPOSE 80 //对外默认暴露的端口是80
CMD /bin/bash //CMD 容器启动命令,在运行容器的时候会自动执行这行命令,好比当咱们 docker run -it centos 的时候,就会直接进入bash

复制代码

而后编译该镜像:

而后编译该镜像
docker build -f ./DockerFile -t mycentos:1.3.
-t 新镜像名字:版本
-f 文件 -d 文件夹
复制代码

以后咱们执行docker images命令就会出现咱们构建好的新镜像, mycentos:1.3 ,运行该镜像,会发现vim和net-tools 是能够正常使用的。

最后就大功告成啦。

下面开始技术总结:

本篇文章呢,咱们讲解了Docker常见的命令行的使用和解释,以及DockerFile的简单入门,下一篇呢,咱们将从DockerFile入手,开始详细的了解去怎么去制做和发布一个本身的镜像。

最后,相关笔记已经同步开源至Github(欢迎star): github.com/hanshuaikan…

相关文章
相关标签/搜索