# docker-study-doc **Repository Path**: XiangdongHe1/docker-study-doc ## Basic Information - **Project Name**: docker-study-doc - **Description**: 自己整理的docker学习的一些文档,比较基础,适合开发人员参考。 - **Primary Language**: Docker - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2022-02-27 - **Last Updated**: 2025-11-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: 文档, Docker, Linux ## README # 介绍 自己整理的docker学习的一些文档,比较基础,适合开发人员参考。 docker网络部分没有整理,请谅解。 # Docker概述  # Docker安装 卸载旧版本的Docker ```shell yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine ``` 下载需要的安装包 ```shell yum install -y yum-utils ``` 设置镜像仓库 ```sh yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo #国外的地址 # 设置阿里云的Docker镜像仓库 yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #国外的地址 ``` 更新yum软件包索引 ```shell yum makecache fast ``` 安装docker相关配置 ```shell yum install docker-ce docker-ce-cli containerd.io ``` 启动docker ```shell systemctl start docker # 查看当前版本号,是否启动成功 docker version # 设置开机自启动 systemctl enable docker ``` 现在hello-world进行测试 ```shell docker run hello-world #结果 [root@iZuf6fung7ildlasg34d8iZ data]# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685 Status: Downloaded newer image for hello-world:latest #出现hello Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ ``` Docker的卸载 ```shell # 1. 卸载依赖 yum remove docker-ce docker-ce-cli containerd.io # 2. 删除资源 . /var/lib/docker是docker的默认工作路径 rm -rf /var/lib/docker ``` Docker设置阿里云镜像加速 ```shell sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker ``` # Docker的常用命令 ### 1.基础命令 ```shell docker version #查看docker的版本信息 docker info #查看docker的系统信息,包括镜像和容器的数量 docker 命令 --help #帮助命令(可查看可选的参数) docker COMMAND --help ``` ### 2.镜像命令 #### 2.1 docker images查看当前镜像 ```shell [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest bf756fb1ae65 11 months ago 13.3kB #解释: 1.REPOSITORY 镜像的仓库源 2.TAG 镜像的标签 3.IMAGE ID 镜像的id 4.CREATED 镜像的创建时间 5.SIZE 镜像的大小 # 可选参数 -a/--all 列出所有镜像 -q/--quiet 只显示镜像的id ``` #### 2.2 docker search搜索镜像 ```shell [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10308 [OK] mariadb MariaDB is a community-developed fork of MyS… 3819 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 754 [OK] percona Percona Server is a fork of the MySQL relati… 517 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 86 mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 79 centurylink/mysql Image containing mysql. Optimized to be link… 60 [OK] #可选参数 Search the Docker Hub for images Options: -f, --filter filter Filter output based on conditions provided --format string Pretty-print search using a Go template --limit int Max number of search results (default 25) --no-trunc Don't truncate output #搜索收藏数大于3000的镜像 [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker search mysql --filter=STARS=3000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10308 [OK] mariadb MariaDB is a community-developed fordockerk of MyS… 3819 [OK] ``` #### 2.3 docker pull 镜像名[:version] 下载镜像 ```shell [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql Using default tag: latest #如果不写tag默认就是latest latest: Pulling from library/mysql 6ec7b7d162b2: Pull complete #分层下载,docker image的核心-联合文件系统 fedd960d3481: Pull complete 7ab947313861: Pull complete 64f92f19e638: Pull complete 3e80b17bff96: Pull complete 014e976799f9: Pull complete 59ae84fee1b3: Pull complete ffe10de703ea: Pull complete 657af6d90c83: Pull complete 98bfb480322c: Pull complete 6aa3859c4789: Pull complete 1ed875d851ef: Pull complete Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #下载来源的真实地址 #docker pull mysql等价于docker pull docker.io/library/mysql:latest ``` #### 2.4 docker rmi 删除镜像 ```shell #1.删除指定的镜像id [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id #2.删除多个镜像id [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id 镜像id 镜像id #3.删除全部的镜像id [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f $(docker images -aq) ``` ## 3.容器命令 #### 3.1 拉取容器 ```shell docker pull centos ``` #### 3.2 运行容器 ```shell docker run [可选参数] image #参数说明 --name="名字" 指定容器名字 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 ( -p ip:主机端口:容器端口 配置主机端口映射到容器端口 -p 主机端口:容器端口 -p 容器端口 ) -P 随机指定端口(大写的P) ``` #### 3.3 进入容器 ```shell #一: [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it centos /bin/bash [root@bd1b8900c547 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var #二: docker run [可选参数] image docker attach 容器id ``` #### 3.4 退出容器 ```shell #exit 停止并退出容器(后台方式运行则仅退出) #Ctrl+P+Q 不停止容器退出 [root@bd1b8900c547 /]# exit exit [root@iZwz99sm8v95sckz8bd2c4Z ~]# ``` #### 3.5 列出运行过的容器 ```shell #docker ps # 列出当前正在运行的容器 -a # 列出所有容器的运行记录 -n=? # 显示最近创建的n个容器 -q # 只显示容器的编号 [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bca129320bb5 centos "/bin/bash" 4 minutes ago Exited (0) 3 minutes ago optimistic_shtern bd1b8900c547 centos "/bin/bash" 6 minutes ago Exited (0) 5 minutes ago cool_tesla cf6adbf1b506 bf756fb1ae65 "/hello" 5 hours ago Exited (0) 5 hours ago optimistic_darwin ``` #### 3.6 删除容器 ```shell docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f docker rm -f $(docker ps -aq) #删除所有的容器 docker ps -a -q|xargs docker rm #删除所有的容器 ``` #### 3.7 启动和停止容器 ```shell docker start 容器id #启动容器 docker restart 容器id #重启容器 docker stop 容器id #停止当前运行的容器 docker kill 容器id #强制停止当前容器 ``` ## 4.其他常用命令 #### 4.1 日志的查看 ```shell [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs --help Usage: docker logs [OPTIONS] CONTAINER Fetch the logs of a container Options: --details Show extra details provided to logs -f, --follow Follow log output --since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) -n, --tail string Number of lines to show from the end of the logs (default "all") -t, --timestamps Show timestamps --until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) 常用: docker logs -tf 容器id docker logs --tail number 容器id #num为要显示的日志条数 #docker容器后台运行,必须要有一个前台的进程,否则会自动停止 #编写shell脚本循环执行,使得centos容器保持运行状态 [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;done" c703b5b1911ff84d584390263a35707b6024816e1f46542b61918a6327a570dc [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c703b5b1911f centos "/bin/sh -c 'while t…" 13 seconds ago Up 10 seconds pedantic_banach [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs -tf --tail 10 c703b5b1911f 2020-12-27T03:34:07.255599560Z hi 2020-12-27T03:34:12.257641517Z hi 2020-12-27T03:34:17.259706294Z hi 2020-12-27T03:34:22.261693707Z hi 2020-12-27T03:34:27.262609289Z hi 2020-12-27T03:34:32.267862677Z hi 2020-12-27T03:34:37.270382873Z hi 2020-12-27T03:34:42.272414182Z hi 2020-12-27T03:34:47.274823243Z hi 2020-12-27T03:34:52.277419274Z hi ``` #### 4.2 查看容器中的进程信息 ```shell [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker top c703b5b1911f UID PID PPID C STIME TTY TIME CMD root 11156 11135 0 11:31 ? 00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done root 11886 11156 0 11:43 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5 ``` #### 4.3 查看容器中的元数据 ```shell [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker inspect 容器id ``` #### 4.4 进入当前正在运行的容器 方式一 docker exec 进入容器后开启一个新的终端,可以在里面操作 ```shell [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it c703b5b1911f /bin/bash [root@c703b5b1911f /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@c703b5b1911f /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 03:31 ? 00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done root 279 0 0 03:54 pts/0 00:00:00 /bin/bash root 315 1 0 03:56 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5 root 316 279 0 03:56 pts/0 00:00:00 ps -ef ``` 方式二 docker attach 进入容器正在执行的终端,不会启动新的进程 ```shell [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker attach c703b5b1911f ``` #### 4.5 拷贝操作 ```shell #拷贝容器的文件到主机中 docker cp 容器id:容器内路径 目的主机路径 #拷贝宿主机的文件到容器中 docker cp 目的主机路径 容器id:容器内路径 ``` ## 5.安装Portainner ```shell [root@localhost conf]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer Unable to find image 'portainer/portainer:latest' locally latest: Pulling from portainer/portainer 94cfa856b2b1: Pull complete 49d59ee0881a: Pull complete a2300fd28637: Pull complete Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f Status: Downloaded newer image for portainer/portainer:latest 8c525a0137be22965bd1e3944da622a2c4248f8ad20883f4b3ea4f8a6b11e163 [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7789d4505a00 portainer/portainer "/portainer" 6 seconds ago Up 5 seconds 0.0.0.0:8088->9000/tcp quirky_sinoussi ``` # Docker镜像讲解 #### 1.提交镜像 对镜像做出修改后,可以提交镜像,从而产生一个新的镜像,可以查看到 ```shell #使用docker commit 命令提交容器成为一个新的版本 docker commit -m=“提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG] #使用docker images查看新提交的镜像 ``` #### 2.部署Nginx ```shell #搜索镜像 docker search nginx #拉取下载镜像 docker pull nginx #运行测试 docker run -d --name nginx01 -p 3334:80 nginx -d 后台运行 --name 给容器命名 -p 3334:80 将宿主机的端口3334映射到该容器的80端口 #进入容器 docker exec -it nginx01 /bin/bash #进入配置文件目录 cd /etc/nginx #修改配置文件 vim nginx.conf #在本地进行访问测试 curl localhost:3334 ``` #### 2.部署tomcat ```shell #下载并运行 docker pull tomcat docker run -d -p 3335:8080 --name tomcat01 tomcat #进入容器 docker exec -it tomcat01 /bin/bash #tomcat的index界面在webapps.dist文件夹下,而不在webapps下 #将他们复制过去 -r表示将文件夹下的所有 都递归复制 cp -r /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps #访问测试 curl localhost:3335 ``` #### 3.部署ElasticSearch ```shell #添加 ’-e ES_JAVA_OPTS="-Xms128m -Xmx512m" ‘ 配置ElasticSearch的虚拟机占用的内存大小。 $ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx512m" elasticsearch:7.6.2 [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx512m" elasticsearch:7.6.2 3b8cd4991814896c523ee67b84ce198e32bd82b1a62d512b198138a58ca946f1 [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b8cd4991814 elasticsearch:7.6.2 "/usr/local/bin/dock…" 10 seconds ago Up 6 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch01 [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker stats ``` # 容器数据卷 ## 什么是容器数据卷 比如使用mysql容器,删除掉了容器,会导致mysql里面的数据丢失,相当于删库,缺少安全性。 容器之间有一个可以共享的技术,Docker容器中产生的数据,同步到本地。 这就是卷技术,目录的挂载,将我们的容器内的目录,挂载到Linux上。  ## 使用数据卷 方式一:直接使用命令来挂载(双向绑定) -v ```shell docker run -it -v 主机目录:容器目录 容器名 docker run -it -v /home/ceshi:/home centos /bin/bash #启动之后查看容器的信息 docker inspect 容器id ```  退出容器 ```shell exit #去Linux主机创建一个文件 #然后再次启动centos容器 docker start 0a21f1b32c26 #进入centos容器 docker attach 0a21f1b32c26 #会发现里面的文件仍然更新了,只要容器在docker后台不关闭,就会同步 ``` ## 实战安装MySQL MySQL持久化 ```shell #安装mysql docker pull mysql:5.7 #首次启动MySQL需要密码 #官方的测试,-e表示配置环境 #docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag #-d后台运行 -p端口映射 -v数据卷挂载 -e环境配置 --name名字 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=h545466093 --name mysql01 mysql:5.7 #启动之后使用Navicat连接,连接成功 ``` ## 具名和匿名挂载 ```shell #匿名挂载 #-P表示将所有公开端口发布到随机端口 docker run -d -P --name nginx01 -v /etc/nginx nginx #查看所有的volume的情况 docker volume ls #输出 DRIVER VOLUME NAME local 9c1daf3b99f8aa30a8c6f1d70f6dd7bddd0b6f75c32af282558b4227d2a80098 #卷名是随机生成的 #具名挂载 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx #查看所有的volume的情况 docker volume ls #输出 DRIVER VOLUME NAME local 9c1daf3b99f8aa30a8c6f1d70f6dd7bddd0b6f75c32af282558b4227d2a80098 local juming-nginx #卷名是刚刚指定的 #查看卷对应的目录 docker volume inspect juming-nginx #输出。没有给定目录的时候,都在/var/lib/docker/volumes目录下 [ { "CreatedAt": "2021-12-10T10:21:52+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", "Name": "juming-nginx", "Options": null, "Scope": "local" } ] ```  ```SHELL #如何确定是具名挂载还是匿名挂载,还是指定路径挂载 -v 容器路径 #匿名挂载 -v 卷名:容器路径 #具名挂载 -v /Linux主机路径:/容器路径 #指定路径挂载 ``` 扩展: ```shell #通过-v 容器内路径, ro rw 改变读写权限 ro readonly #只读 rw readwrite #读写 #容器对挂载出来的文件有限制,只能能通过宿主机改变 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx ``` ## 初识Dockerfile Dockerfile就是构建docker镜像的构建文件 通过脚本生成镜像,镜像是一层一层的,脚本每个命令都是一层 ```shell #创建文件dockerfile1 #文件的内容 指令都是大写 FROM centos VOLUME ["volume01","volume02"] CMD echo "---------end-----------" CMD /bin/bash #这里每个命令,都是镜像的一层 ``` ```shell # docker build -f dockerfile1 -t hehehe/centos:1.0 . #输出 可以看到是一步一步进行的 Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos ---> 5d0da3dc9764 Step 2/4 : VOLUME ["volume01","volume02"] ---> Running in 4d09f5c16a1b Removing intermediate container 4d09f5c16a1b ---> 9112fa0913f6 Step 3/4 : CMD echo "---------end-----------" ---> Running in 54d540ce124d Removing intermediate container 54d540ce124d ---> 0a2823d5f53d Step 4/4 : CMD /bin/bash ---> Running in 21c31e982f2a Removing intermediate container 21c31e982f2a ---> f6c8dc319947 Successfully built f6c8dc319947 Successfully tagged hehehe/centos:1.0 ``` 这个就是我们生成的镜像  ```shell #启动自己的容器 docker run -it f6c8dc319947 /bin/bash ```  在容器中新建一个文件  回到宿主机查看卷存在哪里,因为是匿名的,需要查一下 ```shell docker inspect be63e3238d0e ```  进入查看  ## 数据卷容器 两个Mysql同步数据  ```shell #启动三个容器 docker run -it --name docker01 hehehe/centos:1.0 docker run -it --name docker02 --volumes-from docker01 hehehe/centos:1.0 docker run -it --name docker03 --volumes-from docker01 hehehe/centos:1.0 #将docker01删除了,docker02和docker03中文件仍然存在 ``` 多个MySQL实现数据共享 ```shell #-d后台运行 -p端口映射 -v数据卷挂载 -e环境配置 --name名字 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=h545466093 --name mysql01 mysql:5.7 docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=h545466093 --name mysql02 --volumes-from mysql01 mysql:5.7 #实现两个mysql数据同步 ``` 容器之间配置信息传递,数据卷容器的生命周期一直持续到没有容器为止 但是挂载到本地Linux,就永远不会删除 # DockerFile ## DockerFile介绍 dokerfile用来构建docker镜像的文件,命令参数脚本! 构建步骤: 1.编写一个dockerfile文件 2.docker build构建成为一个镜像 3.docker run运行镜像 4.docker push发布镜像(dockerHub 阿里云镜像仓库) ## DockerFile构建过程 基础知识: 1.每个保留的关键字(指令)都必须是大写字母 2.执行从上到下顺序执行 3.#表示注释 4.每一个指令都会创建提交一个新的镜像层,并提交   dockerfile是面向开发的,我们以后要发布项目,做镜像,就要编写dockerfile文件 DockerFile:构建文件,定义了一切的步骤,源代码 DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品 Docker容器:容器就是镜像运行起来提供服务的服务器 ## DockerFile的指令 以前用别人的,我们用这些指令尝试写一个自己的 ```shell FROM #基础镜像,一切从这里开始构建M MAINTAINER #镜像是谁写的,姓名+邮箱 RUN #镜像构建的时候需要运行的命令 ADD #比如添加tomcat安装包 WORKDIR #镜像的工作目录 VOLUME #挂载的工作目录 EXPOSE #暴露端口配置 CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令 ONBUILD #当构建一个被继承 Dockerfile 这个时候就会运行 ONBUILD 指令,触发指令 COPY #类似ADD命令,将我们的文件拷贝到镜像中 ENV #构建的时候设置环境变量 ``` ## 实战测试 Docker Hub中99%的镜像都是由它而来的FROM scratch,然后配置需要的软件和配置来进行的构建 ``` 创建一个自己的centos ``` ```shell #1.编写dockerfile的文件 FROM centos MAINTAINER hehehe<545466093@qq.com> ENV MYPATH /usr/local #工作目录 MORKDIR $MYPATH #下载vim和net工具 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.测试运行 ``` 查看镜像的历史  平时可以拿一下镜像学习一下 ## CMD和ENTRYPOINT区别 ```shell CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 #创建dockerfile-cmd-test,写入以下内容 FROM centos CMD ["ls","-a"] #创建镜像 docker build -f dockerfile-cmd-test -t cmdtest . #启动镜像 docker run cmdtest #结果 ls-a生效了 [root@iZuf6fung7ildlasg34d8iZ dockerfile]# docker run e53cbd293e77 . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令 #创建dockerfile-entrypoint-test,写入以下内容 FROM centos CMD ["ls","-a"] #创建镜像 docker build -f dockerfile-entrypoint-test -t entrypointtest . #启动镜像 docker run entrypointtest -l #结果 ls-al生效了 [root@iZuf6fung7ildlasg34d8iZ dockerfile]# docker run c90d10bcce89 -l total 0 drwxr-xr-x 1 root root 6 Dec 10 11:10 . drwxr-xr-x 1 root root 6 Dec 10 11:10 .. -rwxr-xr-x 1 root root 0 Dec 10 11:10 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 340 Dec 10 11:10 dev drwxr-xr-x 1 root root 66 Dec 10 11:10 etc drwxr-xr-x 2 root root 6 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 6 Sep 15 14:17 lost+found drwxr-xr-x 2 root root 6 Nov 3 2020 media drwxr-xr-x 2 root root 6 Nov 3 2020 mnt drwxr-xr-x 2 root root 6 Nov 3 2020 opt dr-xr-xr-x 116 root root 0 Dec 10 11:10 proc dr-xr-x--- 2 root root 162 Sep 15 14:17 root drwxr-xr-x 11 root root 163 Sep 15 14:17 run lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x 2 root root 6 Nov 3 2020 srv ``` ## 实战Tomcat镜像 1.准备镜像文件tomcat压缩包,jdk的压缩包  2.编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要-f指定了 ```shell #以centos为基础 FROM centos #作者 MAINTAINER hehehe<545466093@qq.com> #将当前目录下的readme.txt放到镜像的/usr/local/目录下 COPY readme.txt /usr/local/readme.txt #添加jdk压缩包,会自动解压 ADD jdk-8u202-linux-x64.tar.gz /usr/local/ #添加tomcat压缩包 ADD apache-tomcat-8.5.73.tar.gz /usr/local/ #安装vim RUN yum -y install vim #配置环境变量 ENV MYPATH /usr/local #设置启动后进入的目录 WORKDIR $MYPATH #配置JAVA和Tomcat的环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_202 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.73 ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.73 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 #自动启动tomcat,并打印日志 CMD /usr/local/apache-tomcat-8.5.73/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.73/logs/catalina.out ``` 3.构建镜像 ```shell docker build -t diytomcat . ``` ```shell [root@iZuf6fung7ildlasg34d8iZ compressedPackage]# docker build -t diytomcat . Sending build context to Docker daemon 1.404GB Step 1/14 : FROM centos ---> 5d0da3dc9764 Step 2/14 : MAINTAINER hehehe<545466093@qq.com> ---> Using cache ---> 9ce5131a6b4e Step 3/14 : COPY readme.txt /usr/local/readme.txt ---> Using cache ---> fbfc6bc80fea Step 4/14 : ADD jdk-8u202-linux-x64.tar.gz /usr/local/ ---> Using cache ---> 2e43801ed8b0 Step 5/14 : ADD apache-tomcat-8.5.73.tar.gz /usr/local/ ---> Using cache ---> 2508755ccf5f Step 6/14 : ENV MYPATH /usr/local ---> Running in 88fa5f495c06 Removing intermediate container 88fa5f495c06 ---> 395de806f685 Step 7/14 : WORKDIR $MYPATH ---> Running in 5686f8e342e1 Removing intermediate container 5686f8e342e1 ---> b31ffba9c68f Step 8/14 : ENV JAVA_HOME /usr/local/jdk1.8.0_202 ---> Running in e287f81992e0 Removing intermediate container e287f81992e0 ---> bd16fb7eec80 Step 9/14 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ---> Running in b86f37fa72a2 Removing intermediate container b86f37fa72a2 ---> 0d3a4e36ee60 Step 10/14 : ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.73 ---> Running in c83e66beb0b2 Removing intermediate container c83e66beb0b2 ---> 0c9505dd0568 Step 11/14 : ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.73 ---> Running in e7f410b2a076 Removing intermediate container e7f410b2a076 ---> 725e4208afb5 Step 12/14 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin ---> Running in bd6621a6080d Removing intermediate container bd6621a6080d ---> f296f7b57c4d Step 13/14 : EXPOSE 8080 ---> Running in 501a60a3bc85 Removing intermediate container 501a60a3bc85 ---> 96239dab04b5 Step 14/14 : CMD /usr/local/apache-tomcat-8.5.73/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.73/logs/catalina.out ---> Running in 88054d7dda63 Removing intermediate container 88054d7dda63 ---> 65afadb564a4 Successfully built 65afadb564a4 Successfully tagged diytomcat:latest ``` 4.运行镜像,将logs目录和webapp目录挂载到本地 ```shell docker run -d -p 9090:8080 --name hehehetomcat -v /home/hehehe/build/tomcat/test:/usr/local/apache-tomcat-8.5.73/webapps/test -v /home/hehehe/build/tomcat/logs/:/usr/local/apache-tomcat-8.5.73/logs diytomcat ``` 5.访问测试 6.发布项目网页到tomcat上,由于已经做好了卷挂载,所以不需要去容器里面发布,直接在本地发布即可  index.jsp ```jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>