1.通过Dockerfile创建一个基础镜像
- 安装c语言的编辑器:
- 首先创建了一个c语言编写的模块
- vim hello.c 里面输出内容如下:
#include<stdio.h>
int main()
{
printf("hello docker\n");
}
- 第一条命令:yum install gcc
- 第二条命令:yum install glibc-static
- 编译C语言成二进制文件命令:gcc -static hello.c -o hello
- 该目录下会出现:
总用量 844
-rwxr-xr-x. 1 root root 856856 12月 16 21:43 hello
-rw-r--r--. 1 root root 64 12月 16 21:43 hello.c
[root@localhost hello-c]# ./hello # 输入./hello
hello docker
- 创建一个Dockerfile:
- vim Dockerfile:
FROM scratch
ADD hello /
CMD ["/hello"]
- 把这个Dockerfile文件进行镜像:docker build -t lh9 .
- -t(–tag):镜像的名字及标签,通常 name:tag 或者name格式,可以在一次构建中为一个镜像设置多个标签
- lh9:是这次镜像仓库的名字(随意起)
- .:代表执行的是当前文件夹中的Dockerfile文件
2.构建docker镜像的两种方法
-
把容器(container)commit成镜像(image):docker container commit
- 简写为:docker commit
-
2.1、创建镜像方法一:
-
通过用docker commit 基于容器创建一个镜像:
- 1.首先 查看容器 docker container ls -a:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fdbd66aa1ed9 lh9 "/hello" 2 minutes ago Exited (13) awesome_aryabhata caa7fca0483d lh9 "/hello" 2 minutes ago Exited (13) vibrant_mendeleev
-
2.基于容器创建一个镜像:docker commit NAMES[容器的名字] IMAGENAME[镜像的名字]
- 执行命令:docker commit awesome_aryabhata test/lh9
- 创建成功会提示:
sha256:08984f0d6a0be8823f465d782de3fdcd6ec7494a956d5c7659964cb33e2fad72
-
3.查看当前镜像:docker images
REPOSITORY TAG IMAGE ID CREATED SIZE test/hl9 latest 08984f0d6a0b 15 seconds ago 857kB lh9 latest 906e443f5915 16 hours ago 857kB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
- 4.test/lh9 就是上面基于容器创建出的镜像。(不提倡这种方式)
-
-
2.1、创建镜像方法二:
- 通过使用Dockerfile来创建一个镜像方法:
- 1.首先创建一个文件夹
mkdir docker-vim
- 2.进入docker-vim文件夹中,创建一个Dockerfile文件:
[root@localhost docker-centos-vim]# more Dockerfile FROM centos:7.2.1511 (后面是7.2.1511 是我拉取centos镜像的版本号) RUN yum install -y vim
- 3.执行命令:docker build -t centos-vim[镜像的名字] . [.点代表的是当前目录]
- 通过使用Dockerfile来创建一个镜像方法:
3.Dockerfile 基本语法:
- 3.1、常用语法:
- 1.FORM:在哪个Base Image 之上,构建自己的Image
- FROM scratch :制作base image
- FROM centos:使用 base image
- FROM ubuntu:14.04 :使用 base image
- 经量使用官方的image作为base image 为了安全
- 2.LABEL:包含一些信息
- LABEL maintainer = ‘280773872@qq.com’ : 作者信息
- LABEL version = ‘1.0’: 版本信息
- LABEL description = ‘This is description’:描述信息
- 3.RUN:运行命令
Run yum update && yum install -y vim \ python-dev # 反斜线换行 && 合并命令
Run apt-get update && apt-get install -y perl \ pwgen --no-install-recommends && rm -rf \ /var/lib/apt/lists/* # 注意清理cache
Run /bin/bash -c 'source $HOME/.bashrc;echo $HOME'
- 为了美观,复杂的RUN 请用反斜杠换行,避免无用分层,合并多条命令成一行
- 4.WORKDIR:进入目录(相当于Linux系统中的cd 命令)
WORKDIR /test # 如果没有就会自动创建test目录 WORKDIR demo RUN pwd # 输出结果是 /test/demo
- 用WORKDIR,不要用RUN cd ,尽量使用绝对目录
- 5.ADD 和 COPY:把本地文件添加到根目录里面:
ADD hello / # 把本地hello 文件添加到/目录中 ADD test.tar.gz/ # ADD 根COPY区别,ADD 还可以解压缩,把test.tar.gz 压缩文件解压缩到/目录中
WORKDIR /root ADD hello test/ # /root/test/hello
WORKDIR /root COPY hello test/
- COPY优于ADD,ADD除了COPY还有额外功能(解压):适用于添加本地的文件
- 添加远程文件/目录请使用curl或者wget
- 6.ENV:设置常量
ENV MYSQL_VERSION 5.6 # 设置常量 RUN age-get install -y mysql-server = '${MYSQL_VERSION}'\ && rm -rf /var/lib/apt/lists/* # 引用常量
- 尽量使用ENV增加可维护性
- 7.EXPOSE:设置端口
- 8.CMD:设置容器启动后默认执行的命令和参数
- 1:容器启动时默认执行的命令
- 2:如果docker run 指令了其他命令,CMD命令会被忽略
- 3:如果定义了多个CMD,只有最后一行会执行
FROM centos:7.2.1511 ENV name Docker CMD echo "hello $name" CMD echo "hello lh9" # 只会输出这条信息
- 9.ENTRYPOINT:设置容器启动时运行的命令
- 1:让容器以应用程序或者服务的形式运行
- 2:不会被忽略,一定会执行
- 1.FORM:在哪个Base Image 之上,构建自己的Image
- 3.2、Shell 格式 和 Exec格式:
- Shell格式:要运行的命令当作shell格式来执行
RUN apt-get install -y vim CMD echo 'hello docker' ENTRYPOINT echo 'hello docker'
- 创建一个Dockerfile 文件:
FROM centos:7.2.1511 ENV name Docker ENTRYPOINT echo "hello $name"
- 创建镜像:docker build -t docker-shell[镜像的名字] .
- 创建容器:docker run docker-shell[镜像的名字]
- 输出结果:hello docker
- 总结:在使用shell格式写Dockerfile文件的时候,ENV变量 name 可以使用
- Exec 格式:特定的格式指明要运行的命令,和命令所跟的参数
RUN ['apt-get', 'install', '-y', 'vim'] CMD ['/bin/echo', 'hello docker'] ENTRYPOINT ['/bin/echo', 'hello docker']
- 创建一个Dockerfile文件:
FROM centos:7.2.1511 ENV name Docker ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]
- 创建镜像:docker build -t docker-exec .
- 创建容器:docker run docker-exec
- 输出结果:hello Docker
- 总结:在使用exec格式的时候,需要在/bin/bash,增加参数"-c" 使用要打印的变量名
- 创建一个Dockerfile文件: