docker容器创建与镜像构建笔记

2024年05月21日 编程 暂无评论 阅读49 次

介绍

本文整理一下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 中的优先级:
如果 ENTRYPOINTCMD 都存在,启动时会执行 ENTRYPOINT,并将 CMD 的内容作为参数传递给 ENTRYPOINT
- ENTRYPOINT 可以通过 docker run --entrypoint 覆盖。
- CMD 可以通过 docker run <command> 覆盖。
Docker Compose 文件中的优先级:
- entrypointcommand 会覆盖 Dockerfile 中的 ENTRYPOINTCMD
- 如果在 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"]
标签:

给我留言

登录

忘记密码 ?

切换登录

注册