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 之前,你需要卸载旧版本,避免冲突:

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

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

安装命令如下:

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

手动安装(推荐)

1. 更新软件包

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

sudo apt update
sudo apt upgrade

2. 安装依赖包

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

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

3. 添加 Docker 官方 GPG 密钥

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

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 软件源:

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 包索引:

sudo apt update

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

apt-cache policy docker-ce

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

6. 安装 Docker

现在,你可以安装 Docker:

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

7. 启动并验证 Docker

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

sudo systemctl start docker
sudo systemctl enable docker

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

sudo docker --version

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

sudo docker run hello-world

卸载 docker

删除安装包:

sudo apt-get purge docker-ce

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

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,可以这样写:

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

长久有效:

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

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

# 创建目录
	sudo mkdir -p /etc/docker
# 写入配置文件
	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 构建一个自定义的镜像。

例如:

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的指令

#指定基础镜像,一切从这里构建
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文件。

例如:

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常用命令

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、进入需要生成文件的目录,执行

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中的类库内容,那么你可以执行:

 pip install -r requirements.txt

在dockerfile里就是

 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 设计