0
点赞
收藏
分享

微信扫一扫

初识docker

TiaNa_na 2022-01-04 阅读 58

What is docker

A platform for building,running and shipping applications:是一个构建运行的平台并以一致的方法发送应用程序。可以轻松的将我们的应用程序与它所需要的一切打包在一起,并在任何有docker的机器使用它。

  • 隔离环境允许多个应用程序使用,某些软件不同版本并排(一个节点9,一个节点14),不会互相弄乱。不再使用它时,可以删除应用程序。
    docker环境隔离
    删除应用程序
  • Consistently build,run and ship applicaitons
Virtual Machines vs Containers

Containers : An isolated environment for running an application

  • Allow running multiple apps in isolation
  • Are lightweight
  • Use OS of the host(shared system)
  • start quicker(Usually a second)
  • Need less hardware resources(don not need to assign specific disk or memory)

Virtual Machines : An abstraction of a machine(physical hardware)
一台电脑两个系统
VM

Hypervisor:

  • VirtualBox
  • VMware
  • Hyper-v(Windows only)

作用:Run application in isolation
Virtual machine
Problems:

  • Each VM needs a full-blown OS
  • Slow to start
  • Resource intensive(physics resource,like cpu,memory,disk…)

Architecture of Docker

Docker use client-server architecture,it has a client-component and restful api server component
docker
essence:docker essencs
A kernel manages application and hardware resource

different system core:
system core
docker

Installing Docker

docker hub or aliyun
docker version
在这里插入图片描述
IMAGE:

  • A cut-down OS
  • A runtime environment(eg Node)
  • Application files
  • Third-party libraries
  • Environment variables

Building an image of an application are written in a docker file that we can package up our application into a image
images

Docker architectureDocker architecture

Development Workflow

常用命令

# 帮助命令
[root@iZf8zirbfebziiuh71055zZ /]# docker 命令--help
# Search命令
[root@iZf8zirbfebziiuh71055zZ /]#docker search mysql
# 镜像命令
[root@iZf8zirbfebziiuh71055zZ /]# docker pull mysql:8.0.27
> #删除镜像
# 删除指定的容器
[root@iZf8zirbfebziiuh71055zZ /]# docker rmi -f 容器id
# 删除多个容器
[root@iZf8zirbfebziiuh71055zZ /]# docker rmi -f 容器id1 容器id2 容器id3
# 批量删除容器
[root@iZf8zirbfebziiuh71055zZ /]# docker rmi  -f $(docker images -aq)

容器命令

有镜像了才有容器,linux,下载一个contos镜像来测试

docker  pull centos

新建容器并启动

root@iZf8zirbfebziiuh71055zZ /]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
mysql         8.0.27    3218b38490ce   3 days ago     516MB
hello-world   latest    feb5d9fea6a5   3 months ago   13.3kB
centos        latest    5d0da3dc9764   3 months ago   231MB
#启动并进入容器(开一个容器)
[root@iZf8zirbfebziiuh71055zZ /]# docker run -it centos /bin/bash
[root@c9416b31cbdd /]# 
[root@c9416b31cbdd /]# ls  #查看容器centos,
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
#退出容器
[root@c9416b31cbdd /]# exit
exit
[root@iZf8zirbfebziiuh71055zZ /]# ls
bin   dev  home  lib64       media  opt   root  sbin  sys  usr
boot  etc  lib   lost+found  mnt    proc  run   srv   tmp  var

容器的容器

docker ps -options
//列出正在运行的容器 
[root@iZf8zirbfebziiuh71055zZ /]# docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
# 列出正在运行的容器+历史容器运行记录
[root@iZf8zirbfebziiuh71055zZ /]# docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED             STATUS                         PORTS     NAMES
c9416b31cbdd   centos        "/bin/bash"   12 minutes ago      Exited (0) 8 minutes ago                 agitated_bartik
3cfb8cabb443   hello-world   "/hello"      About an hour ago   Exited (0) About an hour ago             adoring_payne
ece492f0c3ff   hello-world   "/hello"      About an hour ago   Exited (0) About an hour ago             loving_driscoll
# 看最近的一条
[root@iZf8zirbfebziiuh71055zZ /]# docker ps -a -n=1
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
c9416b31cbdd   centos    "/bin/bash"   18 minutes ago   Exited (0) 14 minutes ago             agitated_bartik

退出容器

exit #退出并停止容器
Ctrl + p +q #退出不停止容器

删除容器

docker rm 容器id    #删除指定容器
docker rm -f 容器 id #强制删除(包括正在运行的容器)
docker rm -f $(docker ps -ap) #删除全部容器
docker ps -a  -q|xargs docker rm  #删除全部容器

启动和停止容器

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

后台启动容器

docker  run -d centos  #后台启动容器
[root@iZf8zirbfebziiuh71055zZ /]# docker run -d centos
8c92ec720f6460ad904c3e271ce2a5513e318f1a49ab3e6c5a31c3210f9840da
#docker ps 发现centos停止了
# nginx,容器启动后,发现自己没有服提供服务,就会立即停止
[root@iZf8zirbfebziiuh71055zZ /]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
 docker logs -f -t --tail 容器id  #查看容器的日志
[root@iZf8zirbfebziiuh71055zZ /]# docker logs -f -t --tail  5d0da3dc9764
"docker logs" requires exactly 1 argument.
See 'docker logs --help'.

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container
# 发现容器未启动,启动容器
[root@iZf8zirbfebziiuh71055zZ /]# docker run -it centos /bin/bash
[root@8117337aa6b9 /]#  #使用ctrl+p+q 退出来,且不关闭容器
# 因容器没有东西,自动关闭,写入数据
[root@iZf8zirbfebziiuh71055zZ /]# docker run -d centos /bin/sh -c "while true;do echo wxj ;sleep 1;done"
4f12bf857d6b33c009347794c162d795b6a2c011c4a6c38de18c3aff4c727a14
[root@iZf8zirbfebziiuh71055zZ /]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
4f12bf857d6b   centos    "/bin/sh -c 'while t…"   24 seconds ago   Up 23 seconds             quirky_wu
[root@iZf8zirbfebziiuh71055zZ /]# docker logs -f -t  4f12bf857d6b #查看全部日志
[root@iZf8zirbfebziiuh71055zZ /]# docker logs -f -t  --tail 10 4f12bf857d6b #查看十条日志


2-24T06:21:43.189053970Z wxj
2021-12-24T06:21:44.191090421Z wxj
2021-12-24T06:21:45.193158591Z wxj
2021-12-24T06:21:46.195195444Z wxj
2021-12-24T06:21:47.197205465Z wxj
2021-12-24T06:21:48.199200023Z wxj
2021-12-24T06:21:49.201269126Z wxj
2021-12-24T06:21:50.203297803Z wxj
2021-12-24T06:21:51.205127178
[root@iZf8zirbfebziiuh71055zZ /]# docker top 4f12bf857d6b
[root@iZf8zirbfebziiuh71055zZ /]# docker inspect 4f12bf857d6b
[
    {
        "Id": "4f12bf857d6b33c009347794c162d795b6a2c011c4a6c38de18c3aff4c727a14",
        "Created": "2021-12-24T06:19:41.713312099Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo wxj ;sleep 1;done"
        ],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 137,
            "Error": "",
            "StartedAt": "2021-12-24T06:19:41.94285143Z",
            "FinishedAt": "2021-12-24T06:23:50.102028795Z"
        },
        "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "ResolvConfPath": "/var/lib/docker/containers/4f12bf857d6b33c009347794c162d795b6a2c011c4a6c38de18c3aff4c727a14/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/4f12bf857d6b33c009347794c162d795b6a2c011c4a6c38de18c3aff4c727a14/hostname",
        "HostsPath": "/var/lib/docker/containers/4f12bf857d6b33c009347794c162d795b6a2c011c4a6c38de18c3aff4c727a14/hosts",
        "LogPath": "/var/lib/docker/containers/4f12bf857d6b33c009347794c162d795b6a2c011c4a6c38de18c3aff4c727a14/4f12bf857d6b33c009347794c162d795b6a2c011c4a6c38de18c3aff4c727a14-json.log",
        "Name": "/quirky_wu",
        "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,
            "CgroupnsMode": "host",
            "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/cf0c15b0e46b4f643009f4de7b01f8cf0ff0b7b2815902847d2a1eab441c317b-init/diff:/var/lib/docker/overlay2/2aaaafe85736d7fd1ba4e8f42fdb5717d98015f24cc18bcbd0c3db2d0de05a65/diff",
                "MergedDir": "/var/lib/docker/overlay2/cf0c15b0e46b4f643009f4de7b01f8cf0ff0b7b2815902847d2a1eab441c317b/merged",
                "UpperDir": "/var/lib/docker/overlay2/cf0c15b0e46b4f643009f4de7b01f8cf0ff0b7b2815902847d2a1eab441c317b/diff",
                "WorkDir": "/var/lib/docker/overlay2/cf0c15b0e46b4f643009f4de7b01f8cf0ff0b7b2815902847d2a1eab441c317b/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "4f12bf857d6b",
            "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/sh",
                "-c",
                "while true;do echo wxj ;sleep 1;done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "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": "eead276efa4cdcab359a0ab32fad0a29043e9282f8469d7724c9a9b676410aa5",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/eead276efa4c",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "5b62d7eca37c440e39a8bdbba1dbe8f63082d67edb8458f0656419b215a05e42",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                }
            }
        }
    }
]
#通常容器使用后台方式运行,当需要修改配置,需要进入容器
#方式一
#docker  exec  -it  容器id bashShell
[root@iZf8zirbfebziiuh71055zZ /]# docker exec -it 73e7bcae57e2 /bin/bash
[root@73e7bcae57e2 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@73e7bcae57e2 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 06:40 ?        00:00:00 /bin/sh -c while true;do echo wxj ;sleep 1;done
root        42     0  0 06:40 pts/0    00:00:00 /bin/bash
root        96     1  0 06:41 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root        97    42  0 06:41 pts/0    00:00:00 ps -ef
#方式二: docker attach 容器id
[root@iZf8zirbfebziiuh71055zZ /]# docker attach   73e7bcae57e2  

区别::
#docker  exec 进入容器后开启一个新的终端可以在里面操作
#docker attach  进入容器正在执行的终端,不会启用新的线程
[root@iZf8zirbfebziiuh71055zZ home]# docker attach f99920e2465d
[root@f99920e2465d /]# cd /home
#在容器内的文件
[root@f99920e2465d home]# touch wxjj.java
[root@f99920e2465d home]# ls
wxjj.java
[root@f99920e2465d home]# exit
exit
#cp操作
[root@iZf8zirbfebziiuh71055zZ home]# docker cp f99920e2465d:/home/wxjj.java /home
[root@iZf8zirbfebziiuh71055zZ home]# ls
paul  wxj.java  wxjj.java

docker命令小全
Linux命令大全

练习:

Docker about Nginx

步骤:

  • [root@iZf8zirbfebziiuh71055zZ ~]# docker search nginx
  • [root@iZf8zirbfebziiuh71055zZ ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete 
f3409a9a9e73: Pull complete 
9919a6cbae9c: Pull complete 
fc1ce43285d7: Pull complete 
1f01ab499216: Pull complete 
13cfaf79ff6d: Pull complete 
Digest: sha256:366e9f1ddebdb844044c2fafd13b75271a9f620819370f8971220c2b330a9254
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
  • [root@iZf8zirbfebziiuh71055zZ ~]# docker run -d --name nginx01 -p 3344:80 nginx
    a1e96e6d27b77ef3a85c49b9c3053ceb0c943d23ef9b45c8ab5667aad319457d
docker run -d --name nginx01 -p  3344:80 nginx
docker run 后台启动 名字 端口 公网ip:docker内部端口 镜像
  • 查看启动的镜像
[root@iZf8zirbfebziiuh71055zZ ~]#  docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
a1e96e6d27b7   nginx     "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   0.0.0.0:3344->80/tcp   nginx01
  • 本机测试 #curl 端口
[root@iZf8zirbfebziiuh71055zZ ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

公网访问id地址

# 查看或者修改Nginx的配置文件,每次都需进入容器内部,麻烦!
[root@iZf8zirbfebziiuh71055zZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a1e96e6d27b7   nginx     "/docker-entrypoint.…"   15 minutes ago   Up 15 minutes   0.0.0.0:3344->80/tcp   nginx01
[root@iZf8zirbfebziiuh71055zZ ~]# docker exec -it nginx01 /bin/bash
root@a1e96e6d27b7:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@a1e96e6d27b7:/# cd ^[[200~/etc/nginx~
bash: cd: $'\E[200~/etc/nginx~': No such file or directory
root@a1e96e6d27b7:/# cd /etc/nginx
root@a1e96e6d27b7:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params
如果能够在容器外部提供一个映射路径。达到修改容器文件名,文件内部就能自动修改? 数据卷技术!

DockerHub:
[root@iZf8zirbfebziiuh71055zZ ~]# docker run -it --rm tomcat:9.0 #用完即删 --作测试用

...
Destroying ProtocolHandler ["http-nio-8080"]
[root@iZf8zirbfebziiuh71055zZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a1e96e6d27b7   nginx     "/docker-entrypoint.…"   33 minutes ago   Up 33 minutes   0.0.0.0:3344->80/tcp   nginx01

一般使用

[root@iZf8zirbfebziiuh71055zZ ~]#  docker pull tomcat:9.0
[root@iZf8zirbfebziiuh71055zZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
tomcat        9.0       b8e65a4d736d   4 days ago     680MB
#启动tomcat并配置映射
[root@iZf8zirbfebziiuh71055zZ ~]# docker run -d -p 3355:8080 --name tomcat01 b8e65a4d736d
e436ea35fd6214586500443feed8fe0bfb8753f8206cc75c582ed05d5151871a

3355tomcat

# 进入tomcat webapp  ,发现tomcat是阉割版的: 1.linux命令少,2.webapps里没有东西
# 原因 默认是最小镜像,把所有不必要的剔除。
# 保证最少可运行的部分
root@e436ea35fd62:/usr/local/tomcat# ls -al
total 172
drwxr-xr-x 1 root root  4096 Dec 22 17:16 .
drwxr-xr-x 1 root root  4096 Dec 22 17:00 ..
-rw-r--r-- 1 root root 18970 Dec  2 14:30 BUILDING.txt
-rw-r--r-- 1 root root  6210 Dec  2 14:30 CONTRIBUTING.md
-rw-r--r-- 1 root root 57092 Dec  2 14:30 LICENSE
-rw-r--r-- 1 root root  2333 Dec  2 14:30 NOTICE
-rw-r--r-- 1 root root  3378 Dec  2 14:30 README.md
-rw-r--r-- 1 root root  6898 Dec  2 14:30 RELEASE-NOTES
-rw-r--r-- 1 root root 16507 Dec  2 14:30 RUNNING.txt
drwxr-xr-x 2 root root  4096 Dec 22 17:16 bin
drwxr-xr-x 1 root root  4096 Dec 27 03:51 conf
drwxr-xr-x 2 root root  4096 Dec 22 17:16 lib
drwxrwxrwx 1 root root  4096 Dec 27 03:51 logs
drwxr-xr-x 2 root root  4096 Dec 22 17:16 native-jni-lib
drwxrwxrwx 2 root root  4096 Dec 22 17:16 temp
drwxr-xr-x 2 root root  4096 Dec 22 17:16 webapps
drwxr-xr-x 7 root root  4096 Dec  2 14:30 webapps.dist
drwxrwxrwx 2 root root  4096 Dec  2 14:30 work
root@e436ea35fd62:/usr/local/tomcat# cd webapps
root@e436ea35fd62:/usr/local/tomcat/webapps# ls

解决方式:

  • 将webapps.dist 的东西 copy 到webapp
root@e436ea35fd62:/usr/local/tomcat# cp -r  webapps.dist/* webapps
root@e436ea35fd62:/usr/local/tomcat# cd webapps
root@e436ea35fd62:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager

在这里插入图片描述

如果能够在容器外部提供一个映射路径。达到修改容器文件名,文件内部就能自动修改? 数据卷技术!

# 暴露端口过多
# 十分的耗内存
# es的数据一般要放置在安全目录!挂载
# 启动Elasticsearch 
# $ docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
# 这里暂时忽略net
root@e436ea35fd62:/usr/local/tomcat# docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.16.2

# docker 查看cpu状态
docker stats

cpu状态

#  测试elasticsearch 
[root@iZf8zirbfebziiuh71055zZ /]# curl localhost:9200
{
  "name" : "db570b6d772c",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "2ZPcPOryQum22ONTaVrkbg",
  "version" : {
    "number" : "7.16.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "2b937c44140b6559905130a8650c64dbd0879cfb",
    "build_date" : "2021-12-18T19:42:46.604893745Z",
    "build_snapshot" : false,
    "lucene_version" : "8.10.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

给elasticSearch加内存限制
$ docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xms512m" elasticsearch:7.16.2 
#这里因为启动过叫做elasticsearch 的镜像,名字被占用
[root@iZf8zirbfebziiuh71055zZ /]# docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xms512m" elasticsearch:7.16.2 
docker: Error response from daemon: Conflict. The container name "/elasticsearch" is already in use by container "db570b6d772cc0218ccb56c458bc20247be3dcdbfa3588e98929ae01e4adc729". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

docker run -d --name elasticsearch01  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xms512m" elasticsearch:7.16.2 
#结果:
[root@iZf8zirbfebziiuh71055zZ /]# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                                            NAMES
0af8795b1454   elasticsearch:7.16.2   "/bin/tini -- /usr/l…"   7 seconds ago   Up 6 seconds   0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch01

#再次查看cpu运行状态
CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
0af8795b1454   elasticsearch01   0.40%     867.7MiB / 1.694GiB   50.02%    45.1MB / 1.65MB   117MB / 88.6MB   61
#cpu占用率下降
# 测试是否启动成功
[root@iZf8zirbfebziiuh71055zZ /]# curl localhost:9200
{
  "name" : "0af8795b1454",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "7LhkU9t9R72noU_SEXcDcw",
  "version" : {
    "number" : "7.16.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "2b937c44140b6559905130a8650c64dbd0879cfb",
    "build_date" : "2021-12-18T19:42:46.604893745Z",
    "build_snapshot" : false,
    "lucene_version" : "8.10.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

如何使用 kibana 连接 kibanakibana连接 kibana
可视化

  • portainer(暂用)
  • Rancher(CI/CD)

什么是portainer?

[root@iZf8zirbfebziiuh71055zZ /]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
94cfa856b2b1: Pull complete 
49d59ee0881a: Pull complete 
a2300fd28637: Pull complete 
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
add95ee2cec3fbc1afd7f1e337dc2973a23d4f528792cd96219398346329256f

pariainer
在这里插入图片描述

Docker镜像加载

  1. Docker镜像详解
什么是镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以跑起来!
如何得到镜像:

  • 从远程下载
  • 别人拷贝给你
  • 自己制作一个镜像DockerFile
Docker镜像

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

在这里插入图片描述

Docker镜像加载原理

在这里插入图片描述

[root@iZf8zirbfebziiuh71055zZ /]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED        SIZE
centos                latest    5d0da3dc9764   3 months ago   231MB

在这里插入图片描述

分层理解
[root@iZf8zirbfebziiuh71055zZ /]# docker image inspect nginx:latest
...
"RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
                "sha256:5f5f780b24de8669bd35762bdd3c6937d34f07e271ff53f305ba65b51a461e67",
                "sha256:4270b63061e507825dd9ecc50fe1cfc23951641a51ef7233f2d72b669eaf1bba",
                "sha256:32359d2cd6cda64bf19da14c35f003030fe33090d884c72dcba50926bf44c171",
                "sha256:4ded77d16e76e1a5fd06b255e70cc9d7df0694d592fe9741865f064d5f787865",
                "sha256:51a4ac025eb47b33ac682d95e1abace559f3c63cd658e9bc53316352ac2a3446"
            ]
        }
...

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

commit镜像

dokcer commit  提交容器成为一个新的副本
# 命令和git相似
docker commit -m="提交的描述信息" -a ="作者" 容器id 目标镜像名:[TAG]

实际测试

# 1.启动一个镜像
[root@iZf8zirbfebziiuh71055zZ ~]# docker start  3180c33b9918
3180c33b9918

# 2.默认从官方下载的tomcat里webapps没有东西, 将webapps.dist的东复制到 webapps目录下

 [root@iZf8zirbfebziiuh71055zZ ~]# docker ps
CONTAINER ID   IMAGE          COMMAND             CREATED       STATUS       PORTS                    NAMES
3180c33b9918   b8e65a4d736d   "catalina.sh run"   3 hours ago   Up 2 hours   0.0.0.0:8080->8080/tcp   tomcat02

# 3.将操作的容器commit
# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

[root@iZf8zirbfebziiuh71055zZ ~]# docker commit -a="shanhaijing" -m="add webapps app" 3180c33b9918 tomcat02:1.0
sha256:6aabb8ee137f755d204d7d6e67db351f44667518c9afd8ce99ae6dfba625621c

# 查看images 发现新生成了版本是1.0的镜像
[root@iZf8zirbfebziiuh71055zZ ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED              SIZE
tomcat02              1.0       6aabb8ee137f   About a minute ago   685MB

#4.将我们操作过的容器通过commit提交为一个镜像!,以后就使用我们修改/过commit的镜像就可
# 如果想保存容器状态可以使用,commit获得一个镜像。

commit

玩转docker


容器数据卷


Docker的理念:将应用和环境打包成一个镜像!
数据存放何处?如果数据都在容器内,当删除容器,数据也删除了!需求:数据持久化
Mysql的数据可以存储在本地或者其他地方(不在这个内),因此,
容器之间有一个数据共享的技术!Docker容器中产生的数据,同步到本地!–数据卷技术
数据卷技术:将容器内的目录,挂载到Linux上!
容器持久化
容器的持久化操作

使用数据卷
# docker run -it -v -p 主机目录:容器内目录
[root@iZf8zirbfebziiuh71055zZ home]# docker run -it -v /home/ceshi1:/home centos /bin/bash

#开启了一个新的xhell连接,可以看到  ceshi 生成
[root@iZf8zirbfebziiuh71055zZ ~]# cd /home


oot@iZf8zirbfebziiuh71055zZ home]# ls
ceshi1  paul
[root@iZf8zirbfebziiuh71055zZ home]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
f759c585024d   centos    "/bin/bash"   49 seconds ago   Up 48 seconds             vigorous_wilson
[root@iZf8zirbfebziiuh71055zZ home]# docker inspect f759c585024d

"Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi1",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
# 这里有个小坑:在容器里是看不到的mount挂载的

#  我们只需要在虚拟机上操作即可,不用进入容器内部

在这里插入图片描述

安装mysql

mysql的数据持久化的问题!

#获取镜像
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#运行容器,需要做数据挂载, #安装mysql,需要配置密码 。 
	-d 后台运行
	-p 端口映射
	-v 升级卷挂载
	-e 环境配置(如mysql密码)
	--name 容器名字
	
[root@iZf8zirbfebziiuh71055zZ ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/confg.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:8.0.27
464cf2b1fccffe516ff15b0c3f4b21f627517256d064a275cc1f88ec6ae28ffd

经过第三方工具,成功连接到Linux上的数据库
在这里插入图片描述
测试
在第二次ls执行之前,在本地第三方可视化数据库软件上新建数据库test
在这里插入图片描述

将容器删掉,看看数据会不会没有丢失
# 删除 容器
[root@iZf8zirbfebziiuh71055zZ home]# docker rm -f mysql01
mysql01
[root@iZf8zirbfebziiuh71055zZ home]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZf8zirbfebziiuh71055zZ home]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS                      PORTS     NAMES
f759c585024d   centos         "/bin/bash"              25 hours ago   Exited (0) 23 hours ago               vigorous_wilson
# 进入挂载的文件,查看
[root@iZf8zirbfebziiuh71055zZ home]# cd mysql
[root@iZf8zirbfebziiuh71055zZ mysql]# cd data/
[root@iZf8zirbfebziiuh71055zZ data]# ls
auto.cnf       binlog.index  client-cert.pem    #ib_16384_1.dblwr  ib_logfile0  #innodb_temp  performance_schema  server-cert.pem  test
binlog.000001  ca-key.pem    client-key.pem     ib_buffer_pool     ib_logfile1  mysql         private_key.pem     server-key.pem   undo_001
binlog.000002  ca.pem        #ib_16384_0.dblwr  ibdata1            ibtmp1       mysql.ibd     public_key.pem      sys              undo_002

发现,我们保存到本地的数据卷依旧没有丢失,实现了容器持久化功能!

具名和匿名挂载
匿名挂载
# 匿名挂载
[root@iZf8zirbfebziiuh71055zZ /]# docker run -d -P --name nginx01 -v /etc/nginx nginx
4a8c32415c6cd10705a9a3ab2d5d61b270cfa43355c5b304a124dadabe1852ea
#volume 命令查看所有卷的情况
[root@iZf8zirbfebziiuh71055zZ /]# docker volume ls
DRIVER    VOLUME NAME
local     355ee44d3a79509615d49351900f6147ec3b9655093c74a2a9ac8a9e7abcff01
local     d7c2610cc63c05a2089a7b9153d69a80f390c9fa967435e06791f8870c486d63
#这钟都是匿名挂载,没有起名字
#在 -v 挂载的时候,没有写容器外的路径,只写了容器内的路径
具名挂载
# -v 卷名:容器内路径

[root@iZf8zirbfebziiuh71055zZ /]# docker run -d -P --name nginx02 -v giao-nginx:/etc/nginx nginx
2df0379f675e4ec0bb32e457e62fc01d3e11cf4c82e25d50642f885eebe5a603
[root@iZf8zirbfebziiuh71055zZ /]# docker volume ls
DRIVER    VOLUME NAME
local     355ee44d3a79509615d49351900f6147ec3b9655093c74a2a9ac8a9e7abcff01
local     d7c2610cc63c05a2089a7b9153d69a80f390c9fa967435e06791f8870c486d63
local     giao-nginx
#查看一下卷
[root@iZf8zirbfebziiuh71055zZ /]# docker volume inspect giao-nginx
[
    {
        "CreatedAt": "2022-01-01T18:28:00+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/giao-nginx/_data",
        "Name": "giao-nginx",
        "Options": null,
        "Scope": "local"
    }
]
#所有没有设定容器外挂载路径都默认挂载在 '/var/lib/docker/volumes/xxxx/data' 下
通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的**具名挂载**
如何确实挂载方式(匿名挂载还是具名挂载)
#如何确实挂载方式
-v 容器内路径      #匿名挂载
-v 卷名:容器内路径   #具名挂载
-v  /宿主机路径:/容器内路径  #指定路径挂载
拓展:
# 通过-v 容器内路径 ,ro rw 改变读写权限
# ro readonly 只读,
# rw 是readwrite 只读课写

一旦设定权限,对挂载出来的内容有了限制
docker run -d -P --name nginx02 -v giao-nginx:/etc/nginx:rw nginx

# ro  看到ro表示只能通过宿主机来操作,容器内部无法操作 
初识dockerfile

Dockerfile 就是用来构建 docker 镜像的的构建文件!命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令是一层!

# 创建一个dockerfile文件,名字随意 建议 dockerfile

[root@iZf8zirbfebziiuh71055zZ docker-test-volume]# vim dokcerfile1

#文件中内容
From centos
# 这里的每一个命令就是镜像的一层
VOLUME ["volume01","volume02"]

CMD echo "------end--------"
CMD /bin/bash
~               

# 
[root@iZf8zirbfebziiuh71055zZ docker-test-volume]# docker build -f  /home/docker-test-volume/dokcerfile1  

在这里插入图片描述

# 启动自己写的容器

在这里插入图片描述

# 这里是匿名挂载 

在这里插入图片描述

查看刚才自己构建启动的容器

 "Mounts": [
            {
                "Type": "volume",
                "Name": "fa952112aec1cd264ea7dd2d7d88e01e8ed4d587d4399e9b7244a14a5e80dd1b",
                "Source": "/var/lib/docker/volumes/fa952112aec1cd264ea7dd2d7d88e01e8ed4d587d4399e9b7244a14a5e80dd1b/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "fafe01c29ddde058a2852bd7f2edaa4b2da75409734291f3a5fb8b673265d2b0",
                "Source": "/var/lib/docker/volumes/fafe01c29ddde058a2852bd7f2edaa4b2da75409734291f3a5fb8b673265d2b0/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

这是常有的挂载镜的方法,因为通常会自己构建镜像!
假设构建镜像时没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!

数据卷容器

多个mysql同步数据!
在这里插入图片描述

# 启动3个容器,通过刚刚自己写的容器来启动

容器一:
在这里插入图片描述
容器二:

[root@iZf8zirbfebziiuh71055zZ /]# docker run -it --name docker02 --volumes-from docker01  e3e345e7f3e6
[root@2afe560070b6 /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  360 Jan  2 09:26 dev
drwxr-xr-x   1 root root 4096 Jan  2 09:26 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15 14:17 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 108 root root    0 Jan  2 09:26 proc
dr-xr-x---   2 root root 4096 Sep 15 14:17 root
drwxr-xr-x  11 root root 4096 Sep 15 14:17 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Jan  2 08:38 sys
drwxrwxrwt   7 root root 4096 Sep 15 14:17 tmp
drwxr-xr-x  12 root root 4096 Sep 15 14:17 usr
drwxr-xr-x  20 root root 4096 Sep 15 14:17 var
drwxr-xr-x   2 root root 4096 Jan  2 09:23 volume01
drwxr-xr-x   2 root root 4096 Jan  2 09:23 volume02
# 在docker02 中创建文件看看docker01 会不会有变化

[root@iZf8zirbfebziiuh71055zZ /]# docker run -it --name docker02 --volumes-from docker01  e3e345e7f3e6

在这里插入图片描述

在这里插入图片描述
只要通过 ‘–volumes-from’ 就可以实现容器间的数据共享
在这里插入图片描述

多个数据库实现数据共享
[root@iZf8zirbfebziiuh71055zZ ~]# docker run -d -p 3310:3306 -v /etc/mysql/confg.d -v  /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:8.0.27

[root@iZf8zirbfebziiuh71055zZ ~]# docker run -d -p 3310:3306  -e MYSQL_ROOT_PASSWORD=root --name mysql02  --volumes-form mysql01 mysql:8.0.27

# 这样就可以实现两个容器数据同步!

结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
一旦持久化到本地,父容器 -v 本地的数据是不会删除的。

容器二 --volumes-from 容器一 ,当容器一被删掉或停掉,容器二的数据依旧存在

DockerFile


DockerFile 介绍

dockerfile就是用来构建docker镜像的文件!命令参数脚本!
构建步骤:

  1. 编写一个 dockerfile 文件
  2. docker build 建一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库(私有或公用)!)

在这里插入图片描述
在这里插入图片描述

# 官方的file只有最基础的一层,方便使用者自行添加入jdk,tomcat
FROM scratch   
ADD centos-8-x86_64.tar.xz /
LABEL org.label-schema.schema-version="1.0"     org.label-schema.name="CentOS Base Image"     org.label-schema.vendor="CentOS"     org.label-schema.license="GPLv2"     org.label-schema.build-date="20210915"
CMD ["/bin/bash"]
dockerfile 构建过程

基础知识:

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序
  3. #表示注解
  4. 每一个指令都会创建提交镜像层,并提交!
    在这里插入图片描述
    步骤:开发、部署、运行、、
    dockerfile是面向开发的,如要要发布项目,做镜像,这个文件十分简单!
    dockerfile镜像逐渐成为企业交付的标准,掌握推荐指数五颗星!
    DockerFile:构建文件,定义一切的步骤,源代码
    DockerImages:通过 DockerFile 构建生成的镜像,最终发布和运行的产品。
    Dokcer容器:容器就是镜像运行起来提供服务服务
DockerFile的指令

尝试自己写一个dockerfile

FROM       # 基础镜像,一切从这里开始构建,centos
MAINTAINER # 谁写的,姓名+邮箱
RUN 	   # 镜像构建要执行的命令
ADD	  	   # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR    # 镜像的工作目录   
VOLUMES	   # 挂载的目录
EXPORT     # 保留端口配置,
CMD  	   # 指定容器启动要执行的命令,只有最后一个生效,可被替代
ENTRPOINT  # 指定容器启动要执行的命令,可以追加命令
...

docker 指令

# 1.编写dockerfile的文件
[root@iZf8zirbfebziiuh71055zZ dockefile]# vim mydockerfile
[root@iZf8zirbfebziiuh71055zZ dockefile]# cat mydockerfile 
FROM centos
MANTANINER shanhaijing<aef123123@163.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 80

CMD echo $MYPATH
CMD echo "-----end ------"
CMD /bin/bash 
 
# 2.通过这个文件构建镜像
# 命令 docker build  -f dockerfile文件路径 -t  镜像:[tag]
Successfully built 5f4849fd4e3b
Successfully tagged mycentos:0.1

# 3.测试运行 

在这里插入图片描述
在这里插入图片描述

对比:之前的原生centos
默认工作路径是在根目录/下,且没有vim等命令可用

列出本地进行的变更历史
[root@iZf8zirbfebziiuh71055zZ ~]# docker images

[root@iZf8zirbfebziiuh71055zZ ~]# docker history 5f4849fd4e3b
 

在这里插入图片描述

CMD和ENTRYPOINT区别

CMD
# 编写的 dockerfile 内容
[root@iZf8zirbfebziiuh71055zZ dockefile]# cat docker-cmd-test 
FROM centos
CMD ["ls","-a"]

# 构建dockerfile
[root@iZf8zirbfebziiuh71055zZ dockefile]# docker build  -f docker-cmd-test -t cmd-test .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos
 ---> 5d0da3dc9764
Step 2/2 : CMD ["ls","-a"]
 ---> Running in 830cbaa7838c
Removing intermediate container 830cbaa7838c
 ---> 7b1bbdc386d7
Successfully built 7b1bbdc386d7
Successfully tagged cmd-test:latest

[root@iZf8zirbfebziiuh71055zZ dockefile]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED          SIZE
cmd-test             latest    7b1bbdc386d7   9 minutes ago    231MB
mycentos             0.1       5f4849fd4e3b   47 minutes ago   326MB
shanhaijing/centos   1.0       e3e345e7f3e6   27 hours ago     231MB
nginx                latest    605c77e624dd   4 days ago       141MB
mysql                8.0.27    3218b38490ce   13 days ago      516MB
centos               latest    5d0da3dc9764   3 months ago     231MB

# run运行,发现 ls -a 命令生效
[root@iZf8zirbfebziiuh71055zZ dockefile]# docker run 7b1bbdc386d7
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

想在dockerfile cmd 下追加命令
想追加命令
[root@iZf8zirbfebziiuh71055zZ dockefile]# docker run 7b1bbdc386d7 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled 

cmd的模式下 -l 替换了CMD["ls","-l"]命令, -l 不是命令.所以报错

要通过 [root@iZf8zirbfebziiuh71055zZ dockefile]# docker run 7b1bbdc386d7 ls -al

测试 ENTRYPROINT
[root@iZf8zirbfebziiuh71055zZ dockefile]# cat dockerfile-cmd-entrypoint 
FROM centos

ENTRYPOINT ["ls","-a"]

[root@iZf8zirbfebziiuh71055zZ dockefile]# docker  build -f dockerfile-cmd-entrypoint -t entrypoint-test  .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos
 ---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in 5de89c52403f
Removing intermediate container 5de89c52403f
 ---> 3b00d8969318
Successfully built 3b00d8969318
Successfully tagged entrypoint-test:latest
[root@iZf8zirbfebziiuh71055zZ dockefile]# docker run 3b00d8969318
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 我们的追命命令 , 直接拼接在 ENTRYPOINT 命令后面 !
[root@iZf8zirbfebziiuh71055zZ dockefile]# docker run 3b00d8969318 -l
total 56
drwxr-xr-x   1 root root 4096 Jan  3 12:41 .
drwxr-xr-x   1 root root 4096 Jan  3 12:41 ..
-rwxr-xr-x   1 root root    0 Jan  3 12:41 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 Jan  3 12:41 dev
drwxr-xr-x   1 root root 4096 Jan  3 12:41 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15 14:17 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 101 root root    0 Jan  3 12:41 proc
dr-xr-x---   2 root root 4096 Sep 15 14:17 root
drwxr-xr-x  11 root root 4096 Sep 15 14:17 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Jan  2 08:38 sys
drwxrwxrwt   7 root root 4096 Sep 15 14:17 tmp
drwxr-xr-x  12 root root 4096 Sep 15 14:17 usr
drwxr-xr-x  20 root root 4096 Sep 15 14:17 var
[root@iZf8zirbfebziiuh71055zZ dockefile]# 

像这种细微差别的命令很多,以后多留意!

实战: Tomcat镜像

  1. 准备镜像文件 tomcat 压缩包, jdk 压缩包 !
    准备压缩包

  2. 编写 dockerfile 文件 ,官方命名 ‘Dokcerfile’ ,build 会自动寻找这个文件,就不需要 -f 指定

[root@iZf8zirbfebziiuh71055zZ tomcat]# ll
total 154676
-rw-r--r-- 1 root root  11582777 Dec 23 16:39 apache-tomcat-9.0.56.tar.gz
-rw-r--r-- 1 root root       640 Jan  4 11:55 Dockerfile
-rw-r--r-- 1 root root 146799982 Jan  3 22:02 jdk-8u311-linux-x64.tar.gz
-rw-r--r-- 1 root root         0 Jan  4 11:32 readme.txt
[root@iZf8zirbfebziiuh71055zZ tomcat]# cat Dockerfile 
FROM centos
MAINTAINER shanhaijing<aef123123@163.com>

COPY readme.txt  /usr/local/readme.txt

ADD jdk-8u311-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.56.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk-8u311
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.56
ENV CATALINNA_BASH /usr/local/apache-tomcat-9.0.56
ENV PATH  $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

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

  1. 构建镜像
# docker build  -t diytomcat .

# 查看镜像,发现已成功启动
[root@iZf8zirbfebziiuh71055zZ tomcat]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
diytomcat            latest    058d4868b395   5 minutes ago   679MB
  1. 启动镜像
  2. 访问测试
  3. 发布项目(由于做了卷挂载,直接在本地编译项目就可以发布了)
#  web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="MyStrutsApp" version="2.4" 
        xmlns="http://java.sun.com/xml/ns/j2ee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    
</web-app>
# jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello shanhaijing</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test  web logs - - --")
%>
</body>
</html

以后开发步骤:需要掌握Dockerfile编写!我们的一切都是使用docker镜像来发布运行!

发布自己的镜像

  1. https://hub.docker.com/ 注册自己的账号
  2. 登录账号 # docker login --help
  3. 在服务器上提交自己镜像 # # docker push shanhaijing/diytomcat2:1.0
    • 这里如果有重复,则push失败,通过 tag 标签可以解决
    • [root@iZf8zirbfebziiuh71055zZ tomcatlogs]# docker tag 058d4868b395 shanhaijing/tomcat:1.0 [root@iZf8zirbfebziiuh71055zZ tomcatlogs]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE diytomcat latest 058d4868b395 4 hours ago 679MB 在提交即可
  1. 登录阿里云
  2. 找到容器服务
  3. 创建命名空间
  4. 创建容器镜像
  5. 创建容器仓库

在这里插入图片描述
在这里插入图片描述
https://help.aliyun.com/document_detail/114832.html

小结

在这里插入图片描述

Docker 网络


企业实战


Docker Compose


Docker Swarm


CI/CD jenkins 流水线

举报

相关推荐

0 条评论