Docker 入门教程

参考2小时搞定Docker 全程干货 基于CentOS7,感谢刘老师通俗易懂的教程

环境配置

只介绍基于 Debian 12 和 CentOS 7 的操作方法

Debian 12

Docker 从仓库安装的官方教程,结合 USTC 镜像的使用帮助,总结出以下方法

  1. 安装 apt 工具

    1
    2
    sudo apt update
    sudo apt install ca-certificates curl gnupg
  2. 添加 GPG key:

    1
    2
    3
    sudo install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    sudo chmod a+r /etc/apt/keyrings/docker.gpg
  3. 添加 USTC 源

    1
    2
    3
    4
    echo \
    "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.ustc.edu.cn/docker-ce/linux/debian \
    "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  4. 安装 Docker CE

    1
    2
    sudo apt-get update
    sudo apt-get install docker-ce
  5. 为 Docker 添加 sudo 权限

    1
    2
    3
    4
    5
    sudo groupadd docker  ## 添加 docker 用户组
    sudo gpasswd -a $USER docker ## 将登陆用户加入到 docker 用户组中
    newgrp docker ## 更新用户组
    sudo service docker restart ## 重启 docker
    docker ps ## 测试 docker 命令是否需要 sudo

CentOS 7

  1. 安装 CentOS 7 时选择基础设施服务器即可,不需要 GUI

  2. 安装 yum 工具

    1
    yum install -y yum-utils device-mapper-persistent-data lvm2 --skip-broken
  3. 替换阿里云镜像源,对于 CentOS 7,使用以下命令替换默认配置

    1
    2
    3
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  
    sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
    yum makecache fast
  4. 安装 Docker CE

    1
    yum install -y docker-ce
  5. Docker 使用中会涉及到各种端口,为了方便练手可以关闭防火墙,如果你的 Linux 在公网上,请跳过这一步

    1
    2
    3
    4
    ## 关闭防火墙
    systemctl stop firewalld
    ## 禁止开机启动防火墙
    systemctl disable firewalld
  6. 查看 docker 版本

    1
    docker -v

配置 Docker Hub 源

这里使用阿里云的镜像,可以注册或者支付宝等阿里系应用扫码登录,如果有别的选择请跳过,找到这段代码,直接在终端中运行即可

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

启动 Docker

1
2
3
systemctl start docker  ## 启动docker服务
systemctl stop docker ## 停止docker服务
systemctl restart docker ## 重启docker服务

查看容器日志

1
sudo docker logs -f 容器ID

基础知识

操作基础

通俗地说,镜像(image)是静态的环境,容器是镜像运行后的环境

image

  1. 访问 DockerHub 搜索镜像,https://hub.docker.com/,搜索 redis
    image

  2. 拉取镜像

    1
    docker pull redis
  3. 查看本地镜像

    1
    docker images
  4. 将镜像导出到磁盘

    1
    2
    3
    4
    5
    ## docker save -o 文件名称 镜像名称/ID
    docker save -o redis.tar redis

    ## 使用 --help 可以查看命令提示,例如查看 save 的提示
    docker save --help
  5. 删除本地镜像

    1
    2
    ## docker rmi 镜像名称/ID,通过 ID 可以删除指定镜像
    docker rmi redis:latest
  6. 导入镜像

    1
    2
    ## docker load -i 文件名称
    docker load -i redis.tar

容器操作

  • docker run​ 新建并启动容器
  • docker start/stop/pause/unpause​ 启动/停止/暂停/恢复容器
  • docker exec -it​ 进入容器执行命令
  • docker logs​ 查看容器运行日志
  • docker ps​ 查看运行中容器的状态
  • docker rm​ 删除指定容器

Nginx 容器示例

  1. 拉取 nginx 镜像

  2. 创建并启动容器

    1
    2
    3
    4
    ## --name:指定容器名称(任意指定)
    ## -p:宿主机端口:容器端口 将宿主机端口与容器端口映射(宿主机端口任意,容器端口一般固定)
    ## -d:后台运行容器
    docker run --name mynginx -d -p 80:80 nginx
  3. 查看容器

    1
    2
    3
    4
    ## 当前运行的容器
    docker ps
    ## 所有容器
    docker ps -a
  4. 访问宿主机的 IP:端口
    image

Redis 容器示例

  1. 拉取 redis 镜像

  2. 创建并启动容器

    1
    docker run --name myredis -d -p 6379:6379 redis
  3. 进入容器

    1
    2
    3
    ## -it: 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
    ## bash:进入容器后执行的命令
    docker exec -it myredis bash
  4. 进入容器后

    1
    2
    ## 使用 redis 客户端操作 redis
    redis-cli
  5. 以上命令可以合并为一条执行 docker exec -it myredis redis-cli

