微服务day02
教学文档:
黑马教学文档
Docker
Docker的安装
镜像和容器
命令解读
常见命令
案例
查看DockerHub,拉取Nginx镜像,创建并运行容器
搜索Nginx镜像:在 www.hub.docker.com 网站进行查询
拉取镜像:
docker pull nginx
查看本地镜像列表:
docker images
将拉取到本地的镜像进行打包,保存为文件
[root@server02 ~]# docker save --help//查询docker save的命令的用法Usage: docker save [OPTIONS] IMAGE [IMAGE...]Save one or more images to a tar archive (streamed to STDOUT by default)Aliases:docker image save, docker save//由此可知 该命令有 -o 表示设置 镜像的存储文件nginx.tar
Options:-o, --output string Write to a file, instead of STDOUT
[root@server02 ~]# ^C
[root@server02 ~]# docker save -o nginx.tar nginx
[root@server02 ~]# ls
anaconda-ks.cfg dist.zip hello install.sh nginx.tar RDM-用户需求说明书.doc 公共 视频 文档 音乐
Desktop download hello-nginx.zip jdk-17.0.8_linux-x64_bin.tar.gz original-ks.cfg xp-install.log 模板 图片 下载 桌面
[root@server02 ~]#
删除本地镜像
[root@server02 ~]# docker rmi nginx
Untagged: nginx:latest
Untagged: nginx@sha256:fad8e1cd52e24bce7b72cd7cb674a2efad671647b917055f5bd8a1f7ac9b1af8
Deleted: sha256:3f8a4339aadda5897b744682f5f774dc69991a81af8d715d37a616bb4c99edf5
Deleted: sha256:bb528503f6f01b70cd8de94372e1e3196fad3b28da2f69b105e95934263b0487
Deleted: sha256:410204d28a96d436e31842a740ad0c827f845d22e06f3b1ff19c3b22706c3ed4
Deleted: sha256:2ec5c0a4cb57c0af7c16ceda0b0a87a54f01f027ed33836a5669ca266cafe97a
[root@server02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d81b6044c59d mysql "docker-entrypoint.s…" 18 hours ago Up 17 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@server02 ~]#
提取本地镜像文件
[root@server02 ~]# docker load --helpUsage: docker load [OPTIONS]Load an image from a tar archive or STDINAliases:docker image load, docker loadOptions:-i, --input string Read from tar archive file, instead of STDIN-q 表示是否显示提去细节-q, --quiet Suppress the load output
[root@server02 ~]#提去本地文件,只需要指定文件名即可[root@server02 ~]# docker load -i nginx.tar
2ec5c0a4cb57: Loading layer [==================================================>] 58.43MB/58.43MB
73e2bd445514: Loading layer [==================================================>] 53.76MB/53.76MB
a103d141fc98: Loading layer [==================================================>] 3.584kB/3.584kB
Loaded image: nginx:latest
[root@server02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d81b6044c59d mysql "docker-entrypoint.s…" 19 hours ago Up 23 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@server02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest be960704dfac 2 weeks ago 602MB
nginx latest 3f8a4339aadd 6 years ago 108MB
[root@server02 ~]#
创建并运行NGINX容器
d81b6044c59d mysql "docker-entrypoint.s…" 20 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@server02 ~]# docker run -d --name nginx -p 90:80 nginx
cd42761dd7ead46aa2c0a9147f5fe0c1f9d200a253cfeee584d6b03d6c66a30b
查看容器
# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
关闭进程
[root@server02 ~]# docker stop nginx
nginx
[root@server02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd42761dd7ea nginx "nginx -g 'daemon of…" About a minute ago Exited (0) 4 seconds ago nginx
d81b6044c59d mysql "docker-entrypoint.s…" 20 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@server02 ~]#
启动容器
[root@server02 ~]# docker start nginx
nginx
[root@server02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd42761dd7ea nginx "nginx -g 'daemon of…" 2 minutes ago Up 1 second 0.0.0.0:90->80/tcp, :::90->80/tcp nginx
d81b6044c59d mysql "docker-entrypoint.s…" 20 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@server02 ~]#
查看容器详细信息
# 第11步,查看容器详细信息
docker inspect nginx
进入容器
# 第12步,进入容器,查看容器内目录
-it 表示进入命令行交互
bash 为指定交互 语言
docker exec -it nginx bash
# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p
删除容器
# 第13步,删除容器
docker rm nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx[root@server02 ~]# docker rm nginx
Error response from daemon: cannot remove container "/nginx": container is running: stop the container before removing or force remove
[root@server02 ~]# docker rm -f nginx
nginx
[root@server02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d81b6044c59d mysql "docker-entrypoint.s…" 20 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@server02 ~]#
命令别名
设置别名:root目录下 .bashrc文件进行设置
# .bashrc# User specific aliases and functionsalias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'# Source global definitions
if [ -f /etc/bashrc ]; then. /etc/bashrc
fi
~
~
~
~
修改文件,
# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc# User specific aliases and functionsalias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'# Source global definitions
if [ -f /etc/bashrc ]; then. /etc/bashrc
fi
执行命令使别名生效
source /root/.bashrc
实例:
[root@server02 ~]# vim .bashrc
[root@server02 ~]# source /root/.bashrc
[root@server02 ~]# dps
CONTAINER ID IMAGE PORTS STATUS NAMES
d81b6044c59d mysql 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp Up 3 hours mysql
[root@server02 ~]# dis
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest be960704dfac 2 weeks ago 602MB
nginx latest 3f8a4339aadd 6 years ago 108MB
[root@server02 ~]#
数据卷
案例:利用Nginx容器部署静态资源
- 进入容器内部:
[root@server02 ~]# docker exec -it nginx bash
- 通过在DockerHub中查找可知Nginx的静态资源存放在 ‘/usr/share/nginx/html/index.html’文件中,由于容器没有提供非必要的依赖,所以没有修改文件的命令(vim)无法修改,由此引入数据卷。
[root@server02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest be960704dfac 2 weeks ago 602MB
nginx latest 3f8a4339aadd 6 years ago 108MB
[root@server02 ~]# docker run -d --name nginx -p 90:80 nginx
4081207a48ee7f1338b2136166b72f1adb424f5482193ab2a52e9c747acd481d
[root@server02 ~]# docker exec -it nginx bash
root@4081207a48ee:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@4081207a48ee:/# cd /usr/share/nginx/html
root@4081207a48ee:/usr/share/nginx/html# ls
50x.html index.html
root@4081207a48ee:/usr/share/nginx/html# vi index.html
bash: vi: command not found
root@4081207a48ee:/usr/share/nginx/html#
删除原有的Nginx的容器[root@server02 ~]# docker rm -f nginx
nginx创建新的容器并创建数据卷,设置数据卷名称为html,根据容器中的存储位置指定[root@server02 ~]# docker run -d --name nginx -p 90:80 -v html:/usr/share/nginx/html nginx
c0f9d2c91c9dd88f2e767bda76453f0f836585c71b4dc129886850bc7a2fe130
[root@server02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0f9d2c91c9d nginx "nginx -g 'daemon of…" 8 seconds ago Up 6 seconds 0.0.0.0:90->80/tcp, :::90->80/tcp nginx
d81b6044c59d mysql "docker-entrypoint.s…" 22 hours ago Up 4 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@server02 ~]# docker volume psUsage: docker volume COMMANDManage volumesCommands:create Create a volumeinspect Display detailed information on one or more volumesls List volumesprune Remove unused local volumesrm Remove one or more volumesupdate Update a volume (cluster volumes only)Run 'docker volume COMMAND --help' for more information on a command.显示所有的数据卷[root@server02 ~]# docker volume ls
DRIVER VOLUME NAME
local bb415299e39a1c7425861ee4add16668301e28c419cde8e35f5c436a69f228a4
local html展示数据卷的详情信息,其中有宿主机中文件的位置
[root@server02 ~]# docker volume inspect html[{"CreatedAt": "2024-11-02T19:57:10+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/html/_data","Name": "html","Options": null,"Scope": "local"}
]
[root@server02 ~]# ^C进入宿主机的文件位置
[root@server02 ~]# cd /var/lib/docker/volumes/html/_data
[root@server02 _data]# ls
50x.html index.html
[root@server02 _data]# cat index.html容器中的数据
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>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>
[root@server02 _data]#
案例2:Mysql数据挂载
查看Mysql容器的详细挂载:
# 1.查看MySQL容器详细信息
docker inspect mysql
# 关注其中.Config.Volumes部分和.Mounts部分
[root@server02 _data]# docker inspect mysql
[{"Id": "d81b6044c59d6dc6bdfd89ee6308b24c8b15bc62a67e58eb58a51471663fdb11","Created": "2024-11-01T13:40:38.673884478Z","Path": "docker-entrypoint.sh","Args": ["mysqld"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 1988,"ExitCode": 0,"Error": "","StartedAt": "2024-11-02T12:43:18.287204296Z","FinishedAt": "2024-11-02T12:42:46.40149356Z"},"Image": "sha256:be960704dfac8744a2e2df80c90087551a998ac008916b9d1423d7b0c5ee33ea","ResolvConfPath": "/var/lib/docker/containers/d81b6044c59d6dc6bdfd89ee6308b24c8b15bc62a67e58eb58a51471663fdb11/resolv.conf","HostnamePath": "/var/lib/docker/containers/d81b6044c59d6dc6bdfd89ee6308b24c8b15bc62a67e58eb58a51471663fdb11/hostname","HostsPath": "/var/lib/docker/containers/d81b6044c59d6dc6bdfd89ee6308b24c8b15bc62a67e58eb58a51471663fdb11/hosts","LogPath": "/var/lib/docker/containers/d81b6044c59d6dc6bdfd89ee6308b24c8b15bc62a67e58eb58a51471663fdb11/d81b6044c59d6dc6bdfd89ee6308b24c8b15bc62a67e58eb58a51471663fdb11-json.log","Name": "/mysql","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "bridge","PortBindings": {"3306/tcp": [{"HostIp": "","HostPort": "3306"}]},"RestartPolicy": {"Name": "always","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"ConsoleSize": [40,80],"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","Isolation": "","CpuShares": 0,"Memory": 0,"NanoCpus": 0,"CgroupParent": "","BlkioWeight": 0,"BlkioWeightDevice": [],"BlkioDeviceReadBps": [],"BlkioDeviceWriteBps": [],"BlkioDeviceReadIOps": [],"BlkioDeviceWriteIOps": [],"CpuPeriod": 0,"CpuQuota": 0,"CpuRealtimePeriod": 0,"CpuRealtimeRuntime": 0,"CpusetCpus": "","CpusetMems": "","Devices": [],"DeviceCgroupRules": null,"DeviceRequests": null,"MemoryReservation": 0,"MemorySwap": 0,"MemorySwappiness": null,"OomKillDisable": false,"PidsLimit": null,"Ulimits": [],"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","/sys/devices/virtual/powercap"],"ReadonlyPaths": ["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]},"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/3cf60d95239daad11fb5ab3980198891888748066b529da9d663da08d9dbcf7f-init/diff:/var/lib/docker/overlay2/2e296e4d0a879890f34b553a9c3f59fa842faf33f37cdd692113dd269ec1adef/diff:/var/lib/docker/overlay2/2c31d039bb31ffb6ac4da3b76ee29ac8ee1b7b918c7be92595d9a76c63cbf0e0/diff:/var/lib/docker/overlay2/7a1225bf1b17ea29ec4595d8fb4b2b41e3a65f9f7ea532181bca4c259cc8df8d/diff:/var/lib/docker/overlay2/9c123ce4975933c8fdd1d01976c202afd48c4f7425e97ee29b363984c26898bb/diff:/var/lib/docker/overlay2/2e56e6f4d9796d51c25133bdf1f652254678c379a584edc4dd4340b1af1b6a36/diff:/var/lib/docker/overlay2/e8e715b5664a9962b35f9bbf33f62d814d7de58a29c11da00a2c9b41c9eb51da/diff:/var/lib/docker/overlay2/36f7c8ada99b2753cb094209970fa771f5d104b1e1c04a3234fea11260f5055c/diff:/var/lib/docker/overlay2/c4ddb63b3f27ffc789739b457035c23e6c7cd762e2a58da055a0f8ccb6c2e7f7/diff:/var/lib/docker/overlay2/66bc1e7635002279b4e9a3167244ac63845ac61f0bbf1e69ce7b2acfc2f45ee0/diff:/var/lib/docker/overlay2/fa8051a8bb240be1431a320cc952996f212a9a0282a8d2e31e15ad2817a6bc29/diff","MergedDir": "/var/lib/docker/overlay2/3cf60d95239daad11fb5ab3980198891888748066b529da9d663da08d9dbcf7f/merged","UpperDir": "/var/lib/docker/overlay2/3cf60d95239daad11fb5ab3980198891888748066b529da9d663da08d9dbcf7f/diff","WorkDir": "/var/lib/docker/overlay2/3cf60d95239daad11fb5ab3980198891888748066b529da9d663da08d9dbcf7f/work"},"Name": "overlay2"},"Mounts": [{"Type": "volume","Name": "bb415299e39a1c7425861ee4add16668301e28c419cde8e35f5c436a69f228a4","Source": "/var/lib/docker/volumes/bb415299e39a1c7425861ee4add16668301e28c419cde8e35f5c436a69f228a4/_data","Destination": "/var/lib/mysql","Driver": "local","Mode": "","RW": true,"Propagation": ""}],"Config": {"Hostname": "d81b6044c59d","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"3306/tcp": {},"33060/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["TZ=Asia/Shanghai","MYSQL_ROOT_PASSWORD=123","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOSU_VERSION=1.17","MYSQL_MAJOR=innovation","MYSQL_VERSION=9.1.0-1.el9","MYSQL_SHELL_VERSION=9.1.0-1.el9"],"Cmd": ["mysqld"],"Image": "mysql","Volumes": {"/var/lib/mysql": {}},"WorkingDir": "/","Entrypoint": ["docker-entrypoint.sh"],"OnBuild": null,"Labels": {}},"NetworkSettings": {"Bridge": "","SandboxID": "99e3029f08cd8edcaf9feac159a4a80a295b2751a97e3ab7f8ccd098ba3edfcd","SandboxKey": "/var/run/docker/netns/99e3029f08cd","Ports": {"3306/tcp": [{"HostIp": "0.0.0.0","HostPort": "3306"},{"HostIp": "::","HostPort": "3306"}],"33060/tcp": null},"HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "bb696f63baf3dfc2a498766837c478b3e535bd0d07414b66db75af55f57438bb","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,"MacAddress": "02:42:ac:11:00:02","NetworkID": "2479e9c603f8bd3f6a4815a430cfdc37081daa5fd57ad1a8225a92e309c7dd90","EndpointID": "bb696f63baf3dfc2a498766837c478b3e535bd0d07414b66db75af55f57438bb","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"DriverOpts": null,"DNSNames": null}}}}
]
[root@server02 _data]#
Mounts部分为挂载信息,在创建容器时就自动创建挂载用来存储数据库中的数据。使用的是匿名卷,
可以发现,其中有几个关键属性:
-
Name:数据卷名称。由于定义容器未设置容器名,这里的就是匿名卷自动生成的名字,一串hash值。
-
Source:宿主机目录
-
Destination : 容器内的目录
上述配置是将容器内的/var/lib/mysql
这个目录,与数据卷bb415299e39a1c7425861ee4add16668301e28c419cde8e35f5c436a69f228a4
挂载。于是在宿主机中就有了/var/lib/docker/volumes/bb415299e39a1c7425861ee4add16668301e28c419cde8e35f5c436a69f228a4/_data
这个目录。这就是匿名数据卷对应的目录,其使用方式与普通数据卷没有差别。
可以发现,数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:
# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件
注意:本地目录或文件必须以 /
或 ./
开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。
-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录
创建要挂载的文件夹,并将提供的资料中的文件拉人文件夹中,包括配置文件和初始化数据库文件。
[root@server02 _data]# ^C
[root@server02 _data]# cd /root
[root@server02 ~]# mkdir mysql
[root@server02 ~]# cd mysql
[root@server02 mysql]# mkdir data
[root@server02 mysql]# mkdir init
[root@server02 mysql]# mkdir conf
[root@server02 mysql]# ls
conf data init
[root@server02 mysql]#
删除已存在的数据库容器:
[root@server02 mysql]# docker rm -f mysql
mysql
[root@server02 mysql]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0f9d2c91c9d nginx "nginx -g 'daemon of…" 2 hours ago Up 34 minutes 0.0.0.0:90->80/tcp, :::90->80/tcp nginx
[root@server02 mysql]#
修改新的数据库容器的创建语句:
docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \-v ./mysql/data:/var/lib/mysql \-v ./mysql/conf:/etc/mysql/conf.d \-v ./mysql/init:/docker-entrypoint-initdb.d \mysql
# 4.查看root目录,可以发现~/mysql/data目录已经自动创建好了
ls -l mysql
# 结果:
总用量 4
drwxr-xr-x. 2 root root 20 5月 19 15:11 conf
drwxr-xr-x. 7 polkitd root 4096 5月 19 15:11 data
drwxr-xr-x. 2 root root 23 5月 19 15:11 init# 查看data目录,会发现里面有大量数据库数据,说明数据库完成了初始化
ls -l data# 5.查看MySQL容器内数据
# 5.1.进入MySQL
docker exec -it mysql mysql -uroot -p123
# 5.2.查看编码表
show variables like "%char%";
# 5.3.结果,发现编码是utf8mb4没有问题
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+# 6.查看数据
# 6.1.查看数据库
show databases;
# 结果,hmall是黑马商城数据库
+--------------------+
| Database |
+--------------------+
| hmall |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
# 6.2.切换到hmall数据库
use hmall;
# 6.3.查看表
show tables;
# 结果:
+-----------------+
| Tables_in_hmall |
+-----------------+
| address |
| cart |
| item |
| order |
| order_detail |
| order_logistics |
| pay_order |
| user |
+-----------------+
# 6.4.查看address表数据
+----+---------+----------+--------+----------+-------------+---------------+-----------+------------+-------+
| id | user_id | province | city | town | mobile | street | contact | is_default | notes |
+----+---------+----------+--------+----------+-------------+---------------+-----------+------------+-------+
| 59 | 1 | 北京 | 北京 | 朝阳区 | 13900112222 | 金燕龙办公楼 | 李佳诚 | 0 | NULL |
| 60 | 1 | 北京 | 北京 | 朝阳区 | 13700221122 | 修正大厦 | 李佳红 | 0 | NULL |
| 61 | 1 | 上海 | 上海 | 浦东新区 | 13301212233 | 航头镇航头路 | 李佳星 | 1 | NULL |
| 63 | 1 | 广东 | 佛山 | 永春 | 13301212233 | 永春武馆 | 李晓龙 | 0 | NULL |
+----+---------+----------+--------+----------+-------------+---------------+-----------+------------+-------+
4 rows in set (0.00 sec)
自定义镜像
例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]
就有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
由于要下载JDK到本地所以先上传JDK到本地镜像
[root@server02 ~]# docker load -i jdk.tar
2c7e7ab2260a: Loading layer [==================================================>] 119.3MB/119.3MB
9ad2165feb02: Loading layer [==================================================>] 17.18MB/17.18MB
92903c3857f8: Loading layer [==================================================>] 17.87MB/17.87MB
1736ab871b32: Loading layer [==================================================>] 12.18MB/12.18MB
6f8e4cb95a88: Loading layer [==================================================>] 3.584kB/3.584kB
41080a0c646f: Loading layer [==================================================>] 141.8MB/141.8MB
Loaded image: openjdk:11.0-jre-buster
[root@server02 ~]# docker ps -
"docker ps" accepts no arguments.
See 'docker ps --help'.Usage: docker ps [OPTIONS]List containers
[root@server02 ~]# docker ps -A
unknown shorthand flag: 'A' in -A
See 'docker ps --help'.
[root@server02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dbf730d0ef60 mysql "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
c0f9d2c91c9d nginx "nginx -g 'daemon of…" 3 hours ago Up 2 hours 0.0.0.0:90->80/tcp, :::90->80/tcp nginx
[root@server02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest be960704dfac 2 weeks ago 602MB
openjdk 11.0-jre-buster 57925f2e4cff 2 years ago 301MB
nginx latest 3f8a4339aadd 6 years ago 108MB
[root@server02 ~]# cd /root/demo
[root@server02 demo]# docker build -t docker-demo:1.0 .
[+] Building 1.0s (8/8) FINISHED docker:default=> [internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 299B 0.0s=> [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster 0.0s=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [1/3] FROM docker.io/library/openjdk:11.0-jre-buster 0.1s=> [internal] load build context 0.2s=> => transferring context: 17.70MB 0.2s=> [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone 0.6s=> [3/3] COPY docker-demo.jar /app.jar 0.1s=> exporting to image 0.1s=> => exporting layers 0.1s=> => writing image sha256:9e95eddcf939bc4f47db257b48be435c1ef4fbe7f954155bb7ffd38c54ecb3f5 0.0s=> => naming to docker.io/library/docker-demo:1.0 0.0s
[root@server02 demo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-demo 1.0 9e95eddcf939 5 seconds ago 319MB
mysql latest be960704dfac 2 weeks ago 602MB
openjdk 11.0-jre-buster 57925f2e4cff 2 years ago 301MB
nginx latest 3f8a4339aadd 6 years ago 108MB
[root@server02 demo]# docker run -d --name dd -p 8080:8080 docker-demo:1.0
a8fd9609526f1f185148cd5e37bb795d06a100e4660ba57a500cbb206d9d849b
[root@server02 demo]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a8fd9609526f docker-demo:1.0 "java -jar /app.jar" 54 seconds ago Up 52 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp dd
dbf730d0ef60 mysql "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
c0f9d2c91c9d nginx "nginx -g 'daemon of…" 3 hours ago Up 2 hours 0.0.0.0:90->80/tcp, :::90->80/tcp nginx
[root@server02 demo]#
网络
删除网络
[root@server02 demo]# docker network rm hmall
hmall
新增
[root@server02 demo]# docker network create wmmczk
462fcfdc6cb2467df985c1eee7c2ca355713321ca05646a4376ec73c8ed71c93显示网络详情
[root@server02 demo]# docker network ls
NETWORK ID NAME DRIVER SCOPE
2479e9c603f8 bridge bridge local
18a3f1a81ca7 host host local
f3b8297a3f91 none null local
462fcfdc6cb2 wmmczk bridge local将Mysql加入网络,并起别名db
[root@server02 demo]# docker network connect wmmczk mysql --alias db将dd加入网络
[root@server02 demo]# docker network connect wmmczk dd
[root@server02 demo]# docker exec -it dd bash从dd访问nysql 的别名db
root@a8fd9609526f:/# ping db
PING db (172.19.0.2) 56(84) bytes of data.
64 bytes from mysql.wmmczk (172.19.0.2): icmp_seq=1 ttl=64 time=0.152 ms
64 bytes from mysql.wmmczk (172.19.0.2): icmp_seq=2 ttl=64 time=0.151 ms
^C
--- db ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 3ms
rtt min/avg/max/mdev = 0.073/0.125/0.152/0.038 ms
root@a8fd9609526f:/# ping mysql
PING mysql (172.19.0.2) 56(84) bytes of data.
64 bytes from mysql.wmmczk (172.19.0.2): icmp_seq=1 ttl=64 time=0.258 ms
64 bytes from mysql.wmmczk (172.19.0.2): icmp_seq=2 ttl=64 time=0.098 ms
64 bytes from mysql.wmmczk (172.19.0.2): icmp_seq=3 ttl=64 time=0.072 ms
^C
--- mysql ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 0.072/0.142/0.258/0.083 ms
root@a8fd9609526f:/#
创建容器时加入 --network 【容器名称】 就可直接加入网络,但是不加入默认网络。
项目部署
后端项目
[root@server02 demo]# cd /root
[root@server02 ~]# docker build -t hmall .
[+] Building 2.3s (8/8) FINISHED docker:default=> [internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 298B 0.0s=> [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster 0.0s=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [1/3] FROM docker.io/library/openjdk:11.0-jre-buster 0.0s=> [internal] load build context 0.7s=> => transferring context: 68.24MB 0.7s=> CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone 0.0s=> [3/3] COPY hm-service.jar /app.jar 1.2s=> exporting to image 0.3s=> => exporting layers 0.3s=> => writing image sha256:97c798b4ad66621ffe0c767374828880c0a4b1fc060804c4b6bba53511f9bf24 0.0s=> => naming to docker.io/library/hmall 0.0s
[root@server02 ~]# dis
REPOSITORY TAG IMAGE ID CREATED SIZE
hmall latest 97c798b4ad66 5 seconds ago 370MB
docker-demo 1.0 9e95eddcf939 38 minutes ago 319MB
mysql latest be960704dfac 2 weeks ago 602MB
openjdk 11.0-jre-buster 57925f2e4cff 2 years ago 301MB
nginx latest 3f8a4339aadd 6 years ago 108MB
[root@server02 ~]# docker rm -f dd
dd
[root@server02 ~]# docker run -d --name hm -p 8080:8080 --network wmmczk hmall
8de6cc8dcaf73d9452794482fb43327a617a7f7d1b4174baf03143bc1424f0f4
[root@server02 ~]# docker logs -f hm. ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.7.12)23:13:45:771 INFO 1 --- [ main] com.hmall.HMallApplication : Starting HMallApplication v1.0.0 using Java 11.0.13 on 8de6cc8dcaf7 with PID 1 (/app.jar started by root in /)
23:13:45:778 DEBUG 1 --- [ main] com.hmall.HMallApplication : Running with Spring Boot v2.7.12, Spring v5.3.27
23:13:45:780 INFO 1 --- [ main] com.hmall.HMallApplication : The following 1 profile is active: "dev"
23:13:48:750 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
23:13:48:761 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
23:13:48:873 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 30 ms. Found 0 Redis repository interfaces.
23:13:51:096 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
23:13:51:130 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
23:13:51:131 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.75]
23:13:51:355 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
23:13:51:355 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5400 ms_ _ |_ _ _|_. ___ _ | _
| | |\/|_)(_| | |_\ |_)||_|_\/ |3.4.3
23:13:57:392 INFO 1 --- [ main] pertySourcedRequestMappingHandlerMapping : Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#getDocumentation(String, HttpServletRequest)]
23:13:59:106 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
23:13:59:108 INFO 1 --- [ main] d.s.w.p.DocumentationPluginsBootstrapper : Documentation plugins bootstrapped
23:13:59:116 INFO 1 --- [ main] d.s.w.p.DocumentationPluginsBootstrapper : Found 1 custom documentation plugin(s)
23:13:59:356 INFO 1 --- [ main] s.d.s.w.s.ApiListingReferenceScanner : Scanning for api listing references
23:14:00:473 INFO 1 --- [ main] com.hmall.HMallApplication : Started HMallApplication in 16.316 seconds (JVM running for 17.706)
好了,我们已经熟悉了Docker的基本用法,接下来可以尝试部署项目了。
在课前资料中已经提供了一个黑马商城项目给大家,如图:
项目说明:
-
hmall:商城的后端代码
-
hmall-portal:商城用户端的前端代码
-
hmall-admin:商城管理端的前端代码
部署的容器及端口说明:
项目 | 容器名 | 端口 | 备注 |
---|---|---|---|
hmall | hmall | 8080 | 黑马商城后端API入口 |
hmall-portal | nginx | 18080 | 黑马商城用户端入口 |
hmall-admin | 18081 | 黑马商城管理端入口 | |
mysql | mysql | 3306 | 数据库 |
在正式部署前,我们先删除之前的nginx、dd两个容器:
docker rm -f nginx dd
mysql容器中已经准备好了商城的数据,所以就不再删除了。
3.1.部署Java项目
hmall
项目是一个maven聚合项目,使用IDEA打开hmall
项目,查看项目结构如图:
我们要部署的就是其中的hm-service
,其中的配置文件采用了多环境的方式:
其中的application-dev.yaml
是部署到开发环境的配置,application-local.yaml
是本地运行时的配置。
查看application.yaml,你会发现其中的JDBC地址并未写死,而是读取变量:
这两个变量在application-dev.yaml
和application-local.yaml
中并不相同:
在dev开发环境(也就是Docker部署时)采用了mysql作为地址,刚好是我们的mysql容器名,只要两者在一个网络,就一定能互相访问。
我们将项目打包:
结果:
将hm-service
目录下的Dockerfile
和hm-service/target
目录下的hm-service.jar
一起上传到虚拟机的root
目录:
部署项目:
# 1.构建项目镜像,不指定tag,则默认为latest docker build -t hmall . # 2.查看镜像 docker images # 结果 REPOSITORY TAG IMAGE ID CREATED SIZE hmall latest 0bb07b2c34b9 43 seconds ago 362MB docker-demo 1.0 49743484da68 24 hours ago 327MB nginx latest 605c77e624dd 16 months ago 141MB mysql latest 3218b38490ce 17 months ago 516MB # 3.创建并运行容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql docker run -d --name hmall --network hmall -p 8080:8080 hmall
测试,通过浏览器访问:http://你的虚拟机地址:8080/search/list
前端项目
删除原有的Nginx容器
[root@server02 ~]# docker rm -f nginx
nginx
[root@server02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8de6cc8dcaf7 hmall "java -jar /app.jar" 11 hours ago Exited (143) 11 hours ago hm
dbf730d0ef60 mysql "docker-entrypoint.s…" 13 hours ago Exited (0) 11 hours ago mysql
[root@server02 ~]#
创建新Nginx容器并进行挂载和加入网络
修改配置文件(即后端容器的名字使前端可以访问后端):
worker_processes 1;events {worker_connections 1024;
}http {include mime.types;default_type application/json;sendfile on;keepalive_timeout 65;server {listen 18080;# 指定前端项目所在的位置location / {root /usr/share/nginx/html/hmall-portal;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}location /api {rewrite /api/(.*) /$1 break;proxy_pass http://hm:8080;}}server {listen 18081;# 指定前端项目所在的位置location / {root /usr/share/nginx/html/hmall-admin;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}location /api {rewrite /api/(.*) /$1 break;proxy_pass http://hm:8080;}}
}
然后创建nginx容器并完成两个挂载:
-
把
/root/nginx/nginx.conf
挂载到/etc/nginx/ng
inx.conf
-
把
/root/nginx/html
挂载到/usr/share/nginx/html
由于需要让nginx同时代理hmall-portal和hmall-admin两套前端资源,因此我们需要暴露两个端口:
-
18080:对应hmall-portal
-
18081:对应hmall-admin
命令如下:
docker run -d \--name nginx \-p 18080:18080 \-p 18081:18081 \-v /root/nginx/html:/usr/share/nginx/html \-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \--network wmmczk\nginx
[root@server02 ~]# docker rm -f nginx
nginx
[root@server02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8de6cc8dcaf7 hmall "java -jar /app.jar" 11 hours ago Exited (143) 11 hours ago hm
dbf730d0ef60 mysql "docker-entrypoint.s…" 13 hours ago Exited (0) 11 hours ago mysql
[root@server02 ~]# ^C
[root@server02 ~]# docker run -d \
> --name nginx \
> -p 18080:18080 \
> -p 18081:18081 \
> -v /root/nginx/html:/usr/share/nginx/html \
> -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
> --network wmmczk\
> nginx
c1330ae115775b962cf7582805e9feb010ea5b322fcfc3d9aea2a1fa7035eeaf
[root@server02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1330ae11577 nginx "nginx -g 'daemon of…" 6 seconds ago Exited (1) 4 seconds ago nginx
8de6cc8dcaf7 hmall "java -jar /app.jar" 11 hours ago Exited (143) 11 hours ago hm
dbf730d0ef60 mysql "docker-entrypoint.s…" 13 hours ago Exited (0) 11 hours ago mysql
[root@server02 ~]# docker start nginx
nginx
[root@server02 ~]# docker start hm
hm
[root@server02 ~]# docker start mysql
mysql
[root@server02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1330ae11577 nginx "nginx -g 'daemon of…" About a minute ago Exited (1) 59 seconds ago nginx
8de6cc8dcaf7 hmall "java -jar /app.jar" 11 hours ago Up 46 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp hm
dbf730d0ef60 mysql "docker-entrypoint.s…" 13 hours ago Up 40 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@server02 ~]# docker start nginx
nginx
[root@server02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1330ae11577 nginx "nginx -g 'daemon of…" About a minute ago Up 5 seconds 80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp nginx
8de6cc8dcaf7 hmall "java -jar /app.jar" 11 hours ago Up About a minute 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp hm
dbf730d0ef60 mysql "docker-entrypoint.s…" 13 hours ago Up About a minute 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@server02 ~]#
DockerCompose
docker run 参数 | docker compose 指令 | 说明 |
---|---|---|
--name | container_name | 容器名称 |
-p | ports | 端口映射 |
-e | environment | 环境变量 |
-v | volumes | 数据卷配置 |
--network | networks | 网络 |
配置文件:
version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hm-nethmall:build: context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hm-netdepends_on:- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/usr/share/nginx/html"depends_on:- hmallnetworks:- hm-net
networks:hm-net:name: hmall
[root@server02 ~]# docker rm -f hm nginx mysql
hm
nginx
mysql
[root@server02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hmall latest 97c798b4ad66 12 hours ago 370MB
docker-demo 1.0 9e95eddcf939 12 hours ago 319MB
mysql latest be960704dfac 2 weeks ago 602MB
openjdk 11.0-jre-buster 57925f2e4cff 2 years ago 301MB
nginx latest 3f8a4339aadd 6 years ago 108MB
[root@server02 ~]# docker rmi hmall docker-demo
Untagged: hmall:latest
Deleted: sha256:97c798b4ad66621ffe0c767374828880c0a4b1fc060804c4b6bba53511f9bf24
Error response from daemon: No such image: docker-demo:latest
[root@server02 ~]# docker compose up -d
WARN[0000] /root/docker-compose.yml: `version` is obsolete
[+] Building 0.1s (8/8) FINISHED docker:default=> [hmall internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 298B 0.0s=> [hmall internal] load metadata for docker.io/library/openjdk:11.0-jre 0.0s=> [hmall internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [hmall internal] load build context 0.0s=> => transferring context: 38B 0.0s=> [hmall 1/3] FROM docker.io/library/openjdk:11.0-jre-buster 0.0s=> CACHED [hmall 2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc 0.0s=> CACHED [hmall 3/3] COPY hm-service.jar /app.jar 0.0s=> [hmall] exporting to image 0.0s=> => exporting layers 0.0s=> => writing image sha256:3e78751a9f66a7824c8dd9a65bc7efa11c9e8def1e7be 0.0s=> => naming to docker.io/library/root-hmall 0.0s
[+] Running 4/4✔ Network hmall Created 0.1s✔ Container mysql Started 0.5s✔ Container hmall Started 0.9s✔ Container nginx Started 1.7s
[root@server02 ~]# docker compose images
WARN[0000] /root/docker-compose.yml: `version` is obsolete
CONTAINER REPOSITORY TAG IMAGE ID SIZE
hmall root-hmall latest 3e78751a9f66 370MB
mysql mysql latest be960704dfac 602MB
nginx nginx latest 3f8a4339aadd 108MB
[root@server02 ~]# docker compose ps
WARN[0000] /root/docker-compose.yml: `version` is obsolete
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
hmall root-hmall "java -jar /app.jar" hmall 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql mysql "docker-entrypoint.s…" mysql 2 minutes ago Up 2 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx nginx "nginx -g 'daemon of…" nginx 2 minutes ago Up 2 minutes 80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp
[root@server02 ~]#
相关文章:

微服务day02
教学文档: 黑马教学文档 Docker Docker的安装 镜像和容器 命令解读 常见命令 案例 查看DockerHub,拉取Nginx镜像,创建并运行容器 搜索Nginx镜像:在 www.hub.docker.com 网站进行查询 拉取镜像: docker pull ngin…...

使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法
在开发 Spring Boot 项目时,日志是调试和监控的重要工具。Spring Boot 默认支持 Logback 作为日志系统,并提供了 logback.xml 和 logback-spring.xml 两种配置方式。这篇文章将详细介绍这两者的区别、各自的优缺点以及最佳实践。 目录 一、什么是 Logbac…...

NSET or MSET算法--原理解析
1.背景 NSET/MSET是一种非线性的多元预测诊断技术,广泛应用于系统状态估计、故障诊断和预测等领域;相比于传统的线性模型和方法,NSET/MSET能够更好地处理非线性系统,并提供更准确的预测和诊断能力。在早期,MSET融合了…...

NC6 系统配置的消息渠道配置配置涉及相关的表,用户使用admin登录
NC6 系统配置的消息渠道配置配置涉及相关的表 --电子邮件、公共短信属性值配置表,比如邮箱类型、邮件发送服务器、用户、密码、发件人地址、url等。 SELECT * FROM sm_msg_stypeprop;--消息发送方式配置:电子邮件,公共短信。 SELECT * FROM sm_msg_stypebase WHERE active …...

PXC数据库性能测试对比
mysql单机 #初始化测试数据 sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=xxx.xxx.xxx.xxx --mysql-db=test --mysql-user=hzhadmin --mysql-password=Admi --tables=10 --table-size=1000000 prepare#运行性能测试 sysbench /usr/share/sysbench/oltp_rea…...

使用AutoMySQLBackup 数据库自动备份
1.下载地址 AutoMySQLBackup的下在地址为http://sourceforge.net/projects/automysqlbackup/ 。 目前最新版本为automysqlbackup-v3.0_rc6.tar.gz 2.解压缩 把下载的automysqlbackup-v3.0_rc6.tar.gz文件拷贝到/usr/tmp下面 在/usr/local下面新建一个automysqlbackup文件夹…...

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持对接阿里云、腾讯云、天翼云、亚马逊S3云存储
随着云计算技术的日益成熟,越来越多的企业开始将其业务迁移到云端,以享受更为灵活、高效且经济的服务模式。在视频监控领域,云存储因其强大的数据处理能力和弹性扩展性,成为视频数据存储的理想选择。NVR批量管理软件/平台EasyNVR&…...

13.React useTimeout
在 React 应用中,延迟执行某些操作是一个常见需求。传统的 setTimeout 在函数组件中使用可能会导致一些问题,如闭包陷阱或难以正确清理。useTimeout 钩子提供了一种声明式的方法来实现延迟执行,使得定时器的管理更加简单和可靠。这个自定义钩子不仅简化了定时器的使用,还解…...

Android待机问题与内存泄露日志定位及bugreport获取分析
文章目录 bugreportbugreport介绍获取bugreport日志分析bugreport安卓平台log获取日志android.logkernel.logkernel.log查看待机过程sysinfo.log判断内存是否有泄露分析bugreport,定位唤醒源,判断是否有ANR。分析安卓log,定位待机唤醒功耗问题,判断是否有内存泄露。bugrepo…...

访问控制技术原理与应用
目录 访问控制概述实现访问控制目标访问控制参考模型常见访问控制模型访问控制模型-DAC自主访问控制访问控制模型-MAC强制访问控制访问控制模型-RBAC基于角色的访问控制访问控制模型-ABAC基于属性的访问控制 访问控制概述 访问控制是对资源对象的访问授权控制的方法以及运行机…...

详解Rust标准库:Vec向量
查看本地官方文档 安装rust后运行 rustup doc查看The Standard Library即可获取标准库内容 std::vec::Vec定义 Vec除了可以作为动态数组还可以模拟为一个栈,仅使用push、pop即可 Vec默认分配在堆上,对于一个容量为4,有两个元素a、b的向量…...

网络原理(初一,TCP/IP五层(或四层)模型面试问题)
TCP/IP五层(或四层)模型 TCP/IP是⼀组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。 TCP/IP通讯协议采⽤了5层的层级结构,每⼀层都呼叫它的下⼀层所提供的⽹络来完成⾃⼰的需求。 • 应⽤层:负责…...

Unity引擎材质球残留贴图引用的处理
大家好,我是阿赵。 这次来分享一下Unity引擎材质球残留贴图引用的处理 一、 问题 在使用Unity调整美术效果的时候,我们很经常会有这样的操作,比如: 1、 同一个材质球切换不同的Shader、 比如我现在有2个Shader,…...

Flutter鸿蒙next中封装一个列表组件
1. 创建Flutter项目 首先,确保你已经安装了Flutter SDK,并创建一个新的Flutter项目: flutter create podcast_app cd podcast_app2. 封装列表组件 我们将在lib目录下创建一个新的文件,命名为podcast_list.dart,用于…...

层次与网络的视觉对话:树图与力引导布局的双剑合璧
目录 目的内容树图绘制目的步骤参考代码结果与分析 力引导布局算法目的参考代码结果与分析 总结 目的 掌握常用可视化软件与工具:学习和熟练使用常用的数据可视化软件和工具,如Matplotlib、Seaborn、Plotly、Tableau等。这些工具提供了用于创建图表、图…...

python将数据集中所有文件名升序制作txt文件(医学影像)
import os import re # 设定图像文件所在的路径 img_path ./2d/images/ #需修改路径 # 获取该路径下的所有文件名 img_list os.listdir(img_path) # 过滤出以.nii结尾的文件名 nii_list [f for f in img_list if f.endswith(.nii)] # 使用正则表达式从文件名中提…...

【The Art of Unit Testing 3_自学笔记06】3.4 + 3.5 单元测试核心技能之:函数式注入与模块化注入的解决方案简介
文章目录 3.4 函数式依赖注入技术 Functional injection techniques3.5 模块化依赖注入技术 Modular injection techniques 写在前面 上一篇的最后部分对第三章后续内容做了一个概括性的梳理,并给出了断开依赖项的最简单的实现方案,函数参数值注入法。本…...

【VSCode】配置
安装插件 C vscode-icons gdb调试 https://www.bilibili.com/video/BV15U4y1x7b2/?spm_id_from333.999.0.0&vd_sourcedf0ce73d9b9b61e6d4771898f1441f7f https://www.bilibili.com/video/BV1pU4y1W74Z?spm_id_from333.788.recommend_more_video.-1&vd_sourcedf0…...

Linux 常用命令整理大全及命令使用心得
本文章是为了总结自己用过的命令,以及一些心得,网上有很多类似的,但自己总结才能更好的理解。 文章目录 一、文件和目录管理01、 ls :列出目录内容02、cd:更改当前目录03、pwd:显示当前工作目录04、mkdir&a…...

计算器的实现
计算器的⼀般实现 计算器的一般实现:优化:使⽤函数指针数组的实现: 计算器的一般实现: #include <stdio.h> int add(int a, int b) {return a b; } int sub(int a, int b) {return a - b; } int mul(int a, int b) {retur…...

这个工具帮你快速实现数据集成和同步
在这个信息爆炸的时代,数据的流动和同步逐渐成为企业运营的命脉。然而,企业正面临着前所未有的数据挑战,无论是跨地域的分公司协作,还是云服务与本地数据库的交互,数据的集成、清洗、转换和加载(ETL&#x…...

论文阅读:Computational Long Exposure Mobile Photography (一)
这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章,介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像,用运动模糊来呈现场景中的移动元素。它通常有两种模式,分别产生前景模糊或…...

项目解决方案:多地连锁药店高清视频监控系统建设解决方案(设计方案)
目录 一.项目背景 1.1背景描述 1.2需求分析 二.设计依据和建设目标 2.1设计依据 2.2建设目标 三.系统设计实现 3.1系统方案设计 3.2网络组网说明 四.建设系统特色 4.1安全性 4.2节约建设成本 4.3原有资源的再利用 4.4可扩展性 五.产品介绍 5.1概述 5.2设备…...

utf-8、pbkdf2_sha
#utf-8加密、解密 import base64 base64.b64encode(lienlien123.encode(utf-8)) bbGllbmxpZW4xMjM base64.b64decode(bbGllbmxpZW4xMjM.decode(utf-8)) blienlien123 #pbkdf2_sha加密,校验 # 该种密码在不同时刻会有产生不同的加密结果 # 该加密方法使用的是散列…...

Java之包,抽象类,接口
目录 包 导入包 静态导入 将类放入包 常见的系统包 抽象类 语法规则 注意事项: 抽象类的作用 接口 实现多个接口 接口间的继承 接口使用实例 (法一)实现Comparable接口的compareTo()方法 (法二)实现Comp…...

HarmonyOS鸿蒙开发入门,常用ArkUI组件学习(二)
书接上回,让我们继续来学习ArkUI的其他组件 目录,可以点击跳转到想要了解的组件详细内容 组件四:Button组件五:Slider组件六: Column & Row组件七:循环控制组件八: List 组件四:…...

斩!JavaScript语法进阶
一、DOM 概述 DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model)。当网页被加载时,浏览器将网页转为一个DOM,并用JS进行各种操作。比如:改变页面中的HTML 元素及其属性&am…...

UFO:Windows操作系统的具象智能代理
近年来,随着AI技术的发展,智能代理在各种应用中扮演着越来越重要的角色。微软推出的UFO(User-Focused Operator)正是这样一个出色的多代理框架,旨在通过无缝导航和操作,满足用户在Windows操作系统中跨多个应…...

win10/11无休眠设置和断电后电池模式自动休眠而不是睡眠-用以省电
1、打开休眠设置选项 打开控制面板\所有控制面板项\电源选项\ 左侧的选择电源按钮的功能 默认状态没有休眠 1、管理员权限打开cmd或者power shell 2、输入一下指令,打开休眠选项 powercfg -hibernate on关闭后重新打开 控制面板\所有控制面板项\电源选项\左侧的选…...

【动态规划之斐波那契数列模型】——累加递推型动态规划
文章目录 第N个泰波那契数列面试题08.01.三步问题使用最小花费爬楼梯解码问题 第N个泰波那契数列 解题思路: 泰波那契数列的第 N 项定义为前面三项之和,即 T0 0, T1 1, T2 1,从 T3 开始,每一项都等于前三项的和。要找到第 N 项…...