0
点赞
收藏
分享

微信扫一扫

初识docker

TiaNa_na 2022-01-04 阅读 57

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:
# 查看或者修改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
#x27;
\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 条评论