Dockerfile迅速入门和Docker扩展

本文已被阅读过 Posted by 陌无崖 on 2019-08-24

什么是Dockerfile

dockerfile是一个使用特定格式且有特定命令组成的构建容器的文件。

准则

1、Dockerfile的命名具有唯一性,统一为Dockerfile,一般放在项目的根目录,方便构建成镜像文件。
2、Dockerfile中的内容为一系列特定的指令
3、Dockerfile中每一个指令都会创建一个镜像层。这些层是堆叠的,每一个层都是前一个层的增量。

指令详解

FROM

FROM用于指定基础的镜像,语法为FROM <image>:<tag>,tag表示版本,省略时默认是最新版本,如:

1
FROM Golang:1.12.3

LABEL

LABEL可以为镜像添加自定义的标签,一个镜像可以包括一个或多个标签。因为每一条指令都会创建一个可读的层,为了避免太多层,我们经常合并成一个指令,如,

1
LABEL com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"

RUN

RUN指令允许我们书写shell命令或者exec命令,且RUN指令创建的镜像层会被缓存。

1
2
3
4
5
6
# 创建一个文件夹
RUN mkdir /app
# 安装nginx
RUN apt-get install -y curl nginx
# 当然我们也可以进行合并
RUN mkdir /app && apt-get install -y curl nginx

COPY

copy为复制文件,语法为COPY <源路径>... <目标路径>,如:

1
2
3
4
# 将当前目录复制到app路径下。" . "代表当前目录。
COPY . /app
# 将当前work目录复制到app路径下。
COPY ./work /app

除了上面的使用方法,我们也可以利用通配符匹配文件,然后再复制到相应的路径下:

1
COPY app-* /app

常用的通配符如下

1
2
'*'         匹配任意序列的非分隔符字符。
'?' 匹配任何一个非分隔符字符

ADD

ADD 和COPY类似,一般推荐使用COPY,ADD对tar的提取和远程URL的支持不友好,因此我们不推荐使用以下的命令

1
ADD http://example.com/big.tar.xz /usr/src/things/

我们应该尽可能的使用RUN指令,使用shell命令获取

1
2
3
4
RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.xz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all

CMD

CMD主要用于执行我们的镜像中的五年。格式为CMD ["executable", "param1", "param2"...]如:

1
2
指定server这个文件
CMD ["./server"]

EXPOSE

当需要暴露我们的端口时,可以使用这个命令。代表当前容器将要监听的端口

1
EXPOSE 8900

ENV

这个指令经常被使用到,我们可以用它声明我们的环境变量,使用如下

1
ENV GOPATH /root/go

当我们使用的时候就可以像再shell命令中那样简单使用

1
RUN go run $GOPATH/program/main.go

WORKDIR

WORKDIR用于在容器内设置一个工作目录:通过WORKDIR设置工作目录后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行。 如,使用WORKDIR设置工作目录:

1
WORKDIR /app

USER

USER 用于指定运行镜像所使用的用户

Docker命令

获取镜像

1
2
docker pull [imagename]
docker pull [imagename]:1.0.1//指定版本


由于默认的拉取仓库为国外仓库,无法翻墙,因此无法拉取
解决方法
将镜像源换成阿里云镜像
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

重启docker

实例化镜像

实例化镜像即是运行一个镜像,即容器,容器为独立运行的一个或者一组应用以及他们所需要的运行环境
创建一个容器
docker create [选项] 镜像 运行的程序
-i 让容器的输入保持打开状态
-t 让docker分配一个伪终端
例如

1
docker create -it docker.io/mysql /bin/bash

端口映射

-P 默认随机映射一个端口
-p 自定义端口

1
2
docker run -d -P httpd
docker run -d -p 12345:80 httpd

容器互联

–link name:别名

1
2
3
4
5
6
7
8
9
10
# 创建一个源容器
docker run -d -P --name web1 httpd
# 创建接收容器
docker run -d -P --name web2 --link web1:web1 httpd
# 测试容器互联进入容器
docker exec -it web2 /bin/bash
# 安装 ping 命令
apt-get update && apt install iputils-ping
# 测试
ping web1

创建数据卷 -v

供容器使用的特殊目录,位于容器中,可以将宿主机的目录挂载到数据卷如:

1
2
3
4
5
# 创建名字为web的容器并且拥有两个数据卷目录
docker run -d -v /data1 -v /data2 --name web httpd:centos
# 创建一个名字为web-1的容器,并将主机的/var/www目录挂载到数据卷目录 /data1上
# 实现宿主机与容器之间数据的迁移
docker run -d -v /var/www:/data1 --name web-1 mysql:5.6

数据卷容器 -volumes-from

在容器之间共享一些数据
例如:

1
2
# 在web03容器中的data1目录中的数据会共享到web容器中的data1目录
docker run -it --volumes-from web --name web03 httpd:centos

推荐阅读


本文欢迎转载,转载请联系作者,谢谢!


打开微信扫一扫,关注微信公众号