Skip to content

docker的了解、安装与使用笔记

docker 基本了解与使用

镜像:Docker 镜像(lmage),就相当于是 一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

容器(Container): 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

仓库(Repository): 仓库可看成一个代码控制中心,用来保存镜像。

镜像和容器的关系: 我们创建容器就必须要有镜像

docker 安装

请根据 docker 官网的信息进行安装:https://www.docker.com/

安装后记得执行这条命令让 docker 能够开机自启:

bash
sudo systemctl start docker
sudo systemctl enable docker

如果是 debian,可以去这里按照教程按照:Install Docker Engine on Debian | Docker Docs

docker 服务相关命令

  • 启动 docker 服务
bash
sudo systemctl start docker
  • 停止 docker 服务
bash
sudo systemctl stop docker
  • 重启 docker 服务
bash
sudo systemctl restart docker
  • 查看 docker 服务状态
bash
sudo systemctl status docker
  • 设置 docker 开机自启服务(如果是服务器的话建议开启)
bash
sudo systemctl enable docker
  • 其他相关命令 docker info 查看 docker 相关信息docker volume ls 查看 volume 列表docker network ls 查看网络列表

修改相关配置文件

修改镜像源

由于在国内访问 docker 仓库速度太慢,这时我们需要修改为国内的镜像源地址。 常用的镜像源:

https://github.com/DaoCloud/public-image-mirror

https://xuanyuan.cloud/

编辑 /etc/docker/daemon.json 这个文件,如果不存在请自行创建。加入以下内容(这里我以中国科技大学镜像站来作为演示):

json
{
  "registry-mirrors": ["https://docker.m.daocloud.io"]
}

然后重启 Docker 即可:

bash
sudo systemctl daemon-reload
sudo systemctl restart docker

在命令行执行 docker info ,如果从结果中看到了如下内容,说明配置成功。

Registry Mirrors:
    https://docker.m.daocloud.io

更换文件存储位置

默认情况下 docker pull images 存储在/var/lib/docker/ 目录下,但因为 docker images 的大小一般较大,安装较多容易导致我们这个位置的存储空间不足,所以我们需要将其改到其他目录下。(一般有多个分区的才需要修改,如果是整个 linux 系统就存在一个分区,也就是"/",那么就可以不用更改了)

编辑 /etc/docker/daemon.json 这个文件,在修改镜像源的基础上加入如下配置:

json
{
  "registry-mirrors": ["https://docker.m.daocloud.io"],
  "data-root": "/home/var-lib-docker/docker"
}

我们这里更改镜像位置到了 /home/var-lib-docker/docker 目录下,大家可以按照自己的实际位置修改。

然后重启 Docker 即可:

bash
sudo systemctl daemon-reload
sudo systemctl restart docker

再执行命令 docker info ,如果从结果中看到了如下内容,说明配置成功。

Docker Root Dir: /home/var-lib-docker/docker

docker 镜像和容器的相关命令

这是最重要的部分,我们用得最多。

更多更详细命令请看菜鸟教程:docker菜鸟

镜像相关命令

查看镜像

bash
docker images
docker images -q  # 查看所有镜像id

查看我们本机安装的镜像

搜索镜像

我们有两种方式搜索我们需要的镜像,一种是用代码方式搜索,如下:

bash
docker search <images>

images 填入镜像名。

OFFICIAL 标签下为 [ok] 的为官方镜像,我们一般都使用这个。

另一种方式是在 dockerhub 中搜索,网站:docker

拉取镜像

bash
docker pull <images>

这里的 images 填入镜像名,默认安装 latest 版本,也就是最新的版本,当然我们也可以指定版本安装,如下:

bash
docker pull redis:3.2

安装 redis 的 3.2 版本。

删除镜像

bash
docker rmi id

这里的 id 是 docker images 的 id,我们可以通过查看镜像命令看到 id。

容器相关命令

查看容器

查看正在运行的容器:

bash
docker ps

查看正在运行的和已经关闭的容器:

bash
docker ps -a

创建容器

首先要保证我们电脑里要有 images 才能创建容器。

bash
docker run ... <images> [command]

这里的 ... 代表着还有其他的参数,几个常用参数介绍如下:

  • - i :保持一直运行
  • -d :后台运行
  • - t :给容器分配一个伪终端
  • -P : 随机端口映射,容器内部端口随机映射到主机的端口
  • -p : 指定端口映射,格式为:主机(宿主)端口:容器端口
  • --name=c1 :给容器一个名字,这里我们把名字设置为 c1

[command] 是创建容器时的初始化指令,可以不写。

如下,我们这样创建一个 centos7 的容器,并进入其终端:

bash
docker run -it --name=cen centos:7 /bin/bash

进入与退出容器

