-
镜像是 Docker 运行容器的前提,仓库是存放镜像的场所
-
镜像不包含任何动态数据,其内容在构建之后也不会被改变。
-
一个 Docker Registry 中可以包含多个仓库 (Repository) ,每个仓库可以包含多个标签 (Tag),每个标签对应着一个镜像。所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。
-
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。
-
当镜像通过 RUN 命令运行成功后,这个运行的镜像就是一个 Docker 容器啦,容器可以理解为一个轻量级的沙箱, Docker 利用容器来运行和隔离应用,容器是可以被启动、停止、删除的,这并不会影响 Docker 镜像。
-
镜像有多种生成方法:
- 从无到有开始创建镜像
- 下载并使用别人创建好的现成的镜像
- 在现有镜像上创建新的镜像
-
我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile ,通过执行 docker build 命令可以构建出 Docker 镜像
-
运行docker push、docker pull、docker search时,实际上是通过 docker daemon 与 docker registry 通信。
-
Dockerfile 是自动构建 docker 镜像的配置文件, 用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile 中的命令非常类似于 linux 下的 shell 命令。
-
一般来说,我们可以将 Dockerfile 分为四个部分:
- 基础镜像(父镜像)信息指令 FROM
- 维护者信息指令 MAINTAINER
- 镜像操作指令 RUN 、 EVN 、 ADD 和 WORKDIR 等
- 容器启动指令 CMD 、 ENTRYPOINT 和 USER 等
FROM python:3.7 MAINTAINER Angel_Kitty <angelkitty6698@gmail.com> COPY . /app WORKDIR /app RUN pip install -r requirements.txt EXPOSE 5000 ENTRYPOINT ["python"] CMD ["app.py"]
常用命令
# 查看获取容器/镜像的元数据
$ docker inspect <image_name/container_name>
# 将镜像上传到docker hub的仓库
$ docker push <hub-user>/<repo-name>:<tag>
# 为镜像打tag
$ docker tag <image_id> <image_name>:<tag>
# 查看images
$ docker images
# 显示正在运行的容器
# -a 是查看当前所有的容器,包括未运行的
$ docker ps -a
# 获取容器/镜像的元数据
docker inspect <id/name>
#查看docker数据卷
docker volume ls
# 使用exec命令进入容器
$ docker exec -it <container_name>/<container_id> /bin/bash
# 停止容器
$ docker stop <container_name>/<container_id>
# 删除容器
$ docker rm <container_name>/<container_id>
# 删除所有停止的容器
$ docker container prune
# 删除镜像
$ docker rmi <image_name>
# 删除所有未none的镜像
docker rmi $(docker images | grep "none" | awk '{print $3}')
#删除没使用的数据卷(谨慎使用)
docker volume prune
# 构建镜像
# -t 是为新镜像设置仓库和名称,:1.0.0为标签(不添加为默认 latest )
$ docker build -t <image_name>:<version> <Dockerfile_directory>
$ docker build -t my_ubuntu:1.0.0 .
# 启动容器,并且调用容器里面的 bash
$ docker run -t -i <container_name>/<container_id> /bin/bash
# 在后台启动容器
# --name <container_name> 为容器定义一个名字
# --link <container_name>:<alias> 链接到xx容器,使其可以通过alias访问目标容器
$ docker run -d -p <host_port>:<container_port> <repository_name>/<image_name>:1.0.0
Dockerfile
Dockerfile 使用准则
- 大: 首字母必须大写D
- 空: 尽量将Dockerfile放在空目录中。
- 单: 每个容器尽量只有一个功能。
- 少: 执行的命令越少越好
Dockerfile构建过程
- 从基础镜像1运行一个容器A
- 遇到一条Dockerfile指令,都对容器A做一次修改操作
- 执行完毕一条命令,提交生成一个新镜像2
- 再基于新的镜像2运行一个容器B
- 遇到一条Dockerfile指令,都对容器B做一次修改操作
- 执行完毕一条命令,提交生成一个新镜像3
- ...
构建过程镜像介绍
- 构建过程镜像介绍 构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用来启动容器,通过查看容器效果,从侧面能看到我们每次构建的效果。
- 我们可以通过docker history <镜像名> 来查看整个构建过程所产生的镜像
构建缓存
- 我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。
- 不使用构建缓存方法常见两种
- 全部不同缓存:
docker build --no-cache -t [镜像名]:[镜像版本] [Dockerfile位置] - 部分使用缓存:
ENV REFRESH_DATE 2018-01-12- 只要构建的缓存时间不变,那么就用缓存,如果时间一旦改变,就不用缓存
- 全部不同缓存:
- 清理构建缓存
docker system prune dockersystem prune --volumes
# FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
FROM <image>
FROM <image>:<tag>
# 指定该dockerfile文件的维护者信息
MAINTAINER liuyuchuan816@163.com
# 当前镜像构建时候运行的命令
RUN <command> (shell模式)
RUN["executable", "param1", "param2"]。 (exec 模式)
# 设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容 器时增加-p或者-P参数对容器的端口进行分配。
EXPOSE <port> [<port>...]
# 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell模式)
# 将指定的 <src> 文件复制到容器文件系统中的 <dest> src 指的是宿主机,dest 指的是容器
# 如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。
ADD <src> <dest>
ADD ["<src>","<dest>"]
# 单纯复制文件场景,Docker推荐使用COPY
COPY <src> <dest>
COPY ["<src>","<dest>"]
# VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。
# 通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
VOLUME ["/data"]
# 设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定
ENV <key> <value>
ENV <key>=<value> ...
# 切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd 可以多次切换(相当于cd命令), 也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如 举例
WORKDIR /path/to/workdir (shell 模式)
docker-compose
命令
# 安装 docker-compose
pip install docker-compose
# 构建镜像
docker-compose build
# 构建镜像并启动容器
docker-compose up -d
# 启动一个服务
docker-compose start <service_name>
# 停止一个服务
docker-compose stop <service_name>
# 查看正在运行的服务
docker-compose ps
# Stop and remove containers, networks, images, and volumes
docker-compose down
docker-compose down --rmi all
# Remove stopped containers
docker-compose rm <service_name>