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 :

# 移除容器

dockerrm

# 移除镜像

docker rmi

# 启动、停止、重启容器

dockerstop

dockerstart

dockerrestart

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

# 查看docker容器

dockerps<-a>

# 打包镜像

docker tag / /

docker push /

# 登录docker

docker login

# 进入容器内部

docker exec-it /bin/bash

# 从仓库搜索镜像

docker search

批量操作

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

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

FROM :

FROM @

FROM nginx:latest

# 维护者信息

MAINTAINER

MAINTAINER [email protected]

# ENV × N ...

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

ENV

ENV = ...

ENVLANG=C.UTF-8

# ARG × N ...

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

ARG [=]

ARG site

ARGargName=defaultArgValue

# USER × N ...

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

USER

USER :

USER :

USER

USER :

USER :

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

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

RUNmkdir/path/to/workdir

# WORKDIR × N ...

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

WORKDIR

WORKDIR /path/to/workdir

# ADD × N ...

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

ADD ...

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

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

# COPY × N ...

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

COPY ...

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

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

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

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

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

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

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

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

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

VOLUME

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

# 指定于外界交互的端口

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

EXPOSE / ...

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

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必须和命令在同一目录

你可能感兴趣的:(Docker使用教程)