前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >003.Docker镜像制作之基于Dockerfile制作镜像

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

作者头像
CoderJed
发布2020-11-12 12:00:52
3.8K0
发布2020-11-12 12:00:52
举报
文章被收录于专栏:Jed的技术阶梯Jed的技术阶梯

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"]
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 制作带有sshd服务的CentOS6.9镜像
  • 2. 制作带有LAMP+BBS系统的CentOS6.9镜像
  • 3. 其他Dockerfile指令
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档