本人环境搭建在内网树莓派4b上,使用的linux发行版为树莓派Ubuntu 21.04 server版本
一些镜像需要根据自己的处理器架构去修改!!!
sudo apt install docker.io
查看安装的docker是否成功
root@ubuntu:/home/ubuntu# docker version
Client:
Version: 20.10.7
API version: 1.41
Go version: go1.13.8
Git commit: 20.10.7-0ubuntu5~21.04.2
Built: Mon Nov 1 00:21:30 2021
OS/Arch: linux/arm64
Context: default
Experimental: true
Server:
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.8
Git commit: 20.10.7-0ubuntu5~21.04.2
Built: Tue Oct 19 01:00:27 2021
OS/Arch: linux/arm64
Experimental: false
containerd:
Version: 1.5.2-0ubuntu1~21.04.3
GitCommit:
runc:
Version: 1.0.0~rc95-0ubuntu1~21.04.2
GitCommit:
docker-init:
Version: 0.19.0
GitCommit:
使用pull命令吧hello-world镜像pull下来
使用docker pull --help得到pull的使用文档可知
pull 用法Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
sudo docker pull hello-world:latest #latest可以不加,默认会pull最新版
使用run命令吧hello-world跑起来
sudo docker run hello-world
root@ubuntu:/home/ubuntu# sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm64v8)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
可以看出我们的docker安装成功,测试hello-world也成功了
当然,我们可以不用pull命令,直接使用run命令来运行一个镜像。docker在检索宿主机中没有hello-world镜像后会去官方镜像仓库pull下来再运行
sudo docker run hello-world:latest
Docker run 的底层原理图
root@ubuntu:/# sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql oracle 3ffe8c471196 3 days ago 485MB
nginx latest eeb9db34b331 2 months ago 134MB
tomcat 9 e0c31b8f374c 2 months ago 668MB
elasticsearch 7.16.2 e082d8ac7e5e 2 months ago 634MB
hello-world latest 18e5af790473 5 months ago 9.14kB
portainer/portainer latest ce24b0500fe9 11 months ago 68.4MB
REPOSITORY 镜像的仓库
TAG 镜像的标签/版本号
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
比如我们需要查找mysql镜像
sudo docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12191 [OK]
mariadb MariaDB Server is a high performing open sou… 4683 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 907 [OK]
percona Percona Server is a fork of the MySQL relati… 570 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 461 [OK]
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 93
centos/mysql-57-centos7 MySQL 5.7 SQL database server 92
bitnami/mysql Bitnami MySQL Docker Image 64 [OK]
circleci/mysql MySQL is a widely used, open-source relation… 25
ubuntu/mysql MySQL open source fast, stable, multi-thread… 24
mysql/mysql-router MySQL Router provides transparent routing be… 23
centos/mysql-56-centos7 MySQL 5.6 SQL database server 21
arey/mysql-client Run a MySQL client from a docker container 20 [OK]
google/mysql MySQL server for Google Compute Engine 19 [OK]
mysqlboy/mydumper mydumper for mysql logcial backups 3
mysqlboy/docker-mydumper docker-mydumper containerizes MySQL logical … 3
bitnami/mysqld-exporter 2
ibmcom/mysql-s390x Docker image for mysql-s390x 1
mysqlboy/percona-server Percona-Server a MySQL Fork with enhancement… 1 [OK]
mysqlboy/elasticsearch 0
mysqleatmydata/mysql-eatmydata 0
mysql/mysql-operator MySQL Operator for Kubernetes 0
mirantis/mysql 0
cimg/mysql 0
ibmcom/tidb-ppc64le TiDB is a distributed NewSQL database compat… 0
我们会发现符合名称为mysql的镜像太多了,可以使用STARS数量来过滤一部分镜像
docker search mysql --filter=STARS=3000NAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 12191 [OK] mariadb MariaDB Server is a high performing open sou… 4683 [OK]
也可以使用OFFICIAL参数来查找出全部的官方镜像 --filter “is-official=true”
docker search mysql --filter "is-official=true"NAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 12191 [OK] mariadb MariaDB Server is a high performing open sou… 4683 [OK] percona Percona Server is a fork of the MySQL relati… 570 [OK] phpmyadmin phpMyAdmin - A web interface for MySQL and M… 461 [OK]
当然,使用命令行search查找镜像不如去官方网站去查找(http://hub.docker.com),上面有不同的镜像和版本的介绍和帮助文档,在网站中找到合适的镜像再pull到本地是最好的
这个命令在我们运行hello-world镜像时候说过了
我们再次pull一个mysql来使用(注意问题,我的架构是树莓派的armv8架构,直接使用pull mysql下来的是x86/64架构的镜像,不能运行)
我们到官方镜像网站去查询mysql镜像https://hub.docker.com/
排名最前面的mysql我们点进去查看,发现能找到的版本都不支持armv8架构
这时我们去查看下官方文档
能看到有支持armv8架构的mysql 的超链接,点过去
找到了一个最新版本为mysql:oracle版本的mysql,支持的架构中有我们树莓派4b的架构
# docker pull mysql# Using default tag: latest # 如果不写tag,默认就是latest 我们这里不能使用正常版本的mysql,必须修改后缀为oracleroot@ubuntu:/# sudo docker pull mysql:oracleoracle: Pulling from library/mysql63ea605e0f83: Pull complete 8682e4307360: Pull complete 8811e76642f8: Pull complete 04ed278df250: Pull complete 2c93b01f7b04: Pull complete 13a0806a1841: Pull complete dc52d9a5079e: Pull complete 4efb38734b87: Pull complete 98e25dd4e90f: Pull complete 142127aec3b2: Pull complete Digest: sha256:c290ae4835977163f5e64f0097ca8e3e68b7bfe8e1be6eaf868cd2c784f49a61Status: Downloaded newer image for mysql:oracledocker.io/library/mysql:oracle
docker rmi -f [镜像id] # 删除指定镜像docker rmi -f [镜像id1] [镜像id2] [镜像id3] # 删除多个镜像docker rmi -f $(docker images -aq) # 删除所有镜像
容器是在镜像基础上的,有镜像了才能有对应的容器。镜像和容器是层级关系,镜像生成容器,我们操作的层级是容器
我们pull一个centos镜像
sudo docker pull centos
docker run [可选参数] 镜像名 [命令] [文件扩展名]可选参数:-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;-d: 后台运行容器,并返回容器ID;-i: 以交互模式运行容器,通常与 -t 同时使用;-P: 随机端口映射,容器内部端口随机映射到主机的端口-p: 指定端口映射,格式为:主机(宿主)端口:容器端口-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;--name="nginx-lb": 为容器指定一个名称;--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;-h "mars": 指定容器的hostname;-e username="ritchie": 设置环境变量;--env-file=[]: 从指定文件读入环境变量;--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;-m :设置容器使用内存最大值;--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;--link=[]: 添加链接到另一个容器;--expose=[]: 开放一个端口或一组端口;--volume , -v: 绑定一个卷
run刚刚pull 的centos镜像
root@ubuntu:/# docker run -it centos /bin/bash[root@1c10815ca35f /]# #这是已经进入了centos容器内部了[root@1c10815ca35f /]# exit #使用exit退出容器,docker检测到容器无操作就自动关闭了(没有守护进程)exitroot@ubuntu:/#
docker ps [可选参数]-a :显示所有的容器,包括未运行的。-f :根据条件过滤显示的内容。--format :指定返回值的模板文件。-l :显示最近创建的容器。-n :列出最近创建的n个容器。--no-trunc :不截断输出。-q :静默模式,只显示容器编号。-s :显示总的文件大小。
root@ubuntu:/# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESroot@ubuntu:/# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1c10815ca35f centos "/bin/bash" 12 minutes ago Exited (0) 10 minutes ago cranky_kalam161fe37342fd centos "/bin/bash" 12 minutes ago Exited (0) 12 minutes ago stoic_antonelliroot@ubuntu:/# docker ps -qa1c10815ca35f161fe37342fd
exit # 直接退出容器并关闭Ctrl + P + Q # 容器不关闭退出
docker start 容器id # 启动容器docker restart 容器id # 重启容器docker stop 容器id # 停止当前正在运行的容器docker kill 容器id # 强制停止当前的容器
docker rm -f 容器id # 删除指定容器docker rm -f $(docker ps -aq) # 删除所有容器docker rm $(docker ps -aq) # 删除所有关闭的容器
root@ubuntu:/# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1c10815ca35f centos "/bin/bash" 30 minutes ago Up 55 seconds cranky_kalamroot@ubuntu:/# docker top 1c10815ca35fUID PID PPID C STIME TTY TIME CMDroot 17336 17314 0 08:56 pts/0 00:00:00 /bin/bashroot 17511 17314 0 08:56 ? 00:00:00 /bin/bash
docker查看镜像的元数据
root@ubuntu:/# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1c10815ca35f centos "/bin/bash" 32 minutes ago Up 3 minutes cranky_kalamroot@ubuntu:/# docker inspect 1c10815ca35f[ { "Id": "1c10815ca35f50567560b59fc0c38d4bbb3df5f0a59854bf8e2f22e9998f2931", "Created": "2022-03-02T08:26:47.282673896Z", "Path": "/bin/bash", "Args": [], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 17336, "ExitCode": 0, "Error": "", "StartedAt": "2022-03-02T08:56:05.630541344Z", "FinishedAt": "2022-03-02T08:28:07.817797534Z" }, "Image": "sha256:e6a0117ec169eda93dc5ca978c6ac87580e36765a66097a6bfb6639a3bd4038a", "ResolvConfPath": "/var/lib/docker/containers/1c10815ca35f50567560b59fc0c38d4bbb3df5f0a59854bf8e2f22e9998f2931/resolv.conf", "HostnamePath": "/var/lib/docker/containers/1c10815ca35f50567560b59fc0c38d4bbb3df5f0a59854bf8e2f22e9998f2931/hostname", "HostsPath": "/var/lib/docker/containers/1c10815ca35f50567560b59fc0c38d4bbb3df5f0a59854bf8e2f22e9998f2931/hosts", "LogPath": "/var/lib/docker/containers/1c10815ca35f50567560b59fc0c38d4bbb3df5f0a59854bf8e2f22e9998f2931/1c10815ca35f50567560b59fc0c38d4bbb3df5f0a59854bf8e2f22e9998f2931-json.log", "Name": "/cranky_kalam", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "docker-default", "ExecIDs": [ "059c2548da082abf1c704da36f58549ad62575d4bcb2bef71845f435aa2af7ca" ], "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/4b1dae9c8c66a328d74b69903713f34f5c707c2580b2a2c83183a9d2f1daedd3-init/diff:/var/lib/docker/overlay2/6f5717bc400dbb8602596589eaac6e1d38a1d67fbb1fb17f92e847c33825e46b/diff", "MergedDir": "/var/lib/docker/overlay2/4b1dae9c8c66a328d74b69903713f34f5c707c2580b2a2c83183a9d2f1daedd3/merged", "UpperDir": "/var/lib/docker/overlay2/4b1dae9c8c66a328d74b69903713f34f5c707c2580b2a2c83183a9d2f1daedd3/diff", "WorkDir": "/var/lib/docker/overlay2/4b1dae9c8c66a328d74b69903713f34f5c707c2580b2a2c83183a9d2f1daedd3/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "1c10815ca35f", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "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": "b4beed58c56a29585f70645cb29efd70e66086e9c4b0206b82a40a689f731f88", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/b4beed58c56a", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "b83a60b311af3bc3f453594697dc64676cd94cb45a15332067b68337eed8c634", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:02", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "9fafde59e4478c4d3687835f16c80ed6143aee5f46037b7b7dfbd712ff27e254", "EndpointID": "b83a60b311af3bc3f453594697dc64676cd94cb45a15332067b68337eed8c634", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02", "DriverOpts": null } } } }]
docker exec -it 容器id /bin/bash
root@ubuntu:/# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1c10815ca35f centos "/bin/bash" 34 minutes ago Up 4 minutes cranky_kalamroot@ubuntu:/# docker exec -it 1c10815ca35f /bin/bash[root@1c10815ca35f /]# lsbin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var[root@1c10815ca35f /]#
docker attach 容器id
root@ubuntu:/# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1c10815ca35f centos "/bin/bash" 35 minutes ago Up 6 minutes cranky_kalamroot@ubuntu:/# docker attach 1c10815ca35f[root@1c10815ca35f /]#
这两种方法区别:
docker exec # 进入容器后开启一个新的终端,可以在里面操作*
docker attach # 进入容器正在执行的终端,不会启动新的进程
docker cp 容器id:容器内路径 容器外路径
root@ubuntu:/# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1c10815ca35f centos "/bin/bash" 39 minutes ago Up 2 minutes cranky_kalamroot@ubuntu:/# docker exec -it 1c10815ca35f /bin/bash[root@1c10815ca35f /]# lsbin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var[root@1c10815ca35f /]# echo 'helloworld'>ceshi.txt[root@1c10815ca35f /]# lsbin ceshi.txt dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr varroot@ubuntu:/# docker cp 1c10815ca35f:/ceshi.txt /homeroot@ubuntu:/# cd /homeroot@ubuntu:/home# lsceshi.txt mysql ubuntu wwwroot@ubuntu:/home#
root@ubuntu:/home/ubuntu# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmysql oracle 3ffe8c471196 3 days ago 485MBnginx latest eeb9db34b331 2 months ago 134MBtomcat 9 e0c31b8f374c 2 months ago 668MBelasticsearch 7.16.2 e082d8ac7e5e 2 months ago 634MBhello-world latest 18e5af790473 5 months ago 9.14kBcentos latest e6a0117ec169 5 months ago 272MBportainer/portainer latest ce24b0500fe9 11 months ago 68.4MB
可以看到我们已经有nginx的镜像了,我们可以直接启动
docker run -d --name nginx01 -p 3344:80 nginx # 后台方式启动启动nginx镜像,名称为nginx01,吧nginx暴露出的80端口映射到宿主机的3344端口上启动root@ubuntu:/home/ubuntu# docker run -d --name nginx01 -p 3344:80 nginx258ae4f6f9d8c76e4b37b9c8e36251084feeb66aa2c424d735fc9fa6308b8b56root@ubuntu:/home/ubuntu# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES258ae4f6f9d8 nginx "/docker-entrypoint.…" 37 seconds ago Up 36 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
开放3344端口后内网访问测试
nginx部署成功!
root@ubuntu:/home/ubuntu# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmysql oracle 3ffe8c471196 3 days ago 485MBnginx latest eeb9db34b331 2 months ago 134MBtomcat 9 e0c31b8f374c 2 months ago 668MBelasticsearch 7.16.2 e082d8ac7e5e 2 months ago 634MBhello-world latest 18e5af790473 5 months ago 9.14kBcentos latest e6a0117ec169 5 months ago 272MBportainer/portainer latest ce24b0500fe9 11 months ago 68.4MB
我们本地已经有了tomcat:9的镜像了,可以直接运行
docker run -d -p 3344:8080 --name tomcat01 tomcat:9 #后台运行tomcat,吧8080端口映射到3344端口,名称设置为tomcat01
docker: Error response from daemon: driver failed programming external connectivity on endpoint tomcat01 (d7acc0975879aa737958f8d12e7c58d144abe1a91ed23c4d65c2c10e6511ec29): Bind for 0.0.0.0:3344 failed: port is already allocated.
报错了,根据信息可以看得出,我们nginx的端口和tomcat设置的端口重复了,我们把nginx的容器关闭重新开启tomcat
root@ubuntu:/home/ubuntu# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES258ae4f6f9d8 nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01root@ubuntu:/home/ubuntu# docker stop 258ae4f6f9d8258ae4f6f9d8
刚刚运行的启动tomcat虽然报错,但是容器已经生成了;我们直接运行tomcat01容器就可以了
root@ubuntu:/home/ubuntu# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES656b1452509f tomcat:9 "catalina.sh run" 3 minutes ago Created tomcat01258ae4f6f9d8 nginx "/docker-entrypoint.…" 8 minutes ago Exited (0) 2 minutes ago nginx01root@ubuntu:/home/ubuntu# docker start 656b1452509f656b1452509f
访问之后我们发现tomcat报错404
我们进入容器查看下可以发现webapps目录是空的,但是webapps.dist中有我们需要的文件
root@ubuntu:/home/ubuntu# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES656b1452509f tomcat:9 "catalina.sh run" 5 minutes ago Up About a minute 0.0.0.0:3344->8080/tcp, :::3344->8080/tcp tomcat01root@ubuntu:/home/ubuntu# docker exec -it 656b1452509f /bin/bashroot@656b1452509f:/usr/local/tomcat# lsBUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.distCONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps workroot@656b1452509f:/usr/local/tomcat# cd webappsroot@656b1452509f:/usr/local/tomcat/webapps# lsroot@656b1452509f:/usr/local/tomcat/webapps# cd ..root@656b1452509f:/usr/local/tomcat# cd webapps.dist/root@656b1452509f:/usr/local/tomcat/webapps.dist# lsROOT docs examples host-manager manager
我们把webapps.dist中的文件复制到webapps目录中
root@656b1452509f:/usr/local/tomcat# lsBUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.distCONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps workroot@656b1452509f:/usr/local/tomcat# cp -r webapps.dist/* webappsroot@656b1452509f:/usr/local/tomcat# cd webappsroot@656b1452509f:/usr/local/tomcat/webapps# lsROOT docs examples host-manager manager
刷新网站查看,成功进入tomcat
tomcat部署成功!
我们的armv8架构需要不同的mysql(之前已经下载好了)
mysql oracle 3ffe8c471196 3 days ago 485MB
root@ubuntu:/# docker run -d -p 3344:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysql密码 --name mysql01 mysql:oracle# 后台运行,3306端口映射到3344端口,挂载了两个目录,分别是数据和配置目录,使用-e配置了mysql的root密码并且设置名字为mysql01a6fb9bef820e5e8905214f80cc00e3aa96e31f13db54d5bff0d6fd7aadbd08ef
启动起来后我们使用Navicat连接试试
mysql部署成功!
root@ubuntu:/home/ubuntu# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer# 后台运行,9000端口映射到宿主机的8088端口,重新启动策略为总是,挂载卷为/var/run/docker.sock到宿主机的/var/run/docker.sock,privileged为true管理员95f66d93cde791523c7a83464ab6810a47e01384abc90814d43a01976114249c
具体使用方法请百度
root@ubuntu:/var/run# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESroot@ubuntu:/var/run# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES656b1452509f tomcat:9 "catalina.sh run" 37 minutes ago Exited (143) 19 minutes ago tomcat01258ae4f6f9d8 nginx "/docker-entrypoint.…" 42 minutes ago Exited (0) 36 minutes ago nginx01root@ubuntu:/var/run# docker commit -m="这是修改好的tomcat9" -a="Baicha" 656b1452509f tomcat9:0.1sha256:26722a2b241b1bdd05b3c389d2a26d1efdf15908da8f71428fdc053b5cbfe144root@ubuntu:/var/run# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEtomcat9 0.1 26722a2b241b 11 seconds ago 673MBmysql oracle 3ffe8c471196 3 days ago 485MBnginx latest eeb9db34b331 2 months ago 134MBtomcat 9 e0c31b8f374c 2 months ago 668MBelasticsearch 7.16.2 e082d8ac7e5e 2 months ago 634MBhello-world latest 18e5af790473 5 months ago 9.14kBcentos latest e6a0117ec169 5 months ago 272MBportainer/portainer latest ce24b0500fe9 11 months ago 68.4MB
我们把我们刚刚修改好的tomcat9容器commit成了一个镜像,后面就可以直接使用这个镜像来创建容器而不用修改webapps文件夹了
如果数据都在容器中,那么我们吧容器删除,容器中的数据就会丢失!
容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!
这就是卷技术,目录的挂载,将我们容器内的目录挂载到linux目录上面!
**总结: **容器的持久化和同步操作!容器间数据也是可以共享的!
使用方法一:指定路径挂载 run -v来挂载
docker run -it -v /home/ceshi:/home centos /bin/bash #centos镜像创建容器时吧/home目录挂载到主机/home/ceshi上
使用方法二:匿名挂载
docker run -it -v /home centos /bin/bash #会生成一个
docker volume ls #查看所有volume卷的情况DRIVER VOLUME NAMElocal 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
这种情况就是匿名挂载
使用方法三:具名挂载
docker run -it --name centos1 -v juming-centos:/etc centos
root@ubuntu:/var/run# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES80316ef0daf7 centos "/bin/bash" 27 seconds ago Up 25 seconds centos1root@ubuntu:/var/run# docker volume ls #通过docker volume ls查询所有的卷能看到有一个具体名称的juming-centosDRIVER VOLUME NAMElocal 57cfe1534848c2ed94c4f7489d5862fa187c7ffb8ed24db22f2b33015db3a5e8local 91371ac31c49da0fc3c17b25e7c9e8dcc108f138928cbb2fa87d356d0d6d237blocal juming-centosroot@ubuntu:/var/run# docker volume inspect juming-centos #查看卷juming-centos的信息[ { "CreatedAt": "2022-03-02T12:38:12Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/juming-centos/_data", "Name": "juming-centos", "Options": null, "Scope": "local" }]
我们可以进入这个数据卷目录查看
root@ubuntu:/var/lib/docker/volumes# ls57cfe1534848c2ed94c4f7489d5862fa187c7ffb8ed24db22f2b33015db3a5e8 backingFsBlockDev metadata.db91371ac31c49da0fc3c17b25e7c9e8dcc108f138928cbb2fa87d356d0d6d237b juming-centosroot@ubuntu:/var/lib/docker/volumes# cd juming-centos/root@ubuntu:/var/lib/docker/volumes/juming-centos# ls_dataroot@ubuntu:/var/lib/docker/volumes/juming-centos# cd _data/root@ubuntu:/var/lib/docker/volumes/juming-centos/_data# lsadjtime dnf inittab login.defs pkcs11 resolv.conf system-release-cpealiases dracut.conf inputrc logrotate.d pki rpc terminfoalternatives dracut.conf.d iproute2 machine-id pm rpm tmpfiles.dbash_completion.d environment issue makedumpfile.conf.sample popt.d sasl2 udevbashrc ethertypes issue.net modprobe.d printcap security vconsole.confbindresvport.blacklist exports kdump modules-load.d profile selinux vircbinfmt.d filesystems kdump.conf motd profile.d services X11BUILDTIME gcrypt kernel mtab protocols shadow xattr.confcentos-release gnupg krb5.conf netconfig rc0.d shadow- xdgcentos-release-upstream GREP_COLORS krb5.conf.d NetworkManager rc1.d shells xinetd.dchkconfig.d group ld.so.cache networks rc2.d skel yumcrypto-policies group- ld.so.conf nsswitch.conf rc3.d ssl yum.confcrypttab gshadow ld.so.conf.d nsswitch.conf.bak rc4.d subgid yum.repos.dcsh.cshrc gshadow- libaudit.conf openldap rc5.d subuidcsh.login gss libibverbs.d opt rc6.d sysconfigdbus-1 host.conf libnl os-release rc.d sysctl.confdefault hostname libreport pam.d rc.local sysctl.ddepmod.d hosts locale.conf passwd rdma systemddhcp init.d localtime passwd- redhat-release system-release
可以看到centos1容器的etc目录的所有数据
数据容器卷读写权限
# 通过 -v 容器内容路径 ro rw 改变读写权限ro readonly # 只读rw readwrite # 可读可写 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginxdocker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx # ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作
数据容器卷总结:
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!-v 容器内路径 # 匿名挂载-v 卷名:容器内路径 # 具名挂载-v /主机路径:容器内路径 # 指定路径挂载
DockerFile就是生成镜像的构建脚本,通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。
# 我们这个文件的名字就是dockerfileFROM centos VOLUME ["volume01","volume02"] CMD echo "----end----"CMD /bin/bash
这个dockerfile中的意思就是从centos开始,匿名挂载了两个目录,cmd输出"----end----"并且使用bash打开这个自己构建的centos
docker build -f dockerfile -t baicha/centos1.0.1 . #build构建了文件dockerfile,名称为baicha/centos,tag为1.0.1 !!!一定不要忘记后面的点,代表当前路径下
root@ubuntu:/home/ubuntu# docker build -f dockerfile -t baicha/centos:1.0.1 .Sending build context to Docker daemon 43.52kBStep 1/4 : FROM centos ---> e6a0117ec169Step 2/4 : VOLUME ["volume01", "volume02"] ---> Running in 0f75db803ad4Removing intermediate container 0f75db803ad4 ---> fc7f7b9f8fe5Step 3/4 : CMD echo "----end----" ---> Running in f648882c553cRemoving intermediate container f648882c553c ---> 78acc435b07bStep 4/4 : CMD /bin/bash ---> Running in 41d27fa9e770Removing intermediate container 41d27fa9e770 ---> 506c89c1f358Successfully built 506c89c1f358Successfully tagged baicha/centos:1.0.1root@ubuntu:/home/ubuntu# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEbaicha/centos 1.0.1 50e4aac3b79d 4 seconds ago 65.6MBarm64v8/mysql oracle 3ffe8c471196 4 days ago 485MBmysql oracle 3ffe8c471196 4 days ago 485MBnginx latest eeb9db34b331 2 months ago 134MBtomcat 9 e0c31b8f374c 2 months ago 668MBelasticsearch 7.16.2 e082d8ac7e5e 2 months ago 634MBubuntu latest d5ca7a445605 4 months ago 65.6MBcentos latest e6a0117ec169 5 months ago 272MBportainer/portainer latest ce24b0500fe9 11 months ago 68.4MB
运行我们创建的centos镜像
root@ubuntu:/home/ubuntu# docker run -it baicha/centos:1.0.1 /bin/bashroot@23a7c65481fb:/# ls -altotal 64drwxr-xr-x 1 root root 4096 Mar 3 12:33 .drwxr-xr-x 1 root root 4096 Mar 3 12:33 ..-rwxr-xr-x 1 root root 0 Mar 3 12:33 .dockerenvlrwxrwxrwx 1 root root 7 Oct 6 17:33 bin -> usr/bindrwxr-xr-x 2 root root 4096 Apr 15 2020 bootdrwxr-xr-x 5 root root 360 Mar 3 12:33 devdrwxr-xr-x 1 root root 4096 Mar 3 12:33 etcdrwxr-xr-x 2 root root 4096 Apr 15 2020 homelrwxrwxrwx 1 root root 7 Oct 6 17:33 lib -> usr/libdrwxr-xr-x 2 root root 4096 Oct 6 17:33 mediadrwxr-xr-x 2 root root 4096 Oct 6 17:33 mntdrwxr-xr-x 2 root root 4096 Oct 6 17:33 optdr-xr-xr-x 220 root root 0 Mar 3 12:33 procdrwx------ 2 root root 4096 Oct 6 17:57 rootdrwxr-xr-x 5 root root 4096 Oct 6 17:57 runlrwxrwxrwx 1 root root 8 Oct 6 17:33 sbin -> usr/sbindrwxr-xr-x 2 root root 4096 Oct 6 17:33 srvdr-xr-xr-x 12 root root 0 Mar 3 12:33 sysdrwxrwxrwt 2 root root 4096 Oct 6 17:57 tmpdrwxr-xr-x 10 root root 4096 Oct 6 17:33 usrdrwxr-xr-x 11 root root 4096 Oct 6 17:57 vardrwxr-xr-x 2 root root 4096 Mar 3 12:33 volume01 #可以看到我们使用dockerfile挂载的两个目录都在这上面drwxr-xr-x 2 root root 4096 Mar 3 12:33 volume02
使用inspect 查看Mounts可以看到这两个卷匿名挂在的实际目录
"Mounts": [ { "Type": "volume", "Name": "be8b7702cc2dedebf5f0716b49437af9d4f3617d2541a0c17f940df1c286ae4e", "Source": "/var/lib/docker/volumes/be8b7702cc2dedebf5f0716b49437af9d4f3617d2541a0c17f940df1c286ae4e/_data", "Destination": "volume01", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "3c392a07e18924602b20a6fc6ef826d4b9d4cfac9bf080d0366fb4c02c6aa113", "Source": "/var/lib/docker/volumes/3c392a07e18924602b20a6fc6ef826d4b9d4cfac9bf080d0366fb4c02c6aa113/_data", "Destination": "volume02", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
往这两个目录中存放文件
root@ubuntu:/var/lib/docker/volumes# ls3c392a07e18924602b20a6fc6ef826d4b9d4cfac9bf080d0366fb4c02c6aa113 be8b7702cc2dedebf5f0716b49437af9d4f3617d2541a0c17f940df1c286ae4e
root@ubuntu:/var/lib/docker/volumes# docker exec -it 23a7c65481fb /bin/bashroot@23a7c65481fb:/# ls bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02root@23a7c65481fb:/# cd volume01root@23a7c65481fb:/volume01# echo 'this is volum01'>helloroot@23a7c65481fb:/volume01# lshelloroot@23a7c65481fb:/volume01# cd ..root@23a7c65481fb:/# lsbin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02root@23a7c65481fb:/# cd volume02root@23a7c65481fb:/volume02# echo 'this is volums02'>helloroot@23a7c65481fb:/volume02# lshello
查看数据
root@ubuntu:/var/lib/docker/volumes# ls3c392a07e18924602b20a6fc6ef826d4b9d4cfac9bf080d0366fb4c02c6aa113 be8b7702cc2dedebf5f0716b49437af9d4f3617d2541a0c17f940df1c286ae4ebackingFsBlockDev metadata.dbroot@ubuntu:/var/lib/docker/volumes# cd 3c392a07e18924602b20a6fc6ef826d4b9d4cfac9bf080d0366fb4c02c6aa113/root@ubuntu:/var/lib/docker/volumes/3c392a07e18924602b20a6fc6ef826d4b9d4cfac9bf080d0366fb4c02c6aa113# ls_dataroot@ubuntu:/var/lib/docker/volumes/3c392a07e18924602b20a6fc6ef826d4b9d4cfac9bf080d0366fb4c02c6aa113# cd _data/root@ubuntu:/var/lib/docker/volumes/3c392a07e18924602b20a6fc6ef826d4b9d4cfac9bf080d0366fb4c02c6aa113/_data# lshelloroot@ubuntu:/var/lib/docker/volumes/3c392a07e18924602b20a6fc6ef826d4b9d4cfac9bf080d0366fb4c02c6aa113/_data# cat hellothis is volums02root@ubuntu:/var/lib/docker/volumes/3c392a07e18924602b20a6fc6ef826d4b9d4cfac9bf080d0366fb4c02c6aa113# cd ..root@ubuntu:/var/lib/docker/volumes# cd be8b7702cc2dedebf5f0716b49437af9d4f3617d2541a0c17f940df1c286ae4e/root@ubuntu:/var/lib/docker/volumes/be8b7702cc2dedebf5f0716b49437af9d4f3617d2541a0c17f940df1c286ae4e# ls_dataroot@ubuntu:/var/lib/docker/volumes/be8b7702cc2dedebf5f0716b49437af9d4f3617d2541a0c17f940df1c286ae4e# cd _data/root@ubuntu:/var/lib/docker/volumes/be8b7702cc2dedebf5f0716b49437af9d4f3617d2541a0c17f940df1c286ae4e/_data# lshelloroot@ubuntu:/var/lib/docker/volumes/be8b7702cc2dedebf5f0716b49437af9d4f3617d2541a0c17f940df1c286ae4e/_data# cat hello this is volum01
可以看到数据已经互通了 此时我们如果启动了多个此镜像,数据会在多个容器中后互通
注册官方平台账号
在docker中使用login登陆
root@ubuntu:/home/ubuntu# docker login -u [用户名]Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
我们把刚构建好的baicha/centos镜像上传到官方库中
上传需要对我们需要上传的镜像重新打一个tag
可套用的公式其实是: docker tag 需要上传的镜像[:TAG] [docker hub自己注册的账号名]/镜像名[:TAG]
比如我的dockerhub账号是baicha123,存放的仓库为baicha-private。这时候我们就需要吧镜像名修改为baicha123/baicha-private:TAG
root@ubuntu:/home/ubuntu# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
baicha/centos 1.0.1 50e4aac3b79d 2 hours ago 65.6MB
arm64v8/mysql oracle 3ffe8c471196 4 days ago 485MB
mysql oracle 3ffe8c471196 4 days ago 485MB
nginx latest eeb9db34b331 2 months ago 134MB
tomcat 9 e0c31b8f374c 2 months ago 668MB
elasticsearch 7.16.2 e082d8ac7e5e 2 months ago 634MB
ubuntu latest d5ca7a445605 4 months ago 65.6MB
centos latest e6a0117ec169 5 months ago 272MB
portainer/portainer latest ce24b0500fe9 11 months ago 68.4MB
root@ubuntu:/home/ubuntu# docker tag baicha/centos:1.0.1 baicha123/baicha-private:1.0.1
root@ubuntu:/home/ubuntu# docker push baicha123/baicha-private:1.0.1
The push refers to repository [docker.io/baicha123/baicha-private]
350f36b271de: Pushed
1.0.1: digest: sha256:61db0533f2c724e19a6120b64ec361a25cc6469a8a8cc2fc27bf19fbc796a803 size: 529
可以看到我们成功吧镜像push上去了
root@ubuntu:/home/ubuntu# docker pull baicha123/baicha-private:1.0.1
1.0.1: Pulling from baicha123/baicha-private
a39c84e173f0: Already exists
Digest: sha256:61db0533f2c724e19a6120b64ec361a25cc6469a8a8cc2fc27bf19fbc796a803
Status: Downloaded newer image for baicha123/baicha-private:1.0.1
docker.io/baicha123/baicha-private:1.0.1
注册阿里云,找到控制台中的容器镜像服务
创建个人实例,然后创建我们的命名空间
创建镜像仓库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZT27lcM2-1646321372596)(C:\Users\ZJY\AppData\Roaming\Typora\typora-user-images\image-20220303223727391.png)]
按照操作指南在docker中登陆阿里云Docker Registry
docker login --username=[你的阿里云账户名] registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
一样的道理,修改tag
root@ubuntu:/home/ubuntu# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
baicha123/baicha-private 1.0.1 50e4aac3b79d 2 hours ago 65.6MB
arm64v8/mysql oracle 3ffe8c471196 4 days ago 485MB
mysql oracle 3ffe8c471196 4 days ago 485MB
nginx latest eeb9db34b331 2 months ago 134MB
tomcat 9 e0c31b8f374c 2 months ago 668MB
elasticsearch 7.16.2 e082d8ac7e5e 2 months ago 634MB
portainer/portainer latest ce24b0500fe9 11 months ago 68.4MB
root@ubuntu:/home/ubuntu# docker tag baicha123/baicha-private:1.0.1 registry.cn-hangzhou.aliyuncs.com/baicha/mycentos:1.0.1
root@ubuntu:/home/ubuntu# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
baicha123/baicha-private 1.0.1 50e4aac3b79d 2 hours ago 65.6MB
registry-vpc.cn-hangzhou.aliyuncs.com/baicha/mycentos 1.0.1 50e4aac3b79d 2 hours ago 65.6MB
registry.cn-hangzhou.aliyuncs.com/baicha/mycentos/baicha/mycentos 1.0.1 50e4aac3b79d 2 hours ago 65.6MB
registry.cn-hangzhou.aliyuncs.com/baicha/mycentos 1.0.1 50e4aac3b79d 2 hours ago 65.6MB
arm64v8/mysql oracle 3ffe8c471196 4 days ago 485MB
mysql oracle 3ffe8c471196 4 days ago 485MB
nginx latest eeb9db34b331 2 months ago 134MB
tomcat 9 e0c31b8f374c 2 months ago 668MB
elasticsearch 7.16.2 e082d8ac7e5e 2 months ago 634MB
portainer/portainer latest ce24b0500fe9 11 months ago 68.4MB
修改为域名/命名空间/仓库名:TAG #域名根据是什么网络,我是本地搭建的,就使用registry.cn-hangzhou.aliyuncs.com
push到阿里云仓库
root@ubuntu:/home/ubuntu# docker push registry.cn-hangzhou.aliyuncs.com/baicha/mycentos:1.0.1
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/baicha/mycentos]
350f36b271de: Pushed
1.0.1: digest: sha256:61db0533f2c724e19a6120b64ec361a25cc6469a8a8cc2fc27bf19fbc796a803 size: 529
可以看到成功push上去了!
有兴趣访问下我的博客吧!:http://baicha.baichablog.top/