Docker入门

Docker

Docker的基本组成

Docker的安装(CentOS7)

  1. 删除旧的

    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  2. 需要的安装包

    sudo yum install -y yum-utils
    
  3. 设置镜像仓库

    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo //国外源
        
    sudo yum-config-manager \
        --add-repo \ 
        http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        //推荐使用阿里云镜像地址
    
  4. 更新yum软件包索引

    yum makecache fast
    
  5. 安装Docker

    sudo yum install docker-ce docker-ce-cli containerd.io
    # ce 社区版 ee 企业版
    
  6. 启动docker

    sudo systemctl start docker
    
    # 使用
    docker version
    查看docker是否安装成功
    
  7. 运行helloword

    sudo docker run hello-world
    

  8. 查看下载的helloword镜像

    [hazy@aliyun ~]$ sudo docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    hello-world         latest              bf756fb1ae65        8 months ago        13.3kB
    
  9. 了解删除docker

    # 1、卸载依赖
    sudo yum remove docker-ce docker-ce-cli containerd.io
    
    # 2、删除资源
    sudo rm -rf /var/lib/docker
    
    # /var/lib/docker docker的默认工作路径
    
    

阿里云镜像加速

  1. 登录阿里云找到容器镜像服务

  2. 找到镜像加速地址

  3. 配置使用

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

回顾HelloWorld的流程

docker run会发生什么

底层原理

  1. docker是怎么工作的?

    Docker是一个Client—Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问,DockerServer接收到Client的指令,就会执行该指令

  2. Docker为什么比VM快

    • Docker有着比虚拟机更少的抽象层

    • docker利用的是宿主机的内核,vm 需要是Guest OS

Docker的常用命令

1. 帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #万能命令

帮助文档:https://docs.docker.com/reference/

2. 镜像命令
  • docker images 查看本地所有镜像

    [hazy@aliyun ~]$ sudo docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    hello-world         latest              bf756fb1ae65        8 months ago        13.3kB
    
    # 解释
    `REPOSITORY`:镜像的仓库源
    `TAG`:镜像的标签
    `IMAGE ID`:镜像的id
    `CREATED`:镜像的创建时间
    `SIZE`:镜像的大小
    
    # 可选项
     -a, --all             # 显示所有的镜像
     -q, --quiet           # 只显示镜像的id
    
    
  • docker search 搜索镜像

    [hazy@aliyun ~]$ sudo docker search mysql
    NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    mysql                             MySQL is a widely used, open-source relation…   9973                [OK]                
    mariadb                           MariaDB is a community-developed fork of MyS…   3649                [OK]    
    
    # 可选项,通过STARS过滤
    --filter=STARS=3000 # 搜索出stars大于3000的镜像
    [hazy@aliyun ~]$ sudo docker search mysql --filter=STARS=3000
    NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    mysql               MySQL is a widely used, open-source relation…   9973                [OK]                
    mariadb             MariaDB is a community-developed fork of MyS…   3649                [OK] 
    
    
  • docker pull 下载镜像

    # 下载镜像docker pull 镜像名[:tag]
    [hazy@aliyun ~]$ sudo docker pull mysql
    Using default tag: latest 	# 如果不写tag,默认就是lastest
    latest: Pulling from library/mysql
    d121f8d1c412: Pull complete  # 分层下载,docker image的核心 联合文件系统
    f3cebc0b4691: Pull complete 
    1862755a0b37: Pull complete 
    489b44f3dbb4: Pull complete 
    690874f836db: Pull complete 
    baa8be383ffb: Pull complete 
    55356608b4ac: Pull complete 
    dd35ceccb6eb: Pull complete 
    429b35712b19: Pull complete 
    162d8291095c: Pull complete 
    5e500ef7181b: Pull complete 
    af7528e958b6: Pull complete 
    Digest: sha256:e1bfe11693ed2052cb3b4e5fa356c65381129e87e38551c6cd6ec532ebe0e808 # 签名
    Status: Downloaded newer image for mysql:latest 
    docker.io/library/mysql:latest # 真实地址,等价于 docker pull mysql
    
    # 指定下载版本
    [hazy@aliyun ~]$ sudo docker pull mysql:5.7
    5.7: Pulling from library/mysql
    d121f8d1c412: Already exists 
    f3cebc0b4691: Already exists 
    1862755a0b37: Already exists 
    489b44f3dbb4: Already exists 
    690874f836db: Already exists 
    baa8be383ffb: Already exists 
    55356608b4ac: Already exists 
    277d8f888368: Pull complete 
    21f2da6feb67: Pull complete 
    2c98f818bcb9: Pull complete 
    031b0a770162: Pull complete 
    Digest: sha256:14fd47ec8724954b63d1a236d2299b8da25c9bbb8eacc739bb88038d82da4919
    Status: Downloaded newer image for mysql:5.7
    docker.io/library/mysql:5.7
    
    

  • docker rmi 删除镜像

    [hazy@aliyun ~]$ sudo docker rmi -f 容器id # 删除指定镜像
    [hazy@aliyun ~]$ sudo docker rmi -f 容器id1 容器id2 容器id # 删除多个镜像
    [hazy@aliyun ~]$ sudo docker rmi -f $(sudo docker images -aq) # 删除全部的镜像
    
    
