Docker 使用入门

215 阅读5分钟
  1. 镜像是 Docker 运行容器的前提,仓库是存放镜像的场所

  2. 镜像不包含任何动态数据,其内容在构建之后也不会被改变。

  3. 一个 Docker Registry 中可以包含多个仓库 (Repository) ,每个仓库可以包含多个标签 (Tag),每个标签对应着一个镜像。所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。

  4. 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。

  5. 当镜像通过 RUN 命令运行成功后,这个运行的镜像就是一个 Docker 容器啦,容器可以理解为一个轻量级的沙箱, Docker 利用容器来运行和隔离应用,容器是可以被启动、停止、删除的,这并不会影响 Docker 镜像。

  6. 镜像有多种生成方法:

    • 从无到有开始创建镜像
    • 下载并使用别人创建好的现成的镜像
    • 在现有镜像上创建新的镜像
  7. 我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile ,通过执行 docker build 命令可以构建出 Docker 镜像

  8. 运行docker push、docker pull、docker search时,实际上是通过 docker daemon 与 docker registry 通信。

  9. Dockerfile 是自动构建 docker 镜像的配置文件, 用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile 中的命令非常类似于 linux 下的 shell 命令。

  10. 一般来说,我们可以将 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 使用准则

  1. 大: 首字母必须大写D
  2. 空: 尽量将Dockerfile放在空目录中。
  3. 单: 每个容器尽量只有一个功能。
  4. 少: 执行的命令越少越好

Dockerfile构建过程

  • 从基础镜像1运行一个容器A
  • 遇到一条Dockerfile指令,都对容器A做一次修改操作
  • 执行完毕一条命令,提交生成一个新镜像2
  • 再基于新的镜像2运行一个容器B
  • 遇到一条Dockerfile指令,都对容器B做一次修改操作
  • 执行完毕一条命令,提交生成一个新镜像3
  • ...

构建过程镜像介绍

  • 构建过程镜像介绍 构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用来启动容器,通过查看容器效果,从侧面能看到我们每次构建的效果。
  • 我们可以通过docker history <镜像名> 来查看整个构建过程所产生的镜像

构建缓存

  • 我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。
  • 不使用构建缓存方法常见两种
    1. 全部不同缓存: docker build --no-cache -t [镜像名]:[镜像版本] [Dockerfile位置]
    2. 部分使用缓存: ENV REFRESH_DATE 2018-01-12
      • 只要构建的缓存时间不变,那么就用缓存,如果时间一旦改变,就不用缓存
  • 清理构建缓存
    • docker system prune docker
    • system 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>