Docker使用教程

■ 简介

Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。

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

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

Docker 从 17.03 版本之后分为 CE(Community Edition:社区版) 和 EE(Enterprise Edition:企业版),我们用社区版就可以了。

■ 基础概念

镜像(Image):Docker 镜像(Image)就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

■ 相关地址

官方hub仓库:https://hub.docker.com

菜鸟教程:https://www.runoob.com/docker/docker-tutorial.html

官方安装:https://docs.docker.com/engine/install/centos/

■ 注意事项

如果使用的账号不是root账号,需要使用 sudo 前缀,使用root相关权限执行命令,后续命令中省略 sudo 命令,如果权限不足,请自行加上该前缀。

yum install xxx

sudoyum install xxx

■ 卸载docker

# 删除相关组件

# 如果使用种方式的话,需要罗列全部使安装过的组件;

yum remove docker \

  docker-client \

  docker-client-latest \

  docker-common \

  docker-latest \

  docker-latest-logrotate \

  docker-logrotate \

  docker-selinux \

  docker-engine-selinux \

  docker-engine


# 第二种方式,使用匹配符直接删除全部

# 推荐使用第二种方式,无需罗列所有的安装组件

yum remove docker docker-*

# 删除注册的服务

rm-rf/etc/systemd/system/docker.service.d

# 删除docker工作目录

rm-rf/var/lib/docker*

rm-rf/var/run/docker*

# 删除配置文件

# 直接清空这个文件夹,下面所有配置都将被清空

rm-rf/etc/docker

#----------------------------#

# /etc/docker/daemon.json    #

# /ect/docker/key.json       #

#----------------------------#

# 查找残留的docker

rpm-qa|grep docker

■ 安装docker

# 第一步,需要安装一些依赖组件

# 安装所需的软件包。yum-utils 提供了 yum-config-manager,

# 并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

yum install-yyum-utils \

  device-mapper-persistent-data \

  lvm2

# 使用以下命令来获得稳定的仓库

# 阿里云源地址速度相对比较快,这里是设置源地址为阿里云的镜像仓库地址。

yum-config-manager \

--add-repo\

   http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


# 安装 Docker Engine-Community

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

# 将当前用户添加到docker用户组

usermod-aGdocker${USER}

# Docker默认未启动,需要手动重启docker服务

systemctlrestartdocker

systemctlstartdocker

systemctlstopdocker

# 切换当前会话到docker组

newgrp-docker

■ docker镜像加速

sudomkdir-p/etc/docker

sudotee/etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://fpr97nhz.mirror.aliyuncs.com"]

}

EOF

sudosystemctl daemon-reload

sudosystemctlrestartdocker

■ docker常用命令

基础命令

# 查看docker基础信息

docker info

# 拉取镜像

docker pull <image>:<tag>

# 移除容器

dockerrm

# 移除镜像

docker rmi <imageId>

# 启动、停止、重启容器

dockerstop

dockerstart

dockerrestart

docker run-itd--name-P/-p: /bin/bash

# 查看docker容器

dockerps<-a>

# 打包镜像

docker tag <path>/<name> <remotePath>/<name>

docker push <remotePath>/<name>

# 登录docker

docker login <remoteIp>

# 进入容器内部

docker exec-it /bin/bash

# 从仓库搜索镜像

docker search <imageName>

批量操作

# 杀死所有正在运行的容器

dockerkill$(docker ps -a -q)

# 删除所有的容器

dockerrm$(docker ps -a -q)

# 删除所有未打 dangling 标签的镜

docker rmi$(docker images -q -f dangling=true)

# 删除所有镜像

docker rmi$(docker images -q)

docker rmi$(docker images -q)

# 强制删除无法删除的镜像

docker rmi-f

docker rmi-f$(docker images -q)

■ Dockerfile

Dockerfile是一个包含用于组合镜像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取文件中的指令自动生成镜像。

脚本结构

基础镜像信息

维护者信息

镜像操作指令

容器启动时执行指令

’#’ 为 Dockerfile 中的注释

"&&" 符号连接命令,这样执行后,只会创建 1 层镜像

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本镜像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

# 基础镜像

FROM <image>

FROM <image>:<tag>

FROM <image>@<digest>

FROM nginx:latest

# 维护者信息

MAINTAINER <author>

MAINTAINER tangxbai@hotmail.com

# ENV × N ...

# 设置镜像环境变量,仅在 Dockerfile 内有效

ENV <key> <value>

ENV = ...

ENVLANG=C.UTF-8

# ARG × N ...

# 用于指定传递给构建运行时的变量

ARG [=]

ARG site

ARGargName=defaultArgValue

# USER × N ...

# 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

USER <user>

USER <user>:<gid>

USER <user>:<group>

USER <uid>

USER <uid>:<gid>

USER <uid>:<group>

USER root

# 用于为镜像添加元数据

LABEL = ...

LABELversion="1.0"description="Dockerfile"

# ONBUILD × N ...

# 当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被触发

ONBUILD [INSTRUCTION]

ONBUILD RUN /usr/local/bin/python-build--dir/app/src

# RUN × N ...

# 构建镜像执行的命令

RUN <command>

RUN ["executable","param1","param2"]

RUNmkdir/path/to/workdir

# WORKDIR × N ...

# 设置工作目录,类似于cd命令,后续所有操作都会基于此目录进行操作

WORKDIR <path>

WORKDIR /path/to/workdir

# ADD × N ...

# 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

ADD <src>... <dest>

ADD ["<src>",..."<dest>"]# 用于支持包含空格的路径

ADD target/project.jar /path/to/workdir

# COPY × N ...

# 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

COPY <src>... <dest>

COPY ["<src>",..."<dest>"]# 用于支持包含空格的路径

COPY target/project.jar /path/to/workdir

# 用于将容器内的目录挂载到宿主机上

# 一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

# 1、卷可以容器间共享和重用

# 2、容器并不一定要和其它容器共享卷

# 3、修改卷后会立即生效

# 4、对卷的修改不会对镜像产生影响

# 5、卷会一直存在,直到没有任何容器在使用它

VOLUME <path>

VOLUME /var/www /var/log/log1 /var/log/log2

# 指定于外界交互的端口

# 注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。

EXPOSE <port>/<protocol> ...

EXPOSE804438080

EXPOSE80/tcp8080/udp

# 配置容器,使其可执行化,配合CMD可省去"application",只使用参数。

# ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

ENTRYPOINT ["executable","param1","param2"]

ENTRYPOINT command param1 param2

ENTRYPOINT java-jarproject.jar-Dspring.profiles.active=dev

# CMD × N ...

# 构建容器后调用,也就是在容器启动时才进行执行

# CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

CMD <command>

CMD ["executable","param1","param2"]

CMD ["param1","param2"]

CMD java-jarproject.jar

构建命令

Dockerfile文件的存放目录下,执行构建动作。以下示例,通过目录下的 Dockerfile 构建一个 image:tag(镜像名称:镜像标签)。

docker build:用 Dockerfile 构建镜像的命令关键词。

-t(target):指定镜像名字

-f(file):显示指定构建镜像的 Dockerfile 文件(Dockerfile 可不在当前路径下)

如果不使用 -f,则默认将上下文路径下的名为 Dockerfile 的文件认为是构建镜像的 "Dockerfile"

".":当前上下文路径

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

最后找了一张很形象的图

■ docker-compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

使用 Dockerfile 定义应用程序的环境。

使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

最后,执行 docker-compose up 命令来启动并运行整个应用程序。

安装插件

# 下载docker-compose插件

sudocurl-L"https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)"-o/usr/local/bin/docker-compose

# 增加文件可执行权限

sudochmod+x /usr/local/bin/docker-compose

# 创建软连接,以至于可以直接使用在任何目录使用docker-compose命令

sudoln-s/usr/local/bin/docker-compose /usr/bin/docker-compose

# 测试是否安装成功

docker-compose--version

基础命令

docker-compose version

docker-compose-f/start

# 显示正在运行的进程

docker-composetop

docker-composestart

docker-composerestart

docker-composestop

docker-compose up-d

docker-compose down-v

注意:docker-compose.yaml必须和命令在同一目录

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