类似集装箱隔离,
jar — 容器(mysql,redis)----发布到仓库-----从仓库下载
Docker历史2010年dotcloud公司成立
2013 Docker开源
2014年4月9日,Docker1.0发布
在此之前都是用的虚拟机
基于go语言开发
Docker安装#卸载旧版本
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回顾hello-world流程 底层原理
-
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:3344Welcome to nginx! Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.Thank you for using nginx.
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
访问测试
42.193.51.130:8088
Commit镜像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 ghhgy7 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B 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
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
菜鸟教程(runoob.com)
Hello World!
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
进入test的url进行访问
5.发布自己的镜像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小结 Docker网络



