docker容器创建与镜像构建笔记
介绍
本文整理一下docker容器创建与镜像构建的常用命令,基本概念,可以做为速查笔记使用
docker run创建容器
# docker命令
docker run -it \
-p 6011-6050:6011-6050 \
-p 6010:22 \
--name py312all \
--restart always \
-v /home/uadmind/dockerserver/py12all/dockerdata:/dockerdata \ mypython312:1.0 /bin/bash
docker run -p 6060:22 --name python312all python:3.12
-it /bin/bash 是容器创建后进入命令行
-v ./dockerdata:/dockerdata 配置`docker run` 命令时的当前工作目录的相对路径
-p 100-200:100-200 端口可以配置端口段
# 进入容器bash
docker exec -it py312all /bin/bash
docker-compose.yml创建容器
docker-compose.yml文件所在目录下,执行下面命令创建容器
# -d的意思是基于yml文件重建容器
docker compose up -d
sudo docker compose up --build
两种docker compose的区别
docker compose是 Docker CLI 的一部分,需要通过 Docker 引擎运行,只有 root 用户或者属于 docker 组的用户才能运行 Docker 命令,否则要加sudo
docker-compose是一个独立的工具,可以通过包管理器如 pip 或系统包管理器安装,如果 docker-compose 安装在用户的环境中,并且用户已经配置了对 Docker 引擎的访问权限,那么运行 docker-compose 命令时可以不需要 sudo。
将当前用户加入docker组,重启就可以不用sudo运行docker compose
sudo usermod -aG docker $USER
# 重启后用下面命令查看用户是否在docker组
docker ps
## docker-compose.yml
version: '3'
services:
my_python_app:
image: mypython312:1.5
container_name: python312all
restart: always
environment:
- POSTGRES_USER=username
- POSTGRES_PASSWORD=password
- POSTGRES_DB=postgres
ports:
- "6132:22"
volumes:
- ./dockerdata:/dockerdata
network_mode: bridge
tty: true
networks:
fastgpt_new: # 确保网络名称唯一
my_python_app 服务名称
image 是基于的镜像
container_name 容器名字
restart 是否自动重启容器,比如主机重启了,内部服务挂了
ports端口,可以是端口段
volumes:路径映射,可以是相对路径也可以是绝对路径
network_mode:
#bridge桥接模式
默认模式
可以有多个不同的网桥,每个网桥有自己的IP段,分配给同一个网桥下的docker容器
同一个网桥ip段内的容器可以互相通信,像内网机器一样
# host宿主机模式
直接使用宿主机的ip,不过容器内部只要没有使用的端口,也可以给其他容器使用。
等于host模式就像启动一个软件,具体占用了哪些宿主端口由软件的需要决定
不能与已经分配和映射的端口冲突。
# none没网络模式
# 还有共享和自定义
networks:自定义的网络名称,如果compose有多个容器在同一个网络下,容器之间可以通过对方服务名称环境变量获取对方的IP
构建镜像
Dockfile构建镜像
FROM mypython312:1.3
CMD ["/bin/bash", "-c", "/home/start.sh && tail -f /dev/null"]
# Dockerfile 文件创建如上
# 进入Dockerfile文件所在目录,使用下面命令创建mypython312:1.3容器
# 其中.的意思是环境上下文,比如dockerfile中有copy指令,就是从当前路径下复制文件到镜像里
docker build -t mypython312:1.3 .
一个更完整的例子
# 使用官方的 Python 基础镜像
FROM python:3.12.1
# 设置工作目录
WORKDIR /app
# 复制当前目录的内容到容器的 /app 目录
COPY . /app
# 复制 requirements.txt 文件到工作目录
COPY requirements.txt /app/
# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制本地的脚本到容器的 /app 目录
COPY ./scripts/start.sh /app/
# 给予 start.sh 脚本执行权限
RUN chmod +x /app/start.sh
# 暴露应用运行的端口
EXPOSE 8080
# 设置环境变量
ENV PYTHONUNBUFFERED=1
# 设置容器启动时运行的命令
CMD ["/app/start.sh"]
commit构建镜像
是基于现有容器构建镜像,比如有个镜像创建容器后,进入容器进行一番操作,
比如安装一些额外的依赖以后,再基于安装依赖之后的容器创建镜像,比Dockfile构建镜像更加灵活
#基于py312all容器,创建名为mypython312:1.1的镜像
docker commit py312all mypython312:1.1
镜像启动后怎么一直运行
有些镜像启动容器后直接退出,是因为容器内部没有长期运行的服务,所以启动就退出了。
这种情况下不退出
使用下面命令,创建容器后进入容器命令行
docker run -it -p 6060:22 --name python312all mypython312:1.1 /bin/bash
或者Dockerfile和docker-compose.yml都支持ENTRYPOINT和CMD命令,不过只有一个会生效
Dockerfile 中的优先级:
如果 ENTRYPOINT
和 CMD
都存在,启动时会执行 ENTRYPOINT
,并将 CMD
的内容作为参数传递给 ENTRYPOINT
。
- ENTRYPOINT
可以通过 docker run --entrypoint
覆盖。
- CMD
可以通过 docker run <command>
覆盖。
Docker Compose 文件中的优先级:
- entrypoint
和 command
会覆盖 Dockerfile 中的 ENTRYPOINT
和 CMD
。
- 如果在 Docker Compose 文件中定义了 entrypoint
,将覆盖 Dockerfile 中的 ENTRYPOINT
。
- 如果在 Docker Compose 文件中定义了 command
,将覆盖 Dockerfile 中的 CMD
。
#docker-compose.yml例子:
networks:
- fastgpt_new
entrypoint: ["python", "override_entrypoint.py"] # 覆盖 Dockerfile 中的 ENTRYPOINT
command: ["override_arg"] # 覆盖 Dockerfile 中的 CMD
想容器启动后一直执行,可以执行下面的CMD命令
CMD ["tail", "-f", "/dev/null"]
#或者有多个命令需求的话:
CMD ["/bin/bash", "-c", "/home/start.sh && tail -f /dev/null"]
# dockercompose中:
command: ["tail", "-f", "/dev/null"]
command: ["/bin/bash", "-c", "/home/start.sh && tail -f /dev/null"]