赞
踩
类似集装箱隔离,
jar — 容器(mysql,redis)----发布到仓库-----从仓库下载
2010年dotcloud公司成立
2013 Docker开源
2014年4月9日,Docker1.0发布
在此之前都是用的虚拟机
基于go语言开发
#卸载旧版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine #需要的安装包 yum install -y yum-utils #设置镜像的仓库 yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #更新yum软件包索引 yum makecache fast #安装docker docker-ce社区版,ee企业版 yum install docker-ce docker-ce-cli containerd.io #启动docker systemctl start docker #重启 systemctl restart docker #查看版本 docker version #运行hello-world docker run hello-world
#查看镜像
[root@VM-0-15-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 5 weeks ago 13.3kB
#卸载docker
yum remove docker-ce docker-ce-cli containerd.io
#删除资源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访
问!
Docker-Server接收到Docker-Client的指令,就会执行这个命令!
为什么Docker比Vm快?
1、docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在
docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在
效率上有明显优势。
2、docker利用的是宿主机的内核,而不需要Guest OS。
GuestOS: VM(虚拟机)里的的系统(OS);
HostOS:物理机里的系统(OS);
因此,当新建一个 容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。然而避免引导、加
载操作系统内核是个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,返
个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此
新建一个docker容器只需要几秒钟。
docker version
docker info
docker <命令> --help
帮助文档
#查看镜像
docker images
docker images -q
docker images -a
[root@VM-0-15-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 5 weeks ago 13.3kB
REPOSITORY 镜像仓库源
#搜索镜像
[root@VM-0-15-centos ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11635 [OK]
mariadb MariaDB Server is a high performing open sou… 4429 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 863 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 362 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 91
#可选项,根据搜藏来过滤
--filter=STARS=3000 搜索出来的镜像就是STARS>3000
#拉取镜像 docker pull mysql[:tag] tag版本号 [root@VM-0-15-centos ~]# docker pull mysql Using default tag: latest # 如果不写tag,默认是latest latest: Pulling from library/mysql b380bbd43752: Pull complete # 分层下载,docker image的核心 联合文件系统 f23cbf2ecc5d: Pull complete 30cfc6c29c0a: Pull complete b38609286cbe: Pull complete 8211d9e66cd6: Pull complete 2313f9eeca4a: Pull complete 7eb487d00da0: Pull complete 4d7421c8152e: Pull complete 77f3d8811a28: Pull complete cce755338cba: Pull complete 69b753046b9f: Pull complete b2e64b0ab53c: Pull complete Digest: sha256:6d7d4524463fe6e2b893ffc2b89543c81dec7ef82fb2020a1b27606666464d87#签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #真实地址 docker pull mysql #等价于 docker pull mysql[:latest] #版本更改时,分层不会下载重复的文件
#删除镜像
docker rmi -f mysql:5.7#容器名
docker rmi -f 938b57d64674#容器ID
docker rmi -f 容器ID 容器ID 容器ID 容器ID...#删除多个容器
docker rmi -f $(docker images -aq)#删除全部容器
#拉取一个镜像测试
docker pull centos
#新建容器并启动 docker run [可选参数] image #参数说明 --name="Name" 容器名字 -d 后台方式运行 -it 交互方式运行,进入容器查看内容 -p (小写)指定容器的端口 -p ip:主机端口:容器端口 -p 主机端口:容器端口 -p 容器端口 -P 随机指定端口 #测试 docker run -it centos /bin/bash # 进入容器 exit # 退出
#列出所有运行的容器
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近
-q #只显示id
docker ps
docker ps -a #列出当前正在运行的容器+带出历史运行过的容器
exit #停止容器并退出
ctrl + P + Q #容器不停止并退出
#删除容器
docker rm 容器id#删除指定容器,不能删除正在运行的容器,如果要强制删除加上-f
docker rm -f $(docker ps -aq)#删除全部容器
docker ps -a -q|xargs docker rm#删除全部容器
#启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止容器
docker kill 容器id #强制停止容器
#后台启动容器
[root@VM-0-15-centos ~]# docker run -d centos
cb597e7918560bb7ed2b9e7d068061e49a040e7a090f037d54747e6e56263144
[root@VM-0-15-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#问题:发现centos停止了
#原因:docker使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止容器启动后,发现自己没有提供服务,就会立刻停止
#查看日志
docker logs -f -t --tail 显示条数 容器id
docker logs -f -t 容器id
#自己编写脚本
docker run -d centos /bin/sh -c "while true;do echo kuangshen;sleep 1;done"
#显示日志
docker logs -f -t --tail 10 06bea14ffa75
#查看容器中的进程信息
docker top 容器id
[root@VM-0-15-centos ~]# docker top 06bea14ffa75
UID PID PPID C STIME TTY TIME CMD
root 19496 19477 0 21:13 ? 00:00:00 /bin/sh -c while true;do echo kuangshen;sleep 1;done
root 20997 19496 0 21:18 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
#查看镜像的元数据 docker inspect 容器id [root@VM-0-15-centos ~]# docker inspect 06bea14ffa75 [ { "Id": "06bea14ffa75b860cdfe105f5045b1be83a6639eee9552ffc159ae01b401a5c4", "Created": "2021-11-07T13:13:56.785284074Z", "Path": "/bin/sh", "Args": [ "-c", "while true;do echo kuangshen;sleep 1;done" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 19496, "ExitCode": 0, "Error": "", "StartedAt": "2021-11-07T13:13:57.071684542Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6", "ResolvConfPath": "/var/lib/docker/containers/06bea14ffa75b860cdfe105f5045b1be83a6639eee9552ffc159ae01b401a5c4/resolv.conf",
#进入当前正在运行的容器 #方式一:容器在后台运行时,进入容器 docker exec -it 容器id /bin/bash [root@VM-0-15-centos ~]# docker exec -it 06bea14ffa75 /bin/bash [root@06bea14ffa75 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 13:13 ? 00:00:00 /bin/sh -c while true;do echo kuangshen;sleep 1;done root 719 0 0 13:25 pts/0 00:00:00 /bin/bash root 742 1 0 13:25 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1 root 743 719 0 13:25 pts/0 00:00:00 ps -ef #方式二:容器在后台运行时,进入容器 docker attach 容器id 正在执行当前的代码... #区别 docker exec #进入容器后开启一个新的终端 docker attach #进入容器正在执行的终端,不会启动新的进程
#从容器拷贝文件到主机 docker cp 容器id:容器内路径 目的主机路径 [root@VM-0-15-centos home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bad34ff90469 centos "/bin/bash" 31 seconds ago Up 30 seconds keen_einstein [root@VM-0-15-centos home]# docker attach bad34ff90469 [root@bad34ff90469 /]# cd /home/ [root@bad34ff90469 home]# ls [root@bad34ff90469 home]# touch test.java [root@bad34ff90469 home]# exit exit [root@VM-0-15-centos home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@VM-0-15-centos home]# docker cp bad34ff90469:/home/test.java /home [root@VM-0-15-centos home]# ls lighthouse redis test.java www #拷贝是一个手动过程,未来可以使用-v卷的技术,可以实现自动同步
安装nginx
[root@VM-0-15-centos home]# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 15763 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2091 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 818 [OK] jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 273 linuxserver/nginx An Nginx container, brought to you by LinuxS… 159 tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 143 [OK] jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 143 [OK] alfg/nginx-rtmp NGINX, nginx-rtmp-module and FFmpeg from sou… 110 [OK] jasonrivers/nginx-rtmp Docker images to host RTMP streams using NGI… 95 [OK] nginxdemos/hello NGINX webserver that serves a simple page co… 76 [OK] privatebin/nginx-fpm-alpine PrivateBin running on an Nginx, php-fpm & Al… 60 [OK] nginx/nginx-ingress NGINX and NGINX Plus Ingress Controllers fo… 55 nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 54 staticfloat/nginx-certbot Opinionated setup for automatic TLS certs lo… 25 [OK] nginxproxy/nginx-proxy Automated Nginx reverse proxy for docker con… 24 nginx/nginx-prometheus-exporter NGINX Prometheus Exporter for NGINX and NGIN… 22 schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 19 [OK] centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 15 centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 13 flashspys/nginx-static Super Lightweight Nginx Image 11 [OK] mailu/nginx Mailu nginx frontend 9 [OK] webdevops/nginx Nginx container 9 [OK] sophos/nginx-vts-exporter Simple server that scrapes Nginx vts stats a… 7 [OK] ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 3 [OK] wodby/nginx Generic nginx 1 [OK] [root@VM-0-15-centos home]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx b380bbd43752: Pull complete fca7e12d1754: Pull complete 745ab57616cb: Pull complete a4723e260b6f: Pull complete 1c84ebdff681: Pull complete 858292fd2e56: Pull complete Digest: sha256:644a70516a26004c97d0d85c7fe1d0c3a67ea8ab7ddf4aff193d9f301670cf36 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest [root@VM-0-15-centos home]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 87a94228f133 3 weeks ago 133MB centos latest 5d0da3dc9764 7 weeks ago 231MB [root@VM-0-15-centos home]# docker run -d --name nginx01 -p 3344:80 nginx bd1dd8f51eb8efe2359ed1e21ede663f82fc22a630f83ef87a85f0b24aaa96e3 [root@VM-0-15-centos home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bd1dd8f51eb8 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01 bad34ff90469 centos "/bin/bash" 33 minutes ago Up 16 minutes keen_einstein [root@VM-0-15-centos home]# curl localhost:3344 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> docker run -d --name nginx01 -p 3344:80 nginx#3344为主机端口号,80为容器端口号
安装tomcat
docker run -it --rm tomcat:9.0 #一般用于测试,用完就删除
docker run -d -p 3355:8080 --name tomca01 tomcat
部署es+kibana
#由于es比较耗内存,执行这个命令会死机
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#查看cpu,内存等状态
docker stats
#限制内存
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
使用kibana连接es
docker图形化界面管理工具,提供一个后台面板
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试
docker commit
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:TAG
测试
#启动一个tomcat docker run -it -p 8081:8080 tomcat #复制webapps.dist到websapps cp -r webapps.dist/* webapps/ #提交镜像 [root@VM-0-15-centos ~]# docker commit -a="ghhgy" -m="add webapps app" e605cafee200 tomcat02:1.0 sha256:2a9f9f5e81867c0be15d11b88200ba76e8876f26506bf20c38e562283268b396 [root@VM-0-15-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat02 1.0 2a9f9f5e8186 4 seconds ago 684MB tomcat latest b0e0b0a92cf9 2 weeks ago 680MB nginx latest 87a94228f133 3 weeks ago 133MB centos latest 5d0da3dc9764 7 weeks ago 231MB portainer/portainer latest 580c0e4e98b0 7 months ago 79.1MB elasticsearch 7.6.2 f29a1ee41030 19 months ago 791MB
如果数据在容器里,容器删了后数据会丢失
需求:数据持久化
数据可以存储在本地
目录的挂载
容器的持久化和同步操作,容器间可以数据共享
docker run -v 本机目录:容器目录
docker run -it -v /home/ceshi:/home centos /bin/bash
#类似于把本机目录挂载到容器目录,双向绑定
测试
docker pull mysql:5.7
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql:5.7
#匿名挂载 -v容器内的路径 docker run -d -P --name nginx01 -v /etc/nginx nginx #查看所有volume [root@VM-0-15-centos data]# docker volume ls DRIVER VOLUME NAME local a8af848d9eaef19d1f4250e67d4036f0dd6972d91d61d72370d363637f196cfb #具名挂载 [root@VM-0-15-centos data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx 82c334c8dca81c12780d2b0698e27495dad4733b7fab15a44944d8ba6e892ff2 [root@VM-0-15-centos data]# docker volume ls DRIVER VOLUME NAME local a8af848d9eaef19d1f4250e67d4036f0dd6972d91d61d72370d363637f196cfb local juming-nginx #查看路径 [root@VM-0-15-centos data]# docker volume inspect juming-nginx [ { "CreatedAt": "2021-11-08T16:59:02+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", "Name": "juming-nginx", "Options": null, "Scope": "local" } ]
大多使用具名挂载
# 三种挂载: 匿名挂载、具名挂载、指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的
拓展:
# 通过 -v 容器内路径: ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
构建docker镜像的构建文件,命令脚本
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
--volumes-from list Mount volumes from the specified container(s)
# 测试,我们通过刚才启动的
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v
/home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01
mysql:5.7
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name
mysql02 --volumes-from mysql01 mysql:5.7
# 这个时候,可以实现两个容器数据同步!
容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
dockerfile 是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、 编写一个dockerfile文件
2、 docker build 构建称为一个镜像
3、 docker run运行镜像
4、 docker push发布镜像(DockerHub 、阿里云仓库)
但是很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简
单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。
# DockerFile常用指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
FROM scratch
创建centos
#1.编写dockerfile FROM centos MAINTAINER ghhgy<你的邮箱> 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 mydockerfile-centos -t mycentos:0.1 . #3.运行测试,默认工作目录变成了/usr/local,支持了vim和ifconfig命令 #查看镜像构建历史 [root@VM-0-15-centos dockerfile]# docker history 9956616c2ab2 IMAGE CREATED CREATED BY SIZE COMMENT 9956616c2ab2 5 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B b300db55d9c9 5 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B e5c27ca58c9c 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B b100a7b87ba1 6 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B 680c65bf9616 6 minutes ago /bin/sh -c yum -y install net-tools 33.7MB 3d2b83702280 6 minutes ago /bin/sh -c yum -y install vim 75MB 80225a43f177 8 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B 7984a76b67ce 8 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B a7c6e1014333 8 minutes ago /bin/sh -c #(nop) MAINTAINER ghhgy<super.pa… 0B 5d0da3dc9764 7 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 7 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 7 weeks ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB
CMD 和 ENTYPOINT 区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD
[root@VM-0-15-centos dockerfile]# cat dockerfile-centos-cmd FROM centos CMD ["ls","-a"] [root@VM-0-15-centos dockerfile]# docker build -f dockerfile-centos-cmd -t cmdtest . [root@VM-0-15-centos dockerfile]# docker run cmdtest . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var #想追加一个-l [root@VM-0-15-centos dockerfile]# docker run cmdtest -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. # cmd的情况下 -l 替换了CMD["ls","-l"] ,-l 不是命令所以报错
测试ENTRYPOINT
[root@VM-0-15-centos dockerfile]# cat dockerfile-centos-entrypoint FROM centos ENTRYPOINT ["ls","-a"] [root@VM-0-15-centos dockerfile]# docker build -f dockerfile-centos-entrypoint -t entrypoint-test . [root@VM-0-15-centos dockerfile]# docker run entrypoint-test . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@VM-0-15-centos dockerfile]# docker run entrypoint-test -l total 56 drwxr-xr-x 1 root root 4096 Nov 8 10:19 . drwxr-xr-x 1 root root 4096 Nov 8 10:19 .. -rwxr-xr-x 1 root root 0 Nov 8 10:19 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 340 Nov 8 10:19 dev drwxr-xr-x 1 root root 4096 Nov 8 10:19 etc drwxr-xr-x 2 root root 4096 Nov 3 2020 home lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64 drwx------ 2 root root 4096 Sep 15 14:17 lost+found drwxr-xr-x 2 root root 4096 Nov 3 2020 media drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt drwxr-xr-x 2 root root 4096 Nov 3 2020 opt dr-xr-xr-x 142 root root 0 Nov 8 10:19 proc dr-xr-x--- 2 root root 4096 Sep 15 14:17 root drwxr-xr-x 11 root root 4096 Sep 15 14:17 run lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 3 2020 srv dr-xr-xr-x 13 root root 0 Nov 8 10:17 sys drwxrwxrwt 7 root root 4096 Sep 15 14:17 tmp drwxr-xr-x 12 root root 4096 Sep 15 14:17 usr drwxr-xr-x 20 root root 4096 Sep 15 14:17 var # ENTRYPOINT的情况下 -l 拼接在ENTRYPOINT命令后
Dockerfile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们然后测
试效果!
1、准备镜像文件
准备tomcat 和 jdk到当前目录,编写好README 。
[root@VM-0-15-centos webapps]# cat /home/mytomcat/Dockerfile FROM centos MAINTAINER ghhgy<你的邮箱> COPY readme.txt /usr/local/readme.txt ADD jdk-8u211-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.29.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_211 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.29 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.29 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.29/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.29/logs/catalina.out
2、构建镜像
docker build -t diytomcat .
3、运行镜像并挂载卷
docker run -d -p 8081:8080 -v /home/mytomcat/webapps/test:/usr/local/apache-tomcat-9.0.29/webapps/test -v /home/mytomcat/logs:/usr/local/apache-tomcat-9.0.29/logs diytomcat
4、在本机/home/mytomcat/webapps/test目录下新建WEB-INFO/web.xml和index.jsp
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> Hello World!<br/> <% out.println("你的 IP 地址 " + request.getRemoteAddr()); %> </body> </html>
进入test的url进行访问
1、地址 https://hub.docker.com/
2、确定这个账号可以登录
3、登录
[root@VM-0-15-centos test]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
#1、登录
docker login -u ghhgy
#2、把当前的diytomcat:latest tag改成ghhgy/tomcat:1.0,否则无法push
docker tag diytomcat:latest ghhgy/tomcat:1.0
#3、push镜像到dockerhub
docker push ghhgy/tomcat:1.0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。