数据卷

  • 一个容器运行了一段时间,肯定会产生一些数据,比如日志、数据库数据、新
    改的配置文件等等,如果这些数据文件存放在容器中,当我们删除容器时,这
    些数据也会被随之删除
  • 在 docker 中,提供了一种存储数据的方法,叫做“数据卷”,可以达到数据共
    享的目的
  • 其实就是映射目录

基本概念

可以把“数据卷”Data Volumes 理解成“宿主机中的目录”,当把某个卷和
容器中的某个目录建立映射关系后,就相当于把宿主机中的某个目录和容器中的某
个目录建立了映射关系

image

  • 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便
  • 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作
  • 对数据卷的更新不会影响镜像,解耦应用和数据
  • 卷会一直存在,直到没有容器使用,可以安全地卸载它
  • 由命令创建的卷存在宿主机 /var/lib/docker/volumes

数据卷的操作

基本命令

数据卷(volume)操作的基本语法 docker volume [COMMAND]

create​ 创建一个 volume

inspect​ 显示一个或多个 volume 的信息

ls​ 列出所有的 volume

prune​ 删除未使用的 volume

rm​ 删除一个或多个指定的 volume

示例
  1. 创建数据卷:docker volume create testA

  2. 查看数据卷:docker volume ls

  3. 查看对应卷的详细信息:docker volume inspect testA

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [
    {
    "CreatedAt": "2023-07-24T18:19:11+08:00",
    "Driver": "local",
    "Labels": null,
    "Mountpoint": "/var/lib/docker/volumes/testA/_data",
    "Name": "testA",
    "Options": null,
    "Scope": "local"
    }
    ]
  4. 在 linux 的 docker 主机中创建一个卷时,其在宿主机对应的目录(挂载点)路径
    /var/lib/docker/volumes/卷名/_data

挂载卷
  1. 在创建容器时,可以通过 --volume​ 或 -v​ (数据卷:容器内目录)参数挂载一个数据卷到某个容器目录

    1
    2
    3
    ## 创建一个名为testAcon的容器,将testA卷映射到容器的/data目录中
    ## 如果卷映射的目录在容器中不存在时,会自动在容器中创建对应的目录
    docker run --name testAcon -v testA:/data -d redis
  2. 一个容器可以使用多个卷,只需要多次使用-v 选项指定即可

    1
    2
    3
    ## 当指定的卷不存在时,docker 会自动创建对应的卷
    ## 命令中的 testB 数据卷会被自动创建
    docker run --name testBcon -v testA:/data -v testB:/var/log -d redis

在使用数据卷相关的命令时,可以直接使用新的卷名和路径,对于不存在的项目,docker 会自动创建

绑定挂载(自定义宿主机目录)

通常,使用绑定挂载就是为了将宿主机中的配置文件挂载到容器中,如果是整
个目录的数据,建议使用卷,卷只能映射目录,不能映射文件

  • 前面创建的数据卷都存放在 /var/lib/docker/volumes​ 目录中,这个目录是固定
    的,它们都能被 docker volume​ 命令管理

  • docker 还有一种映射宿主机目录的方法,称之为“绑定挂载”,绑定
    挂载能够将指定的宿主机目录挂载到容器中,只需要将卷名替换成宿主机上的目
    录路径即可

    1
    2
    ## 将宿主机的 /root/test1 目录映射到容器的 /data1 目录中
    docker run -d --name testAcon -v /root/test1:/data1 redis
  • 官方建议使用卷,而不是绑定挂载,但是绑定挂载可以直接将宿主机中的文件(非目录)直接挂载到容器中,比如

    1
    2
    ## 将宿主机中的 /etc/localtime 文件映射到容器中的 /etc/localtime 文件
    docker run -d --name testAcon -v /etc/localtime:/etc/localtime alpine
  • 绑定挂载不会生成任何卷,它直接将指定的宿主机目录映射到容器中,所以 docker volume​ 命令无法查看或管理到绑定挂载的路径

以下内容很快更新


创建自定义镜像

镜像内部结构

通过 Dockerfile 构建镜像

制作 Java 应用镜像示例

Docker Compose


Docker 入门教程
https://1doublehelix.github.io/basic-docker-knowledge
作者
Feizhong
发布于
2023年8月29日
许可协议