Docker踩坑指南1:Docker的基本使用

Docker现在是一门非常流行的技术,其实之前就一直想学,不过一是没什么时间;二是没有结合实践,官方文档又介绍的不是很清楚,导致其中很多命令都看不懂,于是就没有继续下去了。
而这次我接了一个外包项目,实践Docker的时候终于到了!!!让我们开始吧。

一、Docker的介绍

Docker是一种虚拟化技术,用于解决开发环境的配置难题。可以把Docker就理解成一种虚拟机,不过比VirtualBox和VMware等的虚拟机要轻量很多,它没有图像化界面,并且与系统深度融合,运行效率非常高,可以说在使用它的时候几乎察觉不出是虚拟机,和真机体验很相似。
为什么要用Docker?很多服务端软件的运行环境配置起来非常麻烦,而最好的办法就是把配置好的环境存起来,保存成一个类似操作系统镜像的东西,同时在需要运行这些软件的地方运行这个虚拟机镜像,再在这个虚拟机里运行这些服务端软件,从而就避免了配置运行环境的麻烦。其次,它还封装好了装好tomcat、mysql等常用开发环境的镜像,使用起来方便很多。

Docker有两个核心概念,Image和Container。Image就是类似操作系统镜像一样的东西,是静态的,可以对Image进行启动和删除。而Container则是正在运行的Image,是动态的,可以对Container进行停止、继续和删除。同样可以把Image和Container理解成面向对象中的类和对象。


二、Docker的安装

Windows和Mac的Docker安装起来都比较简单,有图形化界面,用起来很简单,这里就直接跳过,不过安装后记得配置国内镜像源,不然下载镜像的速度会非常慢。
至于镜像源地址的话,登录阿里云,搜索容器镜像服务,进入镜像加速器,就可以看到给每个用户分配的镜像加速器

阿里云镜像加速器

Linux的Docker安装起来则比较麻烦,这里只介绍服务端常用Linux发行版CentOS如何安装Docker。

常规安装流程

  1. 设置 repository
$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装Docker Community
$ sudo yum install docker-ce docker-ce-cli containerd.io
  1. 开启服务并试运行
$ sudo systemctl start docker
$ sudo docker run hello-world

可能遇到的坑

本来按照上面的步骤是照着官网教程来的,应该是没什么问题的,但我在运行下面这句的时候却报错了

$ sudo systemctl start docker
Job for docker.service failed because start of the service was attempted too often. See "systemctl status docker.service" and "journalctl -xe" for details.

但我按照提示输入systemctl status docker.servicejournalctl -xe只看到提示异常退出,但没有说具体是什么问题,把输出内容在百度和谷歌上都也都没什么用,好几天都没解决这个问题。

后来不知道哪天看到有条命令,journalctl --since "2019-12-12 13:12:00"可以看系统某个时刻之后的所有日志,我这才找到了错误原因!!

Apr  4 22:09:06 localhost_02 dockerd: time="2019-04-04T22:09:06.128742412+08:00" level=info msg="Creating filesystem xfs on device docker-8:3-67789151-base, mkfs args: [-m crc=0,finobt=0 /dev/mapper/docker-8:3-67789151-base]" storage-driver=devicemapper
Apr  4 22:09:06 localhost_02 dockerd: time="2019-04-04T22:09:06.131080987+08:00" level=info msg="Error while creating filesystem xfs on device docker-8:3-67789151-base: exit status 1" storage-driver=devicemapper
Apr  4 22:09:06 localhost_02 dockerd: time="2019-04-04T22:09:06.131103910+08:00" level=error msg="[graphdriver] prior storage driver devicemapper failed: exit status 1"

核心错误就是这个Error while creating filesystem xfs on device docker-8:3-67789151-base: exit status 1

然后在谷歌上一搜,果然找到了解决方案,具体看这个链接https://my.oschina.net/yuanhaohao/blog/3032396就可以解决,真是太激动了!

最后重新运行docker服务:

$ sudo systemctl daemon-reload
$ sudo systemctl start docker.service

三、Docker的常用命令

在命令行输入docker --help就可以查看所有docker命令

Management Commands:
  builder     Manage builds
  config      Manage Docker configs
  container   Manage containers
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  ...

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  ...

是不是有点眼花撩乱?没事,我们慢慢来。

首先常用的命令有两大类,分别是针对Image和针对Container的。

Docker Image命令

$ docker image build xxx

