Docker基础学习

Docker的安装

查看linux版本

  • uname -r 查看内核版本

image-20210617091710491

  • cat /etc/os-release 获取linux的详细信息

image-20210617091755569

开始安装

  • 要安装 Docker Engine,你需要一个 CentOS 7或8的维护版本。必须启用 centos-extras 存储库。这个存储库默认是启用的,但是如果您已经禁用了它,您需要重新启用它。建议使用 overlay2存储驱动程序。

  • 参考官网

  • 安装之前卸载旧版本

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

image-20210617092043888

  • 安装存储库
 # 安装安装包
 sudo yum install -y yum-utils
 # 安装docker镜像 国外的
 sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
# 【建议】 国内阿里云镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

image-20210617092324744

  • 安装docker
# 安装之前更新索引
yum makecache fast
# 安装docker相关的  ce社区版的 ee企业版的
yum install docker-ce docker-ce-cli containerd.io
  • 启动docker
# 启动docker
systemctl start docker
  • 查看版本
docker version

image-20210617093321751

  • 运行helloworld 检查是否可用
docker run hello-world
image-20210617093520819
  • 查看docker镜像
docker images

image-20210617093631261

  • 卸载docker
  1. 卸载 Docker Engine、 CLI 和 Containerd 软件包:

    $ sudo yum remove docker-ce docker-ce-cli containerd.io
    
  2. 主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有图像、容器和卷:

    $ sudo rm -rf /var/lib/docker
    $ sudo rm -rf /var/lib/containerd
    

配置阿里云镜像加速

  • 登录阿里云账号

image-20210617094550038

image-20210617094609643

image-20210617094642135

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://nwucfehd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker查找镜像流程

image-20210617093936202

底层原理

image-20210617095241884

常用命令

官网 https://docs.docker.com/engine/reference/commandline/docker/

帮助命令

docker version # 查看docker版本
docker info # 查看docker的详细信息 
docker 命令 --help # 查看帮助文档

镜像命令