创建后才能进入容器。

bash
docker exec -it <name> <command>

name 是我们上面创建容器时所指定的, command 是初始化命令。

退出容器:

bash
exit

注意: 如果创建容器时没有加 -d 参数,那么退出后容器将关闭,加了的话就不会关闭。

启动容器

bash
docker start <name>

停止容器

bash
docker stop <name>

删除容器

bash
docker rm <name/id>

注意: 我们只能删除已经停止的容器,正在运行的容器不允许删除。

查看容器信息

bash
docker inspect <name>

这里的信息很多,不太方便记录与讲解,自己实际去看才能有所体会。

docker 容器的数据卷

对于 docker 容器有这几个特性:

  • docker 容器删除后数据也消除
  • docker 容器与外部机器之间不能相互传输文件,必须要经过宿主机(也就是 docker 容器所在的那个机器)

为了解决这些问题,我们引入了数据卷,那什么是数据卷呢?

  • 数据卷是宿主机中的一个目录,想让其成为数据卷就要将其挂载到 docker 中
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以同时挂载多个数据卷

数据卷的作用

  • 容器数据持久化
  • 外部机器和容器间接通
  • 容器之间数据交换

配置数据卷

创建容器时,使用 -v 参数设置数据卷

bash
docker ... -v 宿主机目录/文件:容器内目录/文件

注意事项:

  • 目录必须为绝对路径
  • 如果目录不存在则会自动创建
  • 可以挂载多个数据卷

案例:MySQL 部署

  1. 拉取 MySQL 的镜像
bash
docker pull mysql:5.6
  1. 在/root 目录下创建 mysql 目录用于存储 mysql 数据信息
bash
mkdir ~/mysql
cd ~/mysql
  1. 创建容器,设置端口映射、目录映射
bash
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456! \
mysql:5.6

参数说明:

  • -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。由于 docker 容器不能访问外部数据,所以我们需要将 MySQL 的 3306 端口映射到主机的 3307 端口上。
  • -v $PWD/conf:/etc/mysql/conf.d:将宿主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
  • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
  • -v $PWD/data:/var/lib/mysql :将宿主机当前目录下的 data 目录挂载到容器的 /var/lib/mysql 。数据目录
  • -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

dockerfile

DockerFile 是用来构建 Docker 镜像的构建文件,是由一系列命令参数构成的脚本。

linux 的系统组成

docker 一般是基于 linux 或 windows 安装的,而且内部组成有些类似 linux,所以我们先来了解下 Linux 的系统组成。

Linux 文件系统由 bootfs 和 rootfs 两部分组成

  • bootfs: 包含 bootloader (引导加载程序) 和 kernel (内核)
  • rootfs: root 文件系统,包含的就是典型 Linux 系统中的/dev, /proc,/bin,/etc 等标准目录和文件
  • 不同的 linux 发行版,bootfs 基本一样,而 rootfs 不同,如 ubuntu , centos 等

Docker 镜像原理

  • Docker 镜像是由特殊的文件系统叠加而成
  • 最底端是 bootfs,并使用宿主机的 bootfs
  • 第二层是 root 文件系统 rootfs,称为 base image
  • 然后再往上可以叠加其他的镜像文件
  • 统一文件系统 (Union File System) 技术能够将不同的 层整合成一个文件系统,为这些层提供了一个统一的视角 ,这样就隐藏了多层的存在,在用户的角度看来,只存在 一个文件系统。
  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称 为父镜像,最底部的镜像成为基础镜像。
  • 当从一个镜像启动容器时,Docker 会在最顶层加载一个读、写文件系统作为容器

由此可知 Docker 镜像的本质是一个分层的文件系统,各层之间的镜像文件可以复用 以节约空间。

Docker 镜像制作

1. 容器转为镜像

这种是基于容器来制作的,经常是把一个他人的镜像修改后用 docker 重新打包而成的。 注意: 我们挂载的容器卷在制作镜像时会被忽略,也就是镜像中不会存在我们挂载的目录。

bash
docker commit 容器id 镜像名称:版本号

当转为镜像后我们不方便传播到其他计算机上,所以我们要对其进行压缩。压缩完成后默认在当前目录生成文件。

bash
docker save -o 压缩文件名称.tar 镜像名称:版本号

现在我们可以把这个镜像发送给其他的地方,使用以下命令就可以还原出我们的镜像了。

bash
docker load -i 压缩文件

2. dockerfile

我们一般使用 dockerfile 来制作我们的镜像,而容器转镜像技术不太常用。

  • Dockerfile 是一个文本文件
  • 包含了一条条的指令
  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
  • 对于开发人员: 可以为开发团队提供一个完全一致的开发环境
  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过 Dockerfile 文件 构建一个新的镜像开始工作了
  • 对于运维人员:在部署时,可以实现应用的无缝移植

学习这个的最简单方法就是去dockerhub上看一下他们是怎么写的,在 docker 里找一个项目,让后在这个页面点进去就可以查看 dockerfile 文件了。

一些 dockerfile 的关键字
关键字作用备注
FROM指定父镜像指定 dockerfile 基于哪个 image 构建
MAINTAINER作者信息用来标明这个 dockerfile 谁写的
LABEL标签用来标明 dockerfile 的标签 可以使用 Label 代替 Maintainer 最终都是在 docker image 基本信息中可以查看
RUN执行命令执行一段命令,默认是 /bin/sh 格式: RUN command 或者 RUN ["command", "param1","param2"]
CMD容器启动命令提供启动容器时候的默认命令,和 ENTRYPOINT 配合使用。格式 CMD command param1 param2 或者 CMD [“command” , “param1”,”param2”]
ENTRYPOINT入口一般在制作一些执行就关闭的容器中会使用
COPY复制文件build 的时候复制文件到 image 中
ADD添加文件build 的时候添加文件到 image 中,不仅仅局限于当前 build 上下文,也可以来源于远程服务
ENV环境变量指定 build 时候的环境变量,可以在启动的容器的时候通过-e 覆盖,格式 ENV name=value
ARG构建参数构建参数 只在构建的时候使用的参数 如果有 ENV 那么 ENV 的相同名字的值始终覆盖 arg 的参数
VOLUME定义外部可以挂载的数据卷指定 build 的 image 那些目录可以启动的时候挂载到文件系统中,启动容器的时候使用 -v 绑定,格式 VOLUME [“目录”]
EXPOSE暴露端口定义容器运行的时候监听的端口 启动容器的使用-p 来绑定暴露端口
WORKDIR工作目录指定容器内部的工作目录 如果没有创建则自动创建 如果指定 / 使用的是绝对地址 如果不是/开头那么是在上一条 workdir 的路径的相对路径
USER指定执行用户指定 build 或者启动的时候 用户 在 RUN CMD ENTRYPONT 执行的时候的用户
HEALTHCHECK健康检查指定监测当前容器的健康监测的命令,基本上没用,因为很多时候应用本身有健康监测机制
ONBUILD触发器当存在 ONBUILD 关键字的镜像作为基础镜像的时候,当执行 FROM 完成之后,会执行 ONBUILD 的命令,但是不影响当前镜像用处也不怎么大
STOPSIGNAL发送信号量到宿主机该 STOPSIGNAL 指令设置将发送到容器的系统调用信号以退出
SHELL指定执行脚本的 shell指定 RUN CMD ENTRYPOINT 执行命令的时候使用的 shell
用 dockerfile 构建镜像的方法

首先要编写好 dockerfile 文件(dockerfile 文件没有后缀,命名为Dockerfile),然后通过以下命令构建:

bash
docker build -f dockerfile文件路径 -t 镜像名称:版本 .

docker compose

Docker Compose 是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建 ,启动和停止。使用步骤:

  1. 利用 Dockerfile 定义运行环境镜像
  2. 使用 docker-compose.yml 定义组成应用的各服务
  3. 运行 docker-compose up 启动应用

Docker Compose 安装使用

Compose 目前已经完全支持 Linux、Mac OS 和 Windows,在我们安装 Compose 之前,需要先安装 Docker。下面我们以编译好的二进制包方式安装在 Linux 系统中。

具体可以查看 docker 官方的安装文档:docker-compose

bash
#这是linux的安装脚本
curl -SL https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose --version

如果有版本号输出则安装成功

卸载 Docker Compose

bash
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose

运行 docker compose 文件

在有 docker-compose.yml 的文件的目录下,执行

bash
docker-compose up -d

-d 指的是让容器后台运行。 docker-compose 中的很多命令与 docker 中的一样,大家可以自己去研究研究。

案例

使用docker compose编排nginx+springboot项目

创建docker-compose目录

bash
mkdir ~/docker-compose
cd ~/docker-compose

编写 docker-compose.yml 文件,这是一个固定的文件名。

bash
version: '3'
services:
  nginx:
   image: nginx
   ports:
    - 80:80
   links:
    - app
   volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d
  app:
    image: app
    expose:
      - "8080"

因为上面规定了数据卷,所以这里要创建 ./nginx/conf.d 目录

bash
mkdir -p ./nginx/conf.d

./nginx/conf.d 目录下编写 demo.conf 文件。这是nginx的配置文件。

d
server {
    listen 80;
    access_log off;

    location / {
        proxy_pass http://app:8080;
    }

}

在 ~/docker-compose 目录下使用 docker-compose 启动容器

bash
docker-compose up -d

Last updated: