Docker概述
Docker是基于LXC实现的一个应用容器引擎,Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中,然后发布到任何流行的Linux机器上。Docker容器性能开销极低,并且是完全使用沙箱机制,相互隔离的。
虚拟化技术
虚拟化是一种硬件资源管理技术,它可以将各种实体资源抽象后再分割,从而打破物理结构的限制,提高了硬件资源的利用率。常见的虚拟化技术有虚拟机和Docker容器,只不过二者基于不同的层面进行虚拟化。Docker属于操作系统层虚拟化,虚拟机则属于硬件层虚拟化。
虚拟机与Docker对比
Docker和虚拟机都使用了虚拟化技术,达到了资源隔离的目的。但是Docker容器是基于软件虚拟化,虚拟机是基于硬件虚拟化。
基本概念
镜像:Docker镜像提供容器运行时所需的程序、库、资源、配置等文件。
容器:镜像是静态的定义,容器是镜像运行时的实体。镜像和容器的关系,就像是面向对象程序中的类和对象,镜像是面向对象程序中的类,而容器则是类的实例对象。
仓库:镜像仓库是Docker用来集中存放镜像文件的地方,类似于代码仓库。
安装Docker
- 更新yum
sudo yum update
- 安装Docker所需的依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置Docker的yum源
sudo yum-config-manager
--add-repo
mirrors.aliyun.com/docker-ce/l… sudo sed -i 's/download.docker.com/mirrors.aliyun.com/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
- 安装Docker
以下命令二选一,安装最新版本或安装指定版本,推荐安装手动指定的稳定版本。
yum install -y docker-ce
yum install -y docker-ce-25.0.5 docker-ce-cli-25.0.5 containerd.io
- 启动Docker
systemctl start docker
- 设置开机启动Docker
systemctl enable docker
- 重启Docker
systemctl restart docker
- 卸载Docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
配置镜像仓库(重要)
目前国内已经无法访问Docker Hub镜像仓库,因此需要配置可替代的国内镜像平台。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "dc.j8.work", "docker.m.daocloud.io", "dockerproxy.com", "docker.mirrors.ustc.edu.cn", "docker.nju.edu.cn" ] } EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker常用命令
Docker服务相关命令
systemctl start docker #启动docker服务
systemctl stop docker #停止docker服务
systemctl restart docker #重启docker服务
systemctl status docker #查看docker服务状态
systemctl enable docker #设置开启启动docker服务
Docker镜像相关命令
docker images #查看所有镜像
docker images -q #查看所有镜像的id
docker search 镜像名称 #查找需要的镜像,例: docker search mysql:5.7
docker pull 镜像名称 #拉取镜像:从Doker仓库下载镜像到本地,镜像名称格式为名称:版本号,如果版本号不指定则是最新的版本如果不知道镜像版本,可以去hub.docker.com/ 搜索对应镜像查看。
docker rmi 镜像id # 删除指定本地镜像docker
docker rmi
docker images -q# 删除所有本地镜像
Docker容器相关命令
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(运行中的,停止的)
docker run 参数 # 例:docker run -id --name redis -p 6379:6379 redis
参数说明:
-i:保持容器运行。通常与-t同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭,
-t:为容器重新分配一个伪输入终端,通常与-i同时使用。
-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
-it创建的容器一般称为交互式容器,-id创建的容器一般称为守护式容器
--name:为创建的容器命名。
-p:指定虚拟机端口映射到docker容器端口
docker exec 参数 # 进入容器 docker exec -it redis /bin/bash
docker stop 容器名称 # 停止容器
docker start 容器名称 # 启动容器
docker rm 容器名称 # 删除容器,如果容器是运行状态则删除失败,需要停止容器才能删除
docker inspect 容器名称 # 查看容器信息
Docker容器数据卷
数据卷的概念
- 数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
数据卷的作用
- 容器数据的持久化
- 外部机器和容器间接通信
- 容器之间数据交换
配置数据卷
创建启动容器时,使用-v参数设置数据卷
docker run -v 宿主机目录(文件) :容器内目录(文件) ...
示例: docker run --name mysql -v /root/mysql/conf:/etc/mysql/conf.d mysql
注意事项:
1.目录必须是绝对路径
2.如果目录不存在,会自动创建
3.可以挂载多个数据卷
配置数据卷容器
- 通过简单方式实现数据卷配置
- 创建一个容器,挂载一个目录,让其他容器继承自该容器(--volume-from)
- 创建启动c3数据卷容器,使用-v 参数设置数据卷
docker run -it --name=c3 -v /volume centos :7 /bin/bash
- 创建启动c1 c2容器,使用--volumes-from参数设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
DockerFile
Dockerfile就是一个文本文件,其中包含一个个的指令,用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。
基本命令
| 指令 | 说明 | 示例 |
|---|---|---|
| FROM | 指定基础镜像 | FROM centos:6 |
| ENV | 设置环境变量,可在后面指令使用 | ENV key value |
| COPY | 拷贝本地文件到镜像的指定目录 | COPY ./xx.jar /tmp/app.jar |
| RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
| EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
| ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
构建镜像
docker build -t docker-demo:1.0 /root/demo
docker build : 就是构建一个docker镜像
-t docker-demo:1.0 :-t参数是指定镜像的名称(repository和tag)
/root/demo : 指构建时Dockerfile所在路径
示例: 构建一个app应用
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
DockerCompose
docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似
安装DockerCompose
在线安装
官网地址
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
镜像地址
# 默认路径
wget https://gitee.com/fustack/docker-compose/releases/download/v2.24.1/docker-compose-linux-x86_64
# 指定路径【推荐】
sudo curl -L https://gitee.com/fustack/docker-compose/releases/download/v2.24.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# 设置权限
sudo chmod +x /usr/local/bin/docker-compose
离线安装
# 下载;docker-compose-`uname -s`-`uname -m` 查看版本;https://github.com/docker/compose/releases/tag/v2.18.1
# 重命名
mv docker-compose-linux-x86_64 docker-compose
# 加入执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 查看docker-compose版本
docker-compose -v
验证是否安装成功
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v
Docker Compose version v2.18.1
基础命令
docker compose [OPTIONS] [COMMAND]
示例: docker-compose -f docker-compose-environment.yml up -d
其中,OPTIONS和COMMAND都是可选参数,比较常见的有:
| 指令 | 参数或指令 | 说明 |
|---|---|---|
| Options | -f | 指定compose文件的路径和名称 |
| Options | -p | 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念 |
| Commands | up | 创建并启动所有service容器 |
| Commands | down | 停止并移除所有容器、网络 |
| Commands | ps | 列出所有启动的容器 |
| Commands | logs | 查看指定容器的日志 |
| Commands | stop | 停止容器 |
| Commands | start | 启动容器 |
| Commands | restart | 重启容器 |
| Commands | top | 查看运行的进程 |
| Commands | exec | 在指定的运行中容器中执行命令 |