Skip to content

Docker 基本概念

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

Docker 架构

Docker 使用 C/S 架构,Client 通过接口与 Server 进程通信实现容器的构建,运行和发布

Docker Client(客户端)

Docker 命令行工具,利用命令行发送请求给 Docker Daemon

Docker Host(宿主机)

安装了 Docker 程序,并且运行了 Docker Daemon 的主机。其中 Docker Host 包含如下部分:

  • Docker Daemon:守护进程,负责管理镜像和容器
  • Docker Container:容器
  • Docker Images:镜像

Registry(镜像仓库)

最大的公开仓库是官方的 Docker Hub,国内也有如阿里云、时速云等,可以给国内用户提供稳定快速的服务。用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了

Docker 安装

Docker 常用命令

Docker 相关命令

sh
# 启动 Docker 服务
systemctl start docker

# 停止 Docker 服务
systemctl stop docker

# 重启 Docker 服务
systemctl restart docker

# 开机启动 Docker 服务
systemctl enable docker

# 查看 Docker 状态
systemctl status docker

# 查看 Docker 版本
docker version

# 查看 Docker 帮助
docker --help

# 查看 Docker 概要信息
docker info

镜像相关命令

sh
# 查看本地主机上的镜像
docker images

# 查看所有镜像(包含中间镜像层)
docker images -a

# 查看镜像ID
docker images -q

# 查看所有镜像ID
docker images -aq

# 查找 Docker 镜像
docker search 镜像名称

# 拉取 Docker 镜像
docker pull 镜像名称[:版本号]

# 推送镜像
docker push 镜像名称[:版本号]

# 删除单个镜像
docker rmi 镜像ID/镜像名称[:版本号]

# -f:表示强制删除,强制删除单个镜像
docker rmi -f 镜像ID/镜像名称[:版本号]

# 删除多个镜像
docker rmi [-f] 镜像1ID/镜像1名称[:版本号] 镜像2ID/镜像2名称[:版本号]

# 删除全部镜像
docker rmi [-f] $(docker images -aq)

# 获取 Docker 镜像元信息
docker inspect 镜像ID/镜像名称[:版本号]

容器相关命令

sh
# 以交互模式运行容器
docker run -it -v 宿主机目录/文件的绝对路径:容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name=容器名称 镜像ID/镜像名称[:版本号]

# 以后台方式运行容器 (推荐)
docker run -d -v 宿主机目录/文件的绝对路径:容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name=容器名称 镜像ID/镜像名称[:版本号]

# 注意:这里启动容器时,没有挂载容器数据卷,启动容器时,一般建议挂载容器数据卷,实现数据持久化操作
docker run -d -p 8080:8080 --name=myTomcat 镜像ID/镜像名称[:版本号]
# 之后,在浏览器中输入你的 IP:8080 即可访问 Tomcat 页面


# 查看当前运行的容器
docker ps

# 查看所有容器 (运行和停止的)
docker ps -a

# 查看最近创建的容器
docker ps -l

# 查看最近创建指定个数的容器
docker ps -n 数量

# 查看停止的容器
docker ps -f status=exited

# 查看所有容器的ID
docker ps -aq

# 启动容器
docker start 容器ID/容器名称

# 重启容器
docker restart 容器ID/容器名称

# 停止容器
docker stop 容器ID/容器名称

# 强制停止容器
docker kill 容器ID/容器名称

# 删除已停止的容器
docker rm 容器ID/容器名称

# -f:表示强制删除,删除正在运行的容器
docker rm -f 容器ID/容器名称

# 删除全部的容器
docker rm -f $(docker ps -qa)

# 以exec方式进入到容器
docker exec -it 容器ID/容器名称 /bin/bash 或 /bin/sh

# 以attach方式进入到容器
docker attach 容器ID/容器名称

# 如果不想进入容器,直接获取相关指令的运行结果,可在后面填写相关操作指令
docker exec -it 容器ID/容器名称 相关命令

# 退出并停止容器
exit

