Docker

常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
docker update --restart=always  容器id			# 设置自启动(随机器启动)
docker ps
docker ps -a	# 查看全部容器
docker exec -it <container id> bash		# 进入容器
docker logs --tail 50 --follow --timestamps	<container id>	# 查看容器日志


docker build -t game_community_be .		# 构建镜像
docker-compose up -d --build --force-recreate		# 构建和启动容器,--build重新构建镜像
docker cp 容器id:/app/test.txt .		# 将容器中的test.ext文件拷贝到宿主机某个路径下

# 删除none镜像
docker images |grep none | awk '{print $3}'| xargs docker rmi


# 临时测试
docker run -it --rm CONTAINER ID bash


#重置上一次提交,并且不保留记录
git reset --hard HEAD~1
git push -f

dockerfile

指令描述
FROM设定基础镜像
RUN在镜像中运行命令
CMD提供默认的可执行命令
LABEL添加元数据到镜像
EXPOSE指定要在容器运行时开放的端口
ENV设置环境变量
ADD从上下文目录中复制文件到镜像
COPY与 ADD 类似,但更好,因为它更明确
ENTRYPOINT为容器提供可执行文件
VOLUME在容器中创建一个挂载点
USER设定运行容器时的用户名或 UID
WORKDIR设定工作目录
ARG定义在构建过程中要使用的变量
ONBUILD定义在构建子镜像时要运行的指令
STOPSIGNAL定义停止容器时要发送的系统调用信号
HEALTHCHECK配置容器的健康检查
SHELL设置默认的 shell

docker-compose

 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
version: '3'

services:
  app:
    image: game_community_be
    restart: on-failure
    command: bash -c "gunicorn manage:app"
    env_file: .env.test
    ports:		# 宿主机器端口:容器端口,浏览器访问9091端口即可映射到容器内5577端口
      - "9091:5577"	
     volumes: # 宿主机目录:容器内目录
      - /data/logs/game_community_be:/data/logs/game_community_be

  celery_worker:
    image: game_community_be
    restart: on-failure:3
    env_file: .env.test
    command: celery -A make_celery.celery_app worker -l INFO
    depends_on:
      - app

  celery_beat:
    image: game_community_be
    restart: on-failure:3
    env_file: .env.test
    command: celery -A make_celery.celery_app beat -l INFO
    depends_on:
      - app

本地构建推送到harbor

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 1. 在有外网的机器上拉取镜像
docker pull ghcr.io/astral-sh/uv:latest
docker pull python:3.12-slim-bookworm

# 2. 重新打标签
docker tag ghcr.io/astral-sh/uv:latest harbor.yourdomain.com/library/uv:latest
docker tag python:3.12-slim-bookworm harbor.yourdomain.com/library/python:3.12-slim-bookworm

# 3. 推送到内网 Harbor
docker login harbor.yourdomain.com
docker push harbor.yourdomain.com/library/uv:latest
docker push harbor.yourdomain.com/library/python:3.12-slim-bookworm

# 4. 修改 Dockerfile
FROM harbor.yourdomain.com/library/python:3.12-slim-bookworm
COPY --from=harbor.yourdomain.com/library/uv:latest /uv /uvx /bin/

网络模式

网络模式核心特点适用场景
**bridge** (默认)通过 docker0 虚拟网桥为每个容器分配私有 IP,容器间可通过 IP 通信。外部访问需用 -p 进行端口映射。单机运行多个需要相互隔离、但又要通信的普通容器。
**host**容器直接共享宿主机的网络栈,没有独立的 IP。性能最高,无 NAT 开销。对网络性能要求极高,且能容忍端口冲突和较低隔离性的场景。
**none**容器完全隔离网络,仅有 lo 本地回环接口。执行无需网络的高安全性或计算任务,如批处理、密码学计算。
**container**新容器与一个已存在的容器共享网络命名空间(IP 和端口等)。实现“边车(Sidecar)”模式,如主应用容器与日志收集、网络监控容器紧密耦合

更改镜像源

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 配置 Docker registry mirror
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json

# 写入:
{
    "registry-mirrors": [
     "https://docker.m.daocloud.io",
     "https://docker.imgdb.de",
     "https://docker-0.unsee.tech",
     "https://docker.hlmirror.com",
     "https://docker.1ms.run",
     "https://func.ink",
     "https://lispy.org",
     "https://docker.xiaogenban1993.com"
    ]
}


# 重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker