文章目录
一、docker镜像制作
构建镜像的方式有两种:
- 使用docker commit命令
- 使用docker build和dockerfile文件
1.1 docker commit
1.1.1 制作步骤
# docker commit:提交一个正在运行的容器为一个新的镜像
#本例:制作一个tomcat镜像,制作步骤:
# 1. 拉取一个基础镜像
docker pull
#2. 创建一个交互式的容器
二、Docker file
2.1 DockerFile介绍
dockerfile 是用来构建docker镜像的文件,命令参数脚本
构建步骤:
-
编写一个dockerfile文件
-
docker build构建成为一个镜像
-
docker run运行镜像
-
docker push 发布镜像(DockerHub开源)
很多官方镜像都是基础包,需要自行搭建。
2.2 Docker构建过程
基础知识:
- 每个保留关键字(指令都是必须大写字母)
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建一个新的镜像层,并提交
步骤:开发、部署、上线运维
DockerFile :构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品
Docker容器:容器就是镜像运行起来,提供服务
2.3 DockerFile的指令
FROM #基础镜像,一切从这里开始构建
MIANTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤(例如,需要添加tomcat镜像,就需要ADD tomcat压缩包)
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #保留端口配置
CMD #指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候需要运行的命令,可以追加命令
ONBUILD #当构建一个被继承的DockerFile的时候运行,触发指令
COPY #类似ADD,将我们的文件拷贝到镜像中
ENV #构建的时候设置环境变量
2.4 实战测试
Docker Hub中大多数的镜像都是FROM scratch(基础镜像),然后添加需要的软件和相关配置
官方centos-7.0镜像地址
创建自己的centos
当使用Dockerfile Build镜像时,有时会发现发送到Daemon的内容过大,发现Docker Client会默认发送Dockerfile同级目录下的所有文件到Dockerdaemon中
解决办法有两种:
1.创建.dockerignore文件,把不需要的文件写到里面,该文件包含的目录不会被发送到Docker daemon中
2.就找个空目录只有dockerfile。
#1. 编写DockerFile文件
root@huif-Ubuntu20:/home# vim mydockerfile_centos
root@huif-Ubuntu20:/home# cat mydockerfile_centos
FROM centos
MAINTAINER huif<909582348@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end---"
CMD /bin/bash
# 2、通过文件构建镜像
#命令 docker build -f dockerfile文件路径 -t 镜像名:[tag]
docker build -f mydockerfile_centos -t mycentos:0.1 .
Successfully built 18d1a913eb39
Successfully tagged mycentos:0.1
# 3、测试运行
root@huif-Ubuntu20:/home# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 18d1a913eb39 2 minutes ago 307MB
centos latest 300e315adb2f 8 months ago 209MB
root@huif-Ubuntu20:/home# docker run -it mycentos:0.1
[root@16337acecbda local]# pwd
/usr/local
[root@16337acecbda local]# vim test
[root@16337acecbda local]#
docker history 查询历史
我们可以列出镜像本地进行的变更历史
root@huif-Ubuntu20:/home# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 18d1a913eb39 23 minutes ago 307MB
centos latest 300e315adb2f 8 months ago 209MB
root@huif-Ubuntu20:/home# docker history 18d1a913eb39
IMAGE CREATED CREATED BY SIZE COMMENT
18d1a913eb39 23 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
92fc11f9359e 23 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
55b731328368 23 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
c64fcd1cbe79 23 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
b09f2a766b7d 23 minutes ago /bin/sh -c yum -y install net-tools 29.5MB
660b69269c0f 23 minutes ago /bin/sh -c yum -y install vim 68.1MB
b69cbbf442b3 24 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
43ea30a12280 24 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
0e7e837a39e0 24 minutes ago /bin/sh -c #(nop) MAINTAINER huif<909582348… 0B
300e315adb2f 8 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 8 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 8 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
2.5 CMD和ENTRYPOINT的区别
CMD #指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候需要运行的命令,可以追加命令
测试cmd
#1. 创建dockerfile
root@huif-Ubuntu20:/home/docker_test# vim docker_cmd
#2.打印dockerfile内容
root@huif-Ubuntu20:/home/docker_test# cat docker_cmd
FROM centos
CMD ["ls","-a"]
#3.根据文件创建镜像
root@huif-Ubuntu20:/home/docker_test# docker build -f docker_cmd -t cmdImages .
invalid argument "cmdImages" for "-t, --tag" flag: invalid reference format: repository name must be lowercase
See 'docker build --help'.
root@huif-Ubuntu20:/home/docker_test# docker build -f docker_cmd -t cmdtest .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"]
---> Using cache
---> 8ea1c1e3331e
Successfully built 8ea1c1e3331e
Successfully tagged cmdtest:latest
#4. run运行 发现命令"ls","-a"生效
root@huif-Ubuntu20:/home/docker_test# docker run 8ea1c1e3331e
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
root@huif-Ubuntu20:/home/docker_test#
三、容器的目录挂载
#1. 在/opt创建交互式的镜像,并映射到/usr/local/myhtml
root@huif-Ubuntu20:/opt# docker run -itd --name c2 -v /opt:/usr/local/myhtml centos /bin/bash
43eb617c41eb2a1239e9993d1924bd3db0764ea0918b1bd7636c40c431f4a0f3
root@huif-Ubuntu20:/opt# ls
containerd deepinwine google
#2. 运行容器
huif@huif-Ubuntu20:~$ docker exec -it /c2 /bin/bash
#3. 查看宿主机映射目录/usr/local/myhtml下的文件目录
[root@43eb617c41eb /]# cd /usr/local/myhtml
[root@43eb617c41eb myhtml]# ls
containerd deepinwine google
#4. 在/opt编写一个1.txt的文件
root@huif-Ubuntu20:/opt# vim 1.txt
root@huif-Ubuntu20:/opt# cat 1.txt
Hi! huif
#5. 在/usr/local/myhtml查看映射
[root@43eb617c41eb myhtml]# ls
1.txt containerd deepinwine google