Docker入门

181 阅读7分钟

Docker概述

Docker是基于LXC实现的一个应用容器引擎,Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中,然后发布到任何流行的Linux机器上。Docker容器性能开销极低,并且是完全使用沙箱机制,相互隔离的。

虚拟化技术

虚拟化是一种硬件资源管理技术,它可以将各种实体资源抽象后再分割,从而打破物理结构的限制,提高了硬件资源的利用率。常见的虚拟化技术有虚拟机和Docker容器,只不过二者基于不同的层面进行虚拟化。Docker属于操作系统层虚拟化,虚拟机则属于硬件层虚拟化。

虚拟机与Docker对比

Docker和虚拟机都使用了虚拟化技术,达到了资源隔离的目的。但是Docker容器是基于软件虚拟化,虚拟机是基于硬件虚拟化。

基本概念

镜像:Docker镜像提供容器运行时所需的程序、库、资源、配置等文件。

容器:镜像是静态的定义,容器是镜像运行时的实体。镜像和容器的关系,就像是面向对象程序中的类和对象,镜像是面向对象程序中的类,而容器则是类的实例对象。

仓库:镜像仓库是Docker用来集中存放镜像文件的地方,类似于代码仓库。

安装Docker

  1. 更新yum

sudo yum update

  1. 安装Docker所需的依赖包

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

  1. 设置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

  1. 安装Docker

以下命令二选一,安装最新版本或安装指定版本,推荐安装手动指定的稳定版本。
yum install -y docker-ce
yum install -y docker-ce-25.0.5 docker-ce-cli-25.0.5 containerd.io

  1. 启动Docker

systemctl start docker

  1. 设置开机启动Docker

systemctl enable docker

  1. 重启Docker

systemctl restart docker

  1. 卸载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)
  1. 创建启动c3数据卷容器,使用-v 参数设置数据卷

docker run -it --name=c3 -v /volume centos :7 /bin/bash

  1. 创建启动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参数是指定镜像的名称(repositorytag
/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的集合,是逻辑概念
Commandsup创建并启动所有service容器
Commandsdown停止并移除所有容器、网络
Commandsps列出所有启动的容器
Commandslogs查看指定容器的日志
Commandsstop停止容器
Commandsstart启动容器
Commandsrestart重启容器
Commandstop查看运行的进程
Commandsexec在指定的运行中容器中执行命令