# 退出但容器不停止
ctrl + p + q

# 从容器内拷贝文件到宿主机
docker cp 容器ID/容器名称:容器内目录/文件的绝对路径 宿主机目录/文件的绝对路径

# 从宿主机中拷贝文件到容器内
docker cp 宿主机目录/文件的绝对路径 容器ID/容器名称:容器内目录/文件的绝对路径

# 查看容器日志
docker logs -f -t 容器ID/容器名称

exec 与 attach 的区别:

  • exec:是在容器中打开新的终端,并且可以启动新的进程 (推荐)
  • attach:是直接进入容器启动命令的终端,不会启动新的进程

Dockerfile 解析和镜像制作

Dockerfile 是一种能够被 Docker 程序解释的脚本,是用来构建 Docker 镜像的构建文件。是由一条一条的指令组成,每条指令对应 Linux 下面的一条命令,Docker 程序将这些 Dockerfile 指令翻译真正的 Linux 命令。Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,类似于 Makefile,Docker 程序将读取 Dockerfile,根据指令生成定制的镜像

Dockerfile 构建三步骤

  1. 编写 Dockerfile 文件
  2. docker build 生成镜像文件
  3. docker run 运行镜像文件,生成容器实例

Dockerfile 基础知识

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,从左到右的顺序执行
  • # 表示注释
  • && 表示指令前一条指令执行成功后,才执行下一条指令
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

Dockerfile 保留字讲解

FROM:基础镜像,当前镜像是基于哪个镜像的,必须为 Dockerfile 的第一个指令

sh
FROM imageName[:tag]

# 示例
FROM mysql:5.6

# 注:tag 是可选的,如果不写,则会默认使用 latest 版本的基础镜像

LABEL:为镜像指定标签

sh
# 可以设置多个标签,每个标签为一个 "key=value" 的键值对,如果 key 中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线\也可以用于续行
LABEL key1=value1 key2=value2...

RUN:容器构建时需要运行的指令

sh
# RUN用于在镜像容器中执行指令,其有以下两种指令执行方式:

# shell执行
RUN command
# 示例:
RUN yum -y install vim

# exec执行
RUN ["executable", "param1", "param2"]
# 示例:
RUN ["/etc/execfile", "arg1", "arg1"]

# 注:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

EXPOSE:指定当前容器与外界交互的端口

sh
EXPOSE port [port...]

# 示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp

# 注: EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在 docker run 运行容器时通过 -p 来指定映射这些端口

WORKDIR:创建容器后终端默认登录进来的工作目录,一个落脚点

ENV:用来在构建镜像过程中设置环境变量

ADD:将本地文件添加到容器中,会自动处理url网络资源和 解压tar类型文件(网络压缩资源不会被解压)

COPY:与类似 ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件 / 目录复制到新的一层的镜像内的 < 目标路径 > 位置,但是不会自动解压文件,也不能访问网络资源

VOLUME:容器数据卷,用于数据保存和持久化工作

CMD:指定一个容器启动时要运行的指令。Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数给替换

ENTRYPOINT:指定一个容器启动时要运行的指令。ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数,不同点是 docker run 之后的参数会被当做参数传递给 ENTRYPOINT,形成新的命令组合

ONBUILD:当构建一个被继承的 Dockerfile 时,该指令将被运行,即父镜像在被子继承后,父镜像的 onbuild 将会被触发

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

案例:编写一个 Nginx 的 Dockerfile

sh
# This my first nginx Dockerfile
# Version 1.0

# Base images 基础镜像
FROM centos

#LABEL 维护者信息
LABEL  \
    email="8426356@qq.com"

#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
ENV WORKPATH /usr/local/nginx-1.8.0

#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/

#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相当于cd
WORKDIR $WORKPATH

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#CMD 运行以下命令
CMD ["nginx"]

Dockerfile 镜像制作

  • 通过 Dockerfile 使用 docker build 指令生成镜像
  • 通过使用 docker commit 指令生成镜像