# Docker学习 **Repository Path**: hrbu-2022/docker-learning ## Basic Information - **Project Name**: Docker学习 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-14 - **Last Updated**: 2025-05-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Docker介绍 # Docker安装 参考: https://developer.aliyun.com/article/110806 # Docker使用 使用国内的代理: 在 ` /etc/docker/daemon.json`中添加 代理地址,如果没有文件需要创建一个 ```json { "registry-mirrors": ["https://ustc-edu-cn.mirror.aliyuncs.com/", "https://ccr.ccs.tencentyun.com/", "https://docker.m.daocloud.io/"] } ``` 如果失效了需要重新替换,比如使用阿里云的 ![image-20250514091116711](imgs/image-20250514091116711.png) # 安装mysql为例使用 ## 搜索镜像 - 查找有那些版本(tag) ``` docker search mysql ``` ## 拉取镜像 - docker pull 镜像的名字 拉取的是最新的版本号(lasted) - docker pull 镜像的名字:tag 拉取指定版本号的 tag ``` docker pull mysql:8.0.42 ``` ![image-20250514091543238](imgs/image-20250514091543238.png) 拉取结束 ![image-20250514092210288](imgs/image-20250514092210288.png) ## 查看镜像 ``` docker images ``` ![image-20250514092531139](imgs/image-20250514092531139.png) ## 启动容器(介绍-准备) 使用一个镜像(类似于已经安装完的 机器) run起来 - docker run 启动一个容器 - --name 表示 给容器起名 mysql - -v 表示映射的卷(目录或者文件) - -e 环境参数 - MYSQL_ROOT_PASSWORD 默认root的 密码 - MYSQL_DATABASE 暂时不需要 - -d 后台进程 - mysql:tag 使用哪个镜像启动容器 常用的mysql容器的 环境变量 ![image-20250514093127772](imgs/image-20250514093127772.png) ### 准备一个目录 用于映射 宿主机器和容器的关系 /root/docker/mysql---> /etc/mysql/conf.d ``` mkdir -p /root/docker/mysql ``` ![image-20250514093639822](imgs/image-20250514093639822.png) ## 启动容器 ``` docker run -d --name mysql -v /root/docker/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root mysql:8.0.42 ``` ## 查看容器 - docker ps 默认查看 所有已经启动的容器(不包含停止) - -a ``` docker ps ``` ![image-20250514094106367](imgs/image-20250514094106367.png) ## 进入到容器 - docker exec -it 容器的名字或者 id 使用的shell - docker exec -it mysql /bin/bash ```shell [root@neuedu-alma-linux ~]# docker exec -it mysql /bin/sh sh-5.1# exit exit [root@neuedu-alma-linux ~]# docker exec -it mysql /bin/bash bash-5.1# exit exit [root@neuedu-alma-linux ~]# docker exec -it b7165e89d0db /bin/bash bash-5.1# ^C bash-5.1# exit exit [root@neuedu-alma-linux ~]# ``` ## 连接数据库 - 前提是需要进入到容器中: `docker exec -it mysql /bin/bash` - 容器中使用个客户端 ``` mysql -uroot -proot ``` ![image-20250514094623542](imgs/image-20250514094623542.png) ## 容器的停止和启动 上述mysql服务器默认只能在容器中访问 mysql 提示超时访问不了(原因是没有映射端口号) ![image-20250514102954037](imgs/image-20250514102954037.png) ![image-20250514103138806](imgs/image-20250514103138806.png) 需要重新创建一次容器 让**宿主**机器的3306映射到**容器**的 3306 可以使用个 docker rm 命令移除容器(删除), 已经启动的容器不允许删除,需要先停止 ![image-20250514103347979](imgs/image-20250514103347979.png) ### 停止 ```she;; docker stop mysql ``` ![image-20250514103524212](imgs/image-20250514103524212.png) docker ps 查看启动的容器, 如果查看已经启动的 需要添加 `-a`参数 ### 启动 docker start 容器的名称或者id ``` docker start mysql ``` ![image-20250514103625614](imgs/image-20250514103625614.png) ## 容器的删除 docker rm 容器的名称或者id ```shell docker stop mysql && docker rm mysql ``` ![image-20250514103758376](imgs/image-20250514103758376.png) ## 映射端口号 - docker run 启动一个容器 - --name 表示 给容器起名 mysql - -v 表示映射的卷(目录或者文件) - -e 环境参数 - MYSQL_ROOT_PASSWORD 默认root的 密码 - MYSQL_DATABASE 暂时不需要 - -d 后台进程 - mysql:tag 使用哪个镜像启动容器 - -p 3306:3306 将宿主机的 3306端口映射到容器的3306端口 ( -P 映射所有的端口号 ) ``` docker run -d --name mysql -v /root/docker/mysql:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:8.0.42 ``` ```shell # 重新运行容器 添加端口映射 [root@neuedu-alma-linux mysql]# docker run -d --name mysql -v /root/docker/mysql:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:8.0.42 e8b396bcab3f5b036647d790ffedfc39ebf5428aa757b5260c5e11d3e862c7cb #查看 容器 [root@neuedu-alma-linux mysql]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e8b396bcab3f mysql:8.0.42 "docker-entrypoint.s…" 5 seconds ago Up 5 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql # 进入到容器 [root@neuedu-alma-linux mysql]# docker exec -it mysql /bin/bash #在容器中使用mysql客户端连接mysql服务器 bash-5.1# mysql -uroot -proot mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.42 MySQL Community Server - GPL Copyright (c) 2000, 2025, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. # sql 查看数据库 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.01 sec) mysql> ``` ### 外部 使用外部的客户端 连接(window 10 机器上的 mysql命令) -h 表示连接的服务器ip的地址(需要改成自己的linux机器的ip) ip addr ```shell # 切换到 mysql的bin目录 D:\app\mysql-8.0.30-winx64\bin>mysql -h192.168.49.100 -uroot -proot mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 8.0.42 MySQL Community Server - GPL Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. #执行查看的命令 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> ``` ![image-20250514104309243](imgs/image-20250514104309243.png) 修改MYSQL加密方式 ```sql alter user 'root'@'%' identified with mysql_native_password by 'root'; ``` 当我们使用旧的 sqlyog 或者是**navicat** 连接 8.0+++ ![image-20250514111702876](imgs/image-20250514111702876.png) ![image-20250514112127842](imgs/image-20250514112127842.png) # 常用命令 ![image-20250514112534372](imgs/image-20250514112534372.png) ## pull && images - jdk ```shell #拉取镜像 [root@neuedu-alma-linux mysql]# docker pull openjdk:17 17: Pulling from library/openjdk 38a980f2cc8a: Pull complete de849f1cfbe6: Pull complete a7203ca35e75: Pull complete Digest: sha256:528707081fdb9562eb819128a9f85ae7fe000e2fbaeaf9f87662e7b3f38cb7d8 Status: Downloaded newer image for openjdk:17 docker.io/library/openjdk:17 [root@neuedu-alma-linux mysql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0.42 00a697b8380c 4 weeks ago 772MB mysql latest a52cba19e8cc 3 months ago 797MB openjdk 17 5e28ba2b4cdb 3 years ago 471MB ubuntu 15.10 9b9cb95443b5 8 years ago 137MB [root@neuedu-alma-linux mysql]# ``` ## rmi ```shell #查看镜像 [root@neuedu-alma-linux mysql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0.42 00a697b8380c 4 weeks ago 772MB mysql latest a52cba19e8cc 3 months ago 797MB openjdk 17 5e28ba2b4cdb 3 years ago 471MB ubuntu 15.10 9b9cb95443b5 8 years ago 137MB #尝试删除了一次不加 tag的,默认删除latest 没有会提示错误 [root@neuedu-alma-linux mysql]# docker rmi ubuntu Error response from daemon: No such image: ubuntu:latest #删除mysql的latest镜像 [root@neuedu-alma-linux mysql]# docker rmi mysql:latest Untagged: mysql:latest Untagged: mysql@sha256:45f5ae20cfe1d6e6c43684dfffef17db1e1e8dc9bf7133ceaafb25c16b10f31b Deleted: sha256:a52cba19e8ccd4e3970066547773ca4eab465d16ce0357092f4fb8db3b8e2d5c Deleted: sha256:a25c66888991121097bdc54b7993ca7e8aac584ca3bf25fd99e1c18c84732c2f Deleted: sha256:4629313b88fe0d9076b9784e658187800edfa6613e8759ba2d28ef3f411cd1f2 Deleted: sha256:c02d561147b83a1e0f8c481f65672ad5c96a329d08945dd0e633c1f203c06d86 Deleted: sha256:b3815b77568899c228d88ca1c4e90a595200fca22bc9fbcf128d9b2d485d6653 Deleted: sha256:13882270691af85ca7a93dd7c365c1ba08ba49e18db6dd807641c83fb83bb209 Deleted: sha256:c2da903bcd25a4669d99f882ddf141ca95260fdb8622e2cb22807d31957c0f56 Deleted: sha256:19a107afd97eb23884caffedd072d3fd8667ce9b7dee336230be90b3dcc80578 Deleted: sha256:4de79ec911f2cdacda88a23ab83d75942047536fb382d0f02df95128451c5db3 Deleted: sha256:21550eadd384ea77f8f28380c7cb6c79f2a531e11ff8775007e9c9fce1f3a278 Deleted: sha256:7600fdef234bf101e8f4027a1c27c783cf1e502e2de00f676d99aeaf1d6cc5ef #查看镜像,发现已删除 [root@neuedu-alma-linux mysql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0.42 00a697b8380c 4 weeks ago 772MB openjdk 17 5e28ba2b4cdb 3 years ago 471MB ubuntu 15.10 9b9cb95443b5 8 years ago 137MB [root@neuedu-alma-linux mysql]# ``` ## run stop start restart - 启动 start - 停止 stop - 重启 restart - run 参考上面的代码 ## rm 删除容器 container 删除的时候 需要将容器停止 ```shell docker rm 容器的名字或者id ``` ## ps或者 ps -a ```shell #查看启动的容器 [root@neuedu-alma-linux mysql]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e8b396bcab3f mysql:8.0.42 "docker-entrypoint.s…" 56 minutes ago Up 56 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql #查看所有的容器包括已经停止的 [root@neuedu-alma-linux mysql]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e8b396bcab3f mysql:8.0.42 "docker-entrypoint.s…" 56 minutes ago Up 56 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql f32247d881e7 ubuntu:15.10 "/bin/sh -c 'while t…" 3 months ago Exited (137) 3 months ago funny_bouman 6f3e864a8bb9 ubuntu:15.10 "/bin/bash" 3 months ago Exited (0) 3 months ago magical_swanson d065dc357ddf ubuntu:15.10 "/bin/bash" 3 months ago Exited (127) 3 months ago clever_feistel ``` ## logs ````shell #查看日志 [root@neuedu-alma-linux mysql]# docker logs mysql 2025-05-14 02:39:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.42-1.el9 started. 2025-05-14 02:39:58+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' 2025-05-14 02:39:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.42-1.el9 started. 2025-05-14 02:39:58+00:00 [Note] [Entrypoint]: Initializing database files 2025-05-14T02:39:59.001123Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead. 2025-05-14T02:39:59.001265Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.42) initializing of server in progress as process 79 2025-05-14T02:39:59.006601Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2025-05-14T02:39:59.393283Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2025-05-14T02:40:00.027215Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. 2025-05-14 02:40:02+00:00 [Note] [Entrypoint]: Database files initialized 2025-05-14 02:40:02+00:00 [Note] [Entrypoint]: Starting temporary server 2025-05-14T02:40:02.446465Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead. 2025-05-14T02:40:02.448477Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.42) starting as process 121 2025-05-14T02:40:02.459509Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2025-05-14T02:40:02.600107Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2025-05-14T02:40:02.778819Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2025-05-14T02:40:02.778981Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. 2025-05-14T02:40:02.781110Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. 2025-05-14T02:40:02.797276Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock 2025-05-14T02:40:02.797321Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.42' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL. 2025-05-14 02:40:02+00:00 [Note] [Entrypoint]: Temporary server started. '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock' Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. 2025-05-14 02:40:04+00:00 [Note] [Entrypoint]: Stopping temporary server 2025-05-14T02:40:04.640815Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.42). 2025-05-14T02:40:05.284960Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.42) MySQL Community Server - GPL. 2025-05-14 02:40:05+00:00 [Note] [Entrypoint]: Temporary server stopped 2025-05-14 02:40:05+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up. 2025-05-14T02:40:05.857253Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead. 2025-05-14T02:40:05.859250Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.42) starting as process 1 2025-05-14T02:40:05.865627Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2025-05-14T02:40:06.112818Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2025-05-14T02:40:06.248612Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2025-05-14T02:40:06.248783Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. 2025-05-14T02:40:06.250591Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. 2025-05-14T02:40:06.266664Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock 2025-05-14T02:40:06.266904Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.42' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL. 2025-05-14T03:16:11.780660Z 10 [Warning] [MY-013360] [Server] Plugin sha256_password reported: ''sha256_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead' 2025-05-14T03:20:34.787044Z 9 [Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead' [root@neuedu-alma-linux mysql]# ```` ## inspect 检查容器,查看容器信息 ```shell [root@neuedu-alma-linux mysql]# docker inspect mysql [ { "Id": "e8b396bcab3f5b036647d790ffedfc39ebf5428aa757b5260c5e11d3e862c7cb", "Created": "2025-05-14T02:39:58.398808375Z", "Path": "docker-entrypoint.sh", "Args": [ "mysqld" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 236505, "ExitCode": 0, "Error": "", "StartedAt": "2025-05-14T02:39:58.500848964Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:00a697b8380c19e0ea3596a5060e4e79fa7b4493fa4cb0799bd38ebecd057cb8", "ResolvConfPath": "/var/lib/docker/containers/e8b396bcab3f5b036647d790ffedfc39ebf5428aa757b5260c5e11d3e862c7cb/resolv.conf", "HostnamePath": "/var/lib/docker/containers/e8b396bcab3f5b036647d790ffedfc39ebf5428aa757b5260c5e11d3e862c7cb/hostname", "HostsPath": "/var/lib/docker/containers/e8b396bcab3f5b036647d790ffedfc39ebf5428aa757b5260c5e11d3e862c7cb/hosts", "LogPath": "/var/lib/docker/containers/e8b396bcab3f5b036647d790ffedfc39ebf5428aa757b5260c5e11d3e862c7cb/e8b396bcab3f5b036647d790ffedfc39ebf5428aa757b5260c5e11d3e862c7cb-json.log", "Name": "/mysql", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": [ "/root/docker/mysql:/etc/mysql/conf.d" ], "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "bridge", "PortBindings": { "3306/tcp": [ { "HostIp": "", "HostPort": "3306" } ] }, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "ConsoleSize": [ 37, 243 ], "CapAdd": null, "CapDrop": null, "CgroupnsMode": "private", "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": null, "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/c8ed6c587890ecbc64279d7ae0d218499e0ae545bb44d279600d7968ec03be88-init/diff:/var/lib/docker/overlay2/64a05377f2729c3f545c6c2bc50b8f785223c9c39300e6f74be7faecfefe742a/diff:/var/lib/docker/overlay2/7e03779107b019ce918ae7005dc9b73ca9f84fa6f262c992b961da6d52094e5f/diff:/var/lib/docker/overlay2/834df34f769d44853c80ed91b46067c0c5ff27898c2df852df34c3fae8fcff02/diff:/var/lib/docker/overlay2/d5f3aaa0d2fc9e5aeebc63673f778c51ce90c5f5f0156fbcd86b873a4c51b354/diff:/var/lib/docker/overlay2/da2de2e9fb3c4d0276e68fecb4622ca7270ee1a75f978bf22232cccb4d7f37bf/diff:/var/lib/docker/overlay2/7c7b75eab647ef55c280791cae12438e3c21d87b317f96e40720b7ccb883436f/diff:/var/lib/docker/overlay2/3de5d37deb507719c37740f3a14ee1b2563b49cd5493ad065bd3cb9884e2a4dd/diff:/var/lib/docker/overlay2/ed1439024d352ab41bcf533b5da1bb5bd5f030629e8147519dcef4a2c336f34e/diff:/var/lib/docker/overlay2/2e25c45d54144d9a9550aee83a0519fbec6335243e3e6b0ce363666328581750/diff:/var/lib/docker/overlay2/a492847e9f3f7646532aae9301e8daefa728417d02fb4d99724aa379badd127b/diff:/var/lib/docker/overlay2/c8a1807bfb3e3c6a56f8231f1e6ba08e79a0c1f329381240c7b7395eca651724/diff", "MergedDir": "/var/lib/docker/overlay2/c8ed6c587890ecbc64279d7ae0d218499e0ae545bb44d279600d7968ec03be88/merged", "UpperDir": "/var/lib/docker/overlay2/c8ed6c587890ecbc64279d7ae0d218499e0ae545bb44d279600d7968ec03be88/diff", "WorkDir": "/var/lib/docker/overlay2/c8ed6c587890ecbc64279d7ae0d218499e0ae545bb44d279600d7968ec03be88/work" }, "Name": "overlay2" }, "Mounts": [ { "Type": "bind", "Source": "/root/docker/mysql", "Destination": "/etc/mysql/conf.d", "Mode": "", "RW": true, "Propagation": "rprivate" }, { "Type": "volume", "Name": "cb73790322dcdf8588653747f2e5d868e16df50ed29315c36080e2b930b9510e", "Source": "/var/lib/docker/volumes/cb73790322dcdf8588653747f2e5d868e16df50ed29315c36080e2b930b9510e/_data", "Destination": "/var/lib/mysql", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], "Config": { "Hostname": "e8b396bcab3f", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "3306/tcp": {}, "33060/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "MYSQL_ROOT_PASSWORD=root", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "GOSU_VERSION=1.17", "MYSQL_MAJOR=8.0", "MYSQL_VERSION=8.0.42-1.el9", "MYSQL_SHELL_VERSION=8.0.42-1.el9" ], "Cmd": [ "mysqld" ], "Image": "mysql:8.0.42", "Volumes": { "/var/lib/mysql": {} }, "WorkingDir": "/", "Entrypoint": [ "docker-entrypoint.sh" ], "OnBuild": null, "Labels": {} }, "NetworkSettings": { "Bridge": "", "SandboxID": "1a1cfce13d78172afe0305f44ea02d2dbc8dc03302bde372a9ca0547be0e4ee2", "SandboxKey": "/var/run/docker/netns/1a1cfce13d78", "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": "6c159d3139e6439fc50d564b3dab1ac840f252386e8ae025c90d49d8c33f51b7", "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", "DriverOpts": null, "NetworkID": "cc52b7fd34bd5b03b0eb0344a7db557bf9ed686afc03eb5a1c9ff9807e57c0b2", "EndpointID": "6c159d3139e6439fc50d564b3dab1ac840f252386e8ae025c90d49d8c33f51b7", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "DNSNames": null } } } } ] ``` ## load && save - save 把 image镜像 打成tar 压缩包 - 另外的机器上 load 加载成imags ```shell docker save -o openjdk.tar openjdk:17 ``` ```shell [root@neuedu-alma-linux mysql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0.42 00a697b8380c 4 weeks ago 772MB openjdk 17 5e28ba2b4cdb 3 years ago 471MB ubuntu 15.10 9b9cb95443b5 8 years ago 137MB # 使用save命令 打包 [root@neuedu-alma-linux mysql]# docker save -o openjdk.tar openjdk:17 [root@neuedu-alma-linux mysql]# ll total 464276 -rw-------. 1 root root 475417088 May 14 13:42 openjdk.tar #为了测试方便 rmi 删除了下 镜像 [root@neuedu-alma-linux mysql]# docker rmi openjdk:17 Untagged: openjdk:17 Untagged: openjdk@sha256:528707081fdb9562eb819128a9f85ae7fe000e2fbaeaf9f87662e7b3f38cb7d8 Deleted: sha256:5e28ba2b4cdb3a7c3bd0ee2e635a5f6481682b77eabf8b51a17ea8bfe1c05697 Deleted: sha256:8c17fbaf5deb44789fbec8664ece55af2bde3d75ea3a6d34731d12a00229008b Deleted: sha256:f08cf23d2882f5417dc74b6df5c384466d0024dc5d138674a5f42cae72d40f65 Deleted: sha256:c8dd97366670ed499701572c321fb87ef4f9287308536563a8f1e3fd39ff2166 # 查看镜像不存在 openjdk 17 [root@neuedu-alma-linux mysql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0.42 00a697b8380c 4 weeks ago 772MB ubuntu 15.10 9b9cb95443b5 8 years ago 137MB [root@neuedu-alma-linux mysql]# 使用images tar 还原成一个镜像^C # load 将tar 还原成 images 镜像 [root@neuedu-alma-linux mysql]# docker load -i openjdk.tar c8dd97366670: Loading layer [==================================================>] 113.6MB/113.6MB 27ee19dc88f2: Loading layer [==================================================>] 40.11MB/40.11MB dc9fa3d8b576: Loading layer [==================================================>] 321.7MB/321.7MB Loaded image: openjdk:17 # 查看 镜像列表 [root@neuedu-alma-linux mysql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0.42 00a697b8380c 4 weeks ago 772MB openjdk 17 5e28ba2b4cdb 3 years ago 471MB ubuntu 15.10 9b9cb95443b5 8 years ago 137MB [root@neuedu-alma-linux mysql]# ``` # 数据卷 -v 命令映射数据卷 创建nginx 同时映射 数据卷 ```` docker run -d \ --name nginx \ -p 80:80 \ -v html:/usr/share/nginx/html \ nginx:1.23.1 ```` 数据卷的默认位置 在 `/var/lib/docker/volumnes/数据卷的名字` ```shell #创建 同时映射数据卷 [root@neuedu-alma-linux ~]# docker run -d \ > --name nginx \ > -p 80:80 \ > -v html:/usr/share/nginx/html \ > nginx:1.23.1 925165d34934d9dfb7ea302715c6ac4b4416f50b1bb1af30dc80a0ac3e600fc4 #查看数据卷 [root@neuedu-alma-linux ~]# docker volume ls DRIVER VOLUME NAME local 724ff2631f2a11f0fdb08322c544a9e570ed9f8d8ba802fe4aeba7a941d04e8a local 2983f78fe37b68e3ec842901a421f378535aa8d329427144e1a09ccfeb8a84c1 local 6099d1cf4e1b51f88e21cb8c4d81f7a348c5c834b9e1c47f66d4efce1005c674 local cb73790322dcdf8588653747f2e5d868e16df50ed29315c36080e2b930b9510e local html [root@neuedu-alma-linux ~]# cd /var/lib/docker/ buildkit/ containers/ engine-id image/ network/ overlay2/ plugins/ runtimes/ swarm/ tmp/ volumes/ #进入到数据卷的目录 [root@neuedu-alma-linux ~]# cd /var/lib/docker/volumes/ [root@neuedu-alma-linux volumes]# ls 2983f78fe37b68e3ec842901a421f378535aa8d329427144e1a09ccfeb8a84c1 724ff2631f2a11f0fdb08322c544a9e570ed9f8d8ba802fe4aeba7a941d04e8a cb73790322dcdf8588653747f2e5d868e16df50ed29315c36080e2b930b9510e metadata.db 6099d1cf4e1b51f88e21cb8c4d81f7a348c5c834b9e1c47f66d4efce1005c674 backingFsBlockDev html #进入html代表的nginx 数据卷 [root@neuedu-alma-linux volumes]# ``` 可以直接在数据卷中修改内容,不用进入到容器中 ````shell # 进入到nginx 数据卷的 数据目录 [root@neuedu-alma-linux volumes]# cd /var/lib/docker/volumes/html/_data/ # 查看数据内容 nginx 的数据 html代码 [root@neuedu-alma-linux _data]# ls 50x.html index.html # 修改index。html 进行测试 [root@neuedu-alma-linux _data]# vi index.html ```` ![image-20250514143540289](imgs/image-20250514143540289.png) ## 常用命令 ![image-20250515084431955](imgs/image-20250515084431955.png) # 镜像和容器 镜像是静态的,容器是动态的 部署一个Java项目,把它打包为一个镜像该怎么做?要想自己构建镜像,必须先了解镜像的结构。镜像之所以能让我们快速跨操作系统部署应用而忽略其运行环境、配置,就是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依赖。因此,自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用 本身、运行配置等文件,并且打包而成。例: - 从 0 部署一个 Java 应用,大概流程是这样: - 准备一个linux服务(CentOS或者Ubuntu均可) - 安装并配置JDK - 上传Jar包 - 运行jar包那因此, - 打包镜像也是分成这么几步: - 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可) - 安装并配置JDK - 拷贝jar包 - 配置启动脚本 上述步骤中的每一次操作都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以 **镜像就是一堆文件的集合**。但需要注意的是,镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为 **Layer**(**层**)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方制作了这样的只包含Linux运行环境的镜像。在制作 java 镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像。然后再搭建其它层即可,这样逐层搭建,最终整个Java项目的镜像结构如图所示: ![image-20250515085054160](imgs/image-20250515085054160.png) ## Dockerfile 由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以 Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。而这种记录镜像结构的文件就称为 **Dockerfile**,其对应的语法可以参考官方文档: 其中的语法比较多,比较常用的有: ![image-20250515085159006](imgs/image-20250515085159006.png) ### 案例-dockerfile 将springboot 使用dockerfile的 打包成一个镜像,使用镜像启动一个容器 - 准备一个spirngboot的项目 - 制作一个Dockerfile - 使用idea插件利用Dockerfile打包镜像上传到 Linux 服务器 - 使用镜像运行容器 ![image-20250515085512853](imgs/image-20250515085512853.png) ## 使用springboot发布Docker容器中 ### 准备项目并打包 ![image-20250515085824645](imgs/image-20250515085824645.png) ### 准备Dockerfile ```shell # 1 准备一个 基础的 容器 openjdk:17 FROM openjdk:17 #2 设置工作目录 WORKDIR /app # 3 将 本地文件复制到 容器中 COPY ./target/boot-01-helloworld-1.0.jar /app/boot.jar # 通过Docker run的时候启动容器 同时 执行 java -jar 命令 ENTRYPOINT ["java" ,"-jar" , "boot.jar"] # 5 暴露 8080端口给容器的拥有者 EXPOSE 8080 ``` ### 使用IDEA的Docker插件 打包镜像(build) 同时 运行 docker run - 安装插件 ![image-20250515091128656](imgs/image-20250515091128656.png) - 配置idea连接 linux机器 ![image-20250515091311333](imgs/image-20250515091311333.png) ![image-20250515091348387](imgs/image-20250515091348387.png) ![image-20250515091405170](imgs/image-20250515091405170.png) ![image-20250515091436161](imgs/image-20250515091436161.png) ![image-20250515092653635](imgs/image-20250515092653635.png) ![image-20250515093220628](imgs/image-20250515093220628.png) ### 使用浏览器测试 ```\ http://192.168.49.100:8080 ``` ![image-20250515092953627](imgs/image-20250515092953627.png) ## 使用Dockerfile直接构建镜像 直接在Linux系统下操作 编写Dockerfile ``` FROM openjdk:17 WORKDIR /app COPY ./Run.java /app/Run.java RUN javac Run.java CMD ["tail", "-f", "/dev/null"] ``` 构建 ```shell #编写 Dockerfil文件 [root@neuedu-alma-linux ~]# ll total 12 -rw-r--r--. 1 root root 88 May 15 10:36 Dockerfile -rw-r--r--. 1 root root 110 Jan 24 14:05 Run.java drwxr-xr-x. 3 root root 20 May 14 14:27 abc -rw-------. 1 root root 843 Jan 24 10:36 anaconda-ks.cfg drwxr-xr-x. 3 root root 19 May 14 09:36 docker [root@neuedu-alma-linux ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE boot-hello 1.0 32b200086398 About an hour ago 492MB nginx 1.28 7e2dd24abce2 3 weeks ago 192MB mysql 8.0.42 00a697b8380c 4 weeks ago 772MB nginx 1.23.1 51086ed63d8c 2 years ago 142MB openjdk 17 5e28ba2b4cdb 3 years ago 471MB ubuntu 15.10 9b9cb95443b5 8 years ago 137MB # 使用build命令 构建 镜像 [root@neuedu-alma-linux ~]# 使用 Dockerfile构建 镜像^C [root@neuedu-alma-linux ~]# docker build -t myjava:1.0 . [+] Building 1.7s (9/9) FINISHED docker:default => [internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 185B 0.0s => [internal] load metadata for docker.io/library/openjdk:17 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/4] FROM docker.io/library/openjdk:17 0.0s => [internal] load build context 0.0s => => transferring context: 205B 0.0s => [2/4] WORKDIR /app 0.0s => [3/4] COPY ./Run.java /app/Run.java 0.0s => [4/4] RUN javac Run.java 1.3s => exporting to image 0.1s => => exporting layers 0.1s => => writing image sha256:f7cea0c72bcaf1c54bfed5707d8afe26c1cf25f3a776e588805922cb2f3cf435 0.0s => => naming to docker.io/library/myjava:1.0 0.0s [root@neuedu-alma-linux ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myjava 1.0 f7cea0c72bca 29 seconds ago 471MB boot-hello 1.0 32b200086398 About an hour ago 492MB nginx 1.28 7e2dd24abce2 3 weeks ago 192MB mysql 8.0.42 00a697b8380c 4 weeks ago 772MB nginx 1.23.1 51086ed63d8c 2 years ago 142MB openjdk 17 5e28ba2b4cdb 3 years ago 471MB ubuntu 15.10 9b9cb95443b5 8 years ago 137MB ``` 测试使用镜像运行 容器 ``` docker run --name myjava -d myjava:1.0 ```