Docker 环境和 compose 的简要安装

Docker 环境和 compose 的简要安装
Photo by Ian Taylor / Unsplash

本文将简单的介绍 Docker 运行环境的安装,以及通过 compose  进行简单的编排,定义和运行多个容器。不会涉及 Docker 原理和概念等。

什么是 Docker

Docker 是 2008 由 Kamel Founadi, Solomon Hykes, and Sebastien Pahl 在巴黎创立的初创公司 dotCloud 发起;经过一系列并购后于 2013 年 9 月 19 改名为 Docker。
Docker 其实并不是全新的技术,它脱胎于 Linux 的 Container,使用 Go 语言通过对进程的封装隔离,构建基于操作系统层面的轻量级虚拟化。所以它下面这些特点:

  • 效率更高,速度更快: 因为不用像传统虚拟机,需要完全进行硬件的仿真独立内核。Docker 更加的轻量级,只是进程的隔离。所以资源占用更少利用率更高。由于它使用宿主机的内核,不用再启动内核,所以启动时间也更快。
  • 交付物标准化,快速迁移: 提供了除内核外的完整运行时,在多平台下由 Docker 保证了执行环境的一致,所以可以进行快速的迁移到其它平台。这是 Docker 这个单词本意「码头工人」的隐喻,把应用打包成具有标准规格的集装箱,Docker 的图标也有所体现。
  • 节省空间,增量修改: 由于 Docker 使用多层级的镜像,容器间的多个相同的镜像可以复用。同时由于镜像是不可修改的,所以修改都是基于上层进行,且之前编译过程中也可复用,只需处理修改的增量部分。

安装 Docker

官方提供了脚本安装:可以非常快速、简单的安装于开发环境,但是不建议在生产环境中使用。生产环境可以使用软件源安装或者直接软件包安装。

脚本安装

脚本安装非常的方便:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

可以增加 DRY_RUN=1 选项来学习脚本每步的执行。

DRY_RUN=1 sh get-docker.sh

软件源安装

更新和安装软件

安装完成后使 apt 能支持 HTTPS

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

添加 GPG Key

Ubuntu
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Debian
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

设置软件源

根据 Linux 的发行版选择对应的软件源

Ubuntu
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Debian
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
使用国内镜像安装 Docker

为加快国内的安装速度,可换成国内镜像,推荐中科大的镜像( https://mirrors.ustc.edu.cn/ )。如果已经执行上面的命令,可直接编辑文件  /etc/apt/sources.list.d/docker.list,将软件源中的 download.docker.com 替换成 mirrors.ustc.edu.cn/docker-ce。如果未执行以上命令,使用以下脚本进行安装:

Ubutnu
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Debian
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.ustc.edu.cn/docker-ce/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

如果在执行 apt-get update 的时候提示 GPG error,可能是 key 文件的权限造成的,可尝试执行 sudo chmod a+r /etc/apt/keyrings/docker.gpg

验证安装

sudo docker run hello-world

配置 Docker(可选)

非 Root 身份运行

默认 Docker 以也管理员身份运行,为了安全切换为非 root 身份运行。

sudo usermod -aG docker ${username}

${username} 替换成当前登录用户名,执行后重启,就能以当前用户执行 docker 命令了。

镜像加速

为了加速对 Docker 镜像的拉取,使用国内源替换。使用 systemd 的系统(Ubuntu 16.04+、Debian 8+、CentOS 7), 在配置文件 /etc/docker/daemon.json (如果没有手动创建该文件)中加入:

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}

执行以下命令重启 Docker:

sudo systemctl restart docker

重启完成后使用 docker info 查看是否包含以下内容,如果包含说明配置成功

Registry Mirrors:
    https://docker.mirrors.ustc.edu.cn/

Docker 命令

命令 描述
docker build 通过 Dockfile 编译镜像
docker cp 在容器和本地间复制文件
docker create 创建新容器
docker exec 在运行的容器中执行命令
docker kill 结束 1 个或多个容器
docker logs 获取容器的日志
docker network 管理网络
docker ps 列出所有容器
docker pull 拉取镜像
docker restart 重启 1 个或多个容器
docker rm 移动 1 个或多个容器
docker rmi 移除 1 个或多个镜像
docker run 在新容器中运行命令
docker search Docker Hub 中搜索镜像
docker start 开始 1 个或多个停止的容器
docker stop 停止 1 个或多个运行中的容器

compose 使用

可通过 Docker Compose 快速的对 Docker 容器进行编排,老版本的 docker-compose 需要手动下载一个可执行文件,最新版已经通过上面的 docker-compose-plugin 进行安装。

compose.yaml 文件

先看下 Ghost 的 Demo:

services:

  ghost:
    image: ghost:4-alpine
	container_name: ghost
    restart: always
    ports:
      - 8080:2368
    environment:
      database__client: mysql
      database__connection__host: db
      database__connection__user: root
      database__connection__password: example
      database__connection__database: ghost
      url: http://localhost:8080
	depends_on:
	  - db

  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - mysql_data:/var/lib/mysql
	  

可以看到里面有两个服务 ghostdb,可通过名字进行相互网络访问,如在 ghost 中通过 db 访问数据库 database__connection__host: db

常用参数

参数 描述
image 镜像的名称或者镜像 ID,如果本地不存在从远程拉取。每个服务 imagebuild 必须要有其中一个指定镜像。
container_name 指定容器的名称,方便后续直接使用容器名称进行操作。
restart 容器退出后的重启策略,always 始终重启。
ports 把容器内的端口映射到宿主机,- 8080:2368 把容器 2368 映射到宿主机的 8080 端口,可在宿主机通过 8080 端口进行访问。
depends_on 容器依赖,这里会先启动 db 再启动 ghost 服务。
environment 配置环境变量
volumes 数据卷所挂载路径设置,- ./data:/var/lib/mysql 把宿主机 ./data 映射到容器的 /var/lib/mysql

docker compose

编写好 compose.yaml 文件后,进入对应目录后,就可以使用对应的命令执行。新版使用 docker compose 替换老版本的 docker-compose,常用命令:

常用命令

命令 描述
docker compose down 停止并移动容器和网络
docker compose exec 在运行的容器中执行命令
docker compose logs 查看容器的日志
docker compose ps 列出当前项目的容器
docker compose pull 拉取最新容器,常用于镜像升级
docker compose start 开始一个存在的服务
docker compose stop 停止一个服务
docker compose up 创建并启动容器,加 -d 后可在后台启动

附录

  1. Docker - 从入门到实战
  2. Docker, Inc.(wiki)