3. 容器命令

说明:下载了镜像才可以创建容器,下载centos测试学习

sudo docker pull centos

  • docker run 新建容器并启动

    docker run [可选参数] image
    
    # 参数说明
    --name="Name" 	容器名字,用来区分容器
    -d 		以后台方式运行
    -it		使用交互方式运行,进入容器查看内容
    -p		指定容器的端口
    	-p ip:主机端口:容器端口
    	-p 主机端口:容器端口(常用)
    	-p 容器端口
    	容器端口
    -P 		随机指定端口
    
    # 测试,启动并进入容器
    [hazy@aliyun ~]$ sudo docker run -it centos /bin/bash
    [root@d42c8e91c211 /]# ls # 查看容器内的centos,基础版本,很多命令都不完善
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@d42c8e91c211 /]# exit  # 从容器中退回主机
    exit
    [hazy@aliyun ~]$ ls
    derby.log  metastore_db  wa.txt
    
    
  • docker ps 列出所有运行的容器

    # 参数
    -a 	# 列出当前正在运行的容器及其以前运行过的容器
    不加  # 列出当前运行的容器
    -n=? # 显示最近运行的容器
    -q 	# 只显示容器的编号
    
    [hazy@aliyun ~]$ sudo docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [hazy@aliyun ~]$ sudo docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
    d42c8e91c211        centos              "/bin/bash"         3 minutes ago       Exited (0) About a minute ago                       musing_chatelet
    152448dee633        bf756fb1ae65        "/hello"            4 days ago          Exited (0) 4 days ago                               romantic_lederberg
    
    
  • 退出容器

    exit # 直接退出容器并停止
    ctrl + P + Q # 退出容器,但容器不停止
    
    
  • 删除容器

    docker rm 容器id 	# 删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f
    docker rm -f $(docker ps -aq) # 删除所有的容器
    docker ps -aq | xargs docker rm # 删除所有的容器
    
    
  • 启动和停止容器

    docker start 容器id 	# 启动容器
    docker restart 容器id # 重启容器
    docker stop 容器id	# 停止当前正在运行容器
    docker kill 容器id	# 强制停止当前容器
    
    

常用其他命令

  • 后台启动容器

    # 命令 docker run -d 镜像名
    [hazy@aliyun ~]$ sudo docker run -d centos
    
    # 问题:docker ps查看,发现centos停止了
    
    # docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
    # nginx,容器启动后,发现没有提供的服务,就会立即停止
    
    
  • 查看日志

    docker logs -tf --tail 要显示的条数 容器id
    
    # 自己编写一段脚本
    [hazy@aliyun ~]$ sudo docker run -d centos /bin/bash -c "while true;do echo wangshen;sleep 1;done"
    
    # 显示日志
    -tf # 显示日志
    --tail number # 显示日志条数
    [hazy@aliyun ~]$ sudo docker logs -tf --tail 10 26685dc21434
    
    
  • 查看容器中的进程

    # 命令 docker top 容器id
    
    [hazy@aliyun ~]$ sudo docker top 26685dc21434
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                31331               31294               0                   22:12               ?                   00:00:00            /bin/bash -c while true;do echo wangshen;sleep 1;done
    root                31797               31331               0                   22:18               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
    
    
  • 查看镜像的元数据

    # 命令
    docker inspect 容器id
    
    # 测试
    [hazy@aliyun ~]$ sudo docker inspect 26685dc21434
    [
        {
            "Id": "26685dc21434faa126cdfe6fac3c09a018657ee82c7ae1a7cc7b142ae33dda37",
            "Created": "2020-09-19T14:12:38.280342318Z",
            "Path": "/bin/bash",
            "Args": [
                "-c",
                "while true;do echo wangshen;sleep 1;done"
            ],
            "State": {
                "Status": "running",
                "Running": true,
                "Paused": false,
                "Restarting": false,
                "OOMKilled": false,
                "Dead": false,
                "Pid": 31331,
                "ExitCode": 0,
                "Error": "",
                "StartedAt": "2020-09-19T14:12:38.543177605Z",
                "FinishedAt": "0001-01-01T00:00:00Z"
            },
            "Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
            "ResolvConfPath": "/var/lib/docker/containers/26685dc21434faa126cdfe6fac3c09a018657ee82c7ae1a7cc7b142ae33dda37/resolv.conf",
            "HostnamePath": "/var/lib/docker/containers/26685dc21434faa126cdfe6fac3c09a018657ee82c7ae1a7cc7b142ae33dda37/hostname",
            "HostsPath": "/var/lib/docker/containers/26685dc21434faa126cdfe6fac3c09a018657ee82c7ae1a7cc7b142ae33dda37/hosts",
            "LogPath": "/var/lib/docker/containers/26685dc21434faa126cdfe6fac3c09a018657ee82c7ae1a7cc7b142ae33dda37/26685dc21434faa126cdfe6fac3c09a018657ee82c7ae1a7cc7b142ae33dda37-json.log",
            "Name": "/eloquent_antonelli",
            "RestartCount": 0,
            "Driver": "overlay2",
            "Platform": "linux",
            "MountLabel": "",
            "ProcessLabel": "",
            "AppArmorProfile": "",
            "ExecIDs": null,
            "HostConfig": {
                "Binds": null,
                "ContainerIDFile": "",
                "LogConfig": {
                    "Type": "json-file",
                    "Config": {}
                },
                "NetworkMode": "default",
                "PortBindings": {},
                "RestartPolicy": {
                    "Name": "no",
                    "MaximumRetryCount": 0
                },
                "AutoRemove": false,
                "VolumeDriver": "",
                "VolumesFrom": null,
                "CapAdd": null,
                "CapDrop": null,
                "Capabilities": null,
                "Dns": [],
                "DnsOptions": [],
                "DnsSearch": [],
                "ExtraHosts": null,
                "GroupAdd": null,
                "IpcMode": "private",
                "Cgroup": "",
                "Links": null,
                "OomScoreAdj": 0,
                "PidMode": "",
                "Privileged": false,
                "PublishAllPorts": false,
                "ReadonlyRootfs": false,
                "SecurityOpt": null,
                "UTSMode": "",
                "UsernsMode": "",
                "ShmSize": 67108864,
                "Runtime": "runc",
                "ConsoleSize": [
                    0,
                    0
                ],
                "Isolation": "",
                "CpuShares": 0,
                "Memory": 0,
                "NanoCpus": 0,
                "CgroupParent": "",
                "BlkioWeight": 0,
                "BlkioWeightDevice": [],
                "BlkioDeviceReadBps": null,
                "BlkioDeviceWriteBps": null,
                "BlkioDeviceReadIOps": null,
                "BlkioDeviceWriteIOps": null,
                "CpuPeriod": 0,
                "CpuQuota": 0,
                "CpuRealtimePeriod": 0,
                "CpuRealtimeRuntime": 0,
                "CpusetCpus": "",
                "CpusetMems": "",
                "Devices": [],
                "DeviceCgroupRules": null,
                "DeviceRequests": null,
                "KernelMemory": 0,
                "KernelMemoryTCP": 0,
                "MemoryReservation": 0,
                "MemorySwap": 0,
                "MemorySwappiness": null,
                "OomKillDisable": false,
                "PidsLimit": null,
                "Ulimits": null,
                "CpuCount": 0,
                "CpuPercent": 0,
                "IOMaximumIOps": 0,
                "IOMaximumBandwidth": 0,
                "MaskedPaths": [
                    "/proc/asound",
                    "/proc/acpi",
                    "/proc/kcore",
                    "/proc/keys",
                    "/proc/latency_stats",
                    "/proc/timer_list",
                    "/proc/timer_stats",
                    "/proc/sched_debug",
                    "/proc/scsi",
                    "/sys/firmware"
                ],
                "ReadonlyPaths": [
                    "/proc/bus",
                    "/proc/fs",
                    "/proc/irq",
                    "/proc/sys",
                    "/proc/sysrq-trigger"
                ]
            },
            "GraphDriver": {
                "Data": {
                    "LowerDir": "/var/lib/docker/overlay2/6b658735467d3515bfc2e860695501c07fdec1c88335840ab82d7b6143d89272-init/diff:/var/lib/docker/overlay2/1c71dacf8277362d85bbeb318f6ec84c2cde7768dddc40b31a50eadfd840c694/diff",
                    "MergedDir": "/var/lib/docker/overlay2/6b658735467d3515bfc2e860695501c07fdec1c88335840ab82d7b6143d89272/merged",
                    "UpperDir": "/var/lib/docker/overlay2/6b658735467d3515bfc2e860695501c07fdec1c88335840ab82d7b6143d89272/diff",
                    "WorkDir": "/var/lib/docker/overlay2/6b658735467d3515bfc2e860695501c07fdec1c88335840ab82d7b6143d89272/work"
                },
                "Name": "overlay2"
            },
            "Mounts": [],
            "Config": {
                "Hostname": "26685dc21434",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": false,
                "AttachStderr": false,
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                ],
                "Cmd": [
                    "/bin/bash",
                    "-c",
                    "while true;do echo wangshen;sleep 1;done"
                ],
                "Image": "centos",
                "Volumes": null,
                "WorkingDir": "",
                "Entrypoint": null,
                "OnBuild": null,
                "Labels": {
                    "org.label-schema.build-date": "20200809",
                    "org.label-schema.license": "GPLv2",
                    "org.label-schema.name": "CentOS Base Image",
                    "org.label-schema.schema-version": "1.0",
                    "org.label-schema.vendor": "CentOS"
                }
            },
            "NetworkSettings": {
                "Bridge": "",
                "SandboxID": "a875bd48cf0c83e5e46a6a6f885b3e4e1000c28c38fdef278451ec2a21ff128c",
                "HairpinMode": false,
                "LinkLocalIPv6Address": "",
                "LinkLocalIPv6PrefixLen": 0,
                "Ports": {},
                "SandboxKey": "/var/run/docker/netns/a875bd48cf0c",
                "SecondaryIPAddresses": null,
                "SecondaryIPv6Addresses": null,
                "EndpointID": "c313fa22351ea555b068d1084fabf329ec08762736f6b795248211f6139a9027",
                "Gateway": "172.17.0.1",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "IPAddress": "172.17.0.2",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "MacAddress": "02:42:ac:11:00:02",
                "Networks": {
                    "bridge": {
                        "IPAMConfig": null,
                        "Links": null,
                        "Aliases": null,
                        "NetworkID": "b342722d27a3261011938cb70388ce8d29ef932ef37b54df4ed329eabbed6b64",
                        "EndpointID": "c313fa22351ea555b068d1084fabf329ec08762736f6b795248211f6139a9027",
                        "Gateway": "172.17.0.1",
                        "IPAddress": "172.17.0.2",
                        "IPPrefixLen": 16,
                        "IPv6Gateway": "",
                        "GlobalIPv6Address": "",
                        "GlobalIPv6PrefixLen": 0,
                        "MacAddress": "02:42:ac:11:00:02",
                        "DriverOpts": null
                    }
                }
            }
        }
    ]
    
    
  • 进入当前正在运行的容器

    # 通常容器都是使用后台的方式运行,需要进入容器,修改一些配置
    
    # 命令
    docker exec -it 容器id bashshell
    
    # 测试
    [hazy@aliyun ~]$ sudo docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    26685dc21434        centos              "/bin/bash -c 'while…"   16 minutes ago      Up 16 minutes                           eloquent_antonelli
    [hazy@aliyun ~]$ sudo docker exec -it 26685dc21434 /bin/bash
    [root@26685dc21434 /]# ps -ef
    UID        PID  PPID  C STIME TTY          TIME CMD
    root         1     0  0 14:12 ?        00:00:00 /bin/bash -c while true;do echo wangshen;sleep 1;done
    root      1025     0  0 14:29 pts/0    00:00:00 /bin/bash
    root      1044     1  0 14:29 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep
    root      1045  1025  0 14:29 pts/0    00:00:00 ps -ef
    
    # 方式二
    docker attach 容器id
    
    # 测试
    [hazy@aliyun ~]$ sudo docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    26685dc21434        centos              "/bin/bash -c 'while…"   21 minutes ago      Up 21 minutes                           eloquent_antonelli
    [hazy@aliyun ~]$ sudo docker attach 26685dc21434
    正在执行当前的代码...
    
    # 区别
    # docker exec 	# 进入容器后开启一个新的终端 
    # docker attach		# 进入容器正在运行的终端,不会启动新的进程
    
    
  • 从容器内拷贝文件到主机

    # 命令
    docker cp 容器id:容器内的文件路径 要拷贝到的本机路径
    
    # 查看当前主机路径下的文件
    [hazy@aliyun home]$ ls
    hazy
    [hazy@aliyun home]$ sudo docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    26685dc21434        centos              "/bin/bash -c 'while…"   31 minutes ago      Up 31 minutes                           eloquent_antonelli
    
    # 进入容器内创建文件并退出
    [hazy@aliyun home]$ sudo docker exec -it 26685dc21434 /bin/bash
    [root@26685dc21434 /]# cd home
    [root@26685dc21434 home]# touch test.java
    [root@26685dc21434 home]# ls
    test.java
    [root@26685dc21434 home]# exit
    exit
    
    # 拷贝容器中的文件到主机
    [hazy@aliyun home]$ sudo docker cp 26685dc21434:/home/test.java ./
    [hazy@aliyun home]$ ls
    hazy  test.java
    
    

可视化

  • portainer(先使用这个)

    Docker的图形化管理工具,提供一个后台面板供我们操作Docker

    docker run -d -p 8088:9000 \
    --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    
    

    访问测试:http://39.99.151.61:8089/

    创建用户:

    选择红框:

    管理界面:

    备注:平时不会使用

  • Rancher(CI/CD再使用)

Docker镜像讲解

镜像是什么

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

所有的应用可直接打包成Docker镜像,直接运行

如何获取镜像:

  • 从远程仓库下载
  • 从他人那拷贝
  • 自己制作一个镜像DockerFile
Docker镜像加载原理

UnionFS(联合文件系统)

联合文件系统:联合文件系统是一种分层、轻量级的高性能文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下。联合文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外表看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

分层理解

commit镜像

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

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

实战测试:

# 1、启动一个默认的tomcat

# 2、发现这个默认的tomcat是没有webapps应用,官方的镜像默认webapps下是没有文件的

# 3、自己拷贝基本的文件进去

# 4、将我们操作过的容器通过commit提交为一个镜像,我们以后就使用我们修改过的镜像即可

容器数据卷

什么是容器数据卷

docker理念回顾

将应用和环境打包成一个镜像

如果数据在容器中,我们把容器删除了,数据就会丢失;需求:数据可以持久化

容器间可以有一种数据共享的技术,让Docker容器中产生的数据可以同步到本地,这就是卷技术!目录的挂载,我们将容器内的目录挂载到linux上!

总结:容器中数据的持久化和同步操作,容器间也是可以数据共享的

使用数据卷

方式一:直接使用命令来挂载 -v

docker run -it -v 主机目录:容器内目录

# 测试
[hazy@aliyun ~]$ sudo docker run -it -v /home/ceshi:/home centos /bin/bash

# 启动起来之后可以通过 docker inspect 容器id 查看挂载是否成功

测试文件的同步:

再来测试:

1、 停止容器

2、宿主机上修改文件

3、启动容器

4、容器内的数据依旧是同步的

好处:我们以后需要修改配置文件时,只需在本地修改,容器内会自动同步

实战:安装MySQL

思考:MySQL数据持久化的问题!

# 拉取镜像
[hazy@aliyun ~]$ sudo docker pull mysql:5.7

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

# 启动
-d 	后台运行
-p 	端口映射
-v 	卷挂载
--name 	容器名字
[hazy@aliyun ~]$ sudo docker run -d -p 3301:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name=mysql01 mysql:5.7

# 启动成功后,在本地进行测试连接

将容器删除后,同步到本地的数据也不会删除

具名和匿名挂载