[root@ansible-02 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   3 months ago   13.3kB


REPOSITORY # 镜像源
TAG #镜像标签
IMAGE ID  #镜像ID
CREATED  # 镜像创建时间
SIZE #镜像大小
# 可选项
-a, --all # 查看所有镜像
-q, --quiet #只显示镜像id

搜索镜像命令

# 搜索镜像 
docker search 镜像名

# 参数
--filter , -f		#基于提供的条件的过滤器输出 可以通过stars过滤
--format		 #使用 Go 模板进行漂亮印刷的搜索
--limit	25	    #搜寻结果的最大数目
--no-trunc		#不要截断输出

也可到官网搜索 https://hub.docker.com/search?q=mysql&type=image

image-20210617101531195
  • 过滤stars3000以上的 docker search mysql --filter=stars=3000

image-20210617101949070

  • 过滤stars3000以上的 并且内容描述设置为不可截断 docker search --no-trunc mysql --filter=stars=3000

image-20210617102057908

  • --limit 是搜索返回的最大结果数。这个值可以在1到100之间。-- limit 的默认值为25。

  • 过滤

    • 过滤标志(- f 或 -- filter)格式是一个 key = value 对。如果有多个过滤器,则传递多个标志(例如 -- filter is-automated = true -- filter stars = 3)

      目前支持的过滤器有:

    • stars (int - number of stars the image has) 收藏数量

    • is-automated (boolean - true or false) - 是否为自动构建的 true、false

    • is-official (boolean - true or false) -是否为正式的(官方版本) true、false

# 过滤是自动构建的 busybox
docker search --no-trunc  busybox  --filter is-automated=true

image-20210617102843468

拉取镜像命令

[root@ansible-02 ~]# docker pull mysql
Using default tag: latest # 没有指定标签默认从latest拉取
latest: Pulling from library/mysql
69692152171a: Pull complete  # 分层下载,dockerimages的核心,联合文件系统
1651b0be3df3: Pull complete 
951da7386bc8: Pull complete 
0f86c95aa242: Pull complete 
37ba2d8bd4fe: Pull complete 
6d278bb05e94: Pull complete 
497efbd93a3e: Pull complete 
f7fddf10c2c2: Pull complete 
16415d159dfb: Pull complete 
0e530ffc6b73: Pull complete 
b0a4a1a77178: Pull complete 
cd90f92aa9ef: Pull complete 
Digest: sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址


# 等价于
docker pull mysql
docker pull docker.io/library/mysql:latest

#指定版本下载
[root@ansible-02 ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
69692152171a: Already exists # 已经存在的图层 不在重复下载
1651b0be3df3: Already exists 
951da7386bc8: Already exists 
0f86c95aa242: Already exists 
37ba2d8bd4fe: Already exists 
6d278bb05e94: Already exists 
497efbd93a3e: Already exists 
a023ae82eef5: Pull complete 
e76c35f20ee7: Pull complete 
e887524d2ef9: Pull complete 
ccb65627e1c3: Pull complete 
Digest: sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

Docker 图像可以由多个图层组成。在上面的例子中,图像由12个图层组成

图层可以通过图像重复使用。例如,mysql:latest 和mysql:5.7共享几个图层。已经存在的图层就不再下载

  • 使用docker images查看所有镜像

image-20210617104451770

  • Docker 使用内容寻址的图像存储,图像 ID 是一个 SHA256摘要,涵盖了图像的配置和层。

  • 在拉取完成后,Docker 打印图像的摘要。在上面的例子中,图像的摘要是:

    sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
    
  • 可以通过sha256获取镜像

docker pull mysql@sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa

image-20210617104823182

  • docker pull -all-tags images # 拉取所有版本的该镜像
    

关于更多拉取镜像的操作参考官网 https://docs.docker.com/engine/reference/commandline/pull/

删除镜像

  • docker rmi [OPTIONS] IMAGE [IMAGE...]
    
  • 描述

    • 从主机节点移除(和取消标记)一个或多个图像。如果一个图像有多个标记,使用此命令并将标记作为参数只删除标记。如果标记是图像的唯一标记,则图像和标记都将被删除。

      这不会从注册表中删除图像。除非使用-f 选项,否则无法删除正在运行的容器的映像。要查看主机上的所有图像,请使用 docker image ls 命令。

      例如使用这个命令,请参考下面的示例部分。

  • 参数

姓名,速记 违约 描述
--force , -f 强制删除图像
--no-prune 不要删除无标签
  • 操作
[root@ansible-02 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
mysql         5.7       2c9028880e58   5 weeks ago    447MB
mysql         latest    c0cdc95609f1   5 weeks ago    556MB
hello-world   latest    d1165f221234   3 months ago   13.3kB

# 通过标签删除
[root@ansible-02 ~]# docker rmi mysql:latest
Untagged: mysql:latest
Untagged: mysql@sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969
Deleted: sha256:c0cdc95609f1fc1daf2c7cae05ebd6adcf7b5c614b4f424949554a24012e3c09
Deleted: sha256:137bebc5ea278e61127e13cc7312fd83874cd19e392ee87252b532f0162fbd56
Deleted: sha256:7ed0de2ad4e43c97f58fa9e81fba73700167ef9f8a9970685059e0109749a56b
Deleted: sha256:9375660fbff871cd29c86b8643be60e376bfc96e99a3d7e8f93d74cd61500705
Deleted: sha256:d8a47065d005ac34d81017677330ce096eb5562eeb971e2db12b0e200fdb1cb6
Deleted: sha256:ca13c8ad9df5d824d5a259a927eaa6c04a60f022bc2abe8fc7866cf4b2b366f4

# 通过ID删除
[root@ansible-02 ~]# docker rmi 2c9028880e58
Untagged: mysql:5.7
Untagged: mysql@sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
Deleted: sha256:2c9028880e5814e8923c278d7e2059f9066d56608a21cd3f83a01e3337bacd68
Deleted: sha256:c49c5c776f1bc87cdfff451ef39ce16a1ef45829e10203f4d9a153a6889ec15e
Deleted: sha256:8345316eca77700e62470611446529113579712a787d356e5c8656a41c244aee
Deleted: sha256:8ae51b87111404bd3e3bde4115ea2fe3fd2bb2cf67158460423c361a24df156b
Deleted: sha256:9d5afda6f6dcf8dd59aef5c02099f1d3b3b0c9ae4f2bb7a61627613e8cdfe562
Deleted: sha256:7af1865d5c19316c3dc0829a2ee2b3a744ae756f7fec9c213d3afc5f1f6ed306
Deleted: sha256:f205c8f3c8aaa6376442b34c0c2062738461d37e0aa16ba021cd7e09c67213c2
Deleted: sha256:d690e8a8242cf13cbe98c5b2faffdd0fc7e6c4c13425b5da31de991aa1f89a76
Deleted: sha256:24efeee958e9f3d859fe15540e9296d5aaa6d3eb3b5f5494a2e8370608a4cfaa
Deleted: sha256:654f2ffede3bb536fd62d04c9c7b7826e890828bec92182634e38684959b2498
Deleted: sha256:de478a06eaa676052e665faa0b07d86a007f4b87cf82eb46a258742dc2d32260
Deleted: sha256:02c055ef67f5904019f43a41ea5f099996d8e7633749b6e606c400526b2c4b33

# 删除全部容器
[root@ansible-02 ~]# docker rmi -f $(docker images -aq)
Untagged: hello-world:latest
Untagged: hello-world@sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
#再次查看镜像
[root@ansible-02 ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

#也可以使用图像sha256删除 删除注册表localhost:5000/test/busybox上面的busybox镜像
docker rmi localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf

容器命令

  • 下载镜像
docker pull centos
  • 运行容器
# 参数
docker run [可选参数] image
 
# 参数说明
--name=“Name”   容器名字    tomcat01    tomcat02    用来区分容器
-d      后台方式运行
-it     使用交互方式运行,进入容器查看内容
-p      指定容器的端口     -p 8080:8080
    -p  ip:主机端口:容器端口
    -p  主机端口:容器端口(常用)
    -p  容器端口
    容器端口
-p      随机指定端口
 
 
# 测试,启动并进入容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -it centos /bin/bash
[root@74e82b7980e7 /]# ls   # 查看容器内的centos,基础版本,很多命令是不完善的
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
 
# 从容器中退回主机
[root@77969f5dcbf9 /]# exit
exit
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# ls
bin   dev  fanfan  lib    lost+found  mnt  proc  run   srv  tmp  var
boot  etc  home    lib64  media       opt  root  sbin  sys  usr
  • 列出所有正在运行的容器
# docker ps 命令
        # 列出当前正在运行的容器
-a      # 列出正在运行的容器包括历史容器
-n=?    # 显示最近创建的容器
-q      # 只显示当前容器的编号
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
77969f5dcbf9        centos              "/bin/bash"         5 minutes ago       Exited (0) 5 minutes ago                       xenodochial_bose
74e82b7980e7        centos              "/bin/bash"         16 minutes ago      Exited (0) 6 minutes ago                       silly_cori
a57250395804        bf756fb1ae65        "/hello"            7 hours ago         Exited (0) 7 hours ago                         elated_nash
392d674f4f18        bf756fb1ae65        "/hello"            8 hours ago         Exited (0) 8 hours ago                         distracted_mcnulty
571d1bc0e8e8        bf756fb1ae65        "/hello"            23 hours ago        Exited (0) 23 hours ago                        magical_burnell
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps -qa
77969f5dcbf9
74e82b7980e7
a57250395804
392d674f4f18
571d1bc0e8e8
  • 退出容器
exit            # 直接退出容器并关闭
Ctrl + P + Q    # 容器不关闭退出

#再次进入容器
docker attach 容器id
  • 删除容器
docker rm -f 容器id                       # 删除指定容器
docker rm -f $(docker ps -aq)       # 删除所有容器
docker ps -a -q|xargs docker rm -f  # 删除所有的容器
  • 启动和停止容器
docker start 容器id           # 启动容器
docker restart 容器id         # 重启容器
docker stop 容器id            # 停止当前正在运行的容器
docker kill 容器id            # 强制停止当前的容器

常用的其他命令

  • 后台启动命令
[root@ansible-02 ~]# docker run -d centos
7ae90e5c110f83d7933d444cc8e28ce038daa18ba41965f2b476fc5909c64d0e

# 使用docker ps查看  发现docker启动后自动关闭了
[root@ansible-02 ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

# 常见的坑, docker 容器使用后台运行, 就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx, 容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了
  • 查看日志
docker logs -tf --tail number 容器id
[root@ansible-02 ~]# docker logs -tf --tail 1 c0323115eb62
2021-06-17T05:05:45.901449914Z [root@c0323115eb62 /]# exit  # 日志输出

#自己编写一个脚本执行
[root@ansible-02 ~]# docker run -d centos /bin/sh  -c "while true;do echo hello world;sleep 1;done"
04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200

#查看容器进程 发现已经启动
[root@ansible-02 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
04046d3a81a9   centos    "/bin/sh -c 'while t…"   50 seconds ago   Up 49 seconds             kind_lichterman

#查看日志信息 发现正在打印 hello world
[root@ansible-02 ~]# docker logs -tf --tail 10 04046d3a81a9
2021-06-17T05:15:17.936138823Z hello world
2021-06-17T05:15:18.940434219Z hello world
2021-06-17T05:15:19.946570935Z hello world
2021-06-17T05:15:20.973001329Z hello world
2021-06-17T05:15:21.991633882Z hello world
2021-06-17T05:15:22.999685978Z hello world
2021-06-17T05:15:24.004549161Z hello world
2021-06-17T05:15:25.008258675Z hello world
2021-06-17T05:15:26.047740981Z hello world

  • 查看容器中进程信息
[root@ansible-02 ~]# docker top 04046d3a81a9
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                14872               14851               0                   22:13               ?                   00:00:00            /bin/sh -c while true;do echo hello world;sleep 1;done
root                15355               14872               0                   22:16               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
  • 查看镜像的元数据
[root@ansible-02 ~]# docker inspect 04046d3a81a9
[
    {
        "Id": "04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200",
        "Created": "2021-06-17T05:13:12.62892884Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo hello world;sleep 1;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 14872,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-06-17T05:13:13.000698631Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
        "ResolvConfPath": "/var/lib/docker/containers/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200/hostname",
        "HostsPath": "/var/lib/docker/containers/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200/hosts",
        "LogPath": "/var/lib/docker/containers/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200-json.log",
        "Name": "/kind_lichterman",
        "RestartCount": 0,
        "Driver": "overlay2",
- - -- -- - - -- - - - -
  • 进入当前正在运行中的容器
# 我们通过后台启动容器的方式运行的 需要进入容器 修改一些配置

# 命令
docker exec -it 容器id /bin/bash
# 进入docker容器 
[root@ansible-02 ~]# docker exec -it 04046d3a81a9 /bin/bash
[root@04046d3a81a9 /]# 

[root@04046d3a81a9 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

[root@04046d3a81a9 /]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 05:13 ?        00:00:00 /bin/sh -c while true;do echo hello world;sleep 1;done
root        626      0  0 05:23 pts/0    00:00:00 /bin/bash
root       1106      0  0 05:31 pts/1    00:00:00 /bin/bash
root       1151      1  0 05:31 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root       1152   1106  0 05:31 pts/1    00:00:00 ps -ef



# 方式二
docker attach 容器id
 
# docker exec       # 进入容器后开启一个新的终端,可以在里面操作
# docker attach     # 进入容器正在执行的终端,不会启动新的进程
  • 拷贝文件 从容器到主机
# 再容器上创建一个文件
[root@04046d3a81a9 home]# touch test.java
[root@04046d3a81a9 home]# ls
test.java
# 将文件拷贝到当前目录下
[root@ansible-02 ~]# docker cp 04046d3a81a9:/home/test.java ./
[root@ansible-02 ~]# ll
total 12
-rw-------. 1 root root 2769 May 31 17:16 anaconda-ks.cfg
-rw-r--r--. 1 root root 2777 May 31 17:22 initial-setup-ks.cfg
-rw-------. 1 root root 2049 May 31 17:16 original-ks.cfg
-rw-r--r--  1 root root    0 Jun 16 22:36 test.java

小结

image-20210617160722147

作业

安装nginx

# 直接下再并启动容器 
# 这里指定本地端口为 3344 而容器中nginx的启动端口为 80 名字为nginx01
[root@ansible-02 ~]# docker run -d --name nginx01 -p 3344:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
69692152171a: Pull complete 
30afc0b18f67: Pull complete 
596b1d696923: Pull complete 
febe5bd23e98: Pull complete 
8283eee92e2f: Pull complete 
351ad75a6cfa: Pull complete 
Digest: sha256:6d75c99af15565a301e48297fa2d121e15d80ad526f8369c526324f0f7ccb750
Status: Downloaded newer image for nginx:latest
091bc111846110a9de6ce27a5071e1b757168a7610741b441dcb3b71c35f83a2
# 查看本地镜像
[root@ansible-02 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    d1a364dc548d   3 weeks ago    133MB
centos       latest    300e315adb2f   6 months ago   209MB
# 查看容器是否启动
[root@ansible-02 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
091bc1118461   nginx     "/docker-entrypoint.…"   25 seconds ago   Up 24 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
04046d3a81a9   centos    "/bin/sh -c 'while t…"   36 minutes ago   Up 36 minutes                                           kind_lichterman
  • 打开浏览器访问 3344端口

image-20210617161408726

  • 进入容器内部 查看nginx安装位置
root@091bc1118461:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@091bc1118461:/# cd /etc/nginx/
root@091bc1118461:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params
  • 域名映射关系图
image-20210617161740740

安装Tomcat

  • 下载镜像并启动容器
# --rm 参数指 关闭容器后删除容器 
[root@ansible-02 ~]# docker run -it --rm -p 8888:8080 tomcat:9.0

# 进入tomcat容器中
[root@ansible-02 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED             STATUS             PORTS                                       NAMES
4248714095fd   tomcat:9.0   "catalina.sh run"        2 minutes ago       Up 2 minutes       0.0.0.0:8888->8080/tcp, :::8888->8080/tcp   upbeat_austin
091bc1118461   nginx        "/docker-entrypoint.…"   25 minutes ago      Up 25 minutes      0.0.0.0:3344->80/tcp, :::3344->80/tcp       nginx01
04046d3a81a9   centos       "/bin/sh -c 'while t…"   About an hour ago   Up About an hour                      kind_lichterman

# 进入容器中
[root@ansible-02 ~]# docker exec -it 4248714095fd  /bin/bash

# 查看安装目录
root@4248714095fd:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE	NOTICE	README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
root@4248714095fd:/usr/local/tomcat# cd webapps
root@4248714095fd:/usr/local/tomcat/webapps# ls

# 发现问题:1.linux命令少了, 2. webapps下内容为空,阿里云净吸纳过默认是最小的镜像,所有不必要的都剔除了,保证最小可运行环境即可
# webapps的原始内容其实是在webapps.dist中 然后将webapps.dist复制到webapps就可以了
root@4248714095fd:/usr/local/tomcat# cd webapps
root@4248714095fd:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
  • 访问页面

image-20210617164336129

安装es+Kibana

  • 安装es
# es 暴露的端口很多
# es 十分的耗内存
# es 的数据一般需要放置到安全目录! 挂载
# --net somenetwork 网络配置

docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2



# 测试
[root@ansible-02 ~]# curl localhost:9200
{
  "name" : "8cba692312bd",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "L2XkftBhR9u0wKVmOmgVZQ",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

# 限制大小 
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
  • 监视状态
dockter stats

image-20210617185538107

  • 更改内存后重新查看 cpu性能

image-20210617185752848

可视化工具

  • portainer(先用这个)
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer


  • 访问浏览器 8088端口

image-20210617200715638

Docker镜像讲解

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
如何得到镜像:

  • 从远程仓库下载
  • 朋友拷贝
  • 自己制作一个镜像DockerFile

Docker镜像加载原理

UnionFS(联合文件系统)

下载的时候看到的一层层就是这个。
UnionFS(联合文件系统)∶Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into asinglevirtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性∶一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

  • bootfs(boot ilesystem)主要包含bootloader和kerne,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由botfs转交给内核,此时系统也会卸载bootfs。[个人理解:bootfs用于开机,rootfs用于命令。]
  • rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/de,/proc,/bin,/etc等标准目录和文件。roots就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

image-20210618153634859

为什么虚拟机很大,Docker很小?
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
虚拟机是分钟级别,容器是秒级!

分层理解

理解:
所有的Docker┌镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于UbuntuLinux16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)

image-20210618165721991

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。

image-20210618165748388

上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版本。

image-20210618165807557

这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfiter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW【1】.
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

image-20210618165908909

举例

  • 这里我们拉取一个redis镜像
[root@localhost ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
69692152171a: Pull complete 
a4a46f2fd7e0: Pull complete 
bcdf6fddc3bd: Pull complete 
2902e41faefa: Pull complete 
df3e1d63cdb1: Pull complete 
fa57f005a60d: Pull complete 
Digest: sha256:7e2c6181ad5c425443b56c7c73a9cd6df24a122345847d1ea9bb86a5afc76325
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
# 可以看出他是分6层进行下载
  • 我们看一下该镜像的详细信息
 [root@localhost ~]# docker inspect redis
 "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:02c055ef67f5904019f43a41ea5f099996d8e7633749b6e606c400526b2c4b33",
                "sha256:ec5652c3523d96657d66169c0eb71b572ff065711c705a15ec02f60a21c212c3",
                "sha256:76d3e24d63f60e6a73af70be15959eb4021dd7a5a09da6925037d3b4a1673fca",
                "sha256:f06719b0aa43029f32c821c8f14f9f5941a8be6d3b61dcd9f3f884b39e9a4f23",
                "sha256:b896f490f2edc62cc9d190465bbeab871619590d1e9beeffb92e4ca9cc08116d",
                "sha256:e3f4077f577bf07c0940d6345ddd17014ff824d3f4f7f3effc9a8c4dae3e527b"
            ]
        },
# 可以看到他是分6层进行下载

特点

  • Docker镜像都是只读的 当启动容器的时候在该镜像上创建一层(容器),所有的操作都是在容器中进行的

image-20210618155526186

  • 总结

image-20210618155838651

Commit镜像

docker commit 提交容器成为一个新的副本

# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

实例

# 首先从网上pull一个tomcat 并运行
[root@localhost ~]# docker run -it -p 8080:80 tomcat /bin/bash

root@c212dc8abb8b:/usr/local/tomcat# cp -r webapps.dist/* webapps/
root@c212dc8abb8b:/usr/local/tomcat# cd webapps
root@c212dc8abb8b:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager

# 然后将当前已将创建好的镜像重新发布
[root@localhost ~]# docker commit -a="the" -m="add webapps" tomcat01 tomcat02:1.0
sha256:839df4265ee7f101b3dce48d332aa7adb7ef45e4c0923b9cdd08a0228face070
# 查看镜像 发布成功
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
tomcat02     1.0       839df4265ee7   14 seconds ago   672MB
tomcat       latest    5505f7218e4d   28 hours ago     667MB
redis        latest    fad0ee7e917a   2 weeks ago      105MB

容器数据卷

什么是容器数据卷

Docker的理念回顾

将应用和服务打包成一个镜像

如果数据都在容器中,如果我们删除容器,数据就会永久丢失, 需求:数据持节化

Mysql,容器删了,删库跑路! 需求: 将数据持节化到本地

容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!

这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

image-20210618162243127

总结: 卷技术可以实现容器和本地Linux之间数据的同步化,也可以实现容器之间的数据同步。数据共享

实例

# 下载并启动centos 并-v启动卷同步
[root@localhost ~]# docker run -it --name centos01 -v /home/test:/home centos

# 查看容器信息
[root@localhost home]# docker inspect de62d0531ee2
  "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/test", # 主机linux挂在目录
                "Destination": "/home", # 容器同步目录
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

  • 测试创建一个新文件 是一个双向的过程

image-20210618195014535

实战

安装mysql

# 运行容器,需要做数据挂载,安装启动mysql,需要配置密码
# 官方测试:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

-d	后台运行
-p	端口映射
-v	卷挂载
-e	环境配置
--name	容器名称

# 安装启动mysql 并设置密码 
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/mysql.cnf -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

image-20210618201955023

  • 测试 创建一个新的数据库 test

image-20210618202044010

具名和匿名

# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx     # -P 随机指定端口


# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径,也没有指定名!

[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     c1280dd0e57a792d0c74d01c46edea18e92d46415a2d49c026f6fe5efce4808e

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
efb31bfdfc07   nginx       "/docker-entrypoint.…"   42 seconds ago   Up 40 seconds   0.0.0.0:49153->80/tcp, :::49153->80/tcp                nginx01
0758f4a25cee   mysql:5.7   "docker-entrypoint.s…"   41 hours ago     Up 41 hours     33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql02
de62d0531ee2   centos      "/bin/bash"              44 hours ago     Up 44 hours                                                            centos01

# 使用具名的方式创建
[root@localhost ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
f7422866990f04b21635e627e7fdf97781a451a5dfeae43db3ee15c775b679fd
[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     c1280dd0e57a792d0c74d01c46edea18e92d46415a2d49c026f6fe5efce4808e
local     juming-nginx
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
f7422866990f   nginx       "/docker-entrypoint.…"   9 seconds ago   Up 8 seconds   0.0.0.0:49154->80/tcp, :::49154->80/tcp                nginx02
efb31bfdfc07   nginx       "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes   0.0.0.0:49153->80/tcp, :::49153->80/tcp                nginx01
0758f4a25cee   mysql:5.7   "docker-entrypoint.s…"   41 hours ago    Up 41 hours    33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql02
de62d0531ee2   centos      "/bin/bash"              44 hours ago    Up 44 hours                                                           centos01

  • 查看一下这个卷

image-20210620092339653

  • 查看目录
[root@localhost _data]# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params

所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxxx/_data

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v  容器内路径                   # 匿名挂载
-v  卷名:容器内路径               # 具名挂载
-v /主机路径:容器内路径            # 指定路径挂载

拓展

# 通过 -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
 
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作

初实DockerFile

DockerFIle就是用来构建与Docker镜像之间同步文件的!命令脚本

通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!

# 创建一个dockerfile文件, 名字可以随机
# 文件的内容 指定(大写) 参数
 
FROM centos
 
VOLUME ["/volume01", "/volume02"]
 
CMD echo "----end----"
CMD /bin/bash
 
# 这里的每一个命令都是镜像的一层!
  • 构建自己的镜像

image-20210620093336493

  • 查看镜像

image-20210620093313209

  • 启动自己的镜像
[root@localhost test]# docker run -it test/centos:1.4 /bin/bash
  • 检查下目录

image-20210620101641201

  • 这个卷一定在本机有一个对应的目录
    • 查看卷挂载目录 docker inspect 容器id

image-20210620102418226

测试一下刚才的文件是否同步到主机上了!

这种方式我们未来使用的十分多, 因为我们通常会构建自己的镜像!

假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!

数据卷容器

  • 创建docker01并查看
docker run -it --name docker01 test/centos:1.4 /bin/bash

image-20210620104532931

  • 创建docker02并指定数据卷来自docker01

    • docker run -it --name docker02  --volumes-from docker01   test/centos:1.4 /bin/bash
      
    • 查看目录

image-20210620104334133

  • 现在在一中创建一个文件testdocker02中查看 发现存在

image-20210620104649329

多个mysql同步

image-20210620104749767

多个mysql同步的原理是和上面的相同的

[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

结论

容器之间配置信息的传递, 数据卷容器的声明周期一直持续到没有容器使用为止。

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

DockerFile

dockerFile是用来构建docker镜像的文件!命令参数脚本!

构建步骤

  1. 编写一个dockerFile文件

2.docker build 构建成为一个镜像

  1. docker run 运行镜像

  2. docker push 发布镜像(DockerHub、阿里云镜像)

DockerFile的构建过程

基础知识:

  1. 每个保留关键字(指令)都是必须大写字母
  2. 执行从上到下顺序执行
  3. # 表示注释
  4. 每个指令都会创建提交一个新的镜像层,并提交!

image-20210620152217497

dockerFile是面向开发的, 我们以后要发布项目, 做镜像, 就需要编写dockefile文件, 这个文件十分简单!

Docker镜像逐渐成为企业的交互标准,必须要掌握!

步骤:开发,部署, 运维..... 缺一不可!

DockerFile: 构建文件, 定义了一切的步骤,源代码

DockerImages: 通过DockerFile构建生成的镜像, 最终发布和运行的产品!

Docker容器:容器就是镜像运行起来提供服务器

DockerFile指令说明

image-20210620152247024

FROM            # 基础镜像,一切从这里开始构建
MAINTAINER      # 镜像是谁写的, 姓名+邮箱
RUN             # 镜像构建的时候需要运行的命令
ADD             # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR         # 镜像的工作目录
VOLUME          # 挂载的目录
EXPOSE          # 保留端口配置
CMD             # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT      # 指定这个容器启动的时候要运行的命令, 可以追加命令
ONBUILD         # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY            # 类似ADD, 将我们文件拷贝到镜像中
ENV             # 构建的时候设置环境变量!

创建自己的镜像

[root@localhost dockerfile-test]# cat dockerfile-centos 
FROM centos
# 填写作者名 和 邮箱
MAINTAINER zgrey<1234544@qq.com> 
 
ENV MYPATH /usr/local
# 镜像的工作目录
WORKDIR $MYPATH    
# 安装vim 
RUN yum -y install vim
# 安装 ifconfig
RUN yum -y install net-tools  
 # 暴露80端口 
EXPOSE 80 
 
CMD echo $MYPATH 
CMD echo "---end---"
CMD /bin/bash


# 安装dockerfile
[root@localhost dockerfile-test]# docker build -f dockerfile-centos -t mycentos:1.0 .

Successfully built 36f2bc353613
Successfully tagged mycentos:1.0

image-20210620150945890

  • 启动容器并查看
[root@localhost dockerfile-test]# docker run --name mycentos01  -it mycentos:1.0 /bin/bash
[root@0db7ed0f20ee local]# pwd
/usr/local                      # 镜像开启默认在工作目录
  • 可以使用ifconfig

image-20210620151810704

  • 可以使用vim

image-20210620151841253

  • 查看本地运行的变更历史
[root@localhost test]# docker history mycentos:1.0 
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
ee5e440eee89   3 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
8bb709dc586a   3 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
2d21b0150f3e   3 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
73219a337451   3 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
0dafd1e7d6ae   3 minutes ago   /bin/sh -c yum -y install net-tools             25MB      
477a50205a00   3 minutes ago   /bin/sh -c yum -y install vim                   60.7MB    
a07bb528fbb3   4 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
a921a2bc7168   4 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
b3dc1e4e20d9   4 minutes ago   /bin/sh -c #(nop)  MAINTAINER zgrey<1234544@…   0B        
300e315adb2f   6 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      6 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      6 months ago    /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB   

CMD 和ENTRYPOINT区别

CMD         # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT      # 指定这个容器启动的时候要运行的命令, 可以追加命令
  • 测试CMD
# 1. 编写dockerfile文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-cmd-test 
FROM centos
CMD ["ls", "-a"]
 
# 2. 构建镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
 
# 3. run运行, 发现我们的ls -a 命令生效
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
 
# 想追加一个命令 -l 变成 ls -al
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 ls -l
 
# cmd的情况下 -l替换了CMD["ls", "-a"]命令, -l不是命令,所以报错了
  • 测试ENTRYPOINT
# 1. 编写dockerfile文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-entrypoint-test 
FROM centos
ENTRYPOINT ["ls", "-a"]
 
# 2. 构建文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-entrypoint-test -t entrypoint-test .
 
# 3. run运行 发现我们的ls -a 命令同样生效
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test
.
..
.dockerenv
bin
dev
etc
home
lib
 
# 4. 我们的追加命令, 是直接拼接到ENTRYPOINT命令的后面的!
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test -l
total 56
drwxr-xr-x  1 root root 4096 Aug 13 07:52 .
drwxr-xr-x  1 root root 4096 Aug 13 07:52 ..
-rwxr-xr-x  1 root root    0 Aug 13 07:52 .dockerenv
lrwxrwxrwx  1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x  5 root root  340 Aug 13 07:52 dev
drwxr-xr-x  1 root root 4096 Aug 13 07:52 etc
drwxr-xr-x  2 root root 4096 May 11  2019 home
lrwxrwxrwx  1 root root    7 May 11  2019 lib -> usr/lib
lrwxrwxrwx  1 root root    9 May 11  2019 lib64 -> usr/lib64
drwx------  2 root root 4096 Aug  9 21:40 lost+found
 

Docker制作Tomcat镜像

  • 编辑配置文件
[root@localhost myTomcat]# cat Dockerfile 
FROM centos

MAINTAINER zgrey<123123@qq.com>

ADD apache-tomcat-7.0.75.tar.gz /usr/local/
ADD jdk-8u121-linux-x64.tar.gz /usr/local/

RUN yum -y install vim 
RUN yum -y install net-tools

ENV MYPATH  /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_121

ENV JAVA_HOME /usr/local/jdk1.8.0_73
#ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
#ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37
#ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

ENV PATH   $PATH:$JAVA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-7.0.75/bin/startup.sh && tail -F /usr/local/apache-tomcat-7.0.75/bin/logs/catalina.out

  • 构建镜像
[root@localhost myTomcat]# docker build -t mytomcat:1.0 .
  • 启动容器
docker run -it -p 3344:8080 --name mytomcat -v /home/myTomcat/test:/usr/local/apache-tomcat-7.0.75/webapps/test -v /home/myTomcat/logs:/usr/local/apache-tomcat-7.0.75/logs mytomcat:1.0 /bin/bash

# 查看目录
[root@148f76894978 local]# ls
apache-tomcat-7.0.75  bin  etc	games  include	jdk1.8.0_121  lib  lib64  libexec  sbin  share	src

  • 在主机中进入日志文件中查看

image-20210620165153001

  • 由于我们将webapps目录同步到了本地所以直接在本地test目录中发布就可以

发布到DockerHub

  • 登录DockerHub
[root@localhost test]# docker login -u uikka 
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

  • 发布到远程
[root@localhost test]# docker push mytomcat:1.0 
The push refers to repository [docker.io/library/mytomcat]
9376e126d001: Preparing 
e778d6435992: Preparing 
e09ab34b1e6e: Preparing 
ed8ab35cfeb4: Preparing 
2653d992f4ef: Preparing 
denied: requested access to the resource is denied # 拒绝

# 解决  更改一下tag
[root@localhost test]# docker tag a041614d7458 uikka/mytomcat:1.0
[root@localhost test]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
mytomcat         1.0       a041614d7458   20 minutes ago   679MB
uikka/mytomcat   1.0       a041614d7458   20 minutes ago   679MB
mycentos         1.0       ee5e440eee89   2 hours ago      295MB
test/centos      1.4       200025508191   5 hours ago      209MB
test/centos      1.0       4cfac7a8a5b6   5 hours ago      209MB
test/centos      1.2       4cfac7a8a5b6   5 hours ago      209MB
test/centos      1.3       4cfac7a8a5b6   5 hours ago      209MB
tomcat02         1.0       839df4265ee7   2 days ago       672MB
tomcat           latest    5505f7218e4d   3 days ago       667MB
redis            latest    fad0ee7e917a   2 weeks ago      105MB
nginx            latest    d1a364dc548d   3 weeks ago      133MB
mysql            5.7       2c9028880e58   5 weeks ago      447MB
centos           latest    300e315adb2f   6 months ago     209MB

[root@localhost test]# docker push uikka/mytomcat:1.0
The push refers to repository [docker.io/uikka/mytomcat]
9376e126d001: Pushing [===>                                               ]  1.574MB/24.97MB
e778d6435992: Pushing [=>                                                 ]  2.221MB/60.68MB
e09ab34b1e6e: Pushing [>                                                  ]  1.598MB/370.1MB
ed8ab35cfeb4: Pushing [==========>                                        ]   2.83MB/13.71MB
2653d992f4ef: Pushing [=>                                                 ]  5.471MB/209.3MB
# 提交的话也是分层来的
#成功!!!

发布到阿里云镜像服务

  • 登录阿里云 创建一个个人实例

image-20210620170824059

  • 创建一个命名空间

image-20210620170948605

image-20210620171029960

  • 创建一个本地私有仓库

image-20210620171154427

  • 登录阿里云
[root@localhost test]# docker login --username=jh0125*** registry.cn-shenzhen.aliyuncs.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

  • 从Registry中拉取镜像
$ docker pull registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:[镜像版本号]
  • 推送镜像
$ docker login --username=jh0125**** registry.cn-shenzhen.aliyuncs.com
$ docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:[镜像版本号]
$ docker push registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:[镜像版本号]

测试

[root@localhost test]#  docker tag a041614d7458  registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:1.0
[root@localhost test]# docker push registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:1.0
The push refers to repository [registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey]
9376e126d001: Pushed 
e778d6435992: Pushed 
e09ab34b1e6e: Pushed 
ed8ab35cfeb4: Pushed 
2653d992f4ef: Pushed 
1.0: digest: sha256:f892298ad851cb1234b56a61e2a6fa6b7d7491e47618f3db798b9e3b51431fc9 size: 1377

image-20210620172534787

image-20210620172545885

小结

image-20210620174738636

网络

https://blog.csdn.net/qq_21197507/article/details/115071715

posted @ 2021-10-14 15:33  錵開や落幕  阅读(298)  评论(0编辑  收藏  举报