基本结构
Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像。
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
Docker分为四部分:
基础镜像信息
维护者信息
镜像操作指令
容器启动时默认要执行的指令
例如:
[root@localhost ~]# mkdir nginx
[root@localhost ~]# ls
anaconda-ks.cfg nginx
[root@localhost ~]# cd nginx/
[root@localhost nginx]# vi Dockerfile // 这个D必须大写
[root@localhost nginx]# cat Dockerfile
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: seancheng
# Command format: Instruction [arguments / command] ...
# 第一行必须指定基于的基础镜像
FROM ubuntu
# 维护者信息
LABEL MAINTAINER='seancheng xianshangxian@126.com'
# 镜像操作指令
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list && \
apt-get update && apt-get install -y nginx && \
echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 容器启动时默认要执行的指令
CMD /usr/sbin/nginx // CMD是用来指定容器启动的时候要启动什么程序
创建镜像
编写完成Dockerfile后,可以通过docker build命令来创建镜像。
基本的格式为docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像。因此一般建议放置Dockerfile的目录为空目录。
另外,可以通过 .dockerignore 文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。
要指定镜像的标签信息,可以通过-t选项。
例如,指定Dockerfile所在路径为/tmp/docker_builder/,并且希望生成镜像标签为
[root@localhost ~]# docker build nginx
[root@localhost ~]# docker tag 20282efe05a2 kx0822/myapp:v0.1 // 给镜像取名字
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kx0822/myapp v0.1 20282efe05a2 About a minute ago 185MB
ubuntu latest ba6acccedd29 7 weeks ago 72.8MB
[root@localhost ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: kx0822
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@localhost ~]# docker push kx0822/myapp:v0.1
The push refers to repository [docker.io/kx0822/myapp]
d9e2e47db2a4: Pushed
2a270de0c211: Pushed
b25637d4baf9: Pushed
9f54eef41275: Mounted from library/ubuntu
v0.1: digest: sha256:f2d48f46f446f793f172c71b7726b735526b13b3c1348d0f1ddff1c67d4f8bab size: 1155
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kx0822/myapp v0.2 d83c65c205bc 2 seconds ago 185MB
kx0822/myapp v0.1 20282efe05a2 9 minutes ago 185MB
ubuntu latest ba6acccedd29 7 weeks ago 72.8MB
[root@localhost ~]# docker push kx0822/myapp:v0.2
// 使用新创建的镜像创建容器
[root@localhost ~]# docker run -d -p 80:80 --rm --name web kx0822/myapp:v0.1
8961a99d111a427e6f5d677cd7c282aa8552798d49a4ef5081ccb34af6d95960
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8961a99d111a kx0822/myapp:v0.1 "/bin/sh -c /usr/sbi…" 6 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web
Dockerfile编写
# 第一行必须指定基于的基础镜像
FROM centos
# 维护者信息
LABEL MAINTAINER='kx @126.com'
# 下载所需的软件包
RUN yum -y install epel-release && yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++ make && yum -y groups mark install 'Development Tools'
# 传输解压后的包
ADD apr-1.7.0.tar.gz /usr/src/
ADD apr-util-1.6.1.tar.gz /usr/src/
ADD httpd-2.4.53.tar.gz /usr/src/
# 编译安装、创建用户、修改配置文件
RUN cd /usr/src/apr-1.7.0 && ./configure --prefix=/usr/local/apr && make && make install && \
cd /usr/src/apr-util-1.6.1 && ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install && \
cd /usr/src/httpd-2.4.48 && ./configure --prefix=/usr/local/apache \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/ \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork &&\
make && make install && \
useradd -r -M -s /sbin/nologin apache && \
sed -i 's/$RM "$cfgfile"/# $RM "$cfgfile"/g' /usr/src/apr-1.7.0/configure && \
ln -s /usr/local/apache/include/ /usr/include/httpd && \
sed -i 's/#ServerName www.example.com:80/ServerName www.example.com:80/g' /usr/local/apache/conf/httpd.conf
# 容器启动后要执行的程序
CMD ["-D","FOREGROUND"]
ENTRYPOINT ["/usr/local/apache/bin/apachectl"]
# 暴露端口
EXPOSE 80 443 //暴露端口,这里暴露的端口是不一定存在的
生成镜像、并启动成容器
[root@localhost ~]# docker build -t kx0822/httpd:v0.1 apache
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wjm1734321/httpd v0.1 8e69401ab000 6 minutes ago 732MB
mysql latest bbf6571db497 7 days ago 516MB
nginx latest f652ca386ed1 7 days ago 141MB
busybox latest d23834f29b38 9 days ago 1.24MB
centos latest 5d0da3dc9764 2 months ago 231MB
//启动成容器
[root@localhost ~]# docker run -itd --name web -p 80:80 wjm1734321/httpd:v0.1
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
axf339b0b593 kx0822/httpd:v0.1 "/usr/local/apache/b…" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp web