Docker的安装、打包和发布

本文从零开始介绍Docker安装,打包和发布,记录下中间的踩坑点和解决方法,包括

  • Ubuntu上Docker最便捷安装方式
  • 简单Web项目使用Docker从零开始的镜像基本打包流程
  • Docker本地发布失败时,使用Github工作流快速稳定的进行自动镜像发布

安装

Ubuntu 安装 Docker

安装命令:

  1. sudo apt install docker.io​ 安装命令​
  2. systemctl status docker​ 检查 Docker 运行状态,显示Active: active (running)​即是在正常运行
  3. sudo systemctl start docker​ 如果没有运行,使用当前命令运行 Docker 服务
  4. sudo systemctl enable docker​ 开机启动 Docker
  5. sudo docker version​ 查看 Docker 版本

测试命令:

sudo docker run hello-world​ 下载 Docker 测试镜像,并在容器内执行hello-world​样例程序

  • 如果成功运行显示Hello from Docker!​则标识安装成功,同时网络也正常
  • 如果提示拉取失败等网络错误,则需要参考打包一节中更换镜像源

非root用户运行Docker

1
2
3
4
5
6
7
8
# 改变docker权限控制
sudo groupadd docker
sudo usermod -aG docker $USER
# 重启电脑 或运行下面命令使改动生效
newgrp docker
# 测试效果
docker version
docker run hello-world

安装 Docker Compose:

最新版下载地址 github.com/docker/compose/releases

一键下载命令,其中v2.6.1替换为最新的版本号

1
2
3
4
5
6
# 下载并安装
sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 检查版本
docker-compose version

Win10 安装 Docker

直接从官网下载安装

安装后启动 Docker,仍需要通过命令行运行

打包

更换镜像源

由于国内特殊网络环境,直接拉取Docker很容易失败,故需更换镜像地址加速访问

推荐使用阿里源,需要注册阿里云账号,镜像地址

参考页面上的说明即可更换镜像地址

对于Ubuntu可使用如下命令

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

编写 Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

假设你的FastApi项目结构为

1
2
3
4
5
/root/of/project/
│ Dockerfile
│ requirements.txt
└─app
│ main.py

则可以参考下面的文件编写 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FROM python:3.9-slim    
# 拉取一个基础镜像,基于python:3.9-slim 相比于 python:3.9 更精简

# 2、将当前工作目录设置为 /code
# 这是放置 requirements.txt 文件和应用程序目录的地方
WORKDIR /code

# 3、先复制 requirements.txt 文件
# 由于这个文件不经常更改,Docker 会检测它并在这一步使用缓存,也为下一步启用缓存
COPY ./requirements.txt /code/requirements.txt

# 4、运行 pip 命令安装依赖项
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

# 5、复制 FastAPI 项目代码
COPY ./app /app

# 6、运行服务
CMD ["python", "/app/main.py"]
# 或者
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

打包和测试

  1. docker build -t demo:latest .​ 使用当前目录的Dockerfile进行打包,打包出名字为demo,标签为latest的镜像
  2. docker images​ 查看本地的镜像列表
  3. docker run -it -p 8000:8000 demo:latest​ 交互式测试运行镜像,并且进行端口转发, 运行后可以通过web访问
  4. docker run -d -p 8000:8000 demo:latest​ 后台运行镜像,会返回完整的镜像id
  5. docker ps -a​ 查看镜像的运行情况
  6. docker kill 容器ID​ 终止运行中的容器
  7. docker exec -it 容器ID /bin/bash​ 进入到容器内部
  8. docker rmi 镜像ID​ ​删除镜像
  9. docker rm 容器ID​ 删除容器

发布

打标签的命令, 可以给一个镜像打多个不同的标签

1
2
3
4
5
# 将 myimage:1.0 打一个新的标签 myimage:latest
docker tag myimage:1.0 myimage:latest

# 标签可以带项目名前缀 myrepo/,myrepo 换成 dockerhub的用户名,可以用于推送到dockerhub
docker tag myimage:1.0 myrepo/myimage:latest

本地导出

  • docker export 1e560fca3906 > demo-latest.tar​ 本地导出发布
  • docker import demo-latest.tar runoob/ubuntu:v4​ 本地导入

直接发布到 Docker Hub

首先进行登录和授权

  1. 打开 hub.docker.com 注册相应的账号
  2. 打开 Token管理页面 生成新的token,给予读写权限
  3. 本地执行命令docker login​ 然后输入账号和Token完成登录

之后将项目打上 username/repo​标签后,即可开始发布到镜像到repo

  • docker push username/repo​ 推送默认标签(latest)的镜像
  • docker push username/repo:v0.0.4​ 推送标签(v0.0.4)的镜像

网络良好的情况下,可以直接推送成功。

但是由于国内特殊网络环境,往往会一直失败,遇到EOF​等错误,因此可以使用Github的工作流来完成替代发布

使用Github的工作流完成自动发布

成品可以参考项目 simple-image-host

本节的目的为,配置好Action,后续每次推送格式为标签v1.0.0​时,可以自动打包镜像,然后发布标签为v1.0.0​的镜像以及更新标签为latest​的镜像。相比于手动发布,配置好后,后续发布操作简单,发布速度很快并且十分稳定。

  1. 首先将本地项目代码推送到Github
  2. 项目主页打开【Action】
  3. 搜索Docker选择【Docker image】开始配置
  4. 将如下配置文件复制粘贴到工作流配置中,保存并提交,注意其中的your_username/your_image_name​ 替换为自己的Docker Hub项目名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
name: Docker Image CI

on:
push:
tags:
- 'v*'

jobs:

build:

runs-on: ubuntu-latest
steps:
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: your_username/your_image_name
-
name: Checkout
uses: actions/checkout@v4
-
name: Set up QEMU
uses: docker/setup-qemu-action@v3
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
-
name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
  1. 将配置文件保存后,我们要配置secrets变量,以让github可以自动发布

  2. 打开页面【Settings】=>【Secrets and variables】=>【Actions】

    • 在【Repository secrets】新增变量DOCKERHUB_TOKEN​,值为在Docker Hub生成的Token
    • 在【Repository secrets】新增变量DOCKERHUB_USERNAME​,值为在Docker Hub的用户名
  3. 本地项目打标签git tag v1.0.0

  4. 推送标签到远程 git push --tags​ 或者 git push origin v1.0.0

到此大功告成!可以看到工作流成功开始运行

附上标签其他比较常用的操作命令

1
2
3
4
5
6
7
8
9
1、git tag --list 列出所有的标签
2、git tag <your_tag_name> 创建一个标签
3、git tag -a <your_tag_name> -m ‘your_tag_description’ 创建一个带有注释的标签
4、git show <your_tag_name> 查看标签信息
5、git ls-remote --tags origin 查看所有的远程标签及commit ID
6、git tag -d <your_tag_name> 删除一个标签
7、git push --delete origin <your_tag_name> 删除远程仓库的标签
8、git push origin <your_tag_name> 推送一个标签到远程
9、git push origin --tags 推送多个本地标签到远程

参考资料