1、dockerfile创建镜像的流程如下:
1.1 建立一个dockerfile命名的文件,往里面写东西 vim /opt/dockerfile
1.2 写完后构建镜像 dockerfile build . (. 表示当前目录下的dockerfile的所处位置)
1.3 修改镜像名 docker image tag 镜像名称: 镜像标签 新镜像名称: 新的标签
1.4 运行镜像 docker run .......
注意:docker 不是虚拟机,虚拟机的程序运行基本都是后台运行,利用 systemctl 命令
而容器运行必须要在前台,没有后台进程的概念,不能使用 systemctl
2、常用的dockerfile指令(都要大写)
from:指定基于哪个基础镜像 centos:6.8
run: 制作镜像的操作指令 yum -y install tomcat
cmd:运行镜像生成容器后需要执行的命令 nginx -s reload
一个dockerfile至多只能有一个cmd,如果有多个,只有最后一个生效。
entrypoint:作用和CMD一样,容器执行的命令
(dockerfile 中同时出现 cmd 和 entrypoint 时,把 CMD 的内容当作参数传递给 entrypoint )
copy:添加宿主机的文件到容器内,不会自动解压 tar 包,仅拷贝(保留源文件的元数据,如权限
add:添加宿主机的文件到容器内,会自动解压 tar 包
workdir :指定工作目录
volume:指定存储卷
expose:指定暴露的端口
env:设置环境变量
label:为镜像打标签
mkdir -pv dockerfile/{nginx,tomcat,httpd} #同时创建多个目录,-v 显示版本信息,在当前root目录下
cd dockerfile/nginx && yum -y install vim #装一个 vim 的包
pwd && vim Dockerfile #查看当前路径建立一个Dockerfile文件
FROM centos:7
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup && \ # 把官方的源mv改名作为备份
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \ #下载阿里云源
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo && \ #把阿里内网源删除
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo #下载阿里的epel源
RUN yum -y install nginx && rm -rf /var/cache/yum # &&表示同时进行,\表示换行符,都是一行命令,可以有多个RUN,#删除缓存,减小镜像大小
CMD nginx -g "daemon off;"
docker image build --help #查看创建镜像的相关信息
docker image build -t 镜像名 . #在当前路径下创建镜像并指定名称
在创建镜像时,会生成临时镜像,不要清除临时镜像(有可能后面的镜像依赖前面的临时镜像)
docker container ps -l #查看最近的容器的状况
3、docker 镜像的优化思路
(1)利用缓存提高编译速度—利用缓存,将不经常变更的指令放在靠前的位置;合并多条命令减小镜像层数
(2)减小镜像体积—删除无用的缓存、使用较小的基础镜像
4、手动制作镜像
4.1 手动制作单服务的Nginx镜像
docker container run -it -p 80:80 centos:7 /bin/bash #创建一个基础容器
进入到容器后,更换容器的yum为阿里云源
cd /etc/yum.repos.d
yum -y install wget && wget https://mirrors.aliyun.com/repo/ #下载阿里云的镜像源
wget https://mirrors.aliyun.com/repo/epel-7.repo #下载 epel-7.repo 源用于安装 nginx
yum clean all && yum makecache && yum repolist
yum -y install nginx && yum -y install net-tools #安装 nginx、 网络包
nginx #运行nginx (systemctl status nginx 报错,缺少d-b进程;nginx -h 看帮助信息),
netstat -nutlp #查看nginx端口号80及网络进程
nginx -V && cd /usr/share/nginx #查看nginx版本及其他信息后,进入到nginx里面
ls -l html && rm -rf html/index.html && echo 123 > html/index.html #默认html指向的是一个软链接,删除index.html
ifconfig && curl 172.17.0.3 #出现123(ifconfig 查看出来的容器ip是172.17.0.3)
cat /etc/yum.conf && rm -rf /var/cache/yum #删除缓存,减小镜像大小
至此,基础nginx镜像已制作完成,准备提交为新的镜像,退出容器。
docker container ps -sl # s指的是size ,列出容器列表及大小
docker container commit --help #查看容器提交帮助选项
docker container commit 88614be89fac nginx-new:v1201 #提交仓库作为新镜像
docker images #查看镜像
基于新镜像创建容器
docker container run -it -p 80:80 nginx-new:v1201 nginx -g 'daemon off;' #创建镜像后启动,daemon off 表示前台启动
netstat -nutlp #可以看到 nginx 已经在运行
top #查看是否 nginx 运行成功
4.2 手动制作多服务的Nginx镜像:Nginx+sshd
在以上已经创建好单服务的镜像中创建容器
docker container run -it nginx-new:v1201 #创建一个镜像,没指定启动 nginx 服务
netstat -nutlp 查看 nginx 服务没启动
yum -y install openssh-server && yum -y install initscripts #装启动 sshd 服务的包和依赖
/usr/sbin/sshd-keygen #生成 sshd 的 key
/usr/sbin/sshd #启动 sshd 的后台服务 (/usr/sbin/sshd -D 是前台服务,会卡住)
vim /ngxin-ssh-start.sh #编写运行脚本
#!/bin/bash
#nginx -g "daemon off;"
#backend operation
nginx -g "daemon on;"
mima = $1
if [ -n "$mima" ]; then
echo $mima | passwd --stdin root
else
echo 123 | passwd --stdin root
fi
#backend operation
/usr/sbin/sshd -D
chmod +x /nginx-ssh-start.sh
cat /etc/yum.conf && rm -rf /var/cache/yum #删除 yum 的缓存,减小容器大小,打包的镜像就小
【docker container commit 容器名 镜像名 #新开标签提交镜像
docker images #查看镜像
docker container run -itd 4634a139d281 /nginx-ssh-start.sh 6666 #创建并启动一个容器,指定密码
docker container ps -l #查看最近的容器
docker container top 容器名 #查看容器进程】