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