Dockerfile
dockerfile 是用来构建docker 镜像的文件
步骤:
-
编写一个dockerfile 文件
-
docker build 构建成一个镜像
-
docker run 运行镜像
-
docker push 发布镜像(DockerHub,阿里云镜像仓库)
DockerFile 构建过程
基础知识:
-
每个保留关键字(指令)都是大写字母
-
执行从上到下顺序执行
-
#表示注解
-
每一个指令都会创建提交一个新的镜像层,并提交。
dockerfile 是面向开发的,我们要发布项目,做镜像,就需要编写dockerfile 文件,这个文件十分简单
Docker镜像逐渐成为企业交付的标准,必须要掌握。
DockerFile 构建文件,定义了一切的步骤,源代码
DockerImages: 通过DockerFile 构建生成的镜像,最终发布和运行的产品
Docker窗口:窗口就是镜像运行起来提供服务器
DockerFile指令
FROM #基础镜像 MAINTAINER #镜像的作者,姓名+邮箱 RUN #镜像构建的时候需要运行的命令 ADD #步骤,tomcat 镜像,添加内容 WORKDIR #镜像的工作目录 VOLUME #挂载目录 EXPOSE #暴露端口呵呵,跟-p 类型 CMD #指定容器启动的时候运行的命令,只有最后一个会生效,可以被替代 ENTRYPOINT #指定容器启动的时候运行的命令 可以追加命令 ONBUILD #当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的命令 COPY #类似 add,将文件拷贝到镜像中 ENV #构建的时候设置环境变量
实战测试
DockerHub 中99%镜像都是从这个基础镜像壹来的FROM scra
创建一个自己的centos
FROM centos MAINTAINER ben 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 dockfile 文件路径 -t 镜像名:[tag] Successfully built c0f8081136b6 Successfully tagged mycenos:0.1 #3.测试运行
我们可以列出本地进行的变更历史
docker history
CMD 和 ENTRYPOINT 区别
CMD #指定这个窗口启动的时候需运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT #指定这个窗口启动的时候要运行的命令,可以追加命令
测试CMD
[opc@instance-20210428-2058 docker-test]$ vim dockerfile-cmd-test FROM centos CMD ["ls","-a"] [opc@instance-20210428-2058 docker-test]$ sudo docker build -f dockerfile-cmd-test -t cmdtest . Sending build context to Docker daemon 3.072kB Step 1/2 : FROM centos ---> 5d0da3dc9764 Step 2/2 : CMD ["ls","-a"] ---> Running in 287da2cf95d2 Removing intermediate container 287da2cf95d2 ---> 1c6ee0167cca Successfully built 1c6ee0167cca Successfully tagged cmdtest:latest [opc@instance-20210428-2058 docker-test]$ sudo docker run 1c6ee0167cca #想追加一个命令 -l ls -al [opc@instance-20210428-2058 docker-test]$ sudo docker run 1c6ee0167cca -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown. ERRO[0002] error waiting for container: context canceled #cmd 的清理下 -l 替换了CMD["ls","-a"]命令, -l 不是命令所以报错 [opc@instance-20210428-2058 docker-test]$ vim docker-entrypoint-test FROM centos ENTRYPOINT ["ls","-a"] [opc@instance-20210428-2058 docker-test]$ sudo docker build -f docker-entrypoint-test -t entrypoint . Sending build context to Docker daemon 4.096kB Step 1/2 : FROM centos ---> 5d0da3dc9764 Step 2/2 : ENTRYPOINT ["ls","-a"] ---> Running in 3d552a2897d6 Removing intermediate container 3d552a2897d6 ---> 4597889b20f8 Successfully built 4597889b20f8 Successfully tagged entrypoint:latest #区别在于这里可以直接加参数 相当于ls -al [opc@instance-20210428-2058 docker-test]$ sudo docker run 4597889b20f8 -l total 0 drwxr-xr-x 1 root root 6 Dec 10 01:56 . drwxr-xr-x 1 root root 6 Dec 10 01:56 .. -rwxr-xr-x 1 root root 0 Dec 10 01:56 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 340 Dec 10 01:56 dev drwxr-xr-x 1 root root 66 Dec 10 01:56 etc drwxr-xr-x 2 root root 6 Nov 3 2020 home lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
编写Dockerfile 文件,官方命名 Dockerfile
3、构建镜像
发布自己的镜像
Docke hub
-
注册账号
-
确定这个账号可以登录
-
在我们服务器上提交自己的镜像
[opc@instance-20210428-2058 ~]$ sudo docker login -u ben202006 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 [opc@instance-20210428-2058 ~]$
-
登录完毕后就可以提交镜像了
docker push
docker tag imageId ben/tomcat:1.0
-
登录 阿里去
-
找到会被骂镜像服务
-
创建命名空间
-
创建容器镜像
-
浏览器信息
Docker 网络
网络Docker0
三个网络
#问题 Docker 是如何
sudo docker run -d -P --name tomcat01 tomcat
自定义网络
查看所有的docker 网络
网络模式
bridget: 桥接
none : 不配置网络
host: 主机模式,和宿主机共享网络
container: 容器网络连通
测试
# 我们直接启动命令 --net bridget,而 sudo docker run -d -P -t --name tomcat01 tomcat #我们可以自定义一个网络 # -- driver gridge # --subnet 192.168.0.0/16 #--gateway 198.168.0.1 [opc@instance-20210428-2058 ~]$ sudo docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet e588dbc3b74aa8a44c1b9634b67205d6c0c25c2a697eca4239252d29efa21efc [opc@instance-20210428-2058 ~]$ sudo docker run -d -P --name tomcat-net-01 --net mynet tomcat 7f218a38ece0cc071a40aed1de172a2979ffc6737ae842b2cf2cab00fe8ff385 [opc@instance-20210428-2058 ~]$ sudo docker run -d -P --name tomcat-net-02 --net mynet tomcat d9adce66b8b1cfd9b4b60618451b5c0870805ea2155f9ac8f867a6731cf92dfa [opc@instance-20210428-2058 ~]$ sudo docker exec -it tomcat-net-01 ping 192.168.0.3 OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown [opc@instance-20210428-2058 ~]$
好处:
redis -不同的集群使用不同的网络,保证集群是安全和健康的