Docker基础学习 Docker的安装 常用命令 作业 可视化工具 Docker镜像讲解 容器数据卷 DockerFile 发布到DockerHub 网络

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

查看linux版本

  • uname -r 查看内核版本

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

开始安装

  • 要安装 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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 安装存储库
 # 安装安装包
 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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 运行helloworld 检查是否可用
docker run hello-world
Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络
  • 查看docker镜像
docker images

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 卸载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
    

配置阿里云镜像加速

  • 登录阿里云账号

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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查找镜像流程

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

底层原理

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

常用命令

官网 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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络
  • 过滤stars3000以上的 docker search mysql --filter=stars=3000

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • --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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

拉取镜像命令

[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查看所有镜像

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

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

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

docker pull mysql@sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 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

小结

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

作业

安装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端口

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 进入容器内部 查看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
  • 域名映射关系图
Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

安装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
  • 访问页面

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

安装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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

可视化工具

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


  • 访问浏览器 8088端口

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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等等。

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

分层理解

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

举例

  • 这里我们拉取一个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镜像都是只读的 当启动容器的时候在该镜像上创建一层(容器),所有的操作都是在容器中进行的

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 总结

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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上面!

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

总结: 卷技术可以实现容器和本地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"
            }
        ],

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

实战

安装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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

具名和匿名

# 匿名挂载
-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

  • 查看一下这个卷

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 查看目录
[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
 
# 这里的每一个命令都是镜像的一层!
  • 构建自己的镜像

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 查看镜像

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

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

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

数据卷容器

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

多个mysql同步

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

多个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. 每个指令都会创建提交一个新的镜像层,并提交!

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

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

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

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

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

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

DockerFile指令说明

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 可以使用vim

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 查看本地运行的变更历史
[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

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 由于我们将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
# 提交的话也是分层来的
#成功!!!

发布到阿里云镜像服务

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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 创建一个命名空间

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 创建一个本地私有仓库

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

  • 登录阿里云
[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

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

小结

Docker基础学习
Docker的安装
常用命令
作业
可视化工具
Docker镜像讲解
容器数据卷
DockerFile
发布到DockerHub
网络

网络

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