这个用于根据xxx目录下的Dockerfile生成镜像,下面一节会讲解Dockerfile是什么,现在只需要认为是一个自动执行脚本,可以根据需求自动生成Docker镜像文件

$ docker image ls

这条命令则用来查看所有镜像的信息

参数名称 解释
仓库位置 就像我前面几个镜像,是把我的镜像存储在阿里云上,后面没有域名地址的则是来则Docker Hub官方仓库
标签 就像软件有不同的版本一样,镜像也有不同的版本,区分他们的就是镜像标签
镜像ID 每个镜像独有的ID
创建时间
镜像大小



最后是一些比较简单的命令:

$ docker image rm 镜像ID或镜像名
  删除镜像
$ docker image tag 源镜像名 目标镜像名
  重新已经存在的镜像指定一个重名
$ docker image push 镜像ID或镜像名
  将镜像上传到云端(如果没指定域名就默认是官方的Docker Hub)
$ docker image pull 镜像名
  从云端下载镜像

PS:上面说的镜像名都是指“仓库位置:标签”


Docker Container命令

$ docker container run xxxx

这个命令比较复杂,直接用一个例子来介绍:
  • 红色:docker run是docker container run的同义词,后面部分会介绍
  • 橙色:每个容器基本都会指定一个需要运行的命令,用来开启某个服务,而容器和这条命令是同生共死的,而这个参数就是表示让这条命令可以后台运行,也就是让容器能够后台运行
  • 绿色:由于Docker类似于虚拟机,容器与外部之间是默认不共享端口的,需要开放什么端口需要指定,格式是"外部端口:容器内端口"
  • 蓝色:设置容器内的环境变量,我这里是设置MySql数据库的root密码以及默认创建的数据库名称
  • 紫色:运行的镜像名,没有指定标签的话默认就是latest

还有很多其他参数,可以输入docker container run --help查看帮助

$ docker container ls

它的用途是查看所有容器的信息

参数名称 解释
容器ID 与镜像ID差不多,每个容器都独一无二
来源的镜像名
运行的指令 这个在后面的Dockerfile里会介绍
创建时间
容器状态 开启还是暂停还是运行结束
开放的端口 容器开放给外部的端口
容器名 不设置容器名称的话系统会随机给你一个

上面参数中的-a表示显示所有容器,包括停止运行的容器,而不加这个只会显示正在运行的和暂停的容器

$ docker container exec [OPTIONS] 容器ID或容器名 命令

这条命令则是用于在已经运行的容器中运行某条命令

[OPTIONS]有很多,这里只介绍两个最常用的:

  • -d:表示在后台运行命令,与上面的类似

  • -it:表示会开启一个交互式终端,我一般用下面的命令来进入容器内部的终端:docker container exec -it 容器ID bash


    最后是一些比较简单的命令:

$ docker container commit 容器ID或容器名 镜像名
  将运行中的容器保存成镜像
$ docker container rm 容器ID或容器名
  删除已经停止的容器(注意此命令不能删除正在运行的容器)
$ docker container kill 容器ID或容器名
  强行停止正在运行的容器
$ docker container start/pause/restart 容器ID或容器名
  这些一看就知道是什么意思就不解释了


真正常用的命令

真正常用的命令?难道意思是前面的都不常用??

对的,前面这些命令都太长了,我们一般都用它们的简写,替换规则如下:

docker run = docker container run
docker ps = docker container ls
docker commit = docker container commit
docker images = docker image ls
docker pull = docker image pull
docker push = docker image push
docker build = docker image build
docker rm = docker container rm
docker rmi = docker image rm
...

OK了,Docker的基本使用到此告一段落,下一篇博客将介绍Dockerfile和Docker Compose等工具的使用!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容

  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,370评论 0 27
  • 0x01 核心概念 Docker镜像类似于虚拟机镜像,可以理解为一个面向Docker引擎的只读模板,包含了文件系统...
    闲云逸心阅读 4,679评论 0 9
  • Docker简介Docker是一个由GO语言写的程序运行的“容器”; 目前云服务的基石是操作系统级别的隔离,在同一...
    gakiww阅读 526评论 0 0
  • 1. 摘要 本文是辉哥Docker入门的一些摘要和资源分享,涉及DOCKER入门,框架原理,镜像制作和资源列表等内...
    笔名辉哥阅读 4,527评论 0 74
  • 我回来了,同学们,这周我拉下好多课,三天没去上课啦,突然做起作业时才发现我 居然不会做啦,,, 我着急了,对妈妈说...
    李博一黄金分割率阅读 105评论 0 0