003.Docker镜像制作之基于Dockerfile制作镜像

1. 制作带有sshd服务的CentOS6.9镜像

# 1.编写dockerfile,文件名必须是Dockerfile或者dockerfile

# FROM: 指定基础镜像,两种语法
# FROM centos:6.9
# FROM imageId
FROM 2199b8eb8390
# RUN: 进入容器后执行的命令,尽量少的使用新的RUN命令行,因为每次执行一次RUN,都会生成一个新的临时容器
# RUN有两种语法
# RUN command && command
# RUN ["command","params",...], 例如: ["mysqld", "--initialize-insecure", "--user=mysql", "--basedir=/usr/local/mysql", "--datadir=/data/mysql/data"]
RUN yum install wget -y && mv /etc/yum.repos.d/* /tmp/ && wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo && sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo && yum clean all && yum makecache && yum install openssh-server -y 
RUN /etc/init.d/sshd start && echo "123456" | passwd root --stdin
# 暴露端口
EXPOSE 22
# CMD: 启动镜像后执行的命令
CMD ["/usr/sbin/sshd", "-D"]

# 2. 使用Dockerfile构建镜像,docker会自动寻找指定目录下的dockerfile文件
[root@bdc01 dockerfile]# docker image build -t yyh/centos6.9-sshd:v1.0 ./
...
Successfully built 98452bf34065

# 3.启动容器做测试
[root@bdc01 dockerfile]# docker container run -d --name sshd yyh/centos6.9-sshd:v1.0
[root@bdc01 dockerfile]# docker ps -a
CONTAINER ID  IMAGE                    COMMAND              CREATED        STATUS        PORTS   NAMES
b482cfda75ca  yyh/centos6.9-sshd:v1.0  "/usr/sbin/sshd -D"  8 seconds ago  Up 7 seconds  22/tcp  sshd
[root@bdc01 dockerfile]# docker container inspect b482cfda75ca | grep -i ipaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
[root@bdc01 dockerfile]# ssh 172.17.0.2
root@172.17.0.2's password: 
[root@b482cfda75ca ~]# exit
logout
Connection to 172.17.0.2 closed.

2. 制作带有LAMP+BBS系统的CentOS6.9镜像

# 1.准备好bbs系统的安装包,bbs.tar.gz
wget https://github.com/Discuz-X/DiscuzX/archive/Common.zip
unzip Common.zip
cd DiscuzX-Common
tar -zcvf bbs.tar.gz ./*
# 这样就可以得到bbs.tar.gz

# 2.准备一个脚本init.sh,在制作镜像时,容器中需要执行这个脚本来启动服务和初始化MySQL,其中内容如下
#!/bin/bash
/etc/init.d/mysqld start
mysql -e "grant all on *.* to root@'%' identified by '123456';grant all on *.* to discuz@'%' identified by '123456';flush privileges;create database discuz charset utf8;"
/etc/init.d/httpd start
/usr/sbin/sshd -D

# 3.编写dockerfile文件
[root@bdc01 lamp]# vim Dockerfile

FROM 2199b8eb8390
RUN yum install wget -y && mv /etc/yum.repos.d/* /tmp/ && wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo && sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo && yum clean all && yum makecache && yum install openssh-server httpd mysql mysql-server php php-mysql unzip -y
RUN /etc/init.d/sshd start && echo "123456" | passwd root --stdin && /etc/init.d/mysqld start && /etc/init.d/httpd start
# RUN mysql -e "grant all on *.* to root@'%' identified by '123456';grant all on *.* to discuz@'%' identified by '123456';flush privileges;create database discuz charset utf8;"
# COPY: 将宿主机的与Dockerfile在同一目录的文件复制到容器内,支持通配符,如果拷贝是目录,只能拷贝目录下的子目录和子文件
COPY init.sh /
# ADD: 将压缩包复制到容器内并自动解压,仅支持.tar.xxx格式的压缩包
# ADD支持URL的方式,例如:ADD https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz /tmp/
# 如果是从网络链接下载文件,那么就不会自动解压
ADD bbs.tar.gz /var/www/html/
RUN chmod 777 -R /var/www/html/*
EXPOSE 22
EXPOSE 80
EXPOSE 3306
CMD ["/bin/bash", "/init.sh"]

# 4.制作镜像
[root@bdc01 lamp]# ll
total 17324
-rw-r--r-- 1 root root 17727527 2020-10-30 13:23 bbs.tar.gz
-rw-r--r-- 1 root root      896 2020-10-30 13:30 Dockerfile
-rw-r--r-- 1 root root      250 2020-10-30 13:22 init.sh
[root@bdc01 lamp]# docker image build -t yyh/centos6.9-lamp:v1.0 ./
...
Successfully built f2ea7a774e2e

# 5.测试
[root@bdc01 lamp]# docker images
REPOSITORY           TAG           IMAGE ID            CREATED             SIZE
yyh/centos6.9-lamp   v1.0          f2ea7a774e2e        7 minutes ago       746 MB
nginx                latest        f35646e83998        2 weeks ago         133 MB
centos               latest        0d120b6ccaa8        2 months ago        215 MB
centos               6.9           2199b8eb8390        19 months ago       195 MB
centos               7.5.1804      cf49811e3cdb        19 months ago       200 MB
centos               7.6.1810      f1cb7c7d58b7        19 months ago       202 MB
[root@bdc01 lamp]# docker container run -d -p 8080:80 -p 2222:22 -p 33060:3306 --name centos6.9-lamp-bbs yyh/centos6.9-lamp:v1.0
9ae62b1f7060e3395dfb3f6f6127a527d6e91682e03850542d66be3e9e8de703
[root@bdc01 lamp]# docker container ls -a
CONTAINER ID  IMAGE                    COMMAND               CREATED         STATUS         PORTS                                                                 NAMES
9ae62b1f7060  yyh/centos6.9-lamp:v1.0  "/bin/bash /init.sh"  21 seconds ago  Up 21 seconds  0.0.0.0:2222->22/tcp, 0.0.0.0:8080->80/tcp, 0.0.0.0:33060->3306/tcp   centos6.9-lamp-bbs

3. 其他Dockerfile指令

# ENV: 设置环境变量
ENV HTMLDIR /var/www/html/
ADD bbs.tar.gz ${HTMLDIR}

# VOLUMN: 数据卷映射
# 设置挂载点,无法设置宿主机的目录,自动生成宿主机的目录,具体/dir1和/dir2对应宿主机哪个目录,可以通过查看容器详情来查看
VOLUMN ["/dir1", "/dir2"]

# WORKDIR:设置工作目录,设置之后,后续的RUN、CMD、ENTRYPOINT、COPY或者ADD指令都会在指定的WORKDIR中执行
# WORKDIR指令可以在Dockerfile中多次使用,如果提供了一个相对路径,它就是相对于前面的WORKDIR目录的路径
# 例如
# WORKDIR /a
# WORKDIR b
# WORKDIR c
# 那么实际的WORKDIR是/a/b/c
WORKDIR /var/www/html

# ENTRYPOINT,ENTRYPOINT和CMD的用法是一样的
# 如果使用CMD设置容器启动时执行/bin/bash/init.sh
# 那么这个操作可以被外部命令覆盖
# 例如启动容器:docker container run -d yyh/centos6.9-lamp:v1.0 /bin/bash
# 最后指定的/bin/bash就会覆盖掉CMD指定的命令
# 而使用ENTRYPOINT设置的命令是不会被覆盖
ENTRYPOINT ["/bin/bash", "/init.sh"]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349