初识DockerFile

数据卷容器(容器与容器间的数据同步)

DockerFile

DockerFile介绍

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

构建步骤:

  1. 编写一个dockerfile文件;

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

  3. docker run 运行一个镜像;

  4. docker push 发布一个镜像(Docker Hub,阿里源镜像仓库);

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

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件!

Docker镜像逐渐成为企业交付的标准!

步骤:开发、部署、运维。。。缺一不可!

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

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

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

DockerFile指令

实战测试

Docker Hub中99%的镜像都是从基础镜像scratch开始的,然后配置所需要的软件和文件来进行构建!

创建一个centos

# 1、编写dockerfile文件
[hazy@aliyun mydockerfile]$ cat mydockerfile 
FROM centos
MAINTAINER wang<23456732@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 80

CMD $MYPATH
CMD echo "---end---"
CMD /bin/bash

# 2、通过文件构建镜像
# docker build -f dockerfile文件路径 -t 镜像名:[tag] .

Successfully built 50e2cbb62c9d
Successfully tagged mycentos:1.0

# 3、测试运行

对比:官方的centos

增加后的镜像:

列出本地进行的变更历史:

CMD和ENTRYPOINT的区别

实战:Tomcat镜像
  1. 准备tomcat的压缩包,jdk的压缩包

  2. 编写dockerfile文件,官方命名Dockerfile,build时会自动寻找该文件,不需要 -f 来指定

    FROM centos
    MAINTAINET wang<23456765432@qq.com>
    
    COPY readme.txt /usr/local/readme.txt
    
    ADD jdk-8u144-linux-x64.tar.gz /usr/local/
    ADD apache-tomcat-9.0.38.tar.gz /usr/local/
    
    RUN yum -y install vim
    
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_144
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools/jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.38
    ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.38
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    EXPOSE 8080
    
    CMD /usr/local/apache-tomcat-9.0.38/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.38/bin/logs/catalina.out
    
    
  3. 构建镜像

    # docker build -t diytomcat .
    
    
  4. 启动容器

    sudo docker run -d -p 9090:8080 --name diytomcat01 -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.38/webapps/test -v /home/tomcat/logs/:/usr/local/apache-tomcat-9.0.38/bin/logs diytomcat
    
    
  5. 访问测试

  6. 发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了)

    <!--web.xml-->
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>db</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    
    
    <!--index.jsp-->
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD//XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
        <title>九九乘法表</title>
    </head>
    <body>
    <br/>
    <form id="form1" name="form1" method="post" action="result.jsp">
        <p align="center">请输入两个自然数给您打印乘法表</p>
        <p align="center">要求:startNumber &lt;endNumber <br/></p>
        <table width="350" border="1" align="center" cellpadding="0"
               cellspacing="0" bgcolor="#aaccdd" bordercolor="#cccccc">
            <tr>
                <td width="101">startNumber:</td>
                <td width="113">
                    <label>
                        <input name="s" type="text" id="textfield" size="15" maxlength="8" height="20"/>
                    </label>
                </td>
                <td width="68">&nbsp;<br/></td>
            </tr>
            <tr>
                <td>endNumber</td>
                <td>
                    <label>
                        <input name="e" type="text" id="textfield2" size="15" maxlength="8" height="20"/>
                    </label>
                </td>
                <td>&nbsp;<br/></td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td>
                    <label>
                        <input type="submit" name="button" id="button" value="submit"/>
                        <input name="button2" type="reset" id="button2" value="reset"/>
                    </label>
                </td>
                <td>&nbsp;</td>
            </tr>
        </table>
    </form>
    </body>
    </html> 
    
    
发布镜像
  1. 在DockerHub上注册自己的账号,地址:https://hub.docker.com/

  2. 在服务器上提交自己的镜像

    [hazy@aliyun logs]$ sudo 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
    
    

  3. 登录完毕后提交镜像,使用 docker push 命令

发布到阿里云镜像服务上

小结:

Docker网络

理解Docker0

原理

1、我们每启动一个容器,docker就会给容器分配一个ip,我们只要安装了docker,就会有一个docker0的网卡,桥接模式,veth-pair技术!

再测试ip addr:

2、在启动一个容器:

3、测试发现tomcat01和tomcat02可以ping通

小结

Docker中所有的网络接口都是虚拟的,虚拟的转发效率高!

自定义网络

查看所有的docker网络

网络模式

  1. bridge:桥接模式(自定义网络也使用桥接模式)
  2. none:不配置网络
  3. host:仅主机模式,和宿主机共享网络
  4. container:容器网络联通(用得少,局限性大)

测试

# 直接启动命令 --net bridge
sudo docker run -d -P --name tomcat01 tomcat
sudo docker run -d -P --name tomcat01 --net bridge(默认) tomcat

# docker0 的特点:默认,域名不能访问,--link可以打通连接

# 自定义网络
[hazy@aliyun ~]$ sudo docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
de1d06de975d7b96ceef2e68edeb8443775fc7e1520cae31c1de43d04a2b9390
[hazy@aliyun ~]$ sudo docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
b342722d27a3        bridge              bridge              local
79a3e22287f2        host                host                local
de1d06de975d        mynet               bridge              local
14b0c6356a89        none                null                local

自定义网络创建成功:

[hazy@aliyun ~]$ sudo docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "de1d06de975d7b96ceef2e68edeb8443775fc7e1520cae31c1de43d04a2b9390",
        "Created": "2020-09-26T16:48:00.573838029+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "15bbeaaffa449e8da673a3c50807910622601430f1b367ee3150d7630e6e0369": {
                "Name": "tomcat-net-02",
                "EndpointID": "c05556431fb1c0b1e20b3f9777a0eed6e57ab374d70a8c2b805a38160cb3e1e3",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "8eac1f2b5d05af82bd2f79b4d075550902f96b4433865432b3d6dcc7179dafb2": {
                "Name": "tomcat-net-01",
                "EndpointID": "3f0aa0dfeeb8b34732d1c37cbe57cf632dabfb086352d69eeecd62802210626b",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

# 测试ping连接
[hazy@aliyun ~]$ sudo docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.082 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.049 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.051 ms
^C
--- 192.168.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.049/0.060/0.082/0.017 ms

# 现在不使用--link也可通过名字ping通
[hazy@aliyun ~]$ sudo docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.046 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.051 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.050 ms
^C
--- tomcat-net-02 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.046/0.049/0.051/0.002 ms


网络连通

# 测试打通tomcat01 - mynet
# 结果,直接将tomcat01放到 mynet网络下
# 一个容器两个ip

# 01 ping通
[hazy@aliyun ~]$ sudo docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.053 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.050 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.052 ms
^C
--- tomcat-net-01 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.050/0.055/0.066/0.008 ms

# 02 未ping通
[hazy@aliyun ~]$ sudo docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known

结论:若要跨网络访问,就需要使用docker network connect 网络 容器命令连通!

posted @ 2020-10-01 16:07  草酸  阅读(165)  评论(0)    收藏  举报