Featured image of post Docker学习

Docker学习

前言

由于上次不小心执行rm -rf /*导致了我的电脑焕然一新()

之后一直在尝试重新搭建博客,然而由于放弃了原有的Hexo选择了Hugo,导致进展一直不甚顺利

不过在经过多次尝试和调整之后,新的博客也是搭好了,后面可以正常更新了。

虽然还有一些问题没处理好,但是大体记录学习过程的目的还是能达到的,小问题就暂且按下不表吧()

Docker学习

关于Docker

众所周知Docker是一个容器引擎,性能很好。

详细了解:

Docker

Docker 教程

Debian Docker 安装

Docker 支持以下的 64 位 Debian 版本:

  • Debian Bookworm 12 (稳定版)
  • Debian Bullseye 11 (旧稳定版)

支持的架构包括 x86_64(amd64)、armhf、arm64 和 ppc64le。

卸载旧版本

如果你之前安装过 Docker Engine 之前,你需要卸载旧版本,避免冲突:

1
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

使用官方安装脚本自动安装

安装命令如下:

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

手动安装(推荐)

1. 更新软件包

首先,更新现有的软件包和包缓存:

1
2
sudo apt update
sudo apt upgrade

2. 安装依赖包

安装一些需要的依赖包,这些包允许 apt 使用 HTTPS 协议来访问 Docker 仓库:

1
sudo apt install apt-transport-https ca-certificates curl software-properties-common

3. 添加 Docker 官方 GPG 密钥

使用下面的命令来添加 Docker 官方的 GPG 密钥:

1
2
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

4. 添加 Docker 仓库

添加 Docker 官方的 APT 软件源:

1
2
3
4
5
6
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新
sudo apt-get update

5. 更新 APT 软件包缓存

添加仓库后,更新 APT 包索引:

1
sudo apt update

确保你现在从 Docker 官方仓库安装 Docker 而不是 Debian 默认仓库:

1
apt-cache policy docker-ce

你应该看到它指向 https://download.docker.com/,确保这就是官方的 Docker 仓库。

6. 安装 Docker

现在,你可以安装 Docker:

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

7. 启动并验证 Docker

启动 Docker 并设置为开机自启:

1
2
sudo systemctl start docker
sudo systemctl enable docker

你可以使用以下命令来验证 Docker 是否安装成功:

1
sudo docker --version

运行以下测试命令确保 Docker 正常工作:

1
sudo docker run hello-world

卸载 docker

删除安装包:

1
sudo apt-get purge docker-ce

删除镜像、容器、配置文件等内容:

1
sudo rm -rf /var/lib/docker

Docker 基本命令

这里记录一下Docker基本命令,方便查(其实感觉查菜鸟教程更快一点() )

命令 功能 示例
docker run 启动一个新的容器并运行命令 docker run -d ubuntu
docker ps 列出当前正在运行的容器 docker ps
docker ps -a 列出所有容器(包括已停止的容器) docker ps -a
docker build 使用 Dockerfile 构建镜像 docker build -t my-image .
docker images 列出本地存储的所有镜像 docker images
docker pull 从 Docker 仓库拉取镜像 docker pull ubuntu
docker push 将镜像推送到 Docker 仓库 docker push my-image
docker exec 在运行的容器中执行命令 docker exec -it container_name bash
docker stop 停止一个或多个容器 docker stop container_name
docker start 启动已停止的容器 docker start container_name
docker restart 重启一个容器 docker restart container_name
docker rm 删除一个或多个容器 docker rm container_name
docker rmi 删除一个或多个镜像 docker rmi my-image
docker logs 查看容器的日志 docker logs container_name
docker inspect 获取容器或镜像的详细信息 docker inspect container_name
docker exec -it 进入容器的交互式终端 docker exec -it container_name /bin/bash
docker network ls 列出所有 Docker 网络 docker network ls
docker volume ls 列出所有 Docker 卷 docker volume ls
docker-compose up 启动多容器应用(从 docker-compose.yml 文件) docker-compose up
docker-compose down 停止并删除由 docker-compose 启动的容器、网络等 docker-compose down
docker info 显示 Docker 系统的详细信息 docker info
docker version 显示 Docker 客户端和守护进程的版本信息 docker version
docker stats 显示容器的实时资源使用情况 docker stats
docker login 登录 Docker 仓库 docker login
docker logout 登出 Docker 仓库 docker logout

Docker 镜像设置

由于一些原因,国内无法直连Docker官方仓库,原本的镜像站现在也都无法使用了,现在只剩一部分个人搭的镜像站可以使用,因此请经常检查自己的Docker镜像是否还能用

目前国内可用Docker镜像源汇总(截至2025年3月)

配置方式:

临时使用:

直接使用:

直接用镜像域名拼接上官方镜像名。例如:要拉取 istio/distroless,可以这样写:

1
docker pull docker-0.unsee.tech/istio/distroless

长久有效:

以下命令在Debian 12.5,Ubuntu 16.04+适用

修改文件 /etc/docker/daemon.json(如果不存在则需要创建创建,注意不要写入中文,要带 https://),并重启服务。

1
2
# 创建目录
	sudo mkdir -p /etc/docker
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 写入配置文件
	sudo nano /etc/docker/daemon.json
或   sudo vi /etc/docker/daemon.json
# 写入下面的	
	{
	    "registry-mirrors": [
	    	"https://docker-0.unsee.tech",
	        "https://docker-cf.registry.cyou",
	        "https://docker.1panel.live"
	    ]
	}
	
# 重启docker服务
	sudo systemctl daemon-reload && sudo systemctl restart docker

使用docker pull 拉取镜像进行测试

Docker file

什么是 Dockerfile?

Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。

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

通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义的镜像。

例如:

 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
42
43
44
45
46
FROM golang:1.18-alpine AS builder

COPY . /app
RUN mkdir /out
WORKDIR /app
RUN go env -w GO111MODULE=on \
    && go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct \
    && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /out/main .
RUN cp -r /app/assets /app/views -t /out

FROM centos:7

COPY --from=builder /out /app

RUN chmod +x /usr/bin/curl \
    && rm -rf /etc/yum.repos.d/*.repo \
    && curl -k -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \
    && yum --exclude=kernel* update -y \
    && yum install -y epel-release \
    && rm -rf /etc/yum.repos.d/epel.repo \
    && curl -k -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo \
    && yum groupinstall -y "Development Tools" \
    && yum install -y gcc openssl-devel bzip2-devel libffi-devel zlib-devel make wget \
    && cd /usr/src \
    && curl -k -o Python-3.10.4.tgz https://mirrors.huaweicloud.com/python/3.10.4/Python-3.10.4.tgz \
    && tar xzf Python-3.10.4.tgz \
    && cd Python-3.10.4 \
    && ./configure --enable-optimizations \
    && make altinstall \
    && rm -f /usr/src/Python-3.10.4.tgz \
    && ln -s /usr/local/bin/python3.10 /usr/bin/python3 \
    && yum clean all \
    && mkdir -p /home/John \
    && chmod -R 755 /home/John


COPY shell/* /home/John/
COPY start.sh /app/start.sh

RUN chmod +x /home/John/shell.py

WORKDIR /app

EXPOSE 8000

CMD ["/bin/bash", "/app/start.sh"]

基础知识

  • 每个保留关键字(指令)都必须是大写字母
  • 执行从上到下顺序执行
  • #表示注释
  • 每一个指令都会创建提交一个新的镜像层
  • Dockerfile:是定义了构建镜像文件的源代码,能够构建镜像文件
  • Docker Images:通过DockerFile构建生成的镜像,最终发布和运行的产品
  • Docker Container:容器就是镜像运行起来提供服务的

Dockerfile的指令

 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
#指定基础镜像,一切从这里构建
FROM
 
#镜像是谁写的,姓名+邮箱
MAINTAINER
 
#镜像构建运行时需要运行的命令
RUN
 
#添加的内容
ADD
 
#指定镜像的工作目录
WORKDIR
 
#指定挂载的容器卷
VOLUME
 
#指定暴露的端口
EXPOSE
 
#指定容器启动时要运行的命令,只有最后一个会生效,可被替代
CMD
 
#指定容器启动时要运行的命令,可以追加命令
ENTRYPOINT
 
#当构建一个被继承的DockerFile,这个时候就会运行ONBUILD指令
ONBUILD
 
#类似ADD,将文件拷贝进镜像中
COPY
 
#构建的时候设置环境变量
ENV

Docker Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

注意:安装docker的同时,已经安装了Docker compose V2,无需再另外安装 Docker compose V1 ;Docker compose V2的命令以docker compose开头,如docker compose up

Docker-compose.yml

Dockerfile让容器在任何地方运行,但如果要运行多个容器就十分麻烦,这就需要使用docker-compose.yml文件。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:8000" # 可在此处修改映射到宿主机的端口
    environment:
      FLAG: "ISCC{cl1mb3d_p3ngl41_sh4d0w}"  # 可在此处动态修改FLAG值
    command: ["/home/John/.bashrc",  "/app/start.sh"]

两个概念

  • services(服务):容器、应用(mysql、nginx…)
  • project(项目):一组关联的容器

Docker compose常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
up	         启动容器,终端运行
images	     列出镜像
down	     停止和删除容器、网络、卷、镜像
start	     启动项目中容器,后台运行
logs	     查看项目中容器日志
stop	     停止项目中容器
restart	     重启项目中容器
ps           查看启动的容器
 
#选项如下
-f file      指定Compose模板文件,默认为docker-compose.yml,可以多次指定
-p project   指定项目名称,默认将使用所在目录名称作为项目名
-d	         后台运行容器

requirements.txt

有时候可能会遇见使用requirements.txt来存储依赖的情况,这个不必多言()

Python项目依赖,生成requirements.txt 有两种方法

1、进入需要生成文件的目录,执行

1
pip freeze > requirements.txt

,此方法会包含环境所有的依赖包。

直接使用此命令,会把当前共用python环境的所有包都写进去,这些不必要的。可以在目标目录下面先pipenv shell,进入pipenv环境,再用上面的命令,产生的requirements.txt 就只包含虚拟环境的依赖项。

2、pip install pipreqs

进入需要生成文件的目录执行: pipreqs ./ (或者直接 pipreqs D:\test(实际路径))

在此时可能会遇见

UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 776: illegal multibyte sequence

这个错误.

解决方法:指定编码格式 pipreqs ./ –encoding=utf8

如果要安装requirements.txt中的类库内容,那么你可以执行:

1
 pip install -r requirements.txt

在dockerfile里就是

1
 RUN pipe install -r requirements.txt

参考:

Docker学习笔记——DockerFile

Docker学习笔记——Docker Compose

docker部署,生成依赖项清单requirements.txt

Licensed under CC BY-NC-SA 4.0
Build by Oight
使用 Hugo 构建
主题 StackJimmy 设计