Docker备忘¶
参考
https://summer25.net9.org/backend/docker/note/
从镜像创建一个容器并且运行
常用的选项:
-d/--detach后台运行-e/--env <variable>=<value>环境变量--rm运行完以后删除--name命名-p/--publish <host_port>:<container_port>端口映射-it,--interactive --tty交互模式并且分配伪终端(exit退出)
从ubuntu创建一个容器,并且分配一个伪终端.
-f/--file指定构建所用的Dockerfile-t/--tag为镜像命名并添加标签
Tip
这里.指的是镜像构建的上下文路径,比如COPY就会用到这个上下文
这里不能用../也不能用/开头的绝对路径
列出已有的镜像:
列出运行的容器;
docker exec <options> <container> <command>
docker attach <options> <container> # 连接到后台容器,^P断开
docker start <options> <container> # 启动停止运行的容器
docker stop
docker rm # 删除容器
docer rmi # 删除镜像
docker cp <options> <container>:<src_path> <dest_path>
docker cp <options> <src_path> <container>:<dest_path>
# 宿主机和容器之间复制文件
Dockerfile例子¶
写入./Dockerfile
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
WORKDIR /usr/src/cpp
RUN echo -e "build a cpp environment" > test.txt \
&& apt update && apt install -y build-essential
RUN cat << EOF > main.cpp
#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
EOF
RUN g++ main.cpp -o main
CMD ["./main"]
Tip
docker镜像有分层特性,因此RUN很多东西的时候最好用&&连接
Tip
还可以分阶段构建
build的时候可以传代理
docker build \
--build-arg http_proxy=http://host.docker.internal:7890 \
--build-arg https_proxy=http://host.docker.internal:7890 \
-t cpp:1.0 .
这里比较好的操作是在宿主和Dockerfile同目录下写好main.cpp然后Dockerfile里面加上
数据¶
数据卷
用type=volume,可省略
docker volume create database
docker volue ls
docker volume inspect database
docker volume rm database
docker run --name web_backend \
--mount source=database, target=/app/database \
backend
docker inspect web_backend
主机目录
用type=bind