一、Docker的三个基本概念
- 镜像(Image)
镜像是Docker的核心概念,可以理解为一个虚拟机的快照,用来部署应用程序。镜像由多层文件系统组成,每一层都是一个只读的文件系统,每一层都可以添加、修改或删除文件。
- 容器(Container)
容器是基于镜像创建的一个运行环境,可以理解为一个轻量级的虚拟机。容器提供了一个独立的、可隔离的运行环境,它与宿主机共享操作系统内核。
- 仓库(Registry)
仓库是存放镜像的地方,Docker Hub是Docker官方提供的公共仓库。
二、Docker的使用方法
- 安装Docker
在Linux系统中,可以使用以下命令安装Docker:
$ sudo apt-get update
$ sudo apt-get install docker-ce
- 镜像操作
- 搜索镜像
使用以下命令搜索Docker Hub上的镜像:
$ docker search image_name
- 拉取镜像
拉取镜像到本地仓库:
$ docker pull image_name
- 查看本地镜像
$ docker images
- 删除镜像
$ docker rmi image_name
- 容器操作
- 使用镜像创建容器并运行
$ docker run image_name
运行参数:
-d:在后台运行容器并输出容器 ID。
-i:以交互模式运行容器,通常与 -t 一起使用。 -it
-t:为容器分配一个伪终端。
--name:为容器指定一个名称。
-p:将主机端口映射到容器端口。 -p 宿主机端口:容器端口
-v:将主机目录或文件挂载到容器中。 -v 宿主机文件地址:容器内部文件地址
-e: --env=[], 指定环境变量,容器中可以使用该环境变量
--restart="no", 指定容器停止后的重启策略:
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
--rm:容器停止后自动删除。
- 查看运行中的容器
$ docker ps
- 查看所有容器(包括停止和暂挂 )
$ docker ps -a
- 停止容器
$ docker stop container_name # 容器名或容器ID
- 启动容器
$ docker start container_name # 容器名或容器ID
- 删除容器
$ docker rm container_name # 容器名或容器ID
- Dockerfile操作
Dockerfile是一个文本文件,用来定义镜像的构建过程。常用的指令包括FROM、RUN、COPY、ENTRYPOINT等。
Dockerfile制作镜像示例:
FROM ubuntu:latest # 镜像来源
RUN apt-get update && apt-get install -y nginx # 容器启动执行命令
COPY index.html /var/www/html/ #
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
Dockerfile 命令 介绍
FROM :
FROM :# 固定第一行命令 ,表示来源基础镜像
RUN :
RUN : # 镜像构建时执行命令 (docker build)
注意点:
dockerfile是每层都会建立一个镜像为下层命令使用,所以减少中间缓存镜像占用,应尽量较少 层数
执行 RUN命令可采用以下方式(&&命令连接),多行命令 合并执行
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
COPY:
COPY: # 复制指令,从上下文目录中复制文件或者目录到容器里指定路径。 上下文目录是指Dockerfile 文件的当前目录
ADD:
ADD: # 与COPY类似,ADD 可以进行文件解压
CMD:
CMD: # 容器 运行时运行改命令(docker run)
# CMD 可以被 docker run 中的命令覆盖 ,多个CMD命令只有最后一个CMD会生效
ENTRYPOINT:
ENTRYPOINT:容器运行时执行改 命令 ,CMD命令行将作为参数会传递给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参
示例:
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
ENV:
ENV: # 设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ARG:
构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。
VOLUME:
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
VOLUME:
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
- Docker Compose操作
Docker Compose是一个定义和运行多个容器的工具。使用Docker Compose可以定义一组相互关联的容器,然后一次性启动、停止和管理它们。
以下是一个简单的Docker Compose示例:
version: '3'
services:
web:
build: .
ports:
- "80:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
启动Docker Compose:
$ docker-compose up -d
停止容器 :
docker-compose down
重启容器
docker-compose restart nginx # 指定了容器名,不知道 则启动docker-compose 文件里的 所有容器
三、Docker的常用操作
- 容器网络操作
创建一个自定义网络:
$ docker network create network_name
将容器连接到网络:
$ docker run --network network_name image_name
- 容器数据卷操作
创建一个数据卷:
$ docker volume create volume_name
容器挂载到数据卷:
$ docker run -v volume_name:/path/to/mount image_name
- 容器日志操作
查看容器的日志:
$ docker logs container_name
将容器的日志输出到文件:
$ docker logs container_name > log_file