docker入门实战笔记

1.什么是docker:

  Docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解.
  Docker提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个Container;而LXC本身可能因为不同机器的不同配置而无法方便地移植运行;  
  Docker以App为中心,为应用的部署做了很多优化,而LXC的帮助脚本主要是聚焦于如何机器启动地更快和耗更少的内存;
  Docker为App提供了一种自动化构建机制(Dockerfile),包括打包,基础设施依赖管理和安装等等;
  Docker提供了一种类似git的Container版本化的机制,允许你对你创建过的容器进行版本管理,依靠这种机制,你还可以下载别人创建的Container,甚至像git那样进行合并;
  Docker Container是可重用的,依赖于版本化机制,你很容易重用别人的Container(叫Image),作为基础版本进行扩展;
  Docker Container是可共享的,有点类似github一样,Docker有自己的INDEX,你可以创建自己的Docker用户并上传和下载Docker Image;
  Docker提供了很多的工具链,形成了一个生态系统;这些工具的目标是自动化、个性化和集成化,包括对PAAS平台的支持等;

docker运用场景:

    web应用的自动化打包和发布;

    自动化测试和持续集成、发布;

    在服务型环境中部署和调整数据库或其他的后台应用;

    从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

  可以看出来docker其实就是使得部署,发布变得更加快捷,更加自动化,且适应云平台环境.再看定义:

  Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、

OpenStack 集群和其他的基础应用平台。

  意思很明显了.按照我的理解,先不考虑docker的实现方式,其实docker就是一个包含运行环境的应用,由于自身带有所有需要的运行环境促成了他的可移植性和快速部署.

  docker应用环境的集成是通过一层一层的镜像叠加实现的,这种方式可以使得底层镜像多次复用,结构清晰.这里不赘述docker的具体实现原理,实战过后想来都会有一些理解.

  2.docker安装

  不同的linux系统安装docker会有些许不同,新版的redhat和centos7自带有docker包,直接安装即可.具体参考:
  docker安装
  ubuntu14.04 docker:

$ sudo apt-get update
  安装所有必须和可选的包

$ sudo apt-get install linux-image-generic-lts-trusty
  重启系统

$ sudo reboot
  查看你是否安装了wget

$ which wget
  如果wget没有安装,先升级包管理器,然后再安装它。

sudoaptgetupdate s u d o a p t − g e t u p d a t e sudo apt-get install wget
  获取最新版本的 Docker 安装包

$ wget -qO- https://get.docker.com/ | sh
  系统会提示你输入sudo密码,输入完成之后,就会下载脚本并且安装Docker及依赖包。

  验证 Docker 是否被正确的安装

$ sudo docker run hello-world
  上边的命令会下载一个测试镜像,并在容器内运行这个镜像。

#####################正常情况下以下内容可以不看

  Ubuntu Docker可选配置

  这部分主要介绍了 Docker 的可选配置项,使用这些配置能够让 Docker 在 Ubuntu 上更好的工作。

  创建 Docker 用户组
  调整内存和交换空间(swap accounting)
  启用防火墙的端口转发(UFW)
  为 Docker 配置DNS服务
  创建 Docker 用户组

  docker 进程通过监听一个 Unix Socket 来替代 TCP 端口。在默认情况下,docker 的 Unix Socket属于root用户,当然其他用户可以使用sudo方式来访问。因为这个原因, docker 进程就一直是root用户运行的。

  为了在使用 docker 命令的时候前边不再加sudo,我们需要创建一个叫 docker 的用户组,并且为用户组添加用户。然后在 docker 进程启动的时候,我们的 docker 群组有了 Unix Socket 的所有权,可以对 Socket 文件进行读写。

  注意:docker 群组就相当于root用户。有关系统安全影响的细节,请查看 Docker 进程表面攻击细节
  创建 docker 用户组并添加用户

  使用具有sudo权限的用户来登录你的Ubuntu。

  在这过程中,我们假设你已经登录了Ubuntu。

  创建 docker 用户组并添加用户。

$ sudo usermod -aG docker ubuntu
  注销登录并重新登录

  这里要确保你运行用户的权限。

  验证 docker 用户不使用 sudo 命令开执行 Docker

$ docker run hello-world
  调整内存和交换空间(swap accounting)

  当我们使用 Docker 运行一个镜像的时候,我们可能会看到如下的信息提示:

WARNING: Your kernel does not support cgroup swap limit. WARNING: Your
kernel does not support swap limit capabilities. Limitation discarded.
  为了防止以上错误信息提示的出现,我们需要在系统中启用内存和交换空间。我们需要修改系统的 GUN GRUB (GNU GRand Unified Bootloader) 来启用内存和交换空间。开启方法如下:

  使用具有sudo权限的用户来登录你的Ubuntu。

  编辑 /etc/default/grub 文件

  设置 GRUB_CMDLINE_LINUX 的值如下:

GRUB_CMDLINE_LINUX=”cgroup_enable=memory swapaccount=1”
  保存和关闭文件

  更新 GRUB

$ sudo update-grub
  重启你的系统。

  允许UFW端口转发

  当你在运行 docker 的宿主主机上使用UFW(简单的防火墙)。你需要做一些额外的配置。Docker 使用桥接的方式来管理网络。默认情况下,UFW 过滤所有的端口转发策略。因此,当在UFW启用的情况下使用 docker ,你必须适当的设置UFW的端口转发策略。

  默认情况下UFW是过滤掉所有的入站规则。如果其他的主机能够访问你的容器。你需要允许Docker的默认端口(2375)的所有连接。

  设置 UFW 允许Docker 端口的入站规则:

  使用具有sudo权限的用户来登录你的Ubuntu。
  验证UFW的安装和启用状态

$ sudo ufw status
  打开和编辑/etc/default/ufw文件

$ sudo nano /etc/default/ufw
  设置 DEFAULT_FORWARD_POLICY 如下:

DEFAULT_FORWARD_POLICY=”ACCEPT”
  保存关闭文件。

  重新加载UFW来使新规则生效。

$ sudo ufw reload
  允许 Docker 端口的入站规则

$ sudo ufw allow 2375/tcp
  Docker 配置 DNS 服务

  无论是Ubuntu还是Ubuntu 桌面繁衍版在系统运行的时候都是使用/etc/resolv.conf配置文件中的127.0.0.1作为域名服务器(nameserver)。NetworkManager设置dnsmasq使用真实的dns服务器连接,并且设置 /etc/resolv.conf的域名服务为127.0.0.1。

  在桌面环境下使用这些配置来运行 docker 容器的时候, Docker 用户会看到如下的警告:

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers
can’t use it. Using default external servers : [8.8.8.8 8.8.4.4]
  该警告是因为 Docker 容器不能使用本地的DNS服务。相反 Docker 使用一个默认的外部域名服务器。

  为了避免此警告,你可以给 Docker 容器指定一个DNS服务器。或者你可以禁用 NetworkManager 的 dnsmasq。不过当禁止 dnsmasq 可能使某些网络的DNS解析速度变慢。

  为 Docker 指定一个DNS服务器

  使用具有sudo权限的用户来登录你的Ubuntu。

  打开并编辑 /etc/default/docker

$ sudo nano /etc/default/docker
  添加设置

DOCKER_OPTS=”–dns 8.8.8.8”
  使用8.8.8.8替换如192.168.1.1的本地DNS服务器。你可以指定多个DNS服务器,多个DNS服务器使用空格分割例如

–dns 8.8.8.8 –dns 192.168.1.1
  警告:如果你正在使用的电脑需要连接到不同的网络,一定要选择一个公共DNS服务器。
  保存关闭文件。

  重启 Docker 进程

$ sudo restart docker
  或者,作为替代先前的操作过程,禁止NetworkManager中的dnsmasq(这样会使你的网络变慢)

  打开和编辑 /etc/default/docker

$ sudo nano /etc/NetworkManager/NetworkManager.conf
  注释掉 dns = dsnmasq:

  保存关闭文件

  重启NetworkManager 和 Docker

sudorestartnetworkmanager s u d o r e s t a r t n e t w o r k − m a n a g e r sudo restart docker
  升级Docker

  在wget的时候使用-N参数来安装最新版本的Docker:

$ wget -N https://get.docker.com/ | sh

#####################正常情况下以上内容可以不看
#####################安装镜像方法一

  下载镜像

  首先,访问 Docker 中文网,在首页中搜索名为“centos”的镜像,在搜索的结果中,有一个“官方镜像”,它就是我们所需的。

  然后,进入 CentOS 官方镜像页面,在“Pull this repository”输入框中,有一段命令,把它复制下来,在自己的命令行上运行该命令,随后将立即下载该镜像。

  查看本地所有的镜像:

docker images
  当下载完成后,您应该会看到:

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.cn/docker/centos centos6 25c5298b1a36 7 weeks ago 215.8 MB
  如果看到以上输出,说明您可以使用“docker.cn/docker/centos”这个镜像了,或将其称为仓库(Repository),该镜像有一个名为“centos6”的标签(Tag),此外还有一个名为“25c5298b1a36 ”的镜像 ID(可能您所看到的镜像 ID 与此处的不一致,那是正常现象,因为这个数字是随机生成的)。此外,我们可以看到该镜像只有 215.8 MB,非常小巧,而不像虚拟机的镜像文件那样庞大。

  现在镜像已经有了,我们下面就需要使用该镜像,来启动容器。

  启动容器

  只需使用以下命令即可启动容器:

docker run -i -t -v /root/software/:/mnt/software/ 25c5298b1a36 /bin/bash
  这条命令比较长,我们稍微分解一下,其实包含以下三个部分:

  docker run <相关参数> <镜像 ID> <初始命令>
  其中,相关参数包括:

  -i:表示以“交互模式”运行容器
  -t:表示容器启动后会进入其命令行
  -v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
  假设我们的所有安装程序都放在了宿主机的/root/software/目录下,现在需要将其挂载到容器的/mnt/software/目录下。

  需要说明的是,不一定要使用“镜像 ID”,也可以使用“仓库名:标签名”,例如:docker.cn/docker/centos:centos6。

  初始命令表示一旦容器启动,需要运行的命令,此时使用“/bin/bash”,表示什么也不做,只需进入命令行即可。

  安装相关软件

  为了搭建 Java Web 运行环境,我们需要安装 JDK 与 Tomcat,下面的过程均在容器内部进行。我们不妨选择/opt/目录作为安装目录,首先需要通过cd /opt/命令进入该目录

  安装 JDK

  首先,解压 JDK 程序包:

tar -zxf /mnt/software/jdk-7u67-linux-x64.tar.gz -C .
  然后,重命名 JDK 目录:

mv jdk1.7.0_67/ jdk/
  安装 Tomcat

  首先,解压 Tomcat 程序包:

tar -zxf /mnt/software/apache-tomcat-7.0.55.tar.gz -C .
  然后,重命名 Tomcat 目录:

mv apache-tomcat-7.0.55/ tomcat/
  设置环境变量

  首先,编辑.bashrc文件

vi ~/.bashrc
  然后,在该文件末尾添加如下配置:

export JAVA_HOME=/opt/jdk
export PATH= PATH: P A T H : JAVA_HOME
  最后,需要使用source命令,让环境变量生效:

source ~/.bashrc
  编写运行脚本

  我们需要编写一个运行脚本,当启动容器时,运行该脚本,启动 Tomcat,具体过程如下:

  首先,创建运行脚本:

vi /root/run.sh
  然后,编辑脚本内容如下:

!/bin/bash

source ~/.bashrc
sh /opt/tomcat/bin/catalina.sh run
  注意:这里必须先加载环境变量,然后使用 Tomcat 的运行脚本来启动 Tomcat 服务。

  最后,为运行脚本添加执行权限:

chmod u+x /root/run.sh
  退出容器

  当以上步骤全部完成后,可使用exit命令,退出容器。

  随后,可使用如下命令查看正在运行的容器:

docker ps
  此时,您应该看不到任何正在运行的程序,因为刚才已经使用exit命令退出的容器,此时容器处于停止状态,可使用如下命令查看所有容器:

docker ps -a
  输出如下内容:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57c312bbaad1 docker.cn/docker/centos:centos6 “/bin/bash” 27 minutes ago Exited (0) 19 seconds ago naughty_goldstine
  记住以上CONTAINER ID(容器 ID),随后我们将通过该容器,创建一个可运行 Java Web 的镜像。

  创建 Java Web 镜像

  使用以下命令,根据某个“容器 ID”来创建一个新的“镜像”:

docker commit 57c312bbaad1 javaweb:0.1
  该容器的 ID 是“57c312bbaad1”,所创建的镜像名是“javaweb:0.1”,随后可使用镜像来启动 Java Web 容器。

  启动 Java Web 容器

  有必要首先使用docker images命令,查看当前所有的镜像:

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
javaweb 0.1 fc826a4706af 38 seconds ago 562.8 MB
docker.cn/docker/centos centos6 25c5298b1a36 7 weeks ago 215.8 MB
  可见,此时已经看到了最新创建的镜像“javaweb:0.1”,其镜像 ID 是“fc826a4706af”。正如上面所描述的那样,我们可以通过“镜像名”或“镜像 ID”来启动容器,与上次启动容器不同的是,我们现在不再进入容器的命令行,而是直接启动容器内部的 Tomcat 服务。此时,需要使用以下命令:

docker run -d -p 58080:8080 –name javaweb javaweb:0.1 /root/run.sh
  稍作解释:

  -d:表示以“守护模式”执行/root/run.sh脚本,此时 Tomcat 控制台不会出现在输出终端上。
  -p:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 58080 端口,这样就向外界暴露了 58080 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。
  –name:表示容器名称,用一个有意义的名称命名即可。
  关于 Docker 网桥的内容,需要补充说明一下。实际上 Docker 在宿主机与容器之间,搭建了一座网络通信的桥梁,我们可通过宿主机 IP 地址与端口号来映射容器内部的 IP 地址与端口号,

  当运行以上命令后,会立即输出一长串“容器 ID”,我们可通过docker ps命令来查看当前正在运行的容器。

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82f47923f926 javaweb:0.1 “/root/run.sh” 4 seconds ago Up 3 seconds 0.0.0.0:58080->8080/tcp javaweb
  在浏览器中,输入以下地址,即可访问 Tomcat 首页:
  http://192.168.65.132:58080/
  注意:这里使用的是宿主机的 IP 地址,与对外暴露的端口号 58080,它映射容器内部的端口号 8080。
  由于我测试的虚拟机采用nat映射连接,如果采用这种方法测试则需要重新将58080端口映射到宿主主机才能够访问

#####################安装镜像方法二

  导入镜像centos7:
  docker load -i centos7 导入本地仓库
  编写安装jdk的Dockerfile

dockerfile语法

复制代码
Dockerfile关键字

CommentINSTRUCTION arguments

FROM
基于哪个镜像

RUN
安装软件用

MAINTAINER
镜像创建者

CMD
container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.

CMD主要用于container时启动指定的服务,当docker run command的命令匹配到CMD command时,会替换CMD执行的命令。如:
Dockerfile:

CMD echo hello world
运行一下试试:

edwardsbean@ed-pc:~/software/docker-image/centos-add-test$ docker run centos-cmd
hello world
一旦命令匹配:

edwardsbean@ed-pc:~/software/docker-image/centos-add-test$ docker run centos-cmd echo hello edwardsbean
hello edwardsbean
ENTRYPOINT
container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条

ENTRYPOINT没有CMD的可替换特性

USER

使用哪个用户跑container
如:

ENTRYPOINT [“memcached”]
USER daemon
EXPOSE
container内部服务开启的端口。主机上要用还得在启动container时,做host-container的端口映射:

docker run -d -p 127.0.0.1:33301:22 centos6-ssh
container ssh服务的22端口被映射到主机的33301端口

ENV
用来设置环境变量,比如:

ENV LANG en_US.UTF-8 ENV LC_ALL en_US.UTF-8
ADD

将文件拷贝到container的文件系统对应的路径
所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0
如果文件是可识别的压缩格式,则docker会帮忙解压缩

如果要ADD本地文件,则本地文件必须在 docker build ,指定的目录下

如果要ADD远程文件,则远程文件必须在 docker build ,指定的目录下。比如:

docker build github.com/creack/docker-firefox
docker-firefox目录下必须有Dockerfile和要ADD的文件

注意:使用docker build - < somefile方式进行build,是不能直接将本地文件ADD到container中。只能ADD url file.

ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。

VOLUME

可以将本地文件夹或者其他container的文件夹挂载到container中。

WORKDIR

切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效

ONBUILD

ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
复制代码

dockerfile语法
#####脚本

复制代码

Version: 1.0.0

Create Time: 2015-10-16 09:04

Author: baibai

Description: 在最新版本的ubuntu系统中安装jdk,构建可执行java的环境

FROM index.tenxcloud.com/tenxcloud/ubuntu:latest
MAINTAINER Li Siqi “lisiqi_jerry@163.com”

将jdk安装压缩包解压到/home/jdk1.8.0_51

ADD jdk-8u51-linux-x64.tar.gz /home/

安装中文语言包

RUN locale-gen zh_CN.UTF-8

设置java环境变量

ENV JAVA_HOME /home/jdk1.8.0_51
ENV CLASSPATH .: JAVAHOME/lib/dt.jar: J A V A H O M E / l i b / d t . j a r : JAVA_HOME/lib/tools.jar
ENV PATH PATH: P A T H : JAVA_HOME/bin

设置语言环境变量

ENV LANG zh_CN.UTF-8
ENV LANGUAGE zh_CN:zh

#####脚本

运行命令
docker build -t 自定义名称 路径
生成一个镜像
docker images 查看当前所有镜像
接下来用同样的方式运行tomcat

#####脚本

Version: 1.0.0

Create Time: 2015-12-25 11:04

Author: Lin Nan

基于已经配置好的jdk1.8版本进行操作

FROM jdk:latest
MAINTAINER Li Nan <593158016@qq.com>

创建目录

RUN mkdir -p -m 777 /home

将context中的压缩包迁移到容器中并解压

ADD tomcat8.tar.gz /home/tomcat8/

暴露文件目录

VOLUME [“/home/docker/file/distfirstout”, “/home/docker/file/input/D001”]

VOLUME [“/app/tomcat8/webapps/”]

暴露网络端口

EXPOSE 8881

启动服务

ENTRYPOINT [“/home/tomcat8/apache-tomcat-8.0.24/bin/catalina.sh”, “run”]
复制代码

#####脚本

  执行命令
  docker build –no-cache=true -t tomcat8 路径

docker run -d -p 8881:8080 –name=tomcat8 tomcat8

#####################安装镜像方法二结束
###############################################################################################  完

  常用命令:

复制代码
docker images 查看镜像
docker ps 查看容器
docker ps -a 查看所有容器,包括没有运行的
docker rm 删除容器
docker rmi 删除镜像
docker build 新建镜像
docker run 运行容器
docker stop 停止容器
docker logs 查看日志
docker load 导入镜像
docker save 导出镜像
docker commit 容器生成镜像
复制代码
  用一行命令大扫除:

docker kill $(docker ps -q) ;
docker rm $(docker ps -a -q) ;
docker rmi $(docker images -q -a)
  使用挂在方式搭载镜像的方式
  http://www.linuxidc.com/Linux/2015-01/112485.htm
  各个系统安装docker的方式
  http://docker.widuu.com/installation/ubuntu.html

指令说明
  指令的一般格式为INSTRUNCTION arguments,指令包括FROM、MAINTAINER、RUN等。具体指令及说明如下:

指令说明
FROM指定所创建镜像的基础镜像
MAINTAINER指定维护者信息
RUN运行命令
CMD指定启动容器时默认执行的命令
LABEL指定生成镜像的元数据标签信息
EXPOSE声明镜像内服务所监听的端口
ENV指定环境变量
ADD赋值指定的路径下的内容到容器中的路径下,可以为URL;如果为tar文件,会自动解压到路径下
COPY赋值本地主机的路径下的内容到容器中的路径下;一般情况下推荐使用COPY而不是ADD
ENTRYPOINT指定镜像的默认入口
VOLUME创建数据挂载点
USER指定运行容器时的用户名或UID
WORKDIR配置工作目录
ARG指定镜像内使用的参数(例如版本号信息等)
ONBUILD配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作的命令
STOPSIGNAL容器退出的信号
HEALTHCHECK如何进行健康检查
SHELL指定使用SHELL时的默认SHELL类型

1.FROM
  指定所创建的镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像。
  格式为:FROM,或FROM:,或FROM@。
  任何Dockerfile中的第一条指令必须为FROM指令。并且,如果在同一个Dockerfile文件中创建多个镜像,可以使用多个FROM指令(每个镜像一次)。

2.MAINTAINER
  指定维护者信息,格式为MAINTAINER。例如:

MAINTAINER image_creator@docker.com
  该信息将会写入生成镜像的Author属性域中。

3.RUN
  运行指定命令。
  格式为:RUN或RUN [“executable”,”param1”,”param2”]。
注意:
后一个指令会被解析为json数组,所以必须使用双引号。
前者默认将在shell终端中运行命令,即/bin/sh -c;后者则使用exec执行,不会启动shell环境。
指定使用其他终端类型可以通过第二种方式实现,例如:
RUN [“/bin/bash”,”-c”,”echo hello”]
每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\换行。例如:

RUN apt-get update \
&& apt-get install -y libsnappy-dev zliblg-dev libbz2-dev \
&& rm -rf /var/cache/apt
4.CMD
  CMD指令用来指定启动容器时默认执行的命令。它支持三种格式:

1.CMD [“executable”,”param1”,”param2”] 使用exec执行,是推荐使用的方式;
2.CMD param1 param2 在/bin/sh中执行,提供给需要交互的应用;
3.CMD [“param1”,”param2”] 提供给ENTRYPOINT的默认参数。
  每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。入股用户启动容器时指定了运行的命令(作为run的参数),则会覆盖掉CMD指定的命令。

5.LABEL
  LABEL指令用来生成用于生成镜像的元数据的标签信息。
  格式为:LABEL = = = …。
  例如:

LABEL version=”1.0”
LABEL description=”This text illustrates \ that label-values can span multiple lines.”
6.EXPOSE
  声明镜像内服务所监听的端口。
  格式为:EXPOSE […]
  例如:

EXPOSE 22 80 443 3306
注意:

  该命令只是起到声明租用,并不会自动完成端口映射。
在容器启动时需要使用-P(大写P),Docker主机会自动分配一个宿主机未被使用的临时端口转发到指定的端口;使用-p(小写p),则可以具体指定哪个宿主机的本地端口映射过来。

7.ENV
  指定环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在。
  格式为:ENV 或ENV=…。
  例如:

复制代码
ENV GOLANG_VERSION 1.6.3
ENV GOLANG_DOWNLOAD_RUL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
ENV GOLANG_DOWNLOAD_SHA256 cdd5e08530c0579255d6153b08fdb3b8e47caabbe717bc7bcd7561275a87aeb

RUN curl -fssL “GOLANG_DOWNLOAD_RUL" -o golang.tar.gz && echo " GOLANG_DOWNLOAD_RUL" -o golang.tar.gz && echo " GOLANG_DOWNLOAD_SHA256 golang.tar.gz” | sha256sum -c - && tar -C /usr/local -xzf golang.tar.gz && rm golang.tar.gz

ENV GOPATH GOPATH/bin:/usr/local/go/bin: G O P A T H / b i n : / u s r / l o c a l / g o / b i n : PATH

