Docker 构建镜像
docker制作镜像通常是通过两种方式来实现的, 第一种是通过容器的 commit , 第二种是通过 Buildfile来实现的.
docker commit 打包镜像
容器在运行过程中我们难免会做一些修改, 比如运行的mysql 镜像我们可能创建了数据库, 建了用户等等, 但是如果吧容器 stop 之后在 rm 掉, 这个时候在拉取镜像 run 我们的容器就不是刚刚运行的那个容器了, 原来容器的一切修改都丢失了, 这个时候把当前运行中的容器打包成镜像, 之后使用这个镜像运行的容器都会和打包时的容器一模一样.
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
-
-a :提交的镜像作者;
-
-c :使用Dockerfile指令来创建镜像;
-
-m :提交时的说明文字;
-
-p :在commit时,将容器暂停。
使用exec 命令进入正在运行的一个redis容器内部建立一个文件夹
[docker@VM_121_116_centos ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b409e978b259 redis "docker-entrypoint..." 13 days ago Up 24 hours 0.0.0.0:6379->6379/tcp redis
[docker@VM_121_116_centos ~]$ docker exec -it redis /bin/bash
root@b409e978b259:/data# mkdir /testdir
root@b409e978b259:/data# exit
exit
使用commit命令打包容器
[docker@VM_121_116_centos ~]$ docker commit redis testredis
sha256:b4b8688e025d0aba179292f632ae861acb61d792137ed6157a367724e5fb0d2b
[docker@VM_121_116_centos ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
testredis latest b4b8688e025d 5 seconds ago 95 MB
docker.io/redis latest 0f55cf3661e9 3 weeks ago 95 MB
docker.io/mysql 5.6 96e41ac53eac 3 weeks ago 256 MB
docker.io/java latest d23bdf5b1b1b 2 years ago 643 MB
使用新镜像运行容器看看有没有文件夹
使用 DockerFile
使用dockerFile 可以实现在文件中预先定义镜像, 之后使用docker build 命令执行文件就可以构建一个镜像, 相比 docker commit 更加规范, 并且可以实现自动化.
官网介绍: https://docs.docker.com/engine/reference/builder/
Dockerfile reference
Docker can build images automatically by reading the instructions from a Dockerfile
. A Dockerfile
is a text document that contains all the commands a user could call on the command line to assemble an image. Using docker build
users can create an automated build that executes several command-line instructions in succession.
This page describes the commands you can use in a Dockerfile
. When you are done reading this page, refer to the Dockerfile
Best Practices for a tip-oriented guide.
看一个简单的dockerfile的例子
FROM ubuntu
MAINTAINER Talon <j615326@163.com>
# disable interactive functions
ENV DEBIAN_FRONTEND noninteractive
# set default java environment variable
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
RUN apt-get update && \
apt-get install -y software-properties-common && \
add-apt-repository ppa:openjdk-r/ppa -y && \
apt-get install -y --no-install-recommends openjdk-8-jre && \
rm -rf /var/lib/apt/lists/*
解析:
RUN : 是表示使用的基础镜像, 我们这里表示使用的 ubuntu:14.04
MAINTAINER : 表示的是这个BulidFile的创建人
ENV : 表示设置容器的环境变量
RUN : 表示要在容器里面运行的命令, &&\ 表示执行完这个命令继续执行下一行
注意事项: RUN 中最好首先执行 apt-get update 或者 yum update 更新一下依赖, 否则容易报错
E: Unable to locate package software-properties-common
使用docker bliud 命令
j简单的用法是 docker build -t 镜像名称 DockerFile 目录
[docker@VM_121_116_centos dockerFile]$ vim Dockerfile
[docker@VM_121_116_centos dockerFile]$ docker build -t talon/java .
上图中DockerFile的执行顺序是和DockerFile中定义的是一致的,
要注意, 以上的环节都是在容器里面执行的, 而不是在宿主机执行, Dockerfile的主要作用就是事前定义要你要在容器里面做什么, 在bulid的时候直接执行事前定义好的命令和操作
完成之后查看镜像可以看见刚刚 build的镜像
[docker@VM_121_116_centos dockerFile]$ docker images
docker build 更加详细的命令
docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
-
--build-arg=[] :设置镜像创建时的变量;
-
--cpu-shares :设置 cpu 使用权重;
-
--cpu-period :限制 CPU CFS周期;
-
--cpu-quota :限制 CPU CFS配额;
-
--cpuset-cpus :指定使用的CPU id;
-
--cpuset-mems :指定使用的内存 id;
-
--disable-content-trust :忽略校验,默认开启;
-
-f :指定要使用的Dockerfile路径;
-
--force-rm :设置镜像过程中删除中间容器;
-
--isolation :使用容器隔离技术;
-
--label=[] :设置镜像使用的元数据;
-
-m :设置内存最大值;
-
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
-
--no-cache :创建镜像的过程不使用缓存;
-
--pull :尝试去更新镜像的新版本;
-
--quiet, -q :安静模式,成功后只输出镜像 ID;
-
--rm :设置镜像成功后删除中间容器;
-
--shm-size :设置/dev/shm的大小,默认值是64M;
-
--ulimit :Ulimit配置。
-
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
-
--network: 默认 default。在构建期间设置RUN指令的网络模式