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 images 查看
运行容器 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