RUN mkdir -p “GOPATH/bin" && chmod -R 777 " GOPATH/bin" && chmod -R 777 " GOPATH”
复制代码
  指令指定的环境变量在运行时可以被覆盖掉,如docker run –env = built_image。

8.ADD
  该指令将复制指定的路径下的内容到容器中的路径下。
  格式为:ADD
  其中可以使Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个URL,还可以是一个tar文件(如果是tar文件,会自动解压到路径下)。可以使镜像内的绝对路径,或者相当于工作目录(WORKDIR)的相对路径。路径支持正则表达式,例如:

ADD *.c /code/
9.COPY
  复制本地主机的(为Dockerfile所在目录的一个相对路径、文件或目录)下的内容到镜像中的下。目标路径不存在时,会自动创建。路径同样支持正则。
  格式为:COPY
  当使用本地目录为源目录时,推荐使用COPY。

10.ENTRYPOINT
  指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数。
  支持两种格式:

1.ENTRYPOINT [“executable”,”param1”,”param2”] (exec调用执行);
2.ENTRYPOINT command param1 param2(shell中执行)。
  此时,CMD指令指定值将作为根命令的参数。
  每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个有效。
  在运行时可以被–entrypoint参数覆盖掉,如docker run –entrypoint。

11.VOLUME
  创建一个数据卷挂载点。
  格式为:VOLUME [“/data”]
  可以从本地主机或者其他容器挂载数据卷,一般用来存放数据库和需要保存的数据等。

12.USER
  指定运行容器时的用户名或UID,后续的RUN等指令也会使用特定的用户身份。
  格式为:USER daemon
  当服务不需要管理员权限时,可以通过该指令指定运行用户,并且可以在之前创建所需要的用户。例如:

RUN groupadd -r nginx && useradd -r -g nginx nginx
  要临时获取管理员权限可以用gosu或者sudo。

13.WORKDIR
  为后续的RUN、CMD和ENTRYPOINT指令配置工作目录。
  格式为:WORKDIR /path/to/workdir。
  可以使用多个WORKDIR指令,后续命令如果参数是相对的,则会基于之前命令指定的路径。例如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
  则最终路径为/a/b/c

14.ARG
  指定一些镜像内使用的参数(例如版本号信息等),这些参数在执行docker build命令时才以–build-arg=格式传入。
  格式为:ARG[=]。
  则可以用docker build –build-arg=来指定参数值。

15.ONBUILD
  配置当所创建的镜像作为其他镜像的基础镜像的时候,所执行创建操作指令。
  格式为:ONBUILD [INSTRUCTION]。
  例如Dockerfile使用如下的内容创建了镜像image-A:

[…]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build –dir /app/src
[…]
  如果基于image-A镜像创建新的镜像时,新的Dockerfile中使用FROM image-A指定基础镜像,会自动执行ONBUILD指令的内容,等价于在后面添加了两条指令:

FROM image-A

# Automatically run the following
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build –dir /app/src
  使用ONBUILD指令的镜像,推荐在标签中注明,例如:ruby:1.9-onbuild。

16.STOPSIGNAL
  指定所创建镜像启动的容器接收退出的信号值。例如:

STOPSIGNAL singnal
17.HEALTHCHECK
  配置所启动容器如何进行健康检查(如何判断是否健康),自Docker 1.12开始支持。
  格式有两种:

1.HEALTHCHECK [OPTIONS] CMD command :根据所执行命令返回值是否为0判断;
2.HEALTHCHECK NONE           :禁止基础镜像中的健康检查。
  [OPTION]支持:

1.–inerval=DURATION (默认为:30s):多久检查一次;
2.–timeout=DURATION (默认为:30s):每次检查等待结果的超时时间;
3.–retries=N    (默认为:3):如果失败了,重试几次才最终确定失败。
18.SHELL
  指定其他命令使用shell时的默认shell类型。
  格式为: SHELL [“executable”,”parameters”]
  默认值为 [“bin/sh”,”-c”]。
  注意:
    对于Windows系统,建议在Dockerfile开头添加# escape=`来指定转移信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值