build 镜像(image)

以构建一个python程序为例:

# 构建命令
docker build -t drmapp:last .

# ls
drwxrwxrwx. 2 root root 79 Apr 23 03:55 app
-rwxrwxrwx. 1 root root 280 Apr 23 03:52 Dockerfile
drwxrwxrwx. 2 root root 6 Apr 22 01:37 drm

# cat Dockerfile
# 指定python版本
FROM python:3.6
# 指定工作目录
WORKDIR /app
# 将app下的文件拷贝到容器/app目录下
COPY app /app
# 下载python所需要的依赖
RUN pip install -r /app/requirements.txt
# 创建日志文件并设置初始权限
RUN touch /app/drm_call_back.log && \
chmod 777 /app/drm_call_back.log
# 设置运行用户
USER root
# 指定端口
EXPOSE 8001
# 启动程序命令
CMD ["python","drm_call_back.py"]

  • docker build 构建镜像命令
  • -t drmapp:last 指定镜像的名字和tag
  • . 指定构建镜像的上下文路径为当前路径,会在该路径寻找Dockerfile文件

导出加载镜像

导出
docker save -o app.tar drmapp

根据实际需求选择合适的命令:如果需要迁移或备份整个镜像(包括其历史和元数据),使用 docker save;如果只需要容器内部的文件系统内容,或者希望基于容器状态创建一个新的、无历史关联的镜像,则使用 docker export

加载
docker load -i app.tar

docker images 查看

image-20240423193925719

运行容器

docker run -id --name=drmapp -p 8003:8001 -v /data/app:/app e6
# -id 后台运行并保持 stdin 开放,可以docker exec进入容器查看、执行命令等操作。
# --name=drmapp 指定容器运行名称
# -p 8003:8001 端口映射,将本机的8003端口映射容器服务的8001端口。
# -v /data/app:/app 将宿主机的 /data/app 目录挂载到容器内的 /app 目录,对 /app 目录的任何读写操作都会反映到宿主机的 /data/app 目录上,反之亦然。
# e6 指定启动的镜像image ID

执行过程报错分析

权限问题
[root@bogon ~]# docker logs de
Traceback (most recent call last):
File "drm_call_back.py", line 7, in <module>
logger.add(log_file, level="INFO")
File "/usr/local/lib/python3.6/site-packages/loguru/_logger.py", line 795, in add
wrapped_sink = FileSink(path, **kwargs)
File "/usr/local/lib/python3.6/site-packages/loguru/_file_sink.py", line 192, in __init__
self._create_file(path)
File "/usr/local/lib/python3.6/site-packages/loguru/_file_sink.py", line 226, in _create_file
self._file = open(path, **self._kwargs)
PermissionError: [Errno 13] Permission denied: '/app/drm_call_back.log'

docker logs 查看containerID 发现有权限错误。

  • 检查启动用户权限和当前用户权限一致都是root
  • Dockerfile构建时的log文件权限777 如:chmod 777 /app/drm_call_back.log

排出以上问题发现是SELinux(Security-Enhanced Linux)安全模块的系统的问题。

方式1:修改权限

setenforce 0 
# 临时关闭SELinux强制执行

方式2:运行时使用Docker 中用于标记挂载卷或数据目录的一个特殊标签:Z

docker run -id --name=drmapp -p 8003:8001 -v /data/app:/app:Z e6
# 使用:Z,:Z标签可以简化在 SELinux 环境中运行 Docker 容器时的数据共享配置

镜像拉取推送个人仓库

1,登录阿里云

docker login --username=qxp19891224 registry.cn-hangzhou.aliyuncs.com

2,从Registry中拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/quxp/images:[镜像版本号]

3,将镜像推送到Registry

$ docker login --username=qxp19891224 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/quxp/images:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/quxp/images:[镜像版本号]

4,示例

$ docker imagesREPOSITORY                                                         TAG                 IMAGE ID            CREATED             VIRTUAL SIZEregistry.aliyuncs.com/acs/agent                                    0.7-dfb6816         37bb9c63c8b2        7 days ago          37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816