Docker学习笔记
Posted ghhgy531
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker学习笔记相关的知识,希望对你有一定的参考价值。
Docker概述
类似集装箱隔离,
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的常用命令
帮助命令
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
访问测试
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
1.DockerFile介绍
dockerfile 是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、 编写一个dockerfile文件
2、 docker build 构建称为一个镜像
3、 docker run运行镜像
4、 docker push发布镜像(DockerHub 、阿里云仓库)
但是很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
2.DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简
单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。
3.DockerFile的指令
# 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中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们然后测
试效果!
4.实战:Tomcat镜像
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/>
<%以上是关于Docker学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段