关于docker:docker定制镜像

5次阅读

共计 3049 个字符,预计需要花费 8 分钟才能阅读完成。

一、docker commit 定制镜像

不要应用 docker commit 定制镜像,定制镜像应该应用 Dockerfile 来实现

在之前的例子中,咱们所应用的都是来自于 Docker Hub 的镜像。间接应用这些镜像是能够满足肯定的需要,但有时候咱们就须要定制本人的镜像。

$ docker run --name webserver -d -p 80:80 nginx

$ docker exec -it webserver bash
root@3729b97e8226:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@3729b97e8226:/# exit
exit

// 查看变动
$ docker diff webserver

当初咱们定制好了变动,咱们心愿能将其保留下来造成镜像。

而 Docker 提供了一个 docker commit 命令,能够将容器的存储层保留下来成为镜像。换句话说,就是在原有镜像的根底上,再叠加上容器的存储层,并形成新的镜像。当前咱们运行这个新镜像的时候,就会领有原有容器最初的文件变动。

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

$ docker commit webserver lihaixing/docker-nginx:v1
sha256:405bcabb583a2f06fece0c69543eac1fa2e94d84b2c2bf1858ff00cb74b5aec4

// 镜像还在本地,看一下
$ docker image ls lihaixing/docker-nginx

$ docker run --name webserver2 -d -p 81:80 lihaixing/docker-nginx:v1

此外,应用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像

就是除了制作镜像的人晓得执行过什么命令、怎么生成的镜像,他人基本无从得悉。而且,即便是这个制作镜像的人,过一段时间后也无奈记清具体的操作。这种黑箱镜像的保护工作是十分苦楚的。

二、Dockerfile 定制镜像

从方才的 docker commit 的学习中,咱们能够理解到,镜像的定制实际上就是定制每一层所增加的配置、文件。

如果咱们能够把每一层批改、装置、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无奈反复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

Dockerfile 指令介绍 …..

1. FROM 指定根底镜像

指定 根底镜像,因而一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令,如果不依赖任何镜像

// 这个镜像是虚构的概念,并不理论存在,它示意一个空白的镜像。FROM scratch
...

在 Docker Hub 上有十分多的高质量的官网镜像,有能够间接拿来应用的服务类的镜像,如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;

也有一些不便开发、构建、运行各种语言利用的镜像,如 node、openjdk、python、ruby、golang 等。

2. run 命令

RUN 指令是用来执行命令行命令的。因为命令行的弱小能力,RUN 指令在定制镜像时是最罕用的指令之一

  • shell 格局:RUN < 命令 >,
  • exec 格局:RUN [“ 可执行文件 ”, “ 参数 1 ”, “ 参数 2 ”]

    RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

    3. CMD 容器启动命令

  • shell 格局:CMD < 命令 >
  • exec 格局:CMD [“ 可执行文件 ”, “ 参数 1 ”, “ 参数 2 ″…]
  • 参数列表格局:CMD [“ 参数 1 ”, “ 参数 2 ″…]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。

4. ENTRYPOINT

ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param

5. ENV 设置环境变量

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

ENV NODE_VERSION 7.2.0
ENV VERSION=1.0 DEBUG=on NAME="Happy Feet"
ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
  && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
  && grep "node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
  && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
  && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \
  && ln -s /usr/local/bin/node /usr/local/bin/nodejs

6. ARG 构建参数

构建参数和 ENV 的成果一样,都是设置环境变量。

所不同的是,ARG 所设置的构建环境的环境变量,在未来容器运行时是不会存在这些环境变量的。

Dockerfile 中的 ARG 指令是定义参数名称,以及定义其默认值。该默认值能够在构建命令 docker build 中用 –build-arg < 参数名 >=< 值 > 来笼罩。

灵便的应用 ARG 指令,可能在不批改 Dockerfile 的状况下,构建出不同的镜像。

ARG 指令有失效范畴,如果在 FROM 指令之前指定,那么只能用于 FROM 指令中。


ARG < 参数名 >[=< 默认值 >]

ARG DOCKER_USERNAME=library

FROM ${DOCKER_USERNAME}/alpine

RUN set -x ; echo ${DOCKER_USERNAME} // 有效 

3. docker build 输入镜像

docker build [OPTIONS] PATH | URL | –

Build an image from a Dockerfile

docker build -t mynginx . 

docker build -t hello-world https://github.com/docker-library/hello-world.git#master:amd64/hello-world

docker build http://server/context.tar.gz

docker build - < Dockerfile
// 后者
cat Dockerfile | docker build -

docker build - < context.tar.gz
正文完
 0