Docker 环境和 compose 的简要安装
本文将简单的介绍 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
可以看到里面有两个服务 ghost
和 db
,可通过名字进行相互网络访问,如在 ghost 中通过 db
访问数据库 database__connection__host: db
。
常用参数
参数 | 描述 | |
---|---|---|
image |
镜像的名称或者镜像 ID,如果本地不存在从远程拉取。每个服务 image 和 build 必须要有其中一个指定镜像。 |
|
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 后可在后台启动 |