写在前面

镜像和容器的区别是什么,镜像,是一个静态的文件;容器,动态进程,具有生命周期

图解

制作属于自己的Docker镜像,一般有两种方式,第一种为commit方式,利用已有的镜像,运行后安装定制自己需要的环境,然后生成镜像;另一种就是build方式,通过编写Dockerfile命令脚本进行生成镜像。
图解生成方式

使用非root用户操作DOCKER

docker默认使用root操作。

  1. 创建docker组:
sudo groupadd docker
  1. 将当前用户加入docker组:
sudo gpasswd -a ${USRE} docker
  1. 重新启动docker服务:
sudo service docker restart 或
sudo systemctl restart docker(视平台而定)
  1. 当前用户退出系统,重新登陆

commit方式

基础镜像运行生成容器,容器中安装需要工具,提交镜像

检查已有的镜像与容器
# 检查镜像
docker image
# 检查容器
docker ps -a

检查已有的镜像与容器

交互式运行centos镜像
docker -it centos /bin/bash

运行后发现,官方提供的centos镜像中并没有提供vim工具,这里我们选择对centos镜像增添vim工具,最后生成我们自定义的镜像

安装vim工具
yum install vim

安装vim工具

检查容器并生成的镜像

退出并停止容器

exit

查看容器

docker ps -a

生成镜像

docker commit ee10ca5fcfe2 centos-vim

检查容器并生成的镜像

自定义镜像和原始镜像之间的关系

自定义镜像和原始镜像之间的关系

build方式——Dockerfile创建镜像

使用Dockerfile是更推荐的方式,这样可以让使用者更清晰地看到这个镜像的制作细节,逻辑清晰,便于管理

创建存放Dockerfile的目录,后续操作将在这个目录下进行。
mkdir centos-vim
cd centos-vim
编写Dockerfile文件
# 文件名称不可变
vim Dockerfile

FROM centos:7
RUN yum install -y vim
build构建镜像
docker build -t centos-vim .

# -t表示将镜像命名为centos-vim,表示在当前目录下的Dockerfile文件

build构建镜像

注意:依据Dockerfile内容,这一命令将分多步骤执行,每一步骤会生成一个中间镜像,作为下一步骤的基础。在镜像创建后,中间镜像会销毁

查看编译生成的镜像
查看编译生成的镜像

过程解析

**docker镜像是只读的,这里为什么能够在centos镜像的基础上进行自定义操作呢? **

我们看一下docker的编译过程
编译过程
编译的第一步(黄色边框)会复用之前已经存在的centos:7

重点是第二步

882832c2b8eb其实是在centos:7镜像的基础上生成的一个临时container的id
我们忽略vim的安装过程,跳到最后
最后根据临时生成的containerdocker commit 生成镜像文件,最后删除临时container(对照博客开始的图示进行理解)

错误排查与解析

生成错误

build 镜像过程中发生错误会生成一个名字是none镜像,修改完Dockerfile之后可以继续建立生成,之后会删除none中间镜像

类似下面这样:

<none>               <none>              1c4ac682f895        5 weeks ago         915 MB
Dockerfile介绍:
FROM python2:v0.1

from表示从那个基础镜像开始构建镜像。基础镜像来自仓库python2,版本v0.1
from必须作为dockerfile的第一行,若本地仓库没有相关镜像,默认从远程仓库获取。如果不执行版本号,默认使用latest基础镜像。

MAINTAINER YouShow
镜像维护者个人信息

RUN pip install flask
RUN pip install git+http://username:password@gitlab.maixunbytes.com/zhangxiaopeng/pipelines.git
RUN pip install git+http://username:password@gitlab.maixunbytes.com/zhangxiaopeng/mxspider.git
RUN pip install git+http://username:password@gitlab.maixunbytes.com/zhangsheng/dateformatting.git
安装项目需要的依赖,如果从git仓库安装,要用到git账号和密码

WORKDIR /src/spiders/app_zxp_week_2/
容器启动后,切换到指定目录作为工作目录

COPY ./spiders /src/spiders
从源系统的文件复制到容器系统上。示例中复制当前目录下的spiders文件夹到容器系统src文件夹下。要把构建进镜像的文件放到Dockefile文件目录或者子目录下。
ADD 和COPY使用类似

USER dingyong
容器执行操作用哪个账户

ENTRYPOINT bash bbs_funcs.sh run_spider siku
entrypoint用来说明当使用docker run启动容器时候要执行的命令

CMD
CMD用来表示镜像要运行的默认命令,以及想要传递给它的选项。如果没有指定ENTRYPOINT,当容器启动的时候默认运行的就是CMD的值所指定的命令。若有ENTRYPOINT,ENTRYPOINT是要运行的命令,CMD的值当作ENTRYPOINT的选项。
CMD 命令会被docker run --it name /command 中command命令覆盖,而ENTRYPOINT不会
CMD [“cat”, “/etc/hosts”, “/etc/os-release”]注意:RUN指令设置的命令仅在构建镜像的时候会被使用,CMD和ENTRYPOINT会在执行docker run的时候被使用。

ENV DB_USER=root
设置环境变量

注意:编写Dockerfile时候,根据需求填写,不需要填写所有命令。
删除镜像和container
rm Remove one or more containers
rmi Remove one or more images

docker rmi image-id
# 如果删除失败说明在containers中有需要先删除container中的内容

更新镜像

commit来更新 还有重新build更新

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