docker学习记录

docker学习记录

1
2
3
4
5
6
7
8
9
10
11
12
13
镜像 镜像库 
容器

-v
不一定要把代码项目路径挂载上,像不需要代码修改的场景、代码打包成镜像等不需要挂载
开发时需要,将代码同步到开发环境
持久化数据时需要
挂载配置文件
docker run python3 xxx.py镜像内没有代码不行,而且这种在docker run时直接执行命令有-v时也不行,这种一定代表代码里有对应代码。通过-v这种方式可以进入容器后再执行-v里的代码
-v ..\test\:\workspace\ 代表把前者里的所有内容挂载进去

露姐案例:
docker run -it --rm --name 3D_detect --shm-size=32g --gpus all -v /home/lium/dynamic_target_visualisation/.vscode-server:/root/.vscode-server -v /home/lium/dynamic_target_visualisation/:/root/dynamic_target_visualisation/ changan-map.tencentcloudcr.com/train/3donenet:v20251119

镜像

下载

1
2
3
4
5
6
7
8
9
10
11
下载 windows linux 
命令:
docker pull docker.io/library/xxx:latest 注意是官方库可以省略的部分

dockerhub: hub.docker.com
dockhub的镜像站:docker.fxxk.dedyn.io
给docker配置镜像站:daemon.json

docker pull --platform=xxxx 一般linux上下载docker镜像会自动选择适合宿主机处理器架构的镜像

可以直接不下载直接使用docker run,创建运行容器时自动下载镜像

查看已下载镜像

docker images

删除镜像

docker rmi id/名字

容器

创建容器和运行

1
2
3
docker run -d -p 80:80 镜像id或者名字 可以设置容器名字

docker create和run类似 但只创建
1
2
3
4
docker run --rm -v /home/xxx/.vscode-server:/root/.vscode-server \ 
-v $CODE_PATH:/workspace \
--name $container_name \
-it xxxx:$Tag /bin/bash
1
2
3
docker run时直接执行命令

nohup docker run --net=host -d -v /data01/zxx/config:/data/config --rm changan-map.tencentcloudcr.com/train/stdata_preprocess:v1.0.3 /bin/bash -c "python3 run_output.py --tasks $datname --run-type 2 --config /data/config/output.yaml" > ./output$i.log 2>&1
1
2
3
4
5
6
7
8
9
执行容器后,使vscode能直接连接容器

docker run --net=host \
-v /home/$(whoami)/.vscode-server:/root/.vscode-server \
-v /data01/zxx/config:/data/config \
--name test \
-it \
changan-map.tencentcloudcr.com/train/stdata_preprocess:v1.0.3 \
/bin/bash

查看运行中的容器

1
2
3
docker ps 显示正在运营容器 

可以显示:容器id 所属镜像 容器名字等 -a(显示包括非运行的容器)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker ps
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES

docker ps -a --format "{{.Names}}" | grep -q "^$container_name$"
{{.Names}}是一个 Go 模板占位符,它告诉 Docker 命令只输出容器的名称

-q参数表示“安静模式”。grep不会在屏幕上输出任何匹配到的内容,它只关心是否找到了匹配项。如果找到,grep会以退出码 0 结束;如果没找到,则以退出码 1结束。

^$container_name$是一个正则表达式模式:

^表示“行的开始”。

$container_name是一个 Shell 变量,它应该包含了您想查找的容器名称。

$表示“行的结束”

查看容器的信息

docker inspect 容器 查看容器的信息

1
docker inspect <container_id_or_name> | grep -A 10 "NetworkMode"

删除容器

1
docker rm -f id 删除正在运行的容器需要f 

挂载卷

绑定挂载卷 -v

1
2
docker run  -d -p 80:80 -v 宿主机目录:容器目录 镜像id或者名字 
绑定挂载 宿主目录写死 会覆盖容器目录内容
1
2
3
4
5
6
7
不一定要把代码项目路径挂载上,像不需要代码修改的场景、代码打包成镜像等不需要挂载 
开发时需要,将代码同步到开发环境
持久化数据时需要
挂载配置文件

案例:
docker run -it --rm --name 3D_detect --shm-size=32g --gpus all -v /home/lium/dynamic_target_visualisation/.vscode-server:/root/.vscode-server -v /home/lium/dynamic_target_visualisation/:/root/dynamic_target_visualisation/ changan-map.tencentcloudcr.com/train/3donenet:v20251119

命名卷挂载

1
2
3
4
5
6
7
8
docker volume create xxx 

docker run -d -p 80:80 -v 挂载卷名字:容器目录 镜像id或者名字
docker volume inspect 挂载卷名字 显示挂载卷的真实位置

docker volume rm xxx

docker volume prune -a 删除所有没有容器使用的卷

查看已有的挂载卷

1
docker volume list 

设置容器变量 -e

1
2
3
4
5
6
7
8
-e参数  
docker run -e xxx=xxx -d -p... -v... 镜像

创建mongdb容器
mongo
创建mongodb网页端容器
--name参数
docker run -e xxx=xxx -d -p... -v... --name 容器名 镜像 容器名要唯一

-it参数

-it参数 可以让交互页面进入docker交互页面
docker run -it -rm alpine 轻量级linux系统 停止运行后删除,调试很有用

进入容器的交互界面

docker exec -it 容器 /bin/sh

查看容器内linux系统信息

cat /etc/os-release 查看容器内linux系统信息,容器内的系统简洁有的工具不自带

–restart参数

第一个命名在docker停止后会重启,第二个手动停止不会重启 生产环境
docker run -d –restart always nginx
docker run -d –restart unless-stopped nginx

启动和暂停容器

docker start/stop 容器 会保留之前启动的参数

容器日志

docker logs 容器 -f 动态显示日志

在容器内部执行linux命令

docker exec 容器 ps -ef

容器网络 容器子网

1
2
3
4
5
6
7
8
9
10
11
docker network create 子网名 
桥接模式
--network 子网名

host模式 直接使用宿主机网络和端口
--network host

none模式 没有网络

docker network list 显示所有docker网络
删除网路 docker network rm xxx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
docker network create network1

docker run -d \
--name my_mongodb\
-e MONGO_INITDB_ROOT_USERNAME=name\
-e MONGO_INITDB_ROOT_PASSWORD=pass\
-v /my/datadir:/data/db\
--network network1\
mongo

docker run -d \
--name my_mongodb_express\
-p 8081:8081\
-e ME_CONFIG_MONGODB_SERVER=my_mongodb\
-e ME_CONFIG_MONGODB_ADMINUSERNAME=name\
-e ME_CONFIG_MONGODB_ADMINUSERPASSWORD=pass\
--network network1\
mongo-express

构建镜像

dockerfile

1
2
3
4
5
6
7
dockerfile 描述镜像是如何创建的 
from
workdir
copy
run
cmd [] 一个dockerfile里只能有一个cmd
entrypoint 比cmd优先级更高,不容易被覆盖
1
2
3
4
5
6
7
8
9
10
11
12
ARG BASE_IMAGE 
FROM $BASE_IMAGE
WORKDIR /workspace

#设置环境变量
ENV CAFS_SDK_USE_PROVIDER_PROXY=true
ENV CAFS_SDK_PROVIDER_PROXY="{\"xxx":[\"xxx",\"xxx\"]}"

RUN rm -rf *
COPY src /workspace/
RUN ./install.sh && rm -rf /var/lib/apt/lists/*
EXPOSE 3030
1
2
3
4
5
通过ARG指令允许在构建时动态指定BASE_IMAGE 
设置CAFS_SDK_USE_PROVIDER_PROXY为true,启用代理
设置CAFS_SDK_PROVIDER_PROXY,配置
RUN执行命令
暴露3030端口供外部访问
1
2
3
4
5
6
7
8
9
10
11
12
13
ARG BASE_IMAGE
FROM $BASE_IMAGE

# 设置环境变量,防止包安装时交互式提示 设置 Debian/Ubuntu 系统的环境变量
ENV DEBIAN_FRONTEND=noninteractive

WORKDIR /workspace

COPY install.sh requirements.txt .

RUN ./install.sh

RUN rm -rf install.sh requirements.txt
1
2
3
COPY src_tmp .
COPY . .是将当前目录下所有内容,复制到workspace,文件夹的话是包含文件夹名的
COPY src . 复制src里的内容到.

docker build命令

1
2
3
4
5
docker build -t 镜像名字 版本可不指定 . 

然后就可以使用自定义的镜像创建运行了

发布镜像到dockerhub
1
2
3
4
5
docker build -f $DOCKERFILE --build-arg BASE_IMAGE=$BASE_IMAGE  -t $TARGET_IMAGE .

. 它是 docker build命令的最后一个参数,指定了构建上下文的位置。
它告诉 Docker 引擎:从哪里获取构建所需的所有文件(即“构建上下文”)。
Dockerfile 中 COPY、ADD等指令的相对路径,都是相对于这个目录的。
1
2
3
4
5
6
[liuj@VM-16-2-tencentos static_dynamic_annotation]$ docker run -it changan-map.tencentcloudcr.com/train/static_dynamic_annotation:v2.2 /bin/bash

/bin/bash: /bin/bash: cannot execute binary file
原因:您主机的系统架构(例如x86_64/amd64)与Docker镜像的架构(例如arm64)不一致。您尝试在一个架构上运行为另一个架构编译的/bin/bash二进制文件,导致无法执行

uname -m
1
2
3
检查镜像架构(将[您的镜像名]替换为实际名称,如ubuntu:latest):

docker image inspect [您的镜像名] | grep -i architecture

docker compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
快捷创建多个容器,方便管理的容器编排技术,使用yml文件管理多个容器。

yml文件定义各个容器如何创建和如何协同工作的

docker compose文件默认所有容器自动加入同一个子网
yml文件文件里可以定义容器启动顺序dependson

标准的名字是docker-compose.yaml,如果是其它名字需要加-f

docker compose up -d(同dockercompse文件目录下) 启动yml文件里定义的容器

docker compose up -d -f test.yaml(其它名字) 启动yml文件里定义的容器

docker compose down(同dockercompse文件目录下) 停止并删除容器

docker compose stop (同dockercompse文件目录下) 停止容器

docker compose start (同dockercompse文件目录下) 启动用dockercompose文件创建但已停止的容器