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/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>

进入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